浏览代码

Merge branch 'feature/v4.8.51' into dev/4.8.51_fuwencai

fuwencai 1 年之前
父节点
当前提交
c69881a213
共有 100 个文件被更改,包括 3937 次插入1492 次删除
  1. 86 0
      src/jfw/config/config.go
  2. 1 1
      src/jfw/front/front.go
  3. 2 2
      src/jfw/front/laboratory.go
  4. 742 742
      src/jfw/front/tags.go
  5. 114 114
      src/jfw/modules/app/src/app/filter/phonefilter.go
  6. 16 7
      src/jfw/modules/app/src/app/front/front.go
  7. 3 4
      src/jfw/modules/app/src/app/front/laboratory.go
  8. 10 11
      src/jfw/modules/app/src/app/front/login.go
  9. 1 1
      src/jfw/modules/app/src/app/jyutil/tags.go
  10. 0 1
      src/jfw/modules/app/src/phoneFilter.json
  11. 3 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  12. 6 2
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root.js
  13. 14 6
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/page_init.js
  14. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/book_active.png
  15. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/box.png
  16. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/box_active.png
  17. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/home_active.png
  18. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mesg.png
  19. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mesg_active.png
  20. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mine_active.png
  21. 424 295
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  22. 1 0
      src/jfw/modules/app/src/web/staticres/jyapp/js/numberAuth-web-sdk.js
  23. 28 10
      src/jfw/modules/app/src/web/staticres/jyapp/me/css/login.css
  24. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/me/images/register_logo.png
  25. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/me/images/register_logo2.png
  26. 72 0
      src/jfw/modules/app/src/web/staticres/jyapp/me/js/login.js
  27. 39 12
      src/jfw/modules/app/src/web/staticres/jyapp/me/js/phone_bind.js
  28. 1 1
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_index_new.js
  29. 7 3
      src/jfw/modules/app/src/web/templates/big-member/page_full.html
  30. 7 3
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html
  31. 3 3
      src/jfw/modules/app/src/web/templates/common/js.html
  32. 2 2
      src/jfw/modules/app/src/web/templates/frontRouter/userMerge/free/confirm.html
  33. 3 0
      src/jfw/modules/app/src/web/templates/me/account.html
  34. 9 2
      src/jfw/modules/app/src/web/templates/me/account/phone_bind.html
  35. 106 67
      src/jfw/modules/app/src/web/templates/me/login.html
  36. 1 1
      src/jfw/modules/app/src/web/templates/me/mine.html
  37. 3 0
      src/jfw/modules/app/src/web/templates/me/permissions.html
  38. 3 0
      src/jfw/modules/app/src/web/templates/me/privacy.html
  39. 1 2
      src/jfw/modules/app/src/web/templates/me/register.html
  40. 4 1
      src/jfw/modules/app/src/web/templates/me/setting.html
  41. 18 3
      src/jfw/modules/app/src/web/templates/staticpage/privacy_rules.html
  42. 17 2
      src/jfw/modules/app/src/web/templates/staticpage/privacy_rules_client.html
  43. 1 0
      src/jfw/modules/app/src/web/templates/tags/index.html
  44. 0 12
      src/jfw/modules/app/src/web/templates/tags/template/tag-footer.html
  45. 1 1
      src/jfw/modules/app/src/web/templates/tags/template/tag-meta.html
  46. 1 1
      src/jfw/modules/app/src/web/templates/tags/template/tag-register-login-group.html
  47. 3 0
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html
  48. 164 110
      src/jfw/modules/app/src/web/templates/weixin/tabbar.html
  49. 3 3
      src/jfw/modules/app/src/web/templates/weixin/treasure_box.html
  50. 2 0
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  51. 3 4
      src/jfw/modules/publicapply/src/ad/entity/struct.go
  52. 67 0
      src/jfw/modules/publicapply/src/ad/service/actions.go
  53. 8 2
      src/jfw/modules/publicapply/src/config.json
  54. 10 4
      src/jfw/modules/publicapply/src/config/config.go
  55. 4 0
      src/jfw/modules/publicapply/src/filter/sessionfilter.go
  56. 19 6
      src/jfw/modules/publicapply/src/go.mod
  57. 74 8
      src/jfw/modules/publicapply/src/go.sum
  58. 79 0
      src/jfw/modules/publicapply/src/jyutil/pushId.go
  59. 1 0
      src/jfw/modules/publicapply/src/main.go
  60. 723 0
      src/jfw/modules/publicapply/src/oneclick/entity/entity.go
  61. 11 0
      src/jfw/modules/publicapply/src/oneclick/init.go
  62. 32 0
      src/jfw/modules/publicapply/src/oneclick/initjson/oc.go
  63. 17 0
      src/jfw/modules/publicapply/src/oneclick/oneClick.json
  64. 9 0
      src/jfw/modules/publicapply/src/oneclick/service/action.go
  65. 66 0
      src/jfw/modules/publicapply/src/oneclick/service/service.go
  66. 1 2
      src/jfw/modules/publicapply/src/userbase/initjson/ub.go
  67. 2 2
      src/jfw/modules/subscribepay/src/timetask/ent.go
  68. 2 1
      src/phoneFilter.json
  69. 2 0
      src/web/staticres/big-member/js/ent_portrait.js
  70. 2 2
      src/web/staticres/big-member/js/meauContact.js
  71. 10 0
      src/web/staticres/common-module/account/css/fast-bind.css
  72. 221 0
      src/web/staticres/common-module/account/css/fast-login.css
  73. 129 0
      src/web/staticres/common-module/account/js/fast-bind.js
  74. 394 0
      src/web/staticres/common-module/account/js/fast-login.js
  75. 1 1
      src/web/staticres/common-module/account/js/verify.js
  76. 10 0
      src/web/staticres/common-module/big-member/js/page_client_follow_detail.js
  77. 1 0
      src/web/staticres/common-module/collection/js/analysis-report-example.js
  78. 8 6
      src/web/staticres/common-module/collection/js/buyer-example.js
  79. 2 0
      src/web/staticres/common-module/collection/js/ent_portrait.js
  80. 3 2
      src/web/staticres/common-module/collection/js/vip-dialog.js
  81. 二进制
      src/web/staticres/common-module/public/image/register_logo.png
  82. 二进制
      src/web/staticres/common-module/public/image/register_logo2.png
  83. 5 2
      src/web/staticres/entnichePush/js/common.js
  84. 10 2
      src/web/staticres/js/login.js
  85. 7 4
      src/web/staticres/js/superSearch.js
  86. 15 11
      src/web/staticres/me/js/phone_bind.js
  87. 6 0
      src/web/staticres/pccss/pc-detail.css
  88. 20 0
      src/web/staticres/public-pc/js/baiducc.js
  89. 0 0
      src/web/staticres/public-pc/js/detection-min.js
  90. 1 1
      src/web/staticres/public-pc/js/detection.js
  91. 13 6
      src/web/staticres/tags/js/no-login-detail.js
  92. 3 1
      src/web/templates/big-member/wx/meta.html
  93. 3 0
      src/web/templates/big-member/wx/page_analysis_filter.html
  94. 3 0
      src/web/templates/big-member/wx/page_analysis_search.html
  95. 3 0
      src/web/templates/big-member/wx/page_buy_commit.html
  96. 3 0
      src/web/templates/big-member/wx/page_customer.html
  97. 3 0
      src/web/templates/big-member/wx/page_free_contrast_trial.html
  98. 3 0
      src/web/templates/big-member/wx/page_index.html
  99. 3 0
      src/web/templates/big-member/wx/page_landingPage.html
  100. 3 0
      src/web/templates/big-member/wx/page_landingPage2.html

+ 86 - 0
src/jfw/config/config.go

@@ -6,10 +6,13 @@ import (
 	"app.yhyue.com/moapp/jybase/mail"
 	"app.yhyue.com/moapp/jypkg/middleground"
 	"app.yhyue.com/moapp/jypkg/public"
+	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
+	"strings"
 	"sync"
+	"unicode"
 )
 
 var (
@@ -71,6 +74,7 @@ func init() {
 		RegResourceCenter(g.Cfg().MustGet(ctx, "resourceCenterKey").String()).
 		RegEntManageApplication(g.Cfg().MustGet(ctx, "entManageApplication").String()).
 		RegPublicservice(g.Cfg().MustGet(ctx, "publicserviceKey").String())
+	//SubjectMatter = GetLetterMap(util.InterfaceToStr(Sysconfig["hotSubjectMatter"]))
 }
 
 func IpInit() {
@@ -91,3 +95,85 @@ func IpInit() {
 	}
 	IpList = ipmatch.NewRb(nil)
 }
+
+func GetLetterMap(names string) []map[string]interface{} {
+	var (
+		data                                   []map[string]interface{}
+		nameArr1, nameArr2, nameArr3, nameArr4 []string
+	)
+	nameArr := strings.Split(names, ",")
+	for _, v := range nameArr {
+		nameArr1 = append(nameArr1, fmt.Sprintf(`"%s"`, v))
+	}
+	dataArr1 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state=1 and  a.class_1 in (%s) and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`, strings.Join(nameArr1, ",")))
+	dataArr2 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr1, ",")))
+	for _, v1 := range nameArr {
+		var isNormal bool
+		if dataArr1 != nil && len(*dataArr1) > 0 {
+			for _, v2 := range *dataArr1 {
+				if v1 == v2["name"] {
+					isNormal = true
+					data = append(data, map[string]interface{}{
+						"name": v1 + util.ObjToString(Seoconfig["seoKeywordSuffix"]),
+						"url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", util.Int64All(v2["id"]), util.Int64All(v2["class_id"])),
+					})
+				}
+			}
+		}
+		if !isNormal {
+			if dataArr2 != nil && len(*dataArr2) > 0 {
+				for _, v2 := range *dataArr2 {
+					if v1 == v2["name"] {
+						isNormal = true
+						letter := util.ObjToString(v2["letter"])
+						id := util.Int64All(v2["id"])
+						v1 += util.ObjToString(Seoconfig["seoKeywordSuffix"])
+						data = append(data, map[string]interface{}{
+							"name": v1,
+							"url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+						})
+					}
+				}
+			}
+		}
+		if !isNormal {
+			nameArr2 = append(nameArr2, v1)
+			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
+			letter := getFirstLetter(v1)
+			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 1)`, v1, letter))
+		}
+	}
+	if len(nameArr2) > 0 {
+		public.BaseMysql.SelectBySql(fmt.Sprintf(`INSERT INTO seo_words.seo_resource (name, letter, state) VALUES %s`, strings.Join(nameArr4, ",")))
+		dataArr3 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr3, ",")))
+		if dataArr3 != nil {
+			for _, v3 := range *dataArr3 {
+				letter := util.ObjToString(v3["letter"])
+				id := util.Int64All(v3["id"])
+				n := util.ObjToString(v3["name"])
+				n += util.ObjToString(Seoconfig["seoKeywordSuffix"])
+				data = append(data, map[string]interface{}{
+					"name": n,
+					"url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+				})
+			}
+		}
+	}
+	return data
+}
+
+// 获取字符串的首字母大写形式
+func getFirstLetter(s string) string {
+	words := strings.Fields(s) // 将字符串分割成单词
+	var result string
+	for _, word := range words {
+		firstChar := []rune(word)[0] // 获取单词的第一个字符
+
+		// 检查字符是否为汉字或英文字母
+		if unicode.Is(unicode.Han, firstChar) || unicode.IsLetter(firstChar) {
+			result += strings.ToUpper(string(firstChar))
+		}
+	}
+
+	return result
+}

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

@@ -515,7 +515,7 @@ func (f *Front) Topics() error {
 func (f *Front) Notin() error {
 	refer := "/"
 	tmp := f.Header("Referer")
-	if tmp != f.Request.URL.String() && strings.Contains(tmp, config.Sysconfig["webdomain"].(string)) {
+	if tmp != f.Scheme()+"://"+f.Request.Host+f.Url() && strings.Contains(tmp, config.Sysconfig["webdomain"].(string)) {
 		refer = tmp
 	}
 	userId, _ := f.GetSession("userId").(string)

+ 2 - 2
src/jfw/front/laboratory.go

@@ -10,8 +10,8 @@ import (
 
 type Lab struct {
 	*xweb.Action
-	/*******************剑鱼标讯百宝箱dev2.8.5*************************/
-	treasureBox xweb.Mapper `xweb:"/jyTreasureBox/treasureBox"` //剑鱼百宝箱
+	/*******************剑鱼标讯工作台dev2.8.5*************************/
+	treasureBox xweb.Mapper `xweb:"/jyTreasureBox/treasureBox"` //剑鱼工作台
 }
 
 func init() {

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

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

+ 114 - 114
src/jfw/modules/app/src/app/filter/phonefilter.go

@@ -1,26 +1,26 @@
 package filter
 
 import (
-    "fmt"
-    utils "jy/src/jfw/modules/app/src/app/jyutil"
-    "jy/src/jfw/modules/app/src/jfw/config"
-    "log"
-    "net/http"
-    "regexp"
-    "strings"
-    "time"
+	"fmt"
+	utils "jy/src/jfw/modules/app/src/app/jyutil"
+	"jy/src/jfw/modules/app/src/jfw/config"
+	"log"
+	"net/http"
+	"regexp"
+	"strings"
+	"time"
 
-    qu "app.yhyue.com/moapp/jybase/common"
-    . "app.yhyue.com/moapp/jybase/date"
-    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-    "app.yhyue.com/moapp/jybase/redis"
+	qu "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/redis"
 )
 
 type phoneFilter struct {
-    W          http.ResponseWriter
-    R          *http.Request
-    Session    *httpsession.Session
-    GetSession map[string]interface{}
+	W          http.ResponseWriter
+	R          *http.Request
+	Session    *httpsession.Session
+	GetSession map[string]interface{}
 }
 
 var articleUrl = regexp.MustCompile("^/jyapp/article/.*")
@@ -28,109 +28,109 @@ var bindurl = []*regexp.Regexp{}
 var initflag = true
 
 func init() {
-    //初始化不需要过滤的地址
-    qu.ReadConfig("./phoneFilter.json", &config.PhoneFilterConfig)
-    for _, v := range config.PhoneFilterConfig["regurl"].([]interface{}) {
-        bindurl = append(bindurl, regexp.MustCompile(qu.ObjToString(v)))
-    }
-    if len(bindurl) == 0 {
-        log.Println("初始化过滤地址失败。。")
-        initflag = false
-    }
+	//初始化不需要过滤的地址
+	qu.ReadConfig("./phoneFilter.json", &config.PhoneFilterConfig)
+	for _, v := range config.PhoneFilterConfig["regurl"].([]interface{}) {
+		bindurl = append(bindurl, regexp.MustCompile(qu.ObjToString(v)))
+	}
+	if len(bindurl) == 0 {
+		log.Println("初始化过滤地址失败。。")
+		initflag = false
+	}
 }
 
 func (l *phoneFilter) Do() bool {
-    if qu.Int64All(l.GetSession["positionType"]) == 1 {
-        return true
-    }
+	if qu.Int64All(l.GetSession["positionType"]) == 1 {
+		return true
+	}
 	userId, _ := l.GetSession["mgoUserId"].(string)
-    // 请求过滤
-    pass := func() bool {
-        if !initflag || l.R.Method == "POST" || userId == "" {
-            return true
-        }
-        if flag, _ := config.Sysconfig["phoneFilterFlag"].(bool); !flag {
-            return true
-        }
-        for _, v := range bindurl {
-            if v.MatchString(l.R.URL.Path) && !strings.Contains(l.R.URL.Path, "squeeze") {
-                return true
-            }
-        }
-        return false
-    }()
-    if pass {
-        return true
-    }
-    isNewUser := false
-    //是否需要跳转绑定手机号
-    needBindPhone := func() bool {
-        if phone := l.GetSession["phone"]; phone != nil && phone != "" {
-            return false
-        }
-        if person := utils.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"l_registedate":1}`); person != nil {
-            s_phone := qu.ObjToString((*person)["s_phone"])
-            if s_phone == "" {
-                s_phone = qu.ObjToString((*person)["s_m_phone"])
-            }
-            if s_phone != "" {
-                l.Session.Set("phone", s_phone)
-                return false
-            }
-            regtime := qu.Int64All((*person)["l_registedate"])
-            reg := time.Unix(regtime, 0)
-            //新用户时间
-            accountMergeOnline, _ := config.Sysconfig["accountMergeOnline"].(string)
-            onLineTime, _ := time.ParseInLocation(Date_Full_Layout, accountMergeOnline, time.Local)
-            if onLineTime.After(reg) { //老用户
-                dbname, _ := config.Sysconfig["bindPopRedis"].(string)
-                key := fmt.Sprintf("bindPop_new_%s", userId)
-                if redis.GetInt(dbname, key) >= qu.IntAll(config.Sysconfig["maxBindPop"]) {
-                    return true
-                }
-                if articleUrl.MatchString(l.R.URL.Path) {
-                    bindPopNum := redis.Incr(dbname, key)
-                    if bindPopNum == qu.Int64All(config.Sysconfig["firstBindPop"]) ||
-                        bindPopNum > qu.Int64All(config.Sysconfig["maxBindPop"]) {
-                        return true
-                    }
-                }
-                return false
-            } else {
-                isNewUser = true
-            }
-            //设置cookie 前端跳转
-            SetCookie(l.R.URL.String(), int(time.Hour*24/time.Second), l.W)
-            return true
-        }
-        return false
-    }()
-    var href string
-    if needBindPhone {
-        href = "/jyapp/account/phone/bind?mode=mergeBind"
-        if isNewUser {
-            href += "&act=logout"
-        }
-    } else {
-        if exists, _ := redis.Exists("newother", fmt.Sprintf("abnormal_trigger_%s", userId)); exists {
-            href = "/jyapp/frontPage/verify/free/index?mode=phoneCheck"
-        }
-    }
-    if href != "" {
-        http.Redirect(l.W, l.R, href, 302)
-        return false
-    }
-    return true
+	// 请求过滤
+	pass := func() bool {
+		if !initflag || l.R.Method == "POST" || userId == "" {
+			return true
+		}
+		if flag, _ := config.Sysconfig["phoneFilterFlag"].(bool); !flag {
+			return true
+		}
+		for _, v := range bindurl {
+			if v.MatchString(l.R.URL.Path) && !strings.Contains(l.R.URL.Path, "squeeze") {
+				return true
+			}
+		}
+		return false
+	}()
+	if pass {
+		return true
+	}
+	isNewUser := false
+	//是否需要跳转绑定手机号
+	needBindPhone := func() bool {
+		if phone := l.GetSession["phone"]; phone != nil && phone != "" {
+			return false
+		}
+		if person := utils.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"l_registedate":1}`); person != nil {
+			s_phone := qu.ObjToString((*person)["s_phone"])
+			if s_phone == "" {
+				s_phone = qu.ObjToString((*person)["s_m_phone"])
+			}
+			if s_phone != "" {
+				l.Session.Set("phone", s_phone)
+				return false
+			}
+			regtime := qu.Int64All((*person)["l_registedate"])
+			reg := time.Unix(regtime, 0)
+			//新用户时间
+			accountMergeOnline, _ := config.Sysconfig["accountMergeOnline"].(string)
+			onLineTime, _ := time.ParseInLocation(Date_Full_Layout, accountMergeOnline, time.Local)
+			if onLineTime.After(reg) { //老用户
+				dbname, _ := config.Sysconfig["bindPopRedis"].(string)
+				key := fmt.Sprintf("bindPop_new_%s", userId)
+				if redis.GetInt(dbname, key) >= qu.IntAll(config.Sysconfig["maxBindPop"]) {
+					return true
+				}
+				if articleUrl.MatchString(l.R.URL.Path) {
+					bindPopNum := redis.Incr(dbname, key)
+					if bindPopNum == qu.Int64All(config.Sysconfig["firstBindPop"]) ||
+						bindPopNum > qu.Int64All(config.Sysconfig["maxBindPop"]) {
+						return true
+					}
+				}
+				return false
+			} else {
+				isNewUser = true
+			}
+			//设置cookie 前端跳转
+			SetCookie(l.R.URL.String(), int(time.Hour*24/time.Second), l.W)
+			return true
+		}
+		return false
+	}()
+	var href string
+	if needBindPhone {
+		href = "/jyapp/account/phone/bind?mode=mergeBind"
+		if isNewUser {
+			href += "&act=logout"
+		}
+	} else {
+		if exists, _ := redis.Exists("newother", fmt.Sprintf("abnormal_trigger_%s", userId)); exists {
+			href = "/jyapp/frontPage/verify/free/index?mode=phoneCheck"
+		}
+	}
+	if href != "" {
+		http.Redirect(l.W, l.R, href, 302)
+		return false
+	}
+	return true
 }
 
-//文章三级页跳转设置cookie
+// 文章三级页跳转设置cookie
 func SetCookie(value string, timeout int, w http.ResponseWriter) {
-    c := &http.Cookie{
-        Name:     "article",
-        Value:    value,
-        Path:     "/",
-        HttpOnly: true,
-        MaxAge:   timeout,
-    }
-    http.SetCookie(w, c)
+	c := &http.Cookie{
+		Name:     "article",
+		Value:    value,
+		Path:     "/",
+		HttpOnly: true,
+		MaxAge:   timeout,
+	}
+	http.SetCookie(w, c)
 }

+ 16 - 7
src/jfw/modules/app/src/app/front/front.go

@@ -5,6 +5,7 @@ import (
 	"jy/src/jfw/modules/app/src/app/jylabutil"
 	"jy/src/jfw/modules/app/src/jfw/config"
 	"log"
+	"net/url"
 	"regexp"
 	"strings"
 	"sync"
@@ -248,7 +249,7 @@ func isInTSguide(userid string, session *httpsession.Session) bool {
 	}
 	data := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
 	//付费用户无免费订阅,不进入订阅向导页面
-	if data.Data.Vip.Status > 0 || data.Data.Vip.Status > 0 {
+	if data.Data.Vip.Status > 0 {
 		return false
 	}
 	i_ts_guide := data.Data.Free.TsGuide
@@ -436,13 +437,21 @@ func (f *Front) LimitSearchText() {
 }
 
 func (f *Front) Index() error {
-	url := f.Url()
-	redirect := "/jyapp/jylab/mainSearch"
-	if strings.Contains(url, "sign=") && strings.Contains(url, "url=") && strings.Contains(url, "from=") {
-		wh := strings.Split(url, "?")
-		redirect = "/jyapp/free/login?" + wh[len(wh)-1]
+	//开始---兼容老的客户端版本,后续迭代几个版本后可删除
+	if thisUrl := f.Url(); strings.Contains(thisUrl, "sign=") && strings.Contains(thisUrl, "url=") && strings.Contains(thisUrl, "from=") {
+		wh := strings.Split(thisUrl, "?")
+		return f.Redirect("/jyapp/free/login?" + wh[len(wh)-1])
+	}
+	//结束---兼容老的客户端版本,后续迭代几个版本后可删除
+	defaultUrl := "/jyapp/jylab/mainSearch"
+	if sign := f.GetString("sign"); sign != "" && f.GetSession("mgoUserId") == nil {
+		thisUrl := f.GetString("url")
+		if thisUrl == "" {
+			thisUrl = url.QueryEscape(defaultUrl)
+		}
+		return f.Redirect("/jyapp/free/login?sign=" + sign + "&url=" + thisUrl)
 	}
-	return f.Redirect(redirect)
+	return f.Redirect(defaultUrl)
 }
 
 func (f *Front) Kicked() error {

+ 3 - 4
src/jfw/modules/app/src/app/front/laboratory.go

@@ -12,22 +12,21 @@ type Lab struct {
 	newIndex xweb.Mapper `xweb:"/jyapp/jylab/newIndex"` //实验室 nginx跳转
 }
 
-//
 func init() {
 	xweb.AddAction(&Lab{})
 }
 
-//剑鱼标讯实验室首页>移动端工作桌面(百宝箱
+// 剑鱼标讯实验室首页>移动端工作桌面(工作台
 func (l *Lab) Index() error {
 	return l.Redirect("/jy_mobile/tabbar/box")
 }
 
-//剑鱼标讯实验室首页
+// 剑鱼标讯实验室首页
 func (l *Lab) IndexNg() error {
 	return l.Redirect("/jyapp/jylab/page_index") //在nginx配置的路由
 }
 
-//剑鱼标讯实验室首页>移动端工作桌面(百宝箱
+// 剑鱼标讯实验室首页>移动端工作桌面(工作台
 func (l *Lab) NewIndex() error {
 	return l.Redirect("/jy_mobile/tabbar/box")
 }

+ 10 - 11
src/jfw/modules/app/src/app/front/login.go

@@ -86,22 +86,21 @@ func (l *Login) Login() error {
 			l.T["kicked"] = kickedTip
 			return l.Render("/me/login.html", &l.T)
 		} else { //带有签名的登录
-			url := l.GetString("url")
-			if url != "" {
+			if url := l.GetString("url"); url != "" {
 				status := 1
-				from := l.GetString("from")
-				if l.GetSession("mgoUserId") == nil || from == "restart" {
-					status = autoLogin(sign, from, l.Session(), l.ResponseWriter)
+				if l.GetSession("mgoUserId") == nil {
+					status = autoLogin(sign, true, l.Session(), l.ResponseWriter)
 				}
 				if status == 1 {
 					return l.Redirect(url)
 				} else if status == -3 {
 					return l.Redirect("/jyapp/free/login?flag=kicked&back=index")
+				} else {
+					return l.Render("/me/login.html")
 				}
 			} else {
 				return fmt.Errorf("自动登录需要跳转的url为空!")
 			}
-			return l.Redirect(url)
 		}
 	}
 	returnSign := ""
@@ -123,7 +122,7 @@ func (l *Login) Login() error {
 				"s_password": qutil.GetMd5String(password),
 			}
 			// user, ok := mongodb.FindOne("user", query)
-			user, ok := mongodb.Find("user", query, `{"s_phone":-1}`, `{"_id":1,"s_password":1}`, false, 0, 1)
+			user, ok := mongodb.Find("user", query, `{"s_phone":-1}`, `{"_id":1,"s_password":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"o_jy":1}`, false, 0, 1) //
 			//登录成功
 			if ok && user != nil && len(*user) > 0 {
 				rid := l.GetString("rid")
@@ -140,7 +139,7 @@ func (l *Login) Login() error {
 			if l.GetSession("mgoUserId") != nil {
 				returnStatus = 1
 			} else {
-				returnStatus = autoLogin(l.GetString("sign"), "", l.Session(), l.ResponseWriter)
+				returnStatus = autoLogin(l.GetString("sign"), false, l.Session(), l.ResponseWriter)
 			}
 			(userInfo)["headimageurl"] = l.GetSession("s_headimageurl")
 			(userInfo)["nickname"] = l.GetSession("s_nickname")
@@ -1037,6 +1036,7 @@ func afterLogin(user map[string]interface{}, session *httpsession.Session, rid,
 					off = false
 				}
 			}
+			log.Println("app:", old_rid, "---", old_oid, "---", rid, "---", off)
 			//同一账号在不同设备登录,极光id不一样,给之前的设备推送自定义的下线消息,离线消息保持10天
 			if old_rid != "" && old_rid != rid && off && rid != "" {
 				mongodb.UpdateById("user", userid, map[string]interface{}{
@@ -1112,9 +1112,8 @@ func afterLogin(user map[string]interface{}, session *httpsession.Session, rid,
 }
 
 // 解析签名
-func autoLogin(sign, from string, session *httpsession.Session, rw http.ResponseWriter) int {
-	fromIsRestart := from == "restart"
-	u, status := analySign(qutil.If(fromIsRestart, "重启之后登录", "登录").(string), sign)
+func autoLogin(sign string, fromIsRestart bool, session *httpsession.Session, rw http.ResponseWriter) int {
+	u, status := analySign("登录", sign)
 	if status != 1 {
 		return status
 	}

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

@@ -219,7 +219,7 @@ func GetIndustry(industryHref string) *IndustryStruct {
 	if l, err := GetIndustryCache(redisKey); l != nil && (l.List != nil) && len(l.List) > 0 && err == nil {
 		return l
 	} else {
-		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
+		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state = 1 and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
 		industryArr := []string{}
 		industryMap := map[string][]IndustryStruct{}
 		if len(*data) > 0 && data != nil {

+ 0 - 1
src/jfw/modules/app/src/phoneFilter.json

@@ -6,7 +6,6 @@
 		"^/jyapp/free/checkUpdate$",
 		"^/jyapp/free/login$",
 		"^/jyapp/free/afterPageLoadToCheck$",
-		"^/jyapp/jylab/mainSearch$",
 		"^/jyapp/free/showRedSpotOnMenu$",
 		"^/swordfish/frontPage/(.*)",
 		"^/jyapp/frontPage/(.*)",

+ 3 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js

@@ -20,6 +20,7 @@ var vNode = {
     return {
       sessKey: '$data-ent_portrait',
       conf: {
+        isFree: true,
         // 权限查询是否完成
         powerLoaded: false,
         // 是否只显示完整的企业画像
@@ -810,6 +811,8 @@ var vNode = {
             _this.conf.isMember = res.data.memberStatus
             _this.conf.arr = res.data.power || []
             _this.conf.vipStatus = res.data.vipStatus
+            _this.conf.isFree = res.data.isFree
+
             // 新版超级订阅用户获取访问量
             if (res.data.viper && (_this.conf.isMember <= 0 || res.data.power.indexOf(4) == -1)) {
               _this.getEntVisits()

+ 6 - 2
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/main_root.js

@@ -144,8 +144,12 @@ var vNode = {
                                         if (subscribe) {
                                             history.back()
                                         } else {
-                                            JyObj.refreshAppointTab('subscribe',1); //刷新订阅页面
-                                        	JyObj.skipAppointTab('subscribe');//跳转到订阅页面
+                                            if (appVersionGt305()) {
+                                                skipAppointTab('subscribe')
+                                            } else {
+                                                JyObj.refreshAppointTab('subscribe',1); //刷新订阅页面
+                                                JyObj.skipAppointTab('subscribe');//跳转到订阅页面
+                                            }
                                         }
                                     }
                                 }

+ 14 - 6
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/page_init.js

@@ -306,9 +306,13 @@ var vNode = {
                             sessionStorage.setItem('stop_recovery_init', 'true')
                             // location.href = './big_subscribe'
                             try {
-                              JyObj.refreshAppointTab('box', 1)
-                              JyObj.backUrl("")
-                              JyObj.skipAppointTab('box')
+                                if (appVersionGt305()) {
+                                    skipAppointTab('box')
+                                } else {
+                                    JyObj.refreshAppointTab('box', 1)
+                                    JyObj.backUrl("")
+                                    JyObj.skipAppointTab('box')
+                                }
                             } catch (e) {
                               console.warn(e)
                             }
@@ -508,9 +512,13 @@ var vNode = {
                     if (response && response.error_code === 0 && response.data.status === 1) {
                         sessionStorage.setItem('stop_recovery_init', 'true')
                         try {
-                          JyObj.refreshAppointTab('box', 1)
-                          JyObj.backUrl("")
-                          JyObj.skipAppointTab('box')
+                          if (appVersionGt305()) {
+                            skipAppointTab('box')
+                          } else {
+                            JyObj.refreshAppointTab('box', 1)
+                            JyObj.backUrl("")
+                            JyObj.skipAppointTab('box')
+                          }
                         } catch (e) {
                           console.warn(e)
                         }

二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/book_active.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/box.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/box_active.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/home_active.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mesg.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mesg_active.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/tabbar/mine_active.png


+ 424 - 295
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -394,12 +394,12 @@ function mockAppFn () {
     },
     /*跳转到指定的webview
      * name 对应的值:
-     *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
+     *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
      */
     skipAppointTab: function (name) {},
     /*刷新指定的webview
      * name 对应的值:
-     *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
+     *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
      * type 对应的值:
      *   0:当前页 1:一级页面
      */
@@ -479,6 +479,22 @@ function mockAppFn () {
     skipCamera: function () {},
     //打开相册
     skipAlbum: function () {},
+    // 清除浏览器历史记录
+    clearHistory: function () {},
+    // ios专属:开启侧滑
+    sideslipOpen: function () {},
+    // ios专属:禁止侧滑
+    sideslipClose: function () {},
+    // 安卓专属:打开微信扫码
+    openWeChartScan: function () {},
+    // 检查一键登录环境是否可用
+    checkLoginAvailable: function () {},
+    // 唤起一键登录授权
+    // 一键登录成功或者失败后都会走window.getLoginCallback(json: string)回调
+    getLogin: function () {},
+    // 唤起一键绑定手机号授权
+    // 一键绑定手机号成功或者失败后都会走window.getPhoneBindCallback(json: string)回调
+    getPhoneBind: function () {},
     //点击返回调用
     judgeIsHidden: function (referer) {},
     //返回值 处理
@@ -514,6 +530,39 @@ function fixSomeH5BackRefresh () {
   }
 }
 
+// 判断app版本号是否大于3.0.5(即3.0.6以及以上版本)
+function appVersionGt305 () {
+  var currentVersion = ''
+  var targetVersion = '3.0.6' // 3.0.6版本更新移除某些客户端方法。详细描述在common.js中
+  try {
+    currentVersion = JyObj.getVersion()
+    if (currentVersion) {
+      var c = compareVersion(currentVersion, targetVersion)
+      return !c
+    } else {
+      return true
+    }
+  } catch (error) {
+    console.log(error)
+  }
+  return true
+}
+
+// name: search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
+function skipAppointTab (name) {
+  var tabbarRouters = {
+    search: '/jyapp/jylab/mainSearch',
+    subscribe: '/jyapp/swordfish/historypush',
+    box: '/jyapp/jylab/index',
+    me: '/jyapp/free/me',
+    message: '/jyapp/frontPage/messageCenter/sess/index',
+  }
+  var target = tabbarRouters[name]
+  if (target) {
+    location.href = target
+  }
+}
+
 /**
  * @date 2023-1-29
  * 用于快速实现移动端引流相关调整,在App代码基础移植适配H5
@@ -521,297 +570,372 @@ function fixSomeH5BackRefresh () {
 mockAppFn()
 fixSomeH5BackRefresh() // 华为、荣耀h5浏览器在页面返回不刷新兼容
 
-$(function () {
-  if (mySysIsIos() && utilsEnv.platformEnvs.inApp) {
-    window.JyObj = {
-      //获取经纬度
-      getLLitude: function () {
-        return JyObj.IosCall("getLLitude")
-      },
-      /*跳转到指定的webview
-       * name 对应的值:
-       *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
-       */
-      skipAppointTab: function (name) {
-        JyObjMessage.name = name
-        window.webkit.messageHandlers.skipAppointTab.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      /*刷新指定的webview
-       * name 对应的值:
-       *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
-       * type 对应的值:
-       *   0:当前页 1:一级页面
-       */
-      refreshAppointTab: function (name, type) {
-        JyObjMessage.name = name
-        JyObjMessage.type = type
-        window.webkit.messageHandlers.refreshAppointTab.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      skipCameraWithParam: function (type) {
-        JyObjMessage.type = type
-        window.webkit.messageHandlers.skipCameraWithParam.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      // 底部导航消息总数方法
-      sendMsgCount: function (num) {
-        JyObjMessage.num = num
-        window.webkit.messageHandlers.sendMsgCount.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      // 新打开相册客户端方法
-      skipAlbumWithParam: function (type) {
-        JyObjMessage.type = type
-        window.webkit.messageHandlers.skipAlbumWithParam.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      savePic: function (imgbase64) {
-        JyObjMessage.imgbase64 = imgbase64
-        window.webkit.messageHandlers.savePic.postMessage(JyObjMessage)
-        JyObj.clearMessage()
-      },
-      //读取复制内容
-      readRight: function () {
-        return window.webkit.messageHandlers.readRight.postMessage(JyObjMessage);
-      },
-      //写入复制内容
-      wirteRight: function (txt) {
-        JyObjMessage["txt"] = txt;
-        window.webkit.messageHandlers.wirteRight.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //清除复制内容
-      clearRight: function () {
-        window.webkit.messageHandlers.clearRight.postMessage(JyObjMessage);
-      },
-      //拨打电话
-      callPhone: function (phone) {
-        JyObjMessage["phone"] = phone;
-        window.webkit.messageHandlers.callPhone.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //抖音or快手其他应用appName:应用名称;appLink:应用链接
-      openOtherAppLinks: function (appName, appLink) {
-        JyObjMessage["appName"] = appName;
-        JyObjMessage["appLink"] = appLink;
-        window.webkit.messageHandlers.openOtherAppLinks.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //调用接口修改消息通知的打开数
-      openActivityPage: function (url, rectype, openid) {
-        JyObjMessage["url"] = url;
-        JyObjMessage["rectype"] = rectype;
-        JyObjMessage["openid"] = openid;
-        window.webkit.messageHandlers.openActivityPage.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //清除 JyObjMessage
-      clearMessage: function () {
-        JyObjMessage = new Object();
-      },
-      //隐藏显示底部菜单栏 0:隐藏;1:显示
-      hiddenBottom: function (val) {
-        JyObjMessage["hidden"] = val;
-        window.webkit.messageHandlers.hiddenBottom.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //微信登录
-      loginByWeixin: function () {
-        window.webkit.messageHandlers.loginByWeixin.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //分享功能
-      share: function (type, title, content, link) {
-        JyObjMessage["type"] = type
-        JyObjMessage["title"] = title
-        JyObjMessage["content"] = content
-        JyObjMessage["link"] = link
-        window.webkit.messageHandlers.share.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //保存用户token
-      saveUserToken: function (val) {
-        JyObjMessage["token"] = val;
-        window.webkit.messageHandlers.saveUserToken.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //获取用户token
-      getUserToken: function () {
-        return JyObj.IosCall("getUserToken")
-      },
-      //移除用户token
-      removeUserToken: function () {
-        window.webkit.messageHandlers.removeUserToken.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //查看开关状态 是否接受消息
-      checkNoticePermission: function () {
-        return JyObj.IosCall("checkNoticePermission")
-      },
-      //打开接受消息开关
-      openSystemNotification: function () {
-        window.webkit.messageHandlers.openSystemNotification.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //获取极光推送id
-      getPushRid: function () {
-        return JyObj.IosCall("getPushRid")
-      },
-      //跳转外部链接
-      openExternalLink: function (url, title) {
-        JyObjMessage["url"] = url
-        JyObjMessage["title"] = title
-        window.webkit.messageHandlers.openExternalLink.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //获取当前版本号
-      getVersion: function () {
-        return JyObj.IosCall("getVersion")
-      },
-      alert: function (content) {
-        JyObjMessage["content"] = content
-        window.webkit.messageHandlers.alert.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //是否安装了微信
-      isInstallWeixin: function () {
-        return JyObj.IosCall("isInstallWeixin")
-      },
-      //登录加密
-      getCipherText: function (val) {
-        JyObjMessage["phone"] = val
-        return JyObj.IosCall("getCipherText", JyObjMessage)
-      },
-      //刷新首页和订阅页面
-      checkLab: function () {
-        window.webkit.messageHandlers.checkLab.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //登录成功后向客户端传参
-      loginSuccess: function (status) {
-        JyObjMessage["status"] = status
-        window.webkit.messageHandlers.loginSuccess.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //客户端登录页面点击返回 跳转到搜索首页
-      backUrl: function (val) {
-        JyObjMessage["status"] = val;
-        window.webkit.messageHandlers.backUrl.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //清空通知栏消息
-      clearPushMessage: function () {
-        window.webkit.messageHandlers.clearPushMessage.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //隐藏小红点
-      hideRedSpotOnMenu: function (menu) {
-        JyObjMessage["menu"] = menu;
-        window.webkit.messageHandlers.hideRedSpotOnMenu.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //显示小红点
-      showRedSpotOnMenu: function (menu) {
-        JyObjMessage["menu"] = menu;
-        window.webkit.messageHandlers.showRedSpotOnMenu.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //微信支付
-      wxPay: function (order) {
-        JyObjMessage["order"] = order;
-        window.webkit.messageHandlers.wxPay.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //支付宝支付
-      aliPay: function (order) {
-        JyObjMessage["order"] = order;
-        window.webkit.messageHandlers.aliPay.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //获取原生的推送id
-      getOtherPushRid: function () {
-        return JyObj.IosCall("getOtherPushRid")
-      },
-      //获取手机型号
-      getPhoneBrand: function () {
-        return JyObj.IosCall("getPhoneBrand")
-      },
-      //获取定位
-      getLocation: function () {
-        return JyObj.IosCall("getLocation")
-      },
-      //切换菜单
-      chooseTab: function (indexTab) {
-        JyObjMessage["indexTab"] = indexTab;
-        window.webkit.messageHandlers.chooseTab.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //打开照相机
-      skipCamera: function () {
-        window.webkit.messageHandlers.skipCamera.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //打开相册
-      skipAlbum: function () {
-        window.webkit.messageHandlers.skipAlbum.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-      //点击返回调用
-      judgeIsHidden: function (referer) {
-        JyObjMessage["referer"] = referer;
-        window.webkit.messageHandlers.judgeIsHidden.postMessage(JyObjMessage);
+// app 3.0.6更新 (改动较大)-------------------------------------------
+// JyObj.skipAppointTab 删除
+// JyObj.refreshAppointTab 删除
+// JyObj.sendMsgCount 删除
+// JyObj.hiddenBottom 删除
+// JyObj.hideRedSpotOnMenu 删除
+// JyObj.showRedSpotOnMenu 删除
+// JyObj.checkLab 删除
+// JyObj.chooseTab 删除
+// -
+// JyObj.backUrl 更改前:传''则返回到当前tab的第一个页面,传'H'则返回第一个tab的第一个页面即app首页
+//               更改后:传''则无操作,传'H'则返回app首页
+// JyObj.clearHistory()  新增:用来清除webview浏览历史记录
+// JyObj.sideslipOpen()  新增:开启侧滑
+// JyObj.sideslipClose() 新增:禁止侧滑
+// JyObj.openWeChartScan() 安卓新增:调起微信并打开扫一扫
+// --------------------------------------------------------------------
+initIosAppJyObj()
+function initIosAppJyObj () {
+  if (!mySysIsIos()) return
+  if (!utilsEnv.platformEnvs.inApp) return
+  window.JyObj = {
+    //获取经纬度
+    getLLitude: function () {
+      return JyObj.IosCall("getLLitude")
+    },
+    /*跳转到指定的webview
+      * name 对应的值:
+      *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
+      * 该方法在客户端3.0.6版本及以后版本中移除
+      */
+    skipAppointTab: function (name) {
+      JyObjMessage.name = name
+      window.webkit.messageHandlers.skipAppointTab.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    /*刷新指定的webview
+      * name 对应的值:
+      *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
+      * type 对应的值:
+      *   0:当前页 1:一级页面
+      * 该方法在客户端3.0.6版本及以后版本中移除
+      */
+    refreshAppointTab: function (name, type) {
+      JyObjMessage.name = name
+      JyObjMessage.type = type
+      window.webkit.messageHandlers.refreshAppointTab.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    skipCameraWithParam: function (type) {
+      JyObjMessage.type = type
+      window.webkit.messageHandlers.skipCameraWithParam.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    // 底部导航消息总数方法
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    sendMsgCount: function (num) {
+      JyObjMessage.num = num
+      window.webkit.messageHandlers.sendMsgCount.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    // 新打开相册客户端方法
+    skipAlbumWithParam: function (type) {
+      JyObjMessage.type = type
+      window.webkit.messageHandlers.skipAlbumWithParam.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    savePic: function (imgbase64) {
+      JyObjMessage.imgbase64 = imgbase64
+      window.webkit.messageHandlers.savePic.postMessage(JyObjMessage)
+      JyObj.clearMessage()
+    },
+    //读取复制内容
+    readRight: function () {
+      return window.webkit.messageHandlers.readRight.postMessage(JyObjMessage);
+    },
+    //写入复制内容
+    wirteRight: function (txt) {
+      JyObjMessage["txt"] = txt;
+      window.webkit.messageHandlers.wirteRight.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //清除复制内容
+    clearRight: function () {
+      window.webkit.messageHandlers.clearRight.postMessage(JyObjMessage);
+    },
+    //拨打电话
+    callPhone: function (phone) {
+      JyObjMessage["phone"] = phone;
+      window.webkit.messageHandlers.callPhone.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //抖音or快手其他应用appName:应用名称;appLink:应用链接
+    openOtherAppLinks: function (appName, appLink) {
+      JyObjMessage["appName"] = appName;
+      JyObjMessage["appLink"] = appLink; // gifshow:// 快手    snssdk1128:// 抖音
+      console.log(appName, appLink)
+      window.webkit.messageHandlers.openOtherAppLinks.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // 打开微信扫码
+    openWeChartScan: function () {
+      this.openOtherAppLinks('微信', 'weixin://scanqrcode')
+    },
+    //调用接口修改消息通知的打开数
+    openActivityPage: function (url, rectype, openid) {
+      JyObjMessage["url"] = url;
+      JyObjMessage["rectype"] = rectype;
+      JyObjMessage["openid"] = openid;
+      window.webkit.messageHandlers.openActivityPage.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //清除 JyObjMessage
+    clearMessage: function () {
+      JyObjMessage = new Object();
+    },
+    //隐藏显示底部菜单栏 0:隐藏;1:显示
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    hiddenBottom: function (val) {
+      JyObjMessage["hidden"] = val;
+      window.webkit.messageHandlers.hiddenBottom.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //微信登录
+    loginByWeixin: function () {
+      window.webkit.messageHandlers.loginByWeixin.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //分享功能
+    share: function (type, title, content, link) {
+      JyObjMessage["type"] = type
+      JyObjMessage["title"] = title
+      JyObjMessage["content"] = content
+      JyObjMessage["link"] = link
+      window.webkit.messageHandlers.share.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //保存用户token
+    saveUserToken: function (val) {
+      JyObjMessage["token"] = val;
+      window.webkit.messageHandlers.saveUserToken.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //获取用户token
+    getUserToken: function () {
+      return JyObj.IosCall("getUserToken")
+    },
+    //移除用户token
+    removeUserToken: function () {
+      window.webkit.messageHandlers.removeUserToken.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //查看开关状态 是否接受消息
+    checkNoticePermission: function () {
+      return JyObj.IosCall("checkNoticePermission")
+    },
+    //打开接受消息开关
+    openSystemNotification: function () {
+      window.webkit.messageHandlers.openSystemNotification.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //获取极光推送id
+    getPushRid: function () {
+      return JyObj.IosCall("getPushRid")
+    },
+    //跳转外部链接
+    openExternalLink: function (url, title) {
+      JyObjMessage["url"] = url
+      JyObjMessage["title"] = title
+      window.webkit.messageHandlers.openExternalLink.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //获取当前版本号
+    getVersion: function () {
+      return JyObj.IosCall("getVersion")
+    },
+    alert: function (content) {
+      JyObjMessage["content"] = content
+      window.webkit.messageHandlers.alert.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //是否安装了微信
+    isInstallWeixin: function () {
+      return JyObj.IosCall("isInstallWeixin")
+    },
+    //登录加密
+    getCipherText: function (val) {
+      JyObjMessage["phone"] = val
+      return JyObj.IosCall("getCipherText", JyObjMessage)
+    },
+    //刷新首页和订阅页面
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    checkLab: function () {
+      window.webkit.messageHandlers.checkLab.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //登录成功后向客户端传参
+    loginSuccess: function (status) {
+      JyObjMessage["status"] = status
+      window.webkit.messageHandlers.loginSuccess.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //客户端登录页面点击返回 跳转到搜索首页
+    // 3.0.5以及以前版本:传''则返回到当前tab的第一个页面,传'H'则返回第一个tab的第一个页面即app首页
+    // 3.0.6以及以后版本:传''则无操作,传'H'则返回app首页(重新加载了/jyapp/free/index)
+    backUrl: function (val) {
+      JyObjMessage["status"] = val;
+      window.webkit.messageHandlers.backUrl.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //清空通知栏消息
+    clearPushMessage: function () {
+      window.webkit.messageHandlers.clearPushMessage.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //隐藏小红点
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    hideRedSpotOnMenu: function (menu) {
+      JyObjMessage["menu"] = menu;
+      window.webkit.messageHandlers.hideRedSpotOnMenu.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //显示小红点
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    showRedSpotOnMenu: function (menu) {
+      JyObjMessage["menu"] = menu;
+      window.webkit.messageHandlers.showRedSpotOnMenu.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //微信支付
+    wxPay: function (order) {
+      JyObjMessage["order"] = order;
+      window.webkit.messageHandlers.wxPay.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //支付宝支付
+    aliPay: function (order) {
+      JyObjMessage["order"] = order;
+      window.webkit.messageHandlers.aliPay.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //获取原生的推送id
+    getOtherPushRid: function () {
+      return JyObj.IosCall("getOtherPushRid")
+    },
+    //获取手机型号
+    getPhoneBrand: function () {
+      return JyObj.IosCall("getPhoneBrand")
+    },
+    //获取定位
+    getLocation: function () {
+      return JyObj.IosCall("getLocation")
+    },
+    //切换菜单
+    // 该方法在客户端3.0.6版本及以后版本中移除
+    chooseTab: function (indexTab) {
+      JyObjMessage["indexTab"] = indexTab;
+      window.webkit.messageHandlers.chooseTab.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //打开照相机
+    skipCamera: function () {
+      window.webkit.messageHandlers.skipCamera.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //打开相册
+    skipAlbum: function () {
+      window.webkit.messageHandlers.skipAlbum.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //点击返回调用
+    judgeIsHidden: function (referer) {
+      JyObjMessage["referer"] = referer;
+      window.webkit.messageHandlers.judgeIsHidden.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // 客户端清除浏览器历史记录
+    // 此方法在ios的单页面程序中使用会清除当前页面的历史,造成前进后无法后退。
+    // 所以ios谨慎使用此方法。可使用以下方案替代:(sideslipClose+不提供返回按钮)
+    clearHistory: function () {
+      window.webkit.messageHandlers.clearHistory.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // ios专属:开启侧滑
+    sideslipOpen: function () {
+      window.webkit.messageHandlers.sideslipOpen.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // ios专属:禁止侧滑
+    sideslipClose: function () {
+      window.webkit.messageHandlers.sideslipClose.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // 检查一键登录是否可用
+    // 一键登录检查是否可用值用window.checkLoginAvailableCallback(s: string)回调
+    // 返回 '0'不可用/'1'可用(注意:在安卓端环境可用情况下才会调用此方法并正确返回参数。失败情况下会走getLoginCallback并返回统一的sdk数据结构)
+    // 建议:尽量少用
+    checkLoginAvailable: function () {
+      window.webkit.messageHandlers.checkLoginAvailable.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // 唤起一键登录授权
+    // 一键登录成功或者失败后都会走window.getLoginCallback(json: string)回调
+    getLogin: function () {
+      window.webkit.messageHandlers.getLogin.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    // 唤起一键绑定手机号授权
+    // 一键绑定手机号成功或者失败后都会走window.getPhoneBindCallback(json: string)回调
+    getPhoneBind: function () {
+      window.webkit.messageHandlers.getPhoneBind.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+    //返回值 处理
+    IosCall: function (functionName, args) {
+      if (args != "" && args != undefined) {
         JyObj.clearMessage();
-      },
-      //返回值 处理
-      IosCall: function (functionName, args) {
-        if (args != "" && args != undefined) {
-          JyObj.clearMessage();
-        }
-        var payload = { "jsName": functionName, "arguments": args };
-        var res = prompt(JSON.stringify(payload));
-        if (res != "") {
-          var resObj = JSON.parse(res)
-          var type = resObj.type
-          switch (type) {
-            case "int":
-              return parseInt(resObj.value)
-            case "string":
-              return resObj.value
-            case "bool":
-              if (resObj.value == "true") {
-                return true
-              }
-              return false
-            default:
-              return ""
-          }
-        }
-        return ""
-      },
-      //查看定位开关状态 是否开启
-      checkLocationPermission: function () {
-        return JyObj.IosCall("checkLocationPermission")
-      },
-      //ios附件下载
-      //filename 文件名称不带后缀 【文件名称中不能带“/”否则会解析为多个目录】
-      //filetype 文件类型:doc word excel 等等
-      //fileurl 文件链接
-      //filesize 文件大小 字符串
-      //doc 、docx、excel 、xls 、 xlsxppt 、 pptx、 pdf、 txt、png 、PNG、jpg 、JPG 暂定这些为常见类型~支持在线预览+下载+转存
-      //其他类型仅支持下载+转存
-      downLoadFile: function (filename,filetype,fileurl,filesize) {
-        if ( filename != "" ) {
-          filename = filename.replace(/\//g,"")
+      }
+      var payload = { "jsName": functionName, "arguments": args };
+      var res = prompt(JSON.stringify(payload));
+      if (res != "") {
+        var resObj = JSON.parse(res)
+        var type = resObj.type
+        switch (type) {
+          case "int":
+            return parseInt(resObj.value)
+          case "string":
+            return resObj.value
+          case "bool":
+            if (resObj.value == "true") {
+              return true
+            }
+            return false
+          default:
+            return ""
         }
-        JyObjMessage["filename"] = filename;
-        JyObjMessage["filetype"] = filetype;
-        JyObjMessage["fileurl"] = fileurl;
-        JyObjMessage["filesize"] = filesize;
-        window.webkit.messageHandlers.downLoadFile.postMessage(JyObjMessage);
-        JyObj.clearMessage();
-      },
-    }
+      }
+      return ""
+    },
+    //查看定位开关状态 是否开启
+    checkLocationPermission: function () {
+      return JyObj.IosCall("checkLocationPermission")
+    },
+    //ios附件下载
+    //filename 文件名称不带后缀 【文件名称中不能带“/”否则会解析为多个目录】
+    //filetype 文件类型:doc word excel 等等
+    //fileurl 文件链接
+    //filesize 文件大小 字符串
+    //doc 、docx、excel 、xls 、 xlsxppt 、 pptx、 pdf、 txt、png 、PNG、jpg 、JPG 暂定这些为常见类型~支持在线预览+下载+转存
+    //其他类型仅支持下载+转存
+    downLoadFile: function (filename,filetype,fileurl,filesize) {
+      if ( filename != "" ) {
+        filename = filename.replace(/\//g,"")
+      }
+      JyObjMessage["filename"] = filename;
+      JyObjMessage["filetype"] = filetype;
+      JyObjMessage["fileurl"] = fileurl;
+      JyObjMessage["filesize"] = filesize;
+      window.webkit.messageHandlers.downLoadFile.postMessage(JyObjMessage);
+      JyObj.clearMessage();
+    },
+  }
+}
+
+$(function () {
+  if (mySysIsIos()) {
     fixIOSInputBugs()
   }
   if (isIphoneX()) {
@@ -1479,9 +1603,14 @@ function loginSuccess (result, loginType) {
 
   // 清除订阅页面缓存
   sessionStorage.removeItem('$data-historypush')
-  JyObj.refreshAppointTab('subscribe', 1)
 
-  JyObj.saveUserToken(result.sign);
+  try {
+    JyObj.refreshAppointTab('subscribe', 1)
+    JyObj.saveUserToken(result.sign);
+  } catch (error) {
+    console.log(error)
+  }
+
   // 数据包默认选中企业需请求默认企业接口
   try {
     window.onlyUserID =JyObj.getUserToken()
@@ -1592,11 +1721,11 @@ function afterLoginSuccess (type, canBack) {
     localStorage.reLogin = "1";
   }
   try {
-    JyObj.refreshAppointTab('me', 1)
+    JyObj.refreshAppointTab('me', 1);
+    JyObj.loginSuccess(type);
   } catch (e) {
     console.log(e)
   }
-  JyObj.loginSuccess(type);
 }
 
 //ios JyObj对象加载完成回调

文件差异内容过多而无法显示
+ 1 - 0
src/jfw/modules/app/src/web/staticres/jyapp/js/numberAuth-web-sdk.js


+ 28 - 10
src/jfw/modules/app/src/web/staticres/jyapp/me/css/login.css

@@ -1,9 +1,8 @@
 @charset "UTF-8";
 .login_main{
   margin: 12px 12px 0 12px;
-  padding: .34rem 0 .68rem;
-  /*background: #fff;*/
-  box-shadow: 0px 2px 8px rgba(54, 147, 179, 0.051);
+  padding: .34rem 0;
+  /* box-shadow: 0px 2px 8px rgba(54, 147, 179, 0.051); */
   border-radius: 8px;
 }
 .login {
@@ -28,7 +27,7 @@
  	padding-left: 0px;
     top: .5rem;
     position: relative;
-	z-index: 2;
+	z-index: 1;
 	background-color: transparent;
 }
 .login div.onePass {
@@ -46,15 +45,33 @@
 }
 
 .login .forget {
-  margin-top: 12px;
+  margin-top: 22px;
   text-align: center;
   font-size: 14px;
-    color: #9B9CA3;
-    line-height:20px;
+  color: #9B9CA3;
+  line-height:20px;
 }
 .login .btn{
   margin-top: 24px;
+  border-radius: .16rem;
+}
+
+.forget.flex {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-top: 12px;
 }
+.forget.flex 
+.forget.center {
+  justify-content: center;
+  text-align: center;
+}
+
+.forget:not(.flex) .fast-login-open-link {
+  font-size: 16px;
+}
+
 
 .login .forget a {
   color: #2ABED1;
@@ -106,7 +123,7 @@
   display: flex;
   justify-content: center;
   align-items: center;
-  margin-top:24px;
+  margin-top:20px;
   font-family: 'PingFang SC';
   font-style: normal;
   font-weight: 400;
@@ -152,6 +169,7 @@
 .header-tab>a{
 	display: table-cell;
 	width: 50%;
+  font-size: .32rem;
 }
 .header-tab>i{
 	position: absolute;
@@ -177,7 +195,8 @@
 	top: .4rem;
     position: absolute;
 	right: 0px;
-	z-index: 3;
+  font-size: .32rem;
+  z-index: 2;
 }
 .login .closeQc{
 	margin-top: -15px;
@@ -205,7 +224,6 @@
 	position: absolute;
     font-size: .32rem;
     top: .34rem;
-    z-index: 1;
 	color: rgba(0,0,0,0.35);
 	transition: all 0.3s;
 }

二进制
src/jfw/modules/app/src/web/staticres/jyapp/me/images/register_logo.png


二进制
src/jfw/modules/app/src/web/staticres/jyapp/me/images/register_logo2.png


+ 72 - 0
src/jfw/modules/app/src/web/staticres/jyapp/me/js/login.js

@@ -0,0 +1,72 @@
+var fastLogin = {}
+if (utils.$envs.inApp) {
+  fastLogin = new Vue({
+    delimiters: ['${', '}'],
+    mixins: [loadingMixin, toastMixin, fLogin, fastLoginConfApp],
+    el: '#fast-login-container',
+  })
+} else {
+  fastLogin = new Vue({
+    delimiters: ['${', '}'],
+    mixins: [loadingMixin, toastMixin, fLogin, fastLoginConfH5],
+    el: '#fast-login-container',
+  })
+}
+
+var loginEvents = {
+  init: function () {
+    this.bindEvents()
+    this.checkFastButtonShow()
+  },
+  bindEvents: function () {
+    if (utils.$envs.inApp) {
+      this.initAppEvents()
+    } else {
+      this.initH5Events()
+    }
+  },
+  checkFastButtonShow: function () {
+    if (utils.$envs.inApp) {
+      // 如果app版本号大于3.0.5则展示
+      var currentVersion = ''
+      var targetVersion = '3.0.6'
+      try {
+        currentVersion = JyObj.getVersion()
+        if (currentVersion) {
+          var c = compareVersion(currentVersion, targetVersion)
+          this.fastButtonShow(!c)
+        }
+      } catch (error) {
+        console.log(error)
+      }
+    } else {
+      this.fastButtonShow(true)
+    }
+  },
+  fastButtonShow: function (f) {
+    if (f) {
+      $('.forget').removeClass('center').find('.fast-login-open-link').show()
+    } else {
+      $('.forget').addClass('center').find('.fast-login-open-link').hide()
+    }
+  },
+  checkAutoFastLogin: function (auto) {
+    var autoFastLogin = utils.getParam('autoFastLogin')
+    if (autoFastLogin || auto) {
+      fastLogin.disabledToast()
+      $('.fast-login-open-link').trigger('click')
+    }
+  },
+  initAppEvents: function () {
+    $('.fast-login-open-link').on('click', fastLogin.getLogin)
+    this.checkAutoFastLogin(true)
+  },
+  initH5Events: function () {
+    $('.fast-login-open-link').on('click', fastLogin.getAuthInfo)
+    this.checkAutoFastLogin(true)
+  },
+}
+
+$(function () {
+  loginEvents.init()
+})

+ 39 - 12
src/jfw/modules/app/src/web/staticres/jyapp/me/js/phone_bind.js

@@ -7,6 +7,7 @@ var vm = new Vue({
         mode: '',  // 是否跳转强制绑定
         from: '',  // 是否通过iframe进入
         token: '',  // 账号合并需要的token
+        fastButton: false, // 一键绑定按钮是否展示
         userInfo: {
             company: ''
         },
@@ -100,6 +101,7 @@ var vm = new Vue({
 
         if (this.type === 'bind') {
             this.getUserInfo()
+            this.checkFastButtonShow()
         }
         if (this.mode === 'mergeBind') {
             this.needShowEntItem = false
@@ -119,6 +121,27 @@ var vm = new Vue({
         }
     },
     methods: {
+        checkFastButtonShow: function () {
+          if (utils.$envs.inApp) {
+            // 如果app版本号大于3.0.5则展示
+            var currentVersion = ''
+            var targetVersion = '3.0.6'
+            try {
+              currentVersion = JyObj.getVersion()
+              if (currentVersion) {
+                var c = compareVersion(currentVersion, targetVersion)
+                this.fastButtonShow(!c)
+              }
+            } catch (error) {
+              console.log(error)
+            }
+          } else {
+            this.fastButtonShow(true)
+          }
+        },
+        fastButtonShow: function (f) {
+          this.fastButton = !!f
+        },
         // 注册埋点z
         trackClick (c_type) {
           if (!c_type) return
@@ -392,23 +415,27 @@ var vm = new Vue({
         onCancel: function () {
             history.go(-1)
         },
+        bindPhoneSuccess: function (state) {
+            var _this = this
+            if (state == 1) {
+                // 绑定手机号完成后,如果已经填写过公司。则不发送提交公司的请求
+                // 可以直接判断计算属性showEntItem,来判断需不需要填写公司
+                if (_this.showEntItem) {
+                    _this.setCompany(_this.afterSetPhoneSuccess)
+                } else {
+                    _this.afterSetPhoneSuccess()
+                }
+            } else if (state == 2) {
+                location.replace('/jyapp/frontPage/userMerge/free/index?from=bindPhone&token=' + _this.token)
+            }
+        },
         onSubmit: function () {
             var _this = this
             if (this.type === 'bind') {
                 this.trackClick('绑定-立即绑定')
                 console.log('绑定手机号...')
                 this.setPhone(function (state) {
-                    if (state == 1) {
-                        // 绑定手机号完成后,如果已经填写过公司。则不发送提交公司的请求
-                        // 可以直接判断计算属性showEntItem,来判断需不需要填写公司
-                        if (_this.showEntItem) {
-                            _this.setCompany(_this.afterSetPhoneSuccess)
-                        } else {
-                            _this.afterSetPhoneSuccess()
-                        }
-                    } else if (state == 2) {
-                        location.replace('/jyapp/frontPage/userMerge/free/index?from=bindPhone&token=' + _this.token)
-                    }
+                    _this.bindPhoneSuccess(state)
                 })
             } else {
                 console.log('更换手机号...')
@@ -424,7 +451,7 @@ var vm = new Vue({
 			if (this.from == 'treasurebox') {
 				document.querySelector('.j-header .header-left').removeEventListener('click', goBack)
 				$('.j-header .header-left').on('click', function(){
-					JyObj.skipAppointTab('search');
+					JyObj.backUrl('H');
 				})
             }
         },

+ 1 - 1
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_index_new.js

@@ -374,7 +374,7 @@ $(function () {
       let switchProduct = sessionStorage.getItem('switch-product')
       if (switchProduct) {
         if (switchProduct == 'bigmember') {
-          //   判断是否是从百宝箱跳转到订阅设置
+          //   判断是否是从工作台跳转到订阅设置
           if (document.referrer.indexOf('/jyapp/jylab/index') != -1) {
             sessionStorage.setItem('switch-product', 'supervip')
             res = r

+ 7 - 3
src/jfw/modules/app/src/web/templates/big-member/page_full.html

@@ -283,9 +283,13 @@
     if (userLoginStatus) {
       if (isMember) {
         try {
-          JyObj.refreshAppointTab('box', 1)
-          JyObj.backUrl("")
-          JyObj.skipAppointTab('box')
+          if (appVersionGt305()) {
+            skipAppointTab('box')
+          } else {
+            JyObj.refreshAppointTab('box', 1)
+            JyObj.backUrl("")
+            JyObj.skipAppointTab('box')
+          }
         } catch (e) {
           console.warn(e)
         }

+ 7 - 3
src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html

@@ -316,9 +316,13 @@
                         if (res && res.data) {
                             if (res.data.memberStatus > 0){
                               try {
-                                JyObj.refreshAppointTab('box', 1)
-                                JyObj.backUrl("")
-                                JyObj.skipAppointTab('box')
+                                if (appVersionGt305()) {
+                                  skipAppointTab('box')
+                                } else {
+                                  JyObj.refreshAppointTab('box', 1)
+                                  JyObj.backUrl("")
+                                  JyObj.skipAppointTab('box')
+                                }
                               } catch (e) {
                                 console.warn(e)
                               }

+ 3 - 3
src/jfw/modules/app/src/web/templates/common/js.html

@@ -2,9 +2,9 @@
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}"></script>
 <script>
   // 屏蔽console.log输出, 如需查看手动 localStorage.setItem('env', 'development') 刷新页面
-  if (localStorage.getItem('env') !== 'development') {
-      console.log = function () {}
-  }
+  // if (localStorage.getItem('env') !== 'development') {
+  //     console.log = function () {}
+  // }
   // 全局模版变量
   window.goTemplateData = {
     params: {{.T}},

+ 2 - 2
src/jfw/modules/app/src/web/templates/frontRouter/userMerge/free/confirm.html

@@ -192,8 +192,8 @@
                             choose: choose.join('#')
                         },
                         success:function (res) {
-                            if (res.error_msg == 0) {
-                                callback && callback()
+                            if (res.error_code == 0) {
+                                callback && callback(res)
                             }
                         },
                         complete: function () {

+ 3 - 0
src/jfw/modules/app/src/web/templates/me/account.html

@@ -10,6 +10,9 @@
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>账户与安全</title>
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js"></script>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.css">
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css">
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/logoff/css/base.css?v={{Msg "seo" "version"}}">

+ 9 - 2
src/jfw/modules/app/src/web/templates/me/account/phone_bind.html

@@ -9,6 +9,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/public.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/j-icons.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/css/fast-login.css?v={{Msg "seo" "version"}}"/>
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/css/fast-bind.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/ad/css/index.css?v={{Msg "seo" "version"}}'>
     <style>
         .bind-phone-header {
@@ -191,6 +193,9 @@
                         <!-- <button class="j-button-cancel" @click="onCancel">取消</button> -->
                         <button class="j-button-confirm" @click="onSubmit" :disabled="confirmButtonDisabled">立即绑定</button>
                     </div>
+                    <div class="fast-login-container" v-if="type === 'bind'" v-show="fastButton">
+                        <button class="fast-login-text fast-login-open-link highlight-text">本机号码一键绑定</a>
+                    </div>
                     <div class="tip-text" v-if="showBottomTip">
                         根据《中华人民共和国网络安全法》第二十四条及相关法律规定,请您填写正确的手机号进行认证,获取更多网络服务。
                     </div>
@@ -201,10 +206,13 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
+    <script src="//cdn-common.jianyu360.com/cdn/lib/number-auth-web-sdk/2.0.10/numberAuth-web-sdk.js"></script>
     {{include "/big-member/commonjs.html"}}
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/js/phone_bind.js?v={{Msg "seo" "version"}}'></script>
     <script src='/common-module/ad/js/index.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/js/fast-login.js?v={{Msg "seo" "version" }}'></script>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/js/fast-bind.js?v={{Msg "seo" "version" }}'></script>
     <!--S 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
     <script src="//cdn-common.jianyu360.com/cdn/lib/jquery/3.5.1/jquery.min.js"></script>
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/fotter.js?v={{Msg "seo" "version" }}'></script>
@@ -227,8 +235,7 @@
       }
       function afterClickBack(){
         if (utils.getParam('from') == "treasurebox"){
-					JyObj.refreshAppointTab('search', 1)
-					JyObj.skipAppointTab('search');
+            JyObj.backUrl('H');
         }
       }
     </script>

+ 106 - 67
src/jfw/modules/app/src/web/templates/me/login.html

@@ -4,10 +4,13 @@
 	{{include "/common/meta.html"}}
     <meta name="description" content="登录剑鱼标讯,免费查看全国招标采购项目详情。">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
-<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
+  <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}"/>
+	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/public.css?v={{Msg "seo" "version"}}"/>
+  <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/login.css?v={{Msg "seo" "version"}}"/>
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/header.css?v={{Msg "seo" "version"}}"/>
+	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/css/fast-login.css?v={{Msg "seo" "version"}}"/>
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/ad/css/index.css?v={{Msg "seo" "version"}}"/>
 	<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js" type="text/javascript" charset="utf-8"></script>
 	{{include "/common/js.html"}}
@@ -23,7 +26,7 @@
 		display: flex;
 		justify-content: center;
 		/* padding-right: 44px; */
-    margin-top: .32rem;
+		margin: .32rem 0;
 		width: 100%;
 		height: 36px;
 	}
@@ -39,7 +42,7 @@
 		height: 100%;
 	}
 	.rules .selectlabel .agreeleft{
-		margin-left: 8px;
+		margin-left: 16px;
 	}
 	.rules .checkbox-custom {
 		position: absolute;
@@ -119,69 +122,90 @@
 
 </style>
 <body>
-	<div id="header" class="header-login">
-		<!-- <a href="javascript:;" class="cancle"><span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span></a>
-		<h2>欢迎使用剑鱼标讯</h2> -->
-    <a href="javascript:;" class="cancle">
-      <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/back.png?v={{Msg "seo" "version"}}" alt="" />
-    </a>
-    <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/register_logo.png?v={{Msg "seo" "version"}}" alt="" />
-	</div>
-  <div class="active-tip-group" style="display: none;">
-    <img src="" alt="二维码">
-  </div>
-  <div class="login_main">
-    <span class="header-tab">
-      <a class="header-tab-active">验证码登录/注册</a>
-      <a>密码登录</a>
-      <i></i>
-    </span>
-    <div class="login">
-      <div class="pass">
-        <lable>手机号码</lable>
-        <input type="tel" name="" id="tel" class="tel" value=""/>
-        <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
+  <div class="page-container">
+    <div class="page-main">
+      <div id="header" class="header-login">
+        <!-- <a href="javascript:;" class="cancle"><span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span></a>
+        <h2>欢迎使用剑鱼标讯</h2> -->
+        <a href="javascript:;" class="cancle">
+          <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/back.png?v={{Msg "seo" "version"}}" alt="" />
+        </a>
+        <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/register_logo.png?v={{Msg "seo" "version"}}" alt="" />
       </div>
-      <div class="onePass pass">
-        <lable>密码</lable>
-        <input type="password" id="pwd" value=""/>
-        <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
-        <span class="jyapp-icon jyapp-icon-biyan"></span>
+      <div class="active-tip-group" style="display: none;">
+        <img src="" alt="二维码">
       </div>
-      <div class="pass code">
-        <lable>验证码</lable>
-        <input type="tel" id="identCode" maxlength="6"/>
-        <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
-        <span id="sendIdentCode">获取验证码</span>
+	  <!-- <div class="login-callback-text">测试返回值</div> -->
+      <div class="login_main">
+		<!-- 一键登录使用sdk内置页面 -->
+        <div class="fast-login" id="fast-login" style="display: none;">
+          <div class="fast-phone-container client-verify-container">
+            <div class="fast-phone-number client-verify" >
+              <span class="phone-number-prefix">phoneNumberPrefix</span>
+              <span class="phone-number-mask">****</span>
+              <span class="phone-number-suffix">phoneNumberPrefix</span>
+            </div>
+            <div class=" fast-phone-text">xxxx提供认证服务</div>
+          </div>
+          <div class="verify-button-group">
+            <button class="verify-button verify-confirm">一键登录/注册</button>
+            <button class="verify-button verify-cancel">其他手机号登录/注册</button>
+          </div>
+        </div>
+        <div class="input-login">
+          <span class="header-tab">
+            <a class="header-tab-active">验证码登录/注册</a>
+            <a>密码登录</a>
+            <i></i>
+          </span>
+          <div class="login">
+            <div class="pass">
+              <lable>手机号码</lable>
+              <input type="tel" name="" id="tel" class="tel" value=""/>
+              <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
+            </div>
+            <div class="onePass pass">
+              <lable>密码</lable>
+              <input type="password" id="pwd" value=""/>
+              <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
+              <span class="jyapp-icon jyapp-icon-biyan"></span>
+            </div>
+            <div class="pass code">
+              <lable>验证码</lable>
+              <input type="tel" id="identCode" maxlength="6"/>
+              <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
+              <span id="sendIdentCode">获取验证码</span>
+            </div>
+            <button type="button" id="btn" class="disabled btn" />登录 / 注册</button>
+            <div class="forget center">
+              <a class="forget-password" href="javascript:void(0)">忘记密码?</a>
+      			<a href="javascript:void(0)" class="fast-login-open-link" style="display: none;">本机号码一键登录</a>
+                <!-- <span class="tip">未注册用户验证通过后自动注册</span> -->
+            </div>
+          </div>
+        </div>
       </div>
-      <button type="button" id="btn" class="disabled btn" />登录 / 注册</button>
-      <div class="forget">
-        <a class="forget-password" href="javascript:void(0)">忘记密码?</a>
-<!--        <a href="javascript:void(0)" class="register">立即注册</a>-->
-          <span class="tip">未注册用户验证通过后自动注册</span>
-        <div class="clearfix"></div>
+      <!--微信登录start-->
+      <div class="wx">
+        <div class="third_title">
+          <div class="third_line"></div>
+          <div style="padding: 0 12px;">第三方登录</div>
+          <div class="third_line"></div>
+        </div>
+        <div class="third_wx">
+          <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/login_wx.png?v={{Msg "seo" "version"}}">
+        </div>
+      </div>
+      <!--微信登录end-->
+      <div class="rules">
+        <label for="ifagree" class="selectlabel">
+          <input type="checkbox" id="ifagree">
+          <span class="checkbox-custom selectcheck"></span>
+          <span class="agreeleft selectcheck">已阅读并同意</span><a id="permission">《使用协议》</a><a id="privacy">《隐私政策》</a>
+        </label>
       </div>
     </div>
   </div>
-  <!--微信登录start-->
-  <div class="wx">
-    <div class="third_title">
-      <div class="third_line"></div>
-      <div style="padding: 0 12px;">第三方登录</div>
-      <div class="third_line"></div>
-    </div>
-    <div class="third_wx">
-      <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/login_wx.png?v={{Msg "seo" "version"}}">
-    </div>
-  </div>
-  <!--微信登录end-->
-  <div class="rules">
-    <label for="ifagree" class="selectlabel">
-      <input type="checkbox" id="ifagree">
-      <span class="checkbox-custom selectcheck"></span>
-      <span class="agreeleft selectcheck">已阅读并同意</span><a id="permission">《使用协议》</a><a id="privacy">《隐私政策》</a>
-    </label>
-  </div>
   <div class="toast_readtips" style="display: none;">
     <div class="toast_content">
       请阅读并同意《使用协议》和《隐私政策》
@@ -189,6 +213,9 @@
   </div>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/ad/js/index.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
+  <script src="//cdn-common.jianyu360.com/cdn/lib/number-auth-web-sdk/2.0.10/numberAuth-web-sdk.js"></script>
+  <script src="//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js"></script>
+  <script src="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js"></script>
     <!--S 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/fotter.js?v={{Msg "seo" "version" }}'></script>
     <!--E 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
@@ -247,6 +274,16 @@
     sessionStorage.removeItem('comname')
     sessionStorage.removeItem('noDisabled')
     sessionStorage.removeItem('beforePhone')
+
+	function getPushRid () {
+		var pushRid = ''
+		try {
+			pushRid = JyObj.getPushRid()
+		} catch (error) {
+			console.log(error)
+		}
+		return pushRid
+	}
     // e-- 删除注册页缓存 -- e
     function checkHideBottomTab () {
       hideNum++
@@ -280,7 +317,7 @@
 				}
 			})
 
-			$(".forget>a").on("tap",function(){
+			$(".forget .forget-password").on("tap",function(){
 				if($(this).index() == 0){
 					window.location.href = "/jyapp/free/forgetPwd";
 				}else{
@@ -300,14 +337,14 @@
 					$(".login .code").css("display","none");
 					$(".header-tab>i").css("left",left_2);
                   $('.forget-password').show()
-                  $('.forget .tip').hide()
+				  $('.login .forget').addClass('flex')
                   $('#btn').text('登录')
 				}else{
 					$(".login .onePass").hide();
 					$(".login .code").css("display","table");
 					$(".header-tab>i").css("left",left_1);
 					$('.forget-password').hide()
-                    $('.forget .tip').show()
+					$('.login .forget').removeClass('flex')
                    $('#btn').text('登录 / 注册')
 				}
 				changeBtnStatus();
@@ -438,7 +475,7 @@
                         reqType:"phoneLogin",
                         phone:phone,
                         password:$(".onePass input").val(),
-                        rid:JyObj.getPushRid(),
+                        rid:getPushRid(),
                         oid:getOtherPushId(),
                         phoneType:getPhoneType(),
                         channel:getChannel(),
@@ -471,8 +508,8 @@
 					}else{
                       trackClick('注册行为-登录/注册')
 					  // 验证码登录/注册
-                      // {reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord}
-						$.post("/jyapp/free/login",{reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord},function(r){
+                      // {reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:pushRid,oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord}
+						$.post("/jyapp/free/login",{reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord},function(r){
 							if(r.status==1){
 								if(localStorage){
 									localStorage.loginPhone = phone;
@@ -564,7 +601,7 @@
 			$.ajax({
 				url: "/jyapp/free/wxLogin",
 				type: "post",
-				data: {param:wxSign,rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord},
+				data: {param:wxSign,rid:getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord},
 				dataType: "json",
 				success: function(r){
 					if(r.status == 1){
@@ -671,6 +708,8 @@
 			}
 		}
 	</script>
+	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/js/fast-login.js?v={{Msg "seo" "version" }}'></script>
+	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/js/login.js?v={{Msg "seo" "version" }}'></script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}
 </body>

+ 1 - 1
src/jfw/modules/app/src/web/templates/me/mine.html

@@ -309,7 +309,7 @@
         <div class="tip-box">
           <h3>功能搬家提醒</h3>
           <div class="tip-content">
-            “百宝箱”全新升级,“我的”部分功能(例如:项目关注、数据导出记录等)已搬家至“百宝箱”,请前往“百宝箱”了解并使用剑鱼全部功能。
+            “工作台”全新升级,“我的”部分功能(例如:项目关注、数据导出记录等)已搬家至“工作台”,请前往“工作台”了解并使用剑鱼全部功能。
           </div>
           <div class="tip-confirm-btn" onClick="mine.showMoveDialog('know')">我知道了</div>
           <div class="triangle"></div>

+ 3 - 0
src/jfw/modules/app/src/web/templates/me/permissions.html

@@ -17,6 +17,9 @@
     <meta name="format-detection" content="telephone=no">
     <link rel="icon" href="/favicon.ico">
     <title>系统权限设置</title>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />

+ 3 - 0
src/jfw/modules/app/src/web/templates/me/privacy.html

@@ -17,6 +17,9 @@
     <meta name="format-detection" content="telephone=no">
     <link rel="icon" href="/favicon.ico">
     <title>隐私</title>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />

+ 1 - 2
src/jfw/modules/app/src/web/templates/me/register.html

@@ -330,8 +330,7 @@
         var needBackHome = getParam('source') === 'guide'
         if (needBackHome) {
           try {
-            JyObj.refreshAppointTab('search', 1)
-            JyObj.skipAppointTab('search')
+            JyObj.backUrl('H')
           } catch (e) {}
         } else {
           history.go(-1);

+ 4 - 1
src/jfw/modules/app/src/web/templates/me/setting.html

@@ -8,8 +8,11 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>设置</title>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
-<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
+    <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" />
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.css">
     <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/logoff/css/base.css?v={{Msg "seo" "version"}}">

+ 18 - 3
src/jfw/modules/app/src/web/templates/staticpage/privacy_rules.html

@@ -73,9 +73,9 @@
                     <h3 class="title">剑鱼标讯隐私政策</h3>
                     <p style="font-size: 18px;text-align: center;">引言</p>
                     <p style="margin: 14px 0;">
-                        更新日期:2022年11月30
+                        更新日期:2023年9月4
                         <br>
-                        生效日期:2022年11月30
+                        生效日期:2023年9月4
                     </p>
                     <p style="text-indent: 20px;"><span  id="companyName">北京剑鱼信息技术有限公司</span>(以下简称“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务(“剑鱼标讯”)时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(以下简称“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
                     </p>
@@ -131,6 +131,9 @@
                     <p style="text-indent: 20px;">
                       我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、公司名称、微信授权,拟使用的用户名和密码,用于创建账号。
                     </p>
+                    <p style="text-indent: 20px;">
+                      当您使用本机号码“一键登录”功能时,通过您以链接、点击等方式明示同意后,通信运营商会将您的手机号码发送给我们,便于我们为您提供快捷的登录服务,请您在操作前注意查看通信运营商的服务条款。手机号码属于敏感信息,如果您拒绝提供将无法使用“一键登录”方式登录我们的产品,但不影响您通过其他方式进行注册和登录。
+                    </p>
                     <p style="font-size: 14px;">2、帮助您使用信息订阅推送服务</p>
                     <p style="text-indent: 20px;">
                       剑鱼标讯提供行业标讯订阅及消息推送服务,为了向您提供精准的标讯信息内容、活动信息,我们需要获取您的个人设备信息(设备品牌、设备型号、设备序列号、IMEI、Android ID)、电子邮件信息,并通过使用您的订阅、关注设置,帮助您完成标讯信息订阅服务。如您不接受信息订阅推送功能,您可以直接在“APP-我的-设置-推送设置”中关闭。
@@ -319,7 +322,19 @@
                     <br>隐私政策链接:
                     https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8
                   </p>
-                    <br>
+                  <p style="text-indent: 20px;">
+                    (9) 阿里云号码认证SDK
+                  </p>
+                  <p style="padding-left: 30px;word-break: break-all;">
+                    SDK官网:https://www.aliyun.com/product/dypns
+                    <br>第三方主体:阿里巴巴云计算(北京)有限公司
+                    <br>收集的信息:网络类型、设备信息(含IP地址、设备制造商、设备型号、手机操作系统、SIM卡信息SIM State、SIM卡信息ICCID)。
+                    <br>收集目的:支持用户通过本机号码实现一键登录。
+                    <br>使用范围:仅限于用户使用本机号码一键登录时。
+                    <br>收集方式:APP内代码部署。
+                    <br>隐私政策链接: https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112211045_86198.html?spm=a2c4g.11186623.0.0.7d5e55cb220omM
+                  </p>
+                  <br>
                     <p style="font-size: 16px;">(二)转让</p>
                     <p style="text-indent: 20px;">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>
                     <p>1、事先获得您明确的同意或授权;</p>

+ 17 - 2
src/jfw/modules/app/src/web/templates/staticpage/privacy_rules_client.html

@@ -66,9 +66,9 @@
                 <h3 class="title">剑鱼标讯隐私政策</h3>
                 <p style="font-size: 18px;text-align: center;">引言</p>
                 <p style="margin: 14px 0;">
-                        更新日期:2022年11月30
+                        更新日期:2023年9月4
                     <br>
-                        生效日期:2022年11月30
+                        生效日期:2023年9月4
                 </p>
                     <p style="text-indent: 20px;"><span  id="companyName">北京剑鱼信息技术有限公司</span>(以下简称“我们”)非常重视用户的隐私和个人信息保护。您在使用我们的产品与/或服务(“剑鱼标讯”)时,我们可能会收集和使用您的相关信息。我们希望通过《剑鱼标讯隐私政策》(以下简称“本隐私政策”)向您说明我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、删除和保护这些信息的方式。
                 </p>
@@ -124,6 +124,9 @@
                     <p style="text-indent: 20px;">
                       我们通过剑鱼标讯平台账号(以下简称“账号”)为您提供服务,为成为注册用户,您需要提供手机号码、公司名称、微信授权,拟使用的用户名和密码,用于创建账号。
                     </p>
+                    <p style="text-indent: 20px;">
+                      当您使用本机号码“一键登录”功能时,通过您以链接、点击等方式明示同意后,通信运营商会将您的手机号码发送给我们,便于我们为您提供快捷的登录服务,请您在操作前注意查看通信运营商的服务条款。手机号码属于敏感信息,如果您拒绝提供将无法使用“一键登录”方式登录我们的产品,但不影响您通过其他方式进行注册和登录。
+                    </p>
                     <p style="font-size: 14px;">2、帮助您使用信息订阅推送服务</p>
                     <p style="text-indent: 20px;">
                       剑鱼标讯提供行业标讯订阅及消息推送服务,为了向您提供精准的标讯信息内容、活动信息,我们需要获取您的个人设备信息(设备品牌、设备型号、设备序列号、IMEI、Android ID)、电子邮件信息,并通过使用您的订阅、关注设置,帮助您完成标讯信息订阅服务。如您不接受信息订阅推送功能,您可以直接在“APP-我的-设置-推送设置”中关闭。
@@ -312,6 +315,18 @@
                     <br>隐私政策链接:
                     https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8
                   </p>
+                  <p style="text-indent: 20px;">
+                    (9) 阿里云号码认证SDK
+                  </p>
+                  <p style="padding-left: 30px;word-break: break-all;">
+                    SDK官网:https://www.aliyun.com/product/dypns
+                    <br>第三方主体:阿里巴巴云计算(北京)有限公司
+                    <br>收集的信息:网络类型、设备信息(含IP地址、设备制造商、设备型号、手机操作系统、SIM卡信息SIM State、SIM卡信息ICCID)。
+                    <br>收集目的:支持用户通过本机号码实现一键登录。
+                    <br>使用范围:仅限于用户使用本机号码一键登录时。
+                    <br>收集方式:APP内代码部署。
+                    <br>隐私政策链接: https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112211045_86198.html?spm=a2c4g.11186623.0.0.7d5e55cb220omM
+                  </p>
                 <br>
                 <p style="font-size: 16px;">(二)转让</p>
                 <p style="text-indent: 20px;">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</p>

+ 1 - 0
src/jfw/modules/app/src/web/templates/tags/index.html

@@ -48,6 +48,7 @@
   <div class="loading-wrapper" style="display: none;">
     <div class="loading-icon"></div>
   </div>
+  {{include "/weixin/tabbar.html"}}
   {{include "/tags/template/tag-footer-common-assets.html"}}
   <script>
     var templateData = {

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

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

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

@@ -6,7 +6,7 @@
 <meta name="author" content="剑鱼标讯">
 <meta name="applicable-device" content="mobile" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, viewport-fit=cover">
 <meta name="browsermode" content="application">
 <meta name="x5-orientation" content="portrait">
 <meta name="screen-orientation" content="portrait">

+ 1 - 1
src/jfw/modules/app/src/web/templates/tags/template/tag-register-login-group.html

@@ -5,5 +5,5 @@
   {{if .T.areaTopTip}}
     <h1 class="header-title">{{.T.areaTopTip}}</h1>
   {{end}}
-  <a class="seo-button theme-main" href="/jyapp/free/login?url=/jyapp/jylab/mainSearch">登录/注册</a>
+  <a class="seo-button theme-main" href="/jyapp/free/login?DisUrl=/jyapp/jylab/mainSearch">登录/注册</a>
 </section>

+ 3 - 0
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html

@@ -9,6 +9,9 @@
     <meta name="apple-mobile-web-app-capable" content="yes">
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js"></script>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/base.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/iconfont/iconfont.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/public.css?v={{Msg "seo" "version"}}">

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

@@ -1,9 +1,14 @@
-
-<link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+<link rel="stylesheet" href='//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css' />
 <style>
   [v-cloak] {
       display: none !important;
   }
+  #tabMesg {
+    position: fixed;
+    z-index: 999;
+    bottom: 0;
+    left: 0;
+  }
   #tabMesg .van-tabbar-item__icon img {
     width: .48rem;
     height: .48rem;
@@ -15,6 +20,26 @@
   #tabMesg .a-badge .van-tabbar-item__icon .van-info{
     display: none;
   }
+  body.inject-app-tabbar .back-to-top {
+    transform: translateY(-20px);
+  }
+  body.inject-app-tabbar .tag-footer-container .footer-card-line.copyright {
+    padding-bottom: 20px;
+  }
+  body.inject-app-tabbar .tag-footer-container.fixed {
+    bottom: 50px;
+  }
+  /* 兼容ios底部 */
+  @supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
+    body.inject-app-tabbar .tag-footer-container .footer-card-line.copyright {
+      padding-bottom: calc(20px +  constant(safe-area-inset-bottom));
+      padding-bottom: calc(20px +  env(safe-area-inset-bottom));
+    }
+    body.inject-app-tabbar .tag-footer-container.fixed {
+      bottom: calc(50px +  constant(safe-area-inset-bottom));
+      bottom: calc(50px +  env(safe-area-inset-bottom));
+    }
+  }
 </style>
 
 <div id="tabMesg" v-cloak>
@@ -22,127 +47,156 @@
     <van-tabbar-item @click="routeHref(index)" v-for="(item, index) in tabList" :key="index" :badge="index === 2 ? getMsgCount : ''">
       <span>{item.label}</span>
       <template #icon="props">
-        <img v-show="!props.active" :src="'/jyapp/images/tabbar/' + item.icon + '.png'" />
-        <img v-show="props.active" :src="'/jyapp/images/tabbar/' + item.icon + '_active.png'" />
+        <img v-show="!props.active" :src="'/jyapp/images/tabbar/' + item.icon + '.png?v=' + version" />
+        <img v-show="props.active" :src="'/jyapp/images/tabbar/' + item.icon + '_active.png?v=' + version" />
       </template>
     </van-tabbar-item>
   </van-tabbar>
 </div>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
-<script src='{{Msg "seo" "cdn"}}/common-module/messageCenter/js/func.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/messageCenter/js/func.js?v={{Msg "seo" "version"}}'></script>
 <script>
-new Vue({
-  el: '#tabMesg',
-  delimiters: ['{', '}'],
-  data: function () {
-    return {
-			tabActive: 0,
-			counts: 0,
-      tabList: [
-        {
-          label: '首页',
-          icon: 'home',
-          url: '/jy_mobile/tabbar/home',
-          index: 0
-        },
-        {
-          label: '订阅',
-          icon: 'book',
-          url: '/jy_mobile/tabbar/subscribe',
-          index: 1
-        },
-        {
-          label: '消息',
-          icon: 'mesg',
-          url: '/jyapp/frontPage/messageCenter/sess/index',
-          index: 2
-        },
-        {
-          label: '百宝箱',
-          icon: 'box',
-          url: '/jy_mobile/tabbar/box',
-          index: 3
-        },
-        {
-          label: '我的',
-          icon: 'mine',
-          url: '/jyapp/free/me',
-          index: 4
-        },
-      ]
-		}
-	},
+;(function () {
+   function getIsInTheUnifyAppContainer () {
+    var u = navigator.userAgent.toLowerCase()
+    var inNewApp = false
 
-	mounted() {
-    Object.assign(this.$data, this.$options.data())
-    var uMsg = Number(this.getQueryString('msg') || this.getURLIndex())
-    this.tabActive = uMsg
-		this.tabsCount()
-	},
-  computed: {
-    getMsgCount: function () {
-      return this.counts ? (this.counts > 99 ? '99+' : this.counts) : ''
+    if (u.includes('jianyuapp')) {
+      inNewApp = true
+      return inNewApp
     }
-  },
-	methods: {
-    //获取url中"?"符后的字符串并正则匹配
-    getQueryString(name) {
-      var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
-      var r = window.location.search.substr(1).match(reg);
-      var context = "";
-      if (r != null)
-          context = r[2];
-      reg = null;
-      r = null;
-      return context == null || context == "" || context == "undefined" ? "" : context;
-    },
-    getURLIndex: function () {
-      try {
-        var tempUrl = this.findMapsForUrl(this.tabList, location.pathname)
-        if (tempUrl.length) {
-          return tempUrl[0].index
-        } else if (location.pathname.indexOf('/swordfish/historypush') !== -1) {
-          return 1
-        } else {
-          return ''
+  }
+
+  function initAppTabbar () {
+    new Vue({
+      el: '#tabMesg',
+      delimiters: ['{', '}'],
+      data: function () {
+        return {
+          version: 13,
+          tabActive: 0,
+          counts: 0,
+          tabList: [
+            {
+              label: '首页',
+              icon: 'home',
+              url: '/jyapp/jylab/mainSearch',
+              index: 0
+            },
+            {
+              label: '订阅',
+              icon: 'book',
+              url: '/jyapp/swordfish/historypush',
+              index: 1
+            },
+            {
+              label: '消息',
+              icon: 'mesg',
+              url: '/jyapp/frontPage/messageCenter/sess/index',
+              index: 2
+            },
+            {
+              label: '工作台',
+              icon: 'box',
+              url: '/jyapp/jylab/index',
+              index: 3
+            },
+            {
+              label: '我的',
+              icon: 'mine',
+              url: '/jyapp/free/me',
+              index: 4
+            },
+          ]
         }
-      } catch (e) {
-        return ''
-      }
-    },
-    findMapsForUrl: function (arr, url) {
-      var tempReuslt = []
-      arr.forEach(function (v) {
-        if (url.indexOf(v.url) !== -1) {
-          tempReuslt.push(v)
+      },
+
+      mounted() {
+        Object.assign(this.$data, this.$options.data())
+        var uMsg = Number(this.getQueryString('msg') || this.getURLIndex())
+        this.tabActive = uMsg
+        this.tabsCount()
+      },
+      computed: {
+        getMsgCount: function () {
+          return this.counts ? (this.counts > 99 ? '99+' : this.counts) : ''
         }
-      })
-      return tempReuslt.sort(function(a,b) {
-        return b.url.length - a.url.length
-      })
-    },
-		tabsCount() {
-      const _this = this
-      $.ajax({
-        type:'GET',
-        url:'/jymessageCenter/getCount?t=' + Date.now(),
-        success:function (res) {
-          if (res && res.status == 1 && res.data && res.data.count) {
-            _this.counts = res.data.count
+      },
+      methods: {
+        //获取url中"?"符后的字符串并正则匹配
+        getQueryString(name) {
+          var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+          var r = window.location.search.substr(1).match(reg);
+          var context = "";
+          if (r != null)
+            context = r[2];
+          reg = null;
+          r = null;
+          return context == null || context == "" || context == "undefined" ? "" : context;
+        },
+        getURLIndex: function () {
+          try {
+            var tempUrl = this.findMapsForUrl(this.tabList, location.pathname)
+            if (tempUrl.length) {
+              return tempUrl[0].index
+            } else if (location.pathname.indexOf('/swordfish/historypush') !== -1) {
+              return 1
+            } else {
+              return ''
+            }
+          } catch (e) {
+            return ''
+          }
+        },
+        findMapsForUrl: function (arr, url) {
+          var tempReuslt = []
+          arr.forEach(function (v) {
+            if (url.indexOf(v.url) !== -1) {
+              tempReuslt.push(v)
+            }
+          })
+          return tempReuslt.sort(function(a,b) {
+            return b.url.length - a.url.length
+          })
+        },
+        tabsCount() {
+          const _this = this
+          $.ajax({
+            type:'GET',
+            url:'/jymessageCenter/getCount?t=' + Date.now(),
+            success:function (res) {
+              if (res && res.status == 1 && res.data && res.data.count) {
+                _this.counts = res.data.count
+              }
+            }
+          })
+        },
+        routeHref(index) {
+          var goHref = this.tabList[index].url
+          if (index !== 0) {
+            location.href = ('/jyapp/free/login?source=home&url=' + goHref)
           }
         }
-      })
-    },
-		routeHref(index) {
-      var goHref = this.tabList[index].url + '?msg=' + index
-      if (index === this.tabActive) {
-        location.replace(goHref)
-      } else {
-        location.href = goHref
       }
-		}
-	}
-})
+    })
+  }
+
+  /**
+   * 展示逻辑
+   * 1. H5
+   * 2. 新版APP
+   */
+
+  if (getIsInTheUnifyAppContainer() || utils.$envs.inH5) {
+    initAppTabbar()
+    document.body.classList.add('inject-app-tabbar')
+  } else {
+    document.body.classList.remove('inject-app-tabbar')
+  }
+})();
+
+
 </script>

+ 3 - 3
src/jfw/modules/app/src/web/templates/weixin/treasure_box.html

@@ -6,7 +6,7 @@
     <meta name="viewport"
         content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
-    <title>百宝箱</title>
+    <title>工作台</title>
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/rem.js"></script>
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/wx/base.css?v={{Msg "seo" "version"}}" />
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/wx/treasure_box.css?v={{Msg "seo" "version"}}">
@@ -15,8 +15,8 @@
 <body>
     <div class="treasure">
         <div class="top">
-            <h2>百宝箱</h2>
-            <p>欢迎来到剑鱼标讯百宝箱</p>
+            <h2>工作台</h2>
+            <p>欢迎来到剑鱼标讯工作台</p>
         </div>
         <div class="main">
             <div class="vip_subscribe">

+ 2 - 0
src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go

@@ -67,7 +67,9 @@ func (this *SubVipPortrait) SubVipEntDetail() {
 // SubVipWinnerNewMsg 超级订阅升级版查看最新中标动态
 func (this *SubVipPortrait) SubVipWinnerNewMsg() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
+	log.Println(this.Session().GetMultiple(), "---SubVipWinnerNewMsg  userId :", userId)
 	rData, errMsg := func() (interface{}, error) {
+		log.Println(qutil.ObjToString(this.GetSession("userId")), "------SubVipWinnerNewMsg -------------  userId :", userId)
 		entId := util.DecodeId(this.GetString("entId"))
 		if entId == "" {
 			return nil, fmt.Errorf("参数异常")

+ 3 - 4
src/jfw/modules/publicapply/src/ad/entity/struct.go

@@ -2,12 +2,11 @@ package entity
 
 import (
 	"encoding/json"
-	"log"
 	"strings"
 	"time"
 )
 
-//AdInfo 广告信息
+// AdInfo 广告信息
 type AdInfo struct {
 	S_link   string `json:"s_link"`   //广告位跳转链接
 	S_pic    string `json:"s_pic"`    //广告位弹窗
@@ -29,7 +28,7 @@ type AdInfo struct {
 	S_script string `json:"s_script"` //脚本
 }
 
-//Handle 广告位信息处理
+// Handle 广告位信息处理
 func Handle(data []interface{}, host string) []AdInfo {
 	var res = []AdInfo{}
 	if len(data) > 0 {
@@ -42,7 +41,7 @@ func Handle(data []interface{}, host string) []AdInfo {
 		if len(AdInfo_Arr) > 0 {
 			now := time.Now()
 			for _, v := range AdInfo_Arr {
-				log.Println(v.S_id, "---", host, "----", strings.Contains(host, v.S_id))
+				//log.Println(v.S_id, "---", host, "----", strings.Contains(host, v.S_id))
 				if v.S_id != "" && host != "" {
 					//根据不同环境区分广告位信息 v.S_id 填充内容, 例:app-i2;app-a1
 					if !strings.Contains(host, v.S_id) {

+ 67 - 0
src/jfw/modules/publicapply/src/ad/service/actions.go

@@ -1,7 +1,9 @@
 package service
 
 import (
+	"app.yhyue.com/moapp/jybase/common"
 	"encoding/json"
+	"errors"
 	"jy/src/jfw/modules/publicapply/src/ad/entity"
 	"jy/src/jfw/modules/publicapply/src/db"
 	"log"
@@ -16,11 +18,20 @@ import (
 type JyAdvertisement struct {
 	*xweb.Action
 	getJyAdList xweb.Mapper `xweb:"/free/getJyAdList"` //获取剑鱼广告位
+	getStartAd  xweb.Mapper `xweb:"/free/getStartAd"`  //获取 app启动广告位
 }
 
 type AdRequestMsg struct {
 	AdCode []string `json:"codes"` //广告位code
 }
+type startAdRequest struct {
+	Image      string `json:"image"`       // 图片 ios_640x960
+	ModifyDate int64  `json:"modify_date"` // 上次修改时间
+}
+
+var (
+	startAdCode = "app_startup_ad"
+)
 
 func (a *JyAdvertisement) GetJyAdList() {
 	log.Println("http:", a.Request.Host)
@@ -53,3 +64,59 @@ func (a *JyAdvertisement) GetJyAdList() {
 	}
 	a.ServeJson(NewResult(rData, errMsg))
 }
+func (a *JyAdvertisement) GetStartAd() {
+	log.Println("http:", a.Request.Host)
+	rData, errMsg := func() (interface{}, error) {
+		image_ := a.GetString("image")
+		modifyDate_, _ := a.GetInt("modify_date")
+		adReqMsg := startAdRequest{
+			Image:      image_,
+			ModifyDate: modifyDate_,
+		}
+		returnData := map[string]interface{}{}
+		if adReqMsg.Image == "" {
+			return returnData, errors.New("参数有误")
+		}
+		var adInfo []entity.AdInfo
+		var adModifyDate int64
+		obj := redis.Get("other", "ad_"+startAdCode)
+		adModifyDateObj := redis.Get("other", "ad_modifydate_"+startAdCode)
+		adModifyDate = common.Int64All(adModifyDateObj)
+		if obj != nil && adModifyDate != 0 {
+			adInfo = entity.Handle(obj.([]interface{}), "")
+		} else {
+			res, ok := db.Mgo.FindOneByField("ad", `{"s_code":"`+startAdCode+`"}`, `{"a_son":1,"l_modifydate":1}`)
+			if ok && res != nil && (*res)["a_son"] != nil {
+				son := (*res)["a_son"].([]interface{})
+				adModifyDate = common.Int64All((*res)["l_modifydate"])
+				if len(son) > 0 {
+					redis.Put("other", "ad_"+startAdCode, son, int(entity.GetLastTime()))
+					redis.Put("other", "ad_modifydate_"+startAdCode, adModifyDate, int(entity.GetLastTime()))
+				}
+				adInfo = entity.Handle(son, "")
+			}
+		}
+		// 判断时间 传的时间和库里的时间不一致则更新 一致则返回为空
+		if adReqMsg.ModifyDate == adModifyDate {
+			return returnData, nil
+		}
+		// get
+		for i := 0; i < len(adInfo); i++ {
+			if adInfo[i].S_id == adReqMsg.Image {
+				returnData = map[string]interface{}{
+					"url":         adInfo[i].S_pic,
+					"modify_date": adModifyDate,
+				}
+				break
+			}
+		}
+		if len(returnData) == 0 {
+			return returnData, errors.New("未匹配到对应图片")
+		}
+		return returnData, nil
+	}()
+	if errMsg != nil {
+		log.Printf("Ad  err:%s\n", errMsg.Error())
+	}
+	a.ServeJson(NewResult(rData, errMsg))
+}

+ 8 - 2
src/jfw/modules/publicapply/src/config.json

@@ -43,7 +43,8 @@
     "enterpriseNumb": 500
   },
   "tipInfo": {
-    "box_moving": 1670774400
+    "box_moving": 1670774400,
+    "box_rename": 1691978195
   },
   "filterReg": [
     "(项目|公告|公示)$",
@@ -51,5 +52,10 @@
     "^([0-9]{1,3}|[零一二三四五六七八九十]{1,2}|联系人?|电话|地址|编号|采购|政府采购|成交|更正|招标|中标|变更|结果)$",
     "^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$"
   ],
-  "entSearchLimit": 100
+  "entSearchLimit": 100,
+  "appPushServiceRpc": "192.168.20.114:5566",
+  "nsq":"192.168.3.240:4260",
+  "nsq_topic": "jy_event",
+  "accountMergeOnline": "2015-03-30 00:00:00",
+  "criticality":2
 }

+ 10 - 4
src/jfw/modules/publicapply/src/config/config.go

@@ -31,10 +31,16 @@ type config struct {
 		CustomerNumb   int
 		EnterpriseNumb int
 	}
-	ExhibitionLog  string
-	TipInfo        map[string]int64
-	FilterReg      []string
-	EntSearchLimit int64
+	ExhibitionLog      string
+	TipInfo            map[string]int64
+	FilterReg          []string
+	EntSearchLimit     int64
+	AppPushServiceRpc  string
+	AfterSavePushId    int
+	Nsq                string `json:"nsq"`
+	NsqTopic           string `json:"nsq_topic"`
+	AccountMergeOnline string `json:"accountMergeOnline"`
+	Criticality        int    `json:"criticality"`
 }
 type BidColl struct {
 	PayUserCollLimit      int    //付费用户收藏数量最大限制

+ 4 - 0
src/jfw/modules/publicapply/src/filter/sessionfilter.go

@@ -22,6 +22,7 @@ var reg_share = regexp.MustCompile("^/publicapply/shareFission/.*")
 var reg_nps = regexp.MustCompile("^/publicapply/nps/.*")
 var regWhiteList = regexp.MustCompile("^/publicapply/userbase/whitelist$")
 var regEntSearch = regexp.MustCompile("^/publicapply/enterpriseSearch/doQuery") //企业搜索接口
+var regOneClick = regexp.MustCompile("^/publicapply/oneClick/.*")
 
 func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	session := l.App.SessionManager.Session(req, w)
@@ -32,6 +33,9 @@ func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	if getSession["base_user_id"] != nil && getSession["positionId"] == nil {
 		identity.SwitchToBest(util.Int64All(getSession["base_user_id"]), session, Middleground, &Mgo, false)
 	}
+	if regOneClick.MatchString(req.URL.Path) {
+		return true
+	}
 	if regEntSearch.MatchString(req.URL.Path) || reg.MatchString(req.URL.Path) || reg.MatchString(req.URL.Path) || reg_share.MatchString(req.URL.Path) || reg_nps.MatchString(req.URL.Path) {
 		return true
 	}

+ 19 - 6
src/jfw/modules/publicapply/src/go.mod

@@ -3,11 +3,15 @@ module jy/src/jfw/modules/publicapply/src
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
+	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
 	app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
+	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4
+	github.com/alibabacloud-go/dypnsapi-20170525/v2 v2.0.3
+	github.com/alibabacloud-go/tea v1.2.1
+	github.com/alibabacloud-go/tea-utils/v2 v2.0.4
 	github.com/gogf/gf/v2 v2.0.6
 	github.com/zeromicro/go-zero v1.5.3
 	go.mongodb.org/mongo-driver v1.11.6
@@ -21,6 +25,13 @@ require (
 	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7 // indirect
 	github.com/BurntSushi/toml v0.4.1 // indirect
+	github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect
+	github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect
+	github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect
+	github.com/alibabacloud-go/openapi-util v0.1.0 // indirect
+	github.com/alibabacloud-go/tea-utils v1.3.1 // indirect
+	github.com/alibabacloud-go/tea-xml v1.1.2 // indirect
+	github.com/aliyun/credentials-go v1.1.2 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
@@ -41,6 +52,7 @@ require (
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
 	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
@@ -92,6 +104,7 @@ require (
 	github.com/subosito/gotenv v1.4.2 // indirect
 	github.com/tealeg/xlsx v1.0.5 // indirect
 	github.com/thinxer/go-word2vec v0.0.0-20150917053916-5c19ec7379ed // indirect
+	github.com/tjfoc/gmsm v1.3.2 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect
@@ -115,13 +128,13 @@ require (
 	go.uber.org/automaxprocs v1.5.2 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
 	go.uber.org/zap v1.24.0 // indirect
-	golang.org/x/crypto v0.6.0 // indirect
-	golang.org/x/net v0.10.0 // indirect
+	golang.org/x/crypto v0.10.0 // indirect
+	golang.org/x/net v0.11.0 // indirect
 	golang.org/x/oauth2 v0.7.0 // indirect
 	golang.org/x/sync v0.1.0 // indirect
-	golang.org/x/sys v0.8.0 // indirect
-	golang.org/x/term v0.8.0 // indirect
-	golang.org/x/text v0.9.0 // indirect
+	golang.org/x/sys v0.9.0 // indirect
+	golang.org/x/term v0.9.0 // indirect
+	golang.org/x/text v0.10.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect

+ 74 - 8
src/jfw/modules/publicapply/src/go.sum

@@ -5,8 +5,8 @@ app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:J
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b h1:Wtytm2QqQWtBV+see7t8ZTxnsCJaz5PGRqJXzwR6f7s=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf h1:/Tk5haITmGc5c3/y6VxyycIy/LBWO7aYlxTiHKxmzv0=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
 app.yhyue.com/moapp/jypkg v0.0.0-20230901083756-4a2b88d5bf6f h1:R+30KpHwY/OgDAzaWjknnB8Djux+XO0XmQcuG62Z2qY=
@@ -94,11 +94,42 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo=
+github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
+github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
+github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 h1:7Q2FEyqxeZeIkwYMwRC3uphxV4i7O2eV4ETe21d6lS4=
+github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 h1:NqugFkGxx1TXSh/pBcU00Y6bljgDPaFdh5MUSeJ7e50=
+github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY=
+github.com/alibabacloud-go/dypnsapi-20170525/v2 v2.0.3 h1:26XsczMxlJD9btKz2DV7N38l18VC8RUVIxH/Wa9SQ4I=
+github.com/alibabacloud-go/dypnsapi-20170525/v2 v2.0.3/go.mod h1:PVXSzGHi3i/r8NK3eH1iZCaKWqV6QFDfz9fIc48VEFs=
+github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
+github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
+github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
+github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY=
+github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws=
+github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg=
+github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
+github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4=
+github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
+github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A=
+github.com/alibabacloud-go/tea v1.2.1 h1:rFF1LnrAdhaiPmKwH5xwYOKlMh66CqRwPUTzIK74ask=
+github.com/alibabacloud-go/tea v1.2.1/go.mod h1:qbzof29bM/IFhLMtJPrgTGK3eauV5J2wSyEUo4OEmnA=
+github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I=
+github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.1/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.4 h1:SoFgjJuO7pze88j9RBJNbKb7AgTS52O+J5ITxc00lCs=
+github.com/alibabacloud-go/tea-utils/v2 v2.0.4/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ=
+github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M=
+github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
 github.com/alicebob/miniredis/v2 v2.14.1/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg=
 github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
 github.com/alicebob/miniredis/v2 v2.30.3 h1:hrqDB4cHFSHQf4gO3xu6YKQg8PqJpNjLYsQAFYHstqw=
+github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY=
+github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
 github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/antlr/antlr4 v0.0.0-20210105212045-464bcbc32de2/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
@@ -307,6 +338,8 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
 github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
@@ -399,6 +432,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
 github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
@@ -510,6 +545,7 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA=
@@ -739,8 +775,11 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/sirupsen/logrus v1.8.3 h1:DBBfY8eMYazKEJHb3JKpSPfpgd2mBCoNFlQx6C5fftU=
 github.com/sirupsen/logrus v1.8.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -790,6 +829,8 @@ github.com/thinxer/go-word2vec v0.0.0-20150917053916-5c19ec7379ed h1:1+oKuPuDQ4A
 github.com/thinxer/go-word2vec v0.0.0-20150917053916-5c19ec7379ed/go.mod h1:WE5pZgSp3RwicfhHQmOJOexA0n4AKTzBqmnSu7R8Nbk=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
+github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
 github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk=
 github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -816,10 +857,12 @@ github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
 github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
 github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE=
@@ -930,8 +973,10 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -940,10 +985,11 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
-golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
+golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -979,6 +1025,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1028,8 +1076,12 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
+golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1055,6 +1107,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1099,6 +1152,7 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200509044756-6aff5f38e54f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1134,16 +1188,21 @@ golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
+golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
+golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1154,8 +1213,10 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
+golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1173,6 +1234,7 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -1210,6 +1272,7 @@ golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjs
 golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 golang.org/x/tools v0.0.0-20200410132612-ae9902aceb98/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -1230,6 +1293,8 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1378,6 +1443,7 @@ gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaD
 gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=

+ 79 - 0
src/jfw/modules/publicapply/src/jyutil/pushId.go

@@ -0,0 +1,79 @@
+package jyutil
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jypkg/public"
+	"jy/src/jfw/modules/publicapply/src/config"
+	"log"
+	"sync"
+	"time"
+)
+
+type PushDetail struct {
+	Rid        string `json:"rid"`
+	Oid        string `json:"oid"`
+	DeviceId   string `json:"deviceId"`
+	PhoneType  string `json:"phoneType"`
+	Createtime int64  `json:"createtime"`
+	Channel    string `json:"channel"`
+}
+
+type UnLoginPushManager struct {
+	Lock sync.Mutex
+	Date map[string]*PushDetail
+}
+
+var UnLoginPush *UnLoginPushManager
+var mongodb = public.MQFW
+
+func init() {
+	UnLoginPush = &UnLoginPushManager{Date: make(map[string]*PushDetail)}
+	go UnLoginPush.Work()
+}
+
+func (u *UnLoginPushManager) SaveBuff(p *PushDetail) bool {
+	u.Lock.Lock()
+	defer u.Lock.Unlock()
+	u.Date[p.Rid] = p
+	return true
+}
+
+func (u *UnLoginPushManager) DeleteBuff(rid string) {
+	u.Lock.Lock()
+	defer u.Lock.Unlock()
+	delete(u.Date, rid)
+	log.Printf("DeleteBuff size %d ,this rid:%s\n", len(u.Date), rid)
+}
+
+func (u *UnLoginPushManager) savePushId(p *PushDetail) {
+	data := map[string]interface{}{
+		"s_rid": p.Rid,
+	}
+	if mongodb.Count("jyapp_pushId", data) == 0 {
+		log.Println("save", p.Rid)
+		data["i_cometime"] = p.Createtime
+		data["s_oid"] = p.Oid
+		data["phoneType"] = p.PhoneType
+		data["s_deviceId"] = p.DeviceId
+		data["i_lastTime"] = p.Createtime
+		data["s_channel"] = p.Channel
+		mongodb.Save("jyapp_pushId", data)
+	} else {
+		log.Println("update", p.Rid)
+		mongodb.Update("jyapp_pushId", data, map[string]interface{}{"$set": map[string]interface{}{
+			"i_lastTime": p.Createtime,
+		}}, false, true)
+	}
+}
+
+func (u *UnLoginPushManager) Work() {
+	u.Lock.Lock()
+	defer u.Lock.Unlock()
+	for _, v := range u.Date {
+		if v.Createtime+util.Int64All(config.Config.AfterSavePushId) < time.Now().Unix() {
+			u.savePushId(v)
+			delete(u.Date, v.Rid)
+		}
+	}
+	time.AfterFunc(time.Minute, u.Work)
+}

+ 1 - 0
src/jfw/modules/publicapply/src/main.go

@@ -20,6 +20,7 @@ import (
 	_ "jy/src/jfw/modules/publicapply/src/me"
 	_ "jy/src/jfw/modules/publicapply/src/message"
 	_ "jy/src/jfw/modules/publicapply/src/npsValue"
+	_ "jy/src/jfw/modules/publicapply/src/oneclick"
 	_ "jy/src/jfw/modules/publicapply/src/password"
 	_ "jy/src/jfw/modules/publicapply/src/project"
 	_ "jy/src/jfw/modules/publicapply/src/transfer"

+ 723 - 0
src/jfw/modules/publicapply/src/oneclick/entity/entity.go

@@ -0,0 +1,723 @@
+package entity
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+	qrpc "app.yhyue.com/moapp/jybase/rpc"
+	"app.yhyue.com/moapp/jybase/usercenter"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	"encoding/json"
+	"errors"
+	"fmt"
+	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
+	dypnsapi20170525 "github.com/alibabacloud-go/dypnsapi-20170525/v2/client"
+	util "github.com/alibabacloud-go/tea-utils/v2/service"
+	"github.com/alibabacloud-go/tea/tea"
+	"jy/src/jfw/modules/publicapply/src/config"
+	"jy/src/jfw/modules/publicapply/src/db"
+	"jy/src/jfw/modules/publicapply/src/jyutil"
+	"jy/src/jfw/modules/publicapply/src/oneclick/initjson"
+	"log"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+)
+
+type OneClickInfo struct {
+	AccessToken    string `json:"accessToken"`
+	OutId          string `json:"outId"`
+	SpToken        string `json:"spToken"`
+	Phone          string `json:"phone"`
+	ActionType     string `json:"actionType"`
+	Rid            string `json:"rid"`
+	Oid            string `json:"oid"`
+	PhoneType      string `json:"phoneType"`
+	Channel        string `json:"channel"`
+	DeviceId       string `json:"deviceId"`
+	UA             string `json:"UA"`
+	DisWord        string `json:"disWord"`
+	RequestId      string `json:"requestid"`
+	Vender         string `json:"vender"`
+	Session        *httpsession.Session
+	ResponseWriter *http.ResponseWriter
+	Host           string
+}
+
+var (
+	RegLock   = sync.Mutex{}
+	RegMap    = map[string]*RegStruct{}
+	kickedTip = "您的账号在其他设备登录,如有需要请重新登录。"
+)
+
+func init() {
+	rs := &RegStruct{
+		MapR: map[string]int64{},
+		Lock: sync.Mutex{},
+	}
+	go rs.GC()
+}
+func (o *OneClickInfo) GetPhoneByToken() (map[string]interface{}, error) {
+	err, phone := func() (_err error, phone string) {
+		var (
+			tryErr error
+			client *dypnsapi20170525.Client
+		)
+		client, _err = CreateClient()
+		if _err != nil {
+			return
+		}
+		if o.SpToken != "" {
+			getPhoneWithTokenRequest := &dypnsapi20170525.GetPhoneWithTokenRequest{
+				SpToken: &o.SpToken,
+			}
+			runtime := &util.RuntimeOptions{}
+			tryErr, phone = func() (_e error, p string) {
+				defer func() {
+					if r := tea.Recover(recover()); r != nil {
+						_e = r
+					}
+				}()
+				// 复制代码运行请自行打印 API 的返回值
+				_result, _err := client.GetPhoneWithTokenWithOptions(getPhoneWithTokenRequest, runtime)
+				if _err != nil {
+					log.Println("h5取号失败:", _err)
+					return fmt.Errorf("手机号填写错误"), ""
+				}
+				if *_result.Body.Code == "OK" {
+					//获取手机号
+					return nil, *_result.Body.Data.Mobile
+				} else {
+					log.Println(*_result.Body.Message, *_result.Body.Code)
+					return fmt.Errorf("手机号填写错误"), ""
+				}
+				//return fmt.Errorf(*_result.Body.Message), ""
+			}()
+		} else if o.AccessToken != "" {
+			getMobileRequest := &dypnsapi20170525.GetMobileRequest{
+				AccessToken: &o.AccessToken,
+				OutId:       &o.OutId,
+			}
+			runtime := &util.RuntimeOptions{}
+			tryErr, phone = func() (_e error, p string) {
+				defer func() {
+					if r := tea.Recover(recover()); r != nil {
+						_e = r
+					}
+				}()
+				// 复制代码运行请自行打印 API 的返回值
+				_result, _err := client.GetMobileWithOptions(getMobileRequest, runtime)
+				if _err != nil {
+					return _err, ""
+				}
+				if *_result.Body.Code == "OK" {
+					//获取手机号
+					return nil, *_result.Body.GetMobileResultDTO.Mobile
+				}
+				return fmt.Errorf(*_result.Body.Message), ""
+			}()
+		}
+		if tryErr != nil {
+			var sdkError = &tea.SDKError{}
+			if _t, ok := tryErr.(*tea.SDKError); ok {
+				sdkError = _t
+			} else {
+				sdkError.Message = tea.String(tryErr.Error())
+			}
+			log.Println("GetPhoneByToken:", sdkError.Message)
+			return fmt.Errorf(*sdkError.Message), ""
+		}
+		return
+	}()
+	if err != nil || phone == "" {
+		log.Println(err)
+		return nil, err
+	}
+	// 手机号登录注册及绑定操作
+	data, err := o.ProcessPhone(phone)
+	return data, err
+}
+
+/**
+ * 使用AK&SK初始化账号Client
+ * @param accessKeyId
+ * @param accessKeySecret
+ * @return Client
+ * @throws Exception
+ */
+func CreateClient() (_result *dypnsapi20170525.Client, _err error) {
+	c := &openapi.Config{
+		AccessKeyId:     tea.String(initjson.OneClick.AccessKeyId),
+		AccessKeySecret: tea.String(initjson.OneClick.AccessKeySecret),
+	}
+	c.Endpoint = tea.String("dypnsapi.aliyuncs.com")
+	_result = &dypnsapi20170525.Client{}
+	_result, _err = dypnsapi20170525.NewClient(c)
+	return _result, _err
+}
+
+type authToken struct {
+	AccessToken string `json:"accessToken"`
+	JwtToken    string `json:"jwtToken"`
+}
+
+func GetAuthTokenWithOptions(host string) (_err error, token *authToken) {
+	// 判断是微信还是h5的域名
+	origin, url := "", ""
+	log.Println(initjson.OneClick.H5.Origin, "========", host)
+	if strings.Contains(initjson.OneClick.H5.Origin, host) {
+		origin = initjson.OneClick.H5.Origin
+		url = initjson.OneClick.H5.Url
+	} else if strings.Contains(initjson.OneClick.Wx.Origin, host) {
+		origin = initjson.OneClick.Wx.Origin
+		url = initjson.OneClick.Wx.Url
+	} else {
+		log.Println("未匹配到host:", host)
+		return errors.New("host未匹配到"), token
+	}
+	// 是否走缓存
+	redisKey := fmt.Sprintf(initjson.OneClick.TokenCache.Key, host)
+	if initjson.OneClick.TokenCache.Open {
+		// 查缓存
+		if reidsCatche, redisErr := redis.GetBytes("other", redisKey); redisErr == nil && reidsCatche != nil {
+			errs := json.Unmarshal(*reidsCatche, &token)
+			if errs == nil && token != nil {
+				return nil, token
+			}
+		}
+	}
+	var (
+		client *dypnsapi20170525.Client
+	)
+	token = &authToken{}
+	client, _err = CreateClient()
+	if _err != nil {
+		return
+	}
+	getAuthTokenRequest := &dypnsapi20170525.GetAuthTokenRequest{
+		Origin: tea.String(origin),
+		Url:    tea.String(url),
+	}
+	runtime := &util.RuntimeOptions{}
+	tryErr := func() (_e error) {
+		defer func() {
+			if r := tea.Recover(recover()); r != nil {
+				_e = r
+			}
+		}()
+		// 复制代码运行请自行打印 API 的返回值
+		_result, _err := client.GetAuthTokenWithOptions(getAuthTokenRequest, runtime)
+		log.Println(_result)
+		if _err != nil {
+			return
+		}
+		token.AccessToken = *_result.Body.TokenInfo.AccessToken
+		token.JwtToken = *_result.Body.TokenInfo.JwtToken
+		return
+	}()
+	if tryErr != nil {
+		var sdkError = &tea.SDKError{}
+		if _t, ok := tryErr.(*tea.SDKError); ok {
+			sdkError = _t
+		} else {
+			sdkError.Message = tea.String(tryErr.Error())
+		}
+
+		log.Println("GetAuthTokenWithOptions:", sdkError.Message)
+
+	}
+	if initjson.OneClick.TokenCache.Open {
+		// 存缓存
+		if bytes, err := json.Marshal(token); err == nil && bytes != nil {
+			_ = redis.PutBytes("other", redisKey, &bytes, initjson.OneClick.TokenCache.Timeout)
+		}
+	}
+	return
+}
+
+func (o *OneClickInfo) ProcessPhone(phone string) (map[string]interface{}, error) {
+	returnData := map[string]interface{}{}
+
+	// 绑定
+	if o.ActionType == "B" { // 绑定手机号
+		var (
+			mgoUserId, _ = o.Session.Get("mgoUserId").(string)
+			token        = ""
+		)
+		if mgoUserId == "" {
+			return nil, errors.New("未登录")
+		}
+		if thisPhone, _ := o.Session.Get("phone").(string); thisPhone == "" {
+			user, ok := db.Mgo.FindById("user", mgoUserId, `{"s_unionid":1}`)
+			if !ok || user == nil {
+				return nil, errors.New("账号异常")
+			}
+			unionId, _ := (*user)["s_unionid"].(string)
+			if unionId == "" {
+				return nil, errors.New("账号异常")
+			}
+			exists, relationPhoneId := jy.NewPhoneUtil(db.Mgo).BindPhoneIsOccupy(mgoUserId, unionId, phone)
+			if exists { //校验是否使用
+				return nil, errors.New("手机号已被绑定")
+			}
+			o.Session.Set("relationPhoneId", relationPhoneId)
+			var err error
+			token, err = AccountMerge(phone, "", mgoUserId, o.Session)
+
+			mgoUserId, _ = o.Session.Get("mgoUserId").(string)
+			go o.saveLog(mgoUserId, "o_bind")
+			if err != nil {
+				return nil, err
+			} else if token != "" {
+				returnData["state"] = 2
+				returnData["token"] = token
+			} else {
+				returnData["state"] = 1
+			}
+		} else {
+			return nil, errors.New("已绑定过手机号")
+		}
+	} else {
+		//   登录注册
+		rs, err := o.phoneLogin(phone)
+		if err != nil {
+			return nil, err
+		}
+		returnData = rs
+	}
+
+	return returnData, nil
+}
+
+// 登录 注册
+func (o *OneClickInfo) phoneLogin(phone string) (map[string]interface{}, error) {
+	returnSign := ""
+	userInfo := map[string]interface{}{}
+	status := func() int {
+		RegLock.Lock()
+		reg := RegMap[phone]
+		if reg == nil {
+			reg = &RegStruct{}
+			reg.Lock = sync.Mutex{}
+			reg.MapR = make(map[string]int64)
+			reg.MapR[phone] = time.Now().Unix()
+			RegMap[phone] = reg
+		}
+		RegLock.Unlock()
+		reg.Lock.Lock()
+		defer reg.Lock.Unlock()
+		ok, user := getPhoneUser(phone)
+		if !ok {
+			return 0
+		}
+		//用户不存在
+		if user == nil || len(user) == 0 {
+			client := o.UA
+			log.Println(client)
+			//clearRidByRid(rid)
+			s_platform := "app"
+			if strings.Contains(o.Host, "h5.jianyu360.cn") {
+				s_platform = "h5"
+			}
+			data := map[string]interface{}{
+				"i_appid":       2,
+				"s_phone":       phone,
+				"s_unique":      phone,
+				"s_password":    "",
+				"l_registedate": time.Now().Unix(),
+				"s_jpushid":     o.Rid,
+				"s_opushid":     o.Oid,
+				"s_appponetype": o.PhoneType,
+				"i_ts_guide":    2,
+				"o_jy": map[string]interface{}{
+					"i_apppush":    1,
+					"i_ratemode":   2,
+					"l_modifydate": time.Now().Unix(),
+				},
+				"s_platform": s_platform,
+			}
+			data["s_regsource"] = isAndroidOrIOS(client)
+			_id := db.Mgo.Save("user", data)
+			if _id != "" {
+				userInfo["isNewUser"] = true
+				//用户中台同步
+				func(userid string) {
+					if ok := jy.AddUser(db.Mgo, userid, pb.UserAddReq{
+						Appid: "10000",
+						Phone: phone,
+					}, *config.Middleground); !ok {
+						log.Println("usercenter add error", userid, phone)
+					}
+				}(_id)
+				returnSign = afterLogin(data, o.Session, o.Rid, o.Oid, o.PhoneType, o.Channel, o.DeviceId, true, *o.ResponseWriter)
+				addr := config.Config.Nsq
+				nsq_topic := config.Config.NsqTopic
+				if o.DisWord != "" {
+					redisDis := redis.GetStr("other", "DIS_"+o.DisWord[1:])
+					//邀请新用户 调用队列
+					if redisDisArr := strings.Split(redisDis, "##"); len(redisDisArr) > 1 {
+						fromUserId := redisDisArr[1]
+						err := jy.Publish(db.Mgo_Log, addr, nsq_topic, jy.Jywx_subscribe_invite, fromUserId, jy.Jyapp_node1, nil)
+						if err != nil {
+							log.Println("nsq队列写入失败-->", err, jy.Jywx_subscribe_invite, fromUserId)
+						}
+						err = jy.Publish(db.Mgo_Log, addr, nsq_topic, jy.Jywx_subscribe_invited, _id, jy.Jyapp_node1, nil)
+						if err != nil {
+							log.Println("nsq队列写入失败-->", err, jy.Jywx_subscribe_invited, _id)
+						}
+					}
+				} else {
+					err := jy.Publish(db.Mgo_Log, addr, nsq_topic, jy.Jyapp_phone_register, _id, jy.Jyapp_node1, nil)
+					if err != nil {
+						log.Println("nsq队列写入失败-->", err, jy.Jyapp_phone_register, _id)
+					}
+				}
+				mgoUserId, _ := o.Session.Get("mgoUserId").(string)
+				go o.saveLog(mgoUserId, "o_register")
+				return 1
+			}
+		} else {
+			//以s_m_phone登录的 需要把s_m_phone转化为s_phone
+			updataMap := map[string]interface{}{}
+			if user["s_m_phone"] != nil {
+				updataMap["s_phone"] = phone
+			}
+			if len(updataMap) > 0 {
+				db.Mgo.UpdateById("user", mongodb.BsonIdToSId(user["_id"]), map[string]interface{}{
+					"$set":   updataMap,
+					"$unset": map[string]interface{}{"s_m_phone": ""},
+				})
+			}
+			returnSign = afterLogin(user, o.Session, o.Rid, o.Oid, o.PhoneType, o.Channel, o.DeviceId, false, *o.ResponseWriter)
+			mgoUserId, _ := o.Session.Get("mgoUserId").(string)
+			go o.saveLog(mgoUserId, "o_login")
+			return 1
+		}
+		return 0
+	}()
+	result := map[string]interface{}{
+		"status": status,
+		"userId": o.Session.Get("mgoUserId"),
+	}
+	if returnSign != "" {
+		result["sign"] = returnSign
+	}
+	if len(userInfo) > 0 {
+		result["userInfo"] = userInfo
+	}
+	return result, nil
+}
+
+// 绑定
+func AccountMerge(phone, email, mgoUserId string, sess *httpsession.Session) (token string, err error) {
+	if userinfo := config.Compatible.Select(mgoUserId, `{"s_unionid":1,"s_name":1,"s_nickname":1,"s_headimageurl":1,"l_registedate":1,"i_ispush":1,"i_applystatus":1,"i_sex":1,"s_country":1,"s_province":1,"s_city":1,"s_m_openid":1,"a_m_openid":1,"base_user_id":1,"s_newsource":1,"l_registedate":1}`); userinfo != nil && len(*userinfo) > 0 {
+		//新用户时间
+		onLineTime, _ := time.ParseInLocation(date.Date_Full_Layout, config.Config.AccountMergeOnline, time.Local)
+		registerDate := common.Int64All((*userinfo)["l_registedate"])
+		reg := time.Unix(registerDate, 0)
+		relationPhoneId, _ := sess.Get("relationPhoneId").(string)
+		//新账号
+		if relationPhoneId == "" {
+			data := map[string]interface{}{
+				"s_unionid":      (*userinfo)["s_unionid"],
+				"s_name":         (*userinfo)["s_name"],
+				"s_nickname":     (*userinfo)["s_nickname"],
+				"s_headimageurl": (*userinfo)["s_headimageurl"],
+			}
+			if jy.IsEmail(email) {
+				data["s_email"] = email
+			}
+			//建立关联关系
+			if bindErr := jy.NewPhoneUtil(db.Mgo).BindPhone(mgoUserId, relationPhoneId, phone, email, &data); bindErr != nil {
+				log.Println("bind link err :", bindErr)
+				return "", bindErr
+			} else {
+				//用户中台存储  开始
+				if uinfo := jy.GetInfoForBaseUser(db.Mgo, mgoUserId); uinfo != nil {
+					jy.UpdateUser(db.Mgo, mgoUserId, *uinfo, *config.Middleground)
+				} else {
+					log.Println("--用户中台存储 异常--")
+				}
+				//用户中台存储  结束
+				jy.CreateUserMerge(db.Mgo, db.Mysql, sess, config.Middleground).FlushSession(mgoUserId) //刷新session
+			}
+		} else if onLineTime.Before(reg) { //新微信用户直接绑定
+			data := map[string]interface{}{
+				"s_unionid":      (*userinfo)["s_unionid"],
+				"s_name":         (*userinfo)["s_name"],
+				"s_nickname":     (*userinfo)["s_nickname"],
+				"s_headimageurl": (*userinfo)["s_headimageurl"],
+				"i_ispush":       (*userinfo)["i_ispush"],
+				"i_applystatus":  (*userinfo)["i_applystatus"],
+				"i_sex":          (*userinfo)["i_sex"],
+				"s_country":      (*userinfo)["s_country"],
+				"s_province":     (*userinfo)["s_province"],
+				"s_city":         (*userinfo)["s_country"],
+				"s_m_openid":     (*userinfo)["s_m_openid"],
+				"a_m_openid":     (*userinfo)["a_m_openid"],
+				"o_jy.i_wxpush":  1,
+			}
+			if jy.IsEmail(email) {
+				data["s_email"] = email
+			}
+			if config.Compatible.Update(relationPhoneId, map[string]interface{}{
+				"$set": data,
+			}) {
+				//用户中台存储  开始
+				if uinfo := jy.GetInfoForBaseUser(db.Mgo, mongodb.BsonIdToSId(relationPhoneId)); uinfo != nil {
+					jy.UpdateUser(db.Mgo, mongodb.BsonIdToSId(relationPhoneId), *uinfo, *config.Middleground)
+				}
+				//删除user
+				base_userid_del := usercenter.GetBaseUserId(db.Mgo, mgoUserId)
+				jy.DelUser(db.Mgo, mgoUserId, pb.UserIdReq{
+					Appid: "10000",
+					Id:    base_userid_del,
+				}, *config.Middleground)
+				//备份用户
+				if backUser, _ := db.Mgo.FindById("user", mgoUserId, nil); backUser != nil && len(*backUser) > 0 {
+					backData := map[string]interface{}{
+						"l_mergeData":   time.Now().Unix(),
+						"s_userId":      mgoUserId,
+						"s_save_userId": relationPhoneId,
+						"mergeType":     "autoMerge",
+					}
+					for k, v := range *backUser {
+						if k == "_id" {
+							continue
+						}
+						backData[k] = v
+					}
+					if db.Mgo.Save("user_merge", backData) != "" {
+						db.Mgo.Del("user", map[string]interface{}{"_id": mongodb.StringTOBsonId(mgoUserId)})
+						jy.CreateUserMerge(db.Mgo, db.Mysql, sess, config.Middleground).FlushSession(relationPhoneId)
+						redis.Put("session", fmt.Sprintf("usermerge_delete_%s", mgoUserId), relationPhoneId, 7*24*60*60)
+					} else {
+						log.Println("备份用户查询异常")
+						return "", errors.New("备份用户查询异常")
+					}
+				} else {
+					log.Println("没有备份用户或备份用户查询异常")
+					return "", errors.New("没有备份用户或备份用户查询异常")
+				}
+			} else {
+				log.Println("账号 中台 更新异常")
+				return "", errors.New("账号 中台 更新异常")
+			}
+		} else { //老微信用户选择合并
+			go CollectPhone(mgoUserId, phone) //增加user表验证手机号
+			token = jy.MergeEncrypt.Encode2Hex(mgoUserId + "&&" + relationPhoneId)
+		}
+	}
+	return
+}
+
+func CollectPhone(userId, phone string) bool {
+	if userId == "" || phone == "" {
+		return false
+	}
+	if !config.Compatible.Update(userId, map[string]interface{}{
+		"$addToSet": map[string]interface{}{
+			"a_collect_phone": phone,
+		},
+	}) {
+		return false
+	}
+	return true
+}
+
+func getPhoneUser(phone string) (bool, map[string]interface{}) {
+	users, ok := db.Mgo.Find("user", map[string]interface{}{
+		"i_appid": 2,
+		"$or": []map[string]interface{}{
+			{"s_phone": phone},
+			{"s_m_phone": phone}},
+	}, `{"s_phone":-1}`, nil, false, 0, 1)
+	if users != nil && len(*users) > 0 {
+		return ok, (*users)[0]
+	}
+	return ok, nil
+}
+
+type RegStruct struct {
+	MapR map[string]int64
+	Lock sync.Mutex
+}
+
+func (this *RegStruct) GC() {
+	defer common.Catch()
+	this.Lock.Lock()
+	now := time.Now().Unix()
+	for k, v := range this.MapR {
+		if now-v > 60 {
+			reg := RegMap[k]
+			if reg != nil {
+				delete(RegMap, k)
+			}
+		}
+	}
+	this.Lock.Unlock()
+	time.AfterFunc(5*time.Minute, this.GC)
+}
+
+func isAndroidOrIOS(s string) string {
+	typ := ""
+	if strings.Contains(s, "Android") {
+		typ = "Android"
+	} else if strings.Contains(s, "iPhone") || strings.Contains(s, "iPad") {
+		typ = "IOS"
+	} else {
+		typ = "other"
+	}
+	return typ
+}
+
+func afterLogin(user map[string]interface{}, session *httpsession.Session, rid, oid, phoneType, channel, deviceId string, isNewUser bool, rw http.ResponseWriter) string {
+	userid := mongodb.BsonIdToSId(user["_id"])
+	old_rid, _ := user["s_jpushid"].(string)
+	old_oid, _ := user["s_opushid"].(string)
+	old_ponetype, _ := user["s_appponetype"].(string)
+	off := true
+	log.Println("多账号登录:", user)
+	go func() {
+		if !isNewUser {
+			if rd := config.Compatible.Select(userid, `{"i_unlimited":1}`); rd != nil && len(*rd) > 0 {
+				i_unlimited := common.IntAll((*rd)["i_unlimited"])
+				if i_unlimited > 0 {
+					off = false
+				}
+			}
+			log.Println("publicapply:", old_rid, "---", old_oid, "---", rid, "---", off)
+			//同一账号在不同设备登录,极光id不一样,给之前的设备推送自定义的下线消息,离线消息保持10天
+			if old_rid != "" && old_rid != rid && off && rid != "" {
+				db.Mgo.UpdateById("user", userid, map[string]interface{}{
+					"$addToSet": map[string]interface{}{"a_jpushid": old_rid},
+				})
+				//
+				log.Println(userid, phoneType, rid, oid, "踢人下线", old_ponetype, old_rid, old_oid)
+				qrpc.AppPush(config.Config.AppPushServiceRpc, map[string]interface{}{
+					"type":        "signOut",
+					"descript":    kickedTip,
+					"jgPushId":    old_rid,
+					"otherPushId": old_oid,
+					"phoneType":   old_ponetype,
+					"userId":      userid,
+				})
+			}
+			if channel != "" && deviceId != "" {
+				//更新用户最后一次登录渠道和设备信息
+				if db.Mgo.Count("jyapp_channel", map[string]interface{}{"s_userid": userid, "s_type": "lastLogin"}) > 0 {
+					update := map[string]interface{}{"i_cometime": time.Now().Unix(), "s_channel": channel}
+					db.Mgo.Update("jyapp_channel", map[string]interface{}{"s_userid": userid, "s_type": "lastLogin"},
+						map[string]interface{}{"$set": update}, false, true)
+				} else {
+					db.Mgo.Save("jyapp_channel", map[string]interface{}{
+						"s_deviceId": deviceId,
+						"s_type":     "lastLogin",
+						"i_cometime": time.Now().Unix(),
+						"s_channel":  channel,
+						"s_userid":   userid,
+					})
+				}
+			}
+		} else {
+			if channel != "" && deviceId != "" {
+				//记录新用户注册渠道来源
+				db.Mgo.Save("jyapp_channel", map[string]interface{}{
+					"s_deviceId": deviceId,
+					"s_type":     "regist",
+					"i_cometime": time.Now().Unix(),
+					"s_channel":  channel,
+					"s_userid":   userid,
+				})
+			}
+		}
+		if rid != "" {
+			db.Mgo.Update("user", map[string]interface{}{
+				"i_appid":   2,
+				"s_jpushid": rid,
+			}, map[string]interface{}{
+				"$unset": map[string]interface{}{
+					"s_jpushid": "",
+					"s_opushid": "",
+				},
+			}, false, true)
+			set := map[string]interface{}{
+				"s_jpushid":     rid,
+				"s_opushid":     oid,
+				"s_appponetype": phoneType,
+			}
+			if o_jy, ok := user["o_jy"].(map[string]interface{}); ok && o_jy != nil && o_jy["i_apppush"] == nil {
+				set["o_jy.i_apppush"] = 1
+			}
+			db.Mgo.UpdateById("user", userid, map[string]interface{}{
+				"$set":  set,
+				"$pull": map[string]interface{}{"a_jpushid": rid},
+			})
+			//删除未登录的pushid
+			jyutil.UnLoginPush.DeleteBuff(rid)
+		}
+	}()
+	jy.JyAppCreateSession(db.Mgo, session, userid, 0, rw, true, config.Middleground, config.Config.AppPushServiceRpc, config.Config.Criticality)
+	return createSign(userid, rid, "登录后", session)
+}
+
+// UserSign 签名
+type UserSign struct {
+	CreateTime int64  `json:"createtime"`
+	OpenId     string `json:"openid"`
+	UserId     string `json:"userid"`
+	Rid        string `json:"rid"`
+	Sign       string `json:"sign"`
+	Type       int    `json:"type"`
+}
+
+// 生成签名,返回手机端
+func createSign(userid, rid, signType string, session *httpsession.Session) string {
+	u := &UserSign{
+		UserId:     userid,
+		CreateTime: time.Now().Unix(),
+		Rid:        rid,
+	}
+	u.Sign, _ = getSign(u)
+	b, err := json.Marshal(u)
+	if err != nil {
+		log.Println(err)
+	}
+	sign := string(b)
+	log.Println(signType, "生成签名加密前:", sign)
+	sign = encrypt.SE.EncodeString(sign)
+	sign = strings.Replace(sign, "+", "%2B", -1)
+	log.Println(signType, "生成签名加密后:", sign)
+	return sign
+}
+func getSign(u *UserSign) (string, string) {
+	newSign := common.GetMd5String(fmt.Sprintf("createtime=%d&userid=%s&rid=%s&type=%d", u.CreateTime, u.UserId, u.Rid, u.Type))
+	oldSign := common.GetMd5String(fmt.Sprintf("createtime=%d&openid=%s&rid=%s&type=%d", u.CreateTime, u.OpenId, u.Rid, u.Type))
+	return newSign, oldSign
+}
+
+// 保存日志
+func (o OneClickInfo) saveLog(userId string, logType string) {
+	q := map[string]interface{}{
+		"s_user_id": userId,
+	}
+	u := map[string]interface{}{
+		"$set": map[string]interface{}{
+			logType: map[string]interface{}{
+				"accessToken": o.AccessToken,
+				"outId":       o.OutId,
+				"spToken":     o.SpToken,
+				"UA":          o.UA,
+				"requestId":   o.RequestId,
+				"vender":      o.Vender,
+				"createTime":  time.Now().Unix(),
+			},
+		},
+	}
+	db.Mgo.Update("oneclick_log", q, u, true, false)
+}

+ 11 - 0
src/jfw/modules/publicapply/src/oneclick/init.go

@@ -0,0 +1,11 @@
+package oneclick
+
+import (
+    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
+    _ "jy/src/jfw/modules/publicapply/src/oneclick/initjson"
+    "jy/src/jfw/modules/publicapply/src/oneclick/service"
+)
+
+func init() {
+    xweb.AddAction(&service.OneClick{})
+}

+ 32 - 0
src/jfw/modules/publicapply/src/oneclick/initjson/oc.go

@@ -0,0 +1,32 @@
+package initjson
+
+import (
+	qu "app.yhyue.com/moapp/jybase/common"
+)
+
+type oneClick struct {
+	AccessKeyId     string `json:"accessKeyId"`
+	AccessKeySecret string `json:"accessKeySecret"`
+	H5              struct {
+		Origin string `json:"origin"`
+		Url    string `json:"url"`
+	} `json:"h5"`
+	Wx struct {
+		Origin string `json:"origin"`
+		Url    string `json:"url"`
+	} `json:"wx"`
+	TokenCache struct {
+		Open    bool   `json:"open"`
+		Key     string `json:"key"`
+		Timeout int    `json:"timeout"`
+	} `json:"tokenCache"`
+}
+
+var (
+	OneClick *oneClick
+)
+
+func init() {
+	//初始化配置
+	qu.ReadConfig("./oneclick/oneClick.json", &OneClick)
+}

+ 17 - 0
src/jfw/modules/publicapply/src/oneclick/oneClick.json

@@ -0,0 +1,17 @@
+{
+  "accessKeyId": "LTAIjtDusUKp6XEw",
+  "accessKeySecret": "DWAt7v7HtfpJcJzRjzWOoPZ0D4oSRu",
+  "h5": {
+    "origin": "https://apph3-jytest.jydev.jianyu360.com",
+    "url": "https://apph3-jytest.jydev.jianyu360.com/"
+  },
+  "wx": {
+    "origin": "https://jybx-webtest.jydev.jianyu360.com",
+    "url": "https://jybx-webtest.jydev.jianyu360.com/"
+  },
+  "tokenCache": {
+    "open": false,
+    "key": "oneclick_token_%s",
+    "timeout": 300
+  }
+}

+ 9 - 0
src/jfw/modules/publicapply/src/oneclick/service/action.go

@@ -0,0 +1,9 @@
+package service
+
+import "app.yhyue.com/moapp/jybase/go-xweb/xweb"
+
+type OneClick struct {
+	*xweb.Action
+	getAuthToken    xweb.Mapper `xweb:"/oneClick/getAuthToken"`    //H5获取token
+	getPhoneByToken xweb.Mapper `xweb:"/oneClick/getPhoneByToken"` //根据token 获取手机号
+}

+ 66 - 0
src/jfw/modules/publicapply/src/oneclick/service/service.go

@@ -0,0 +1,66 @@
+package service
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	qu "app.yhyue.com/moapp/jybase/common"
+	"errors"
+	"jy/src/jfw/modules/publicapply/src/oneclick/entity"
+	"log"
+)
+
+func (o *OneClick) GetPhoneByToken() {
+	defer qu.Catch()
+	r := func() Result {
+		if o.Method() != "POST" {
+			return Result{Data: nil, Error_msg: Error_msg_1005}
+		}
+		var (
+			oci = &entity.OneClickInfo{
+				AccessToken:    o.GetString("accessToken"),
+				OutId:          o.GetString("outId"),
+				SpToken:        o.GetString("spToken"),
+				ActionType:     o.GetString("actionType"),
+				Rid:            o.GetString("rid"),
+				Oid:            o.GetString("oid"),
+				PhoneType:      o.GetString("phoneType"),
+				Channel:        o.GetString("channel"),
+				DeviceId:       o.GetString("deviceId"),
+				UA:             o.Header("User-Agent"),
+				ResponseWriter: &o.ResponseWriter,
+				Session:        o.Session(),
+				DisWord:        o.GetString("disWord"),
+				RequestId:      o.GetString("requestid"),
+				Vender:         o.GetString("vender"),
+				Host:           o.Request.Host,
+			}
+		)
+		if oci.SpToken == "" && oci.AccessToken == "" {
+			return NewResult(nil, errors.New(Error_msg_1002))
+		}
+		data, err := oci.GetPhoneByToken()
+		if err != nil {
+			log.Println("err:", err)
+			return NewResult(nil, err)
+		}
+		return NewResult(data, err)
+	}()
+	o.ServeJson(r)
+}
+
+func (o *OneClick) GetAuthToken() {
+	//userId, _ := o.GetSession("mgoUserId").(string)
+	//fmt.Println("-----------------", userId)
+	defer qu.Catch()
+	r := func() Result {
+		if o.Method() != "POST" {
+			return Result{Data: nil, Error_msg: Error_msg_1005}
+		}
+		err, token := entity.GetAuthTokenWithOptions(o.Request.Host)
+		if err != nil {
+			log.Println("err:", err)
+			return Result{Data: nil, Error_msg: Error_msg_1003}
+		}
+		return Result{Data: token}
+	}()
+	o.ServeJson(r)
+}

+ 1 - 2
src/jfw/modules/publicapply/src/userbase/initjson/initjson.go → src/jfw/modules/publicapply/src/userbase/initjson/ub.go

@@ -1,8 +1,8 @@
 package initjson
 
 import (
-	"log"
 	util "app.yhyue.com/moapp/jybase/common"
+	"log"
 )
 
 type BaseFunc struct {
@@ -26,7 +26,6 @@ type baseFuncInfo struct {
 
 var BaseFuncInfo baseFuncInfo
 
-//
 type MenuLevel struct {
 	Firstlevel     string      `json:"firstlevel"`
 	Secondarylevel []*MenuInfo `json:"secondarylevel"`

+ 2 - 2
src/jfw/modules/subscribepay/src/timetask/ent.go

@@ -56,7 +56,7 @@ func (e *Ent) LoadVipUsers(field map[string]interface{}, f func(m map[string]int
 		userId := fmt.Sprint(IntAll(m["i_userid"]))
 		mm := util.Compatible.SelectByEntUserId(userId, field)
 		if mm == nil {
-			return
+			continue
 		}
 		(*mm)["_id"] = userId
 		f(*mm)
@@ -85,7 +85,7 @@ func (e *Ent) LoadBigMemberUsers(field map[string]interface{}, f func(m map[stri
 		userId := fmt.Sprint(IntAll(m["i_userid"]))
 		mm := util.Compatible.SelectByEntUserId(userId, field)
 		if mm == nil {
-			return
+			continue
 		}
 		(*mm)["_id"] = userId
 		f(*mm)

+ 2 - 1
src/phoneFilter.json

@@ -22,7 +22,8 @@
     "^/weixin/(\\w+)/paySuccess",
     "^/stl/exhibitionActive",
     "^/swordfish/SingleLogin",
-    "^/weixin/frontPage/bigmember/free/perfect_info_exhibition"
+    "^/weixin/frontPage/bigmember/free/perfect_info_exhibition",
+    "^/orgstructure/invaction/(.*)"
 	],
 	"sessUrl":{
 		"/jyTreasureBox/treasureBox":"",

+ 2 - 0
src/web/staticres/big-member/js/ent_portrait.js

@@ -15,6 +15,7 @@ var vNode = {
         return {
             sessKey: '$data-ent_portrait',
             conf: {
+                isFree: true,
                 // 权限查询是否完成
                 powerLoaded: false,
                 // 是否只显示完整的企业画像
@@ -396,6 +397,7 @@ var vNode = {
                         _this.conf.powerLoaded = true
                         if (res.data) {
                             _this.powerInfo = res.data
+                            _this.conf.isFree = res.data.isFree
                         }
                         if (res.data && $.isArray(res.data.power)) {
                             // 显示完整企业画像(不完整的企业画像只有中标动态)

+ 2 - 2
src/web/staticres/big-member/js/meauContact.js

@@ -468,7 +468,7 @@ var SCFX = [
   {
     '推荐服务': [
       {
-        two: '联系采购单位,供采双方直接对接',
+        two: '搭建有效桥梁,供采双方直接对接',
         three: [
           {
             threein: '采购单位/招标代理机构会将部分项目通过剑鱼标讯进行公开或邀请招标,剑鱼标讯为客户提供项目的采购单位/招标代理机构联系方式,方便客户联系。',
@@ -488,7 +488,7 @@ var SCFX = [
         ]
       },
       {
-        two: '向采购单位唯一推荐,直接成交',
+        two: '向采购单位唯一推荐,直接有效促成签单',
         three: [
           {
             threein: '剑鱼标讯与众多采购单位/招标代理机构拥有良好的合作关系,部分优质项目在剑鱼标讯进行公开或邀请招标。剑鱼标讯将根据客户企业资质、综合实力、成功案例,向采购单位方推荐。客户在使用唯一推荐权益后,剑鱼标讯将不再向采购单位方推荐其他供应商。',

+ 10 - 0
src/web/staticres/common-module/account/css/fast-bind.css

@@ -0,0 +1,10 @@
+/* 基于fast-login对fast-bind进行补充修改 */
+body .page-type-container .submit-btn {
+  margin-bottom: 30vw;
+}
+body .page-type-container .agreement {
+  position: absolute;
+  bottom: 10vw;
+  left: 50%;
+  transform: translate(-50%, 0);
+}

+ 221 - 0
src/web/staticres/common-module/account/css/fast-login.css

@@ -0,0 +1,221 @@
+.fast-login-container {
+  margin-top: 0.14rem;
+  margin-bottom: .14rem;
+  text-align: center;
+}
+.fast-login {
+  margin: 0 auto;
+  padding: 0 .4rem;
+}
+.fast-login-text {
+  font-size: 0.32rem;
+  line-height: 0.52rem;
+  background-color: transparent;
+}
+.fast-phone-container {
+  margin: 0.64rem auto 0.8rem;
+  text-align: center;
+}
+.fast-phone-number {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #171826;
+  font-size: 0.48rem;
+  line-height: 0.96rem;
+}
+.fast-phone-text {
+  color: #5F5E64;
+  text-align: center;
+  font-size: 0.26rem;
+  line-height: 0.4rem;
+}
+.client-verify .phone-number-mask {
+  margin: 0 .16rem;
+}
+.h5-verify .van-password-input {
+  margin: 0 .2rem;
+}
+.h5-verify .phone-number-prefix,
+.h5-verify .phone-number-suffix {
+  letter-spacing: .1rem;
+}
+.verify-button {
+  padding: 0.18rem 0;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  border-radius: .16rem;
+  border: 1px solid transparent;
+}
+.verify-confirm {
+  color: #F7F9FA;
+  background-color: #2ABED1;
+  border-color: #2ABED1;
+}
+.verify-cancel {
+  color: #2ABED1;
+  background-color: transparent;
+  border-color: #2ABED1;
+}
+.verify-button-group .verify-button:not(:first-of-type) {
+  margin-top: .24rem;
+}
+
+.van-password-input__security li {
+  flex: none;
+  width: 0.4rem;
+  color: inherit;
+  font-size: inherit;
+  border-bottom: 1px solid #5F5E64;
+  background-color: transparent;
+}
+.van-password-input__security li:not(:last-of-type) {
+  margin-right: 0.2rem;
+}
+.van-password-input__security li.van-password-input__item--focus {
+  border-bottom: 2px solid #2ABED1;
+}
+
+
+/* 一键登录相关样式 */
+/* 此处可修改导航栏整体样式:字体大小,字体颜色,背景颜色等 */
+body .page-type-container {
+  position: fixed;
+  bottom: 0;
+  min-height: 100vh;
+  z-index: 99999;
+}
+body .page-type-container .nav-title {
+  color:#fff;
+}
+body .page-type-container .dialog-subtitle,
+body .dialog-type-container .dialog-subtitle {
+  color: #5F5E64;
+  text-align: center;
+  font-size: 0.26rem;
+  line-height: 0.4rem;
+}
+/* 此处可修改logo容器的样式: 宽度 高度,圆角等 */
+body .page-type-container .logo {
+  margin-top: 0;
+  margin-bottom: 4vh;
+  width: 100%;
+}
+body .dialog-type-container .logo {
+  margin-top: 0;
+  margin-bottom: 4vw;
+  width: 86%;
+}
+.page-type-container .content {
+  min-height: unset;
+}
+/* 此处修改电话号码的样式: 颜色、字体大小等 */
+body .page-type-container .number-con-wrap {
+  flex-direction:column
+}
+body .page-type-container .number-con-label {
+  color: #5F5E64;
+  text-align: center;
+  font-size: 0.26rem;
+  line-height: 0.4rem;
+}
+body .page-type-container .number-con,
+body .dialog-type-container .number-con {
+  color: #171826;
+  font-size: 0.48rem;
+  line-height: 0.96rem;
+}
+body .page-type-container .number-con {
+  margin: 4vw 0;
+}
+/* 此处修改电话号码掩码的样式:宽度、高度、字体颜、色间距等 */
+body .page-type-container .number-con input,
+body .dialog-type-container .number-con input {
+  padding: 0;
+  color: inherit;
+  font-size: inherit;
+  border-bottom: 1px solid #5F5E64;
+}
+body .page-type-container .number-con input:focus,
+body .dialog-type-container .number-con input:focus {
+  border-bottom: 2px solid #2ABED1;
+}
+/* 此处修改协议勾选、选中时的颜色 */
+body .page-type-container .agreement .checke-1 svg g
+body .dialog-type-container .agreement .checke-1 svg g {
+  fill: #2ABED1;
+}
+/* 此处修改登录按钮的样式:颜色大小背景色等 */
+body .page-type-container .submit-btn,
+body .dialog-type-container .submit-btn {
+  margin: 10vw auto;
+  margin-bottom: 20vw;
+  padding: 0.18rem 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  text-align: center;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  border-radius: .16rem;
+  border: 1px solid #2ABED1;
+  background: #2ABED1;
+}
+body .dialog-type-container .submit-btn {
+  margin: 8vw auto 4vw;
+}
+
+body .page-type-container .submit-disabled,
+body .dialog-type-container .submit-disabled {
+  background: #2ABED1;
+}
+body .page-type-container .submit-btn.submit-disabled,
+body .dialog-type-container .submit-btn.submit-disabled {
+  opacity: 0.6;
+}
+/* 此处修改协议区域的样式: 字体颜色,大小等 */
+body .page-type-container .agreement {
+  margin: 2vh 6vw 0
+}
+body .page-type-container .agreement .agree-content,
+body .dialog-type-container .agreement .agree-content {
+  width: 80vw;
+  margin: 0 auto;
+  color: #171826;
+}
+body .dialog-type-container .agreement .agree-content {
+  width: 74vw;
+}
+body .page-type-container .agreement .checke-0,
+body .page-type-container .agreement .checke-1,
+body .dialog-type-container .agreement .checke-0,
+body .dialog-type-container .agreement .checke-1 {
+  margin-right: 6px;
+}
+body .page-type-container .agreement .checke-1 svg g,
+body .dialog-type-container .agreement .checke-1 svg g {
+  fill: #2ABED1;
+}
+body .page-type-container .agreement a,
+body .dialog-type-container .agreement a {
+  color: #2ABED1;
+}
+body .page-type-container .custom-view-box {
+  margin: 0 auto;
+  margin-top: -27vw;
+}
+body .page-type-container .agreement .agree-content-tip {
+  top: -7.2vh;
+  left: -1.6vw;
+  background: rgba(0,0,0,.7);
+  color: #fff;
+}
+body .page-type-container .agreement .agree-content-tip::after {
+  content: unset;
+}
+  

+ 129 - 0
src/web/staticres/common-module/account/js/fast-bind.js

@@ -0,0 +1,129 @@
+var fastLogin = {}
+
+if (utils.$envs.inApp) {
+  fastLogin = new Vue({
+    mixins: [loadingMixin, toastMixin, fLogin, fastLoginConfApp],
+    el: '#fast-login-container',
+    created: function () {
+      window.getPhoneBindCallback = this.getPhoneBindCallback
+    },
+    methods: {
+      getPrePayload: function () {
+        return {
+          actionType: 'B'
+        }
+      },
+      doPhoneFastLoginSuccess: function (r) {
+        if (r && r.data) {
+          if (r.data.token) {
+            vm.token = r.data.token || ''
+          }
+          vm.bindPhoneSuccess(r.data.state)
+        }
+      },
+      getPhoneBind: function () {
+        this.loading()
+        try {
+          JyObj.getPhoneBind()
+        } catch (e) {
+          console.log(e)
+          this.enableToast()
+          this.loadingClear()
+        }
+      },
+      getPhoneBindCallback: function (r) {
+        this.loadingClear()
+        if (!r) return
+        var res = JSON.parse(r)
+        // 错误码需要注意:android取res.code,ios取resultCode
+        $('.bind-callback-text').text(r)
+        console.log(res.msg)
+        if (res && res.token) {
+          this.tokenInfo.accessToken = res.token
+          this.tokenInfo.outId = res.requestId
+          this.tokenInfo.requestId = res.requestId
+          this.tokenInfo.venderName = res.venderName
+          this.doFastBind()
+        } else {
+          if (this.toast.enable && res.msg) {
+            // this.$toast(res.msg)
+            // 错误码需要注意:android取res.code,ios取resultCode
+            var androidError = res.code && res.code < 700000  && res.code > 600001
+            var iosError = res.resultCode && res.resultCode < 700000  && res.resultCode > 600001
+            if (androidError || iosError) {
+              this.$toast('当前网络环境不支持一键绑定认证')
+            }
+          }
+        }
+        this.enableToast()
+      },
+      doFastBind: function () {
+        var tokenInfo = this.tokenInfo
+        this.doPhoneFastLogin(tokenInfo)
+      },
+    }
+  })
+} else {
+  // 函数覆盖mixin中的函数
+  fastLogin = new Vue({
+    mixins: [loadingMixin, toastMixin, fLogin, fastLoginConfH5],
+    el: '#fast-login-container',
+    methods: {
+      getPrePayload: function () {
+        return {
+          actionType: 'B'
+        }
+      },
+      calcAuthPageOption: function () {
+        this.authPageOption.navText = '绑定手机号'
+        this.authPageOption.logoImg = ''
+        this.authPageOption.isHideLogo = true
+        this.authPageOption.privacyOne = undefined
+        this.authPageOption.privacyTwo = undefined
+        this.authPageOption.btnText = '一键绑定手机号'
+        this.authPageOption.customView.element = '<div class="btn_box other" onclick="clickEvent()"><button class="verify-button verify-cancel">绑定其他手机号</button></div>'
+      },
+      doPhoneFastLoginSuccess: function (r) {
+        if (r && r.data) {
+          if (r.data.token) {
+            vm.token = r.data.token || ''
+          }
+          vm.bindPhoneSuccess(r.data.state)
+        }
+      },
+    }
+  })
+}
+
+var bindPhoneEvents = {
+  init: function () {
+    this.bindEvents()
+  },
+  bindEvents: function () {
+    if (utils.$envs.inApp) {
+      this.initAppEvents()
+    } else {
+      this.initH5Events()
+    }
+  },
+  checkAutoFastBind: function (auto) {
+    var autoFastLogin = utils.getParam('auto')
+    var onBind = window.vm && window.vm.type
+    if (autoFastLogin || auto || onBind) {
+      fastLogin.disabledToast()
+      $('.fast-login-open-link').trigger('click')
+    }
+  },
+  initAppEvents: function () {
+    $('.fast-login-open-link').on('click', fastLogin.getPhoneBind)
+    this.checkAutoFastBind()
+  },
+  initH5Events: function () {
+    $('.fast-login-open-link').on('click', fastLogin.getAuthInfo)
+    this.checkAutoFastBind()
+  },
+}
+
+$(function () {
+  bindPhoneEvents.init()
+})

+ 394 - 0
src/web/staticres/common-module/account/js/fast-login.js

@@ -0,0 +1,394 @@
+var phoneNumberServer = new window.PhoneNumberServer()
+var phoneNumberServerVersion = phoneNumberServer.getVersion()
+// 开启日志
+// phoneNumberServer.setLoggerEnable(true)
+
+var toastMixin = {
+  data: function () {
+    return {
+      toast: {
+        enable: true,  // toast是否可用,默认可用
+      },
+    }
+  },
+  methods: {
+    enableToast: function () {
+      this.toast.enable = true
+    },
+    disabledToast: function () {
+      this.toast.enable = false
+    },
+  }
+}
+var loadingMixin = {
+  methods: {
+    loading: function () {
+      return this.$toast.loading({
+        loadingType: 'spinner',
+        duration: 0,
+        forbidClick: true,
+      })
+    },
+    loadingClear: function () {
+      return this.$toast.clear()
+    },
+  }
+}
+var fLogin = {
+  methods: {
+    getPrePayload: function () {
+      var payload = {}
+      try {
+        payload = {
+          rid: getPushRid(),
+          oid:getOtherPushId(),
+          phoneType:getPhoneType(),
+          channel:getChannel(),
+          deviceId:getDeviceId(),
+          disWord:disWord,
+        }
+      } catch (error) {
+        console.log(error)
+      }
+      return payload
+    },
+    doPhoneFastLogin: function (tokenInfo) {
+      this.loading()
+      var _this = this
+      var payload = this.getPrePayload()
+      Object.assign(payload, tokenInfo)
+      $.ajax({
+        url: '/publicapply/oneClick/getPhoneByToken',
+        method: 'POST',
+        data: payload,
+        success: function (res) {
+          if (res && res.error_code === 0) {
+            _this.doPhoneFastLoginSuccess(res)
+          } else {
+            if (_this.toast.enable) {
+              if (res.error_msg) {
+                _this.$toast(res.error_msg)
+              } else {
+                if (payload.actionType === 'B') {
+                  _this.$toast('绑定失败')
+                } else {
+                  _this.$toast('登录失败')
+                }
+              }
+            }
+            console.log(res.error_msg)
+          }
+        },
+        error: function () {
+          _this.loadingClear()
+        },
+        complete: function () {
+          _this.enableToast()
+        },
+      })
+    },
+    doPhoneFastLoginSuccess: function (r) {
+      if (r && r.data) {
+        loginSuccess(r.data)
+      }
+    },
+  }
+}
+
+var fastLoginConfApp = {
+  delimiters: ['${', '}'],
+  mixins: [loadingMixin, toastMixin, fLogin],
+  data: function () {
+    return {
+      tokenInfo: {
+        outId: '',
+        requestId: '',
+        accessToken: '',
+        venderName: '',
+      }
+    }
+  },
+  created: function () {
+    // window.checkLoginEnvAvailableCallback = this.checkLoginEnvAvailableCallback
+    window.getLoginCallback = this.getLoginCallback
+  },
+  methods: {
+    // 此方法暂时不用,原因是安卓ios对此方法操作不相同,具体见common.js此方法定义处的注释
+    checkLoginEnvAvailable: function () {
+      try {
+        JyObj.checkLoginEnvAvailable()
+      } catch (e) {
+        console.log(e)
+      }
+    },
+    // 此方法暂时不用
+    // r一键登录是否可用: '0'不可用/'1'可用
+    checkLoginEnvAvailableCallback: function (r) {
+      if (r === '0') {
+        if (this.toast.enable) {
+          this.$toast('环境不可用')
+        }
+      } else if (r === '1') {
+        this.getLogin()
+      } else {
+        console.log('未知参数:', r)
+      }
+    },
+    getLogin: function () {
+      this.loading()
+      try {
+        JyObj.getLogin()
+      } catch (e) {
+        console.log(e)
+        this.enableToast()
+        this.loadingClear()
+      }
+    },
+    getLoginCallback: function (r) {
+      this.loadingClear()
+      if (!r) return
+      var res = JSON.parse(r)
+      // 错误码需要注意:android取res.code,ios取resultCode
+      $('.login-callback-text').text(r)
+      console.log(res.msg)
+      if (res && res.token) {
+        this.tokenInfo.accessToken = res.token
+        this.tokenInfo.outId = res.requestId
+        this.tokenInfo.requestId = res.requestId
+        this.tokenInfo.venderName = res.venderName
+        this.doFastLogin()
+      } else {
+        if (this.toast.enable && res.msg) {
+          // this.$toast(res.msg)
+          // 错误码:https://help.aliyun.com/document_detail/2249338.html
+          var androidError = res.code && res.code < 700000 && res.code > 600001
+          var iosError = res.resultCode && res.resultCode < 700000 && res.resultCode > 600001
+          if (androidError || iosError) {
+            this.$toast('当前网络环境不支持一键登录认证')
+          }
+        }
+      }
+      this.enableToast()
+    },
+    doFastLogin: function () {
+      var tokenInfo = this.tokenInfo
+      this.doPhoneFastLogin(tokenInfo)
+    }
+  }
+}
+
+var fastLoginConfH5 = {
+  delimiters: ['${', '}'],
+  mixins: [loadingMixin, toastMixin, fLogin],
+  data: function () {
+    return {
+      authPageOption: {
+        // mount: 'h5-verify', // 指定挂载节点
+        navText: "一键登录", // 标题必须填,否则会报错(授权页css属性超过限制)
+        subtitle: "", // 副标题
+        isHideLogo: false, // logo显示隐藏
+        numberLabel: '请填写完整手机号,并授权剑鱼标讯认证使用',
+        logoImg: '/common-module/public/image/register_logo.png',
+        btnText: "一键登录/注册",
+        agreeSymbol: "、",
+        privacyOne: ["《使用协议》", "/jyapp/free/staticPage/permission_rules.html"],
+        privacyTwo: ["《隐私政策》", "/jyapp/free/staticPage/privacy_rules.html"],
+        showCustomView: true,
+        customView: {
+          element:
+            '<div class="btn_box other" onclick="clickEvent()"><button class="verify-button verify-cancel">其他手机号登录/注册</button></div>',
+          style: ".btn_box.other{width: 100%;}",
+          js: "function clickEvent(){phoneNumberServer.closeLoginPage()}",
+        },
+        privacyBefore: "我已阅读并同意",
+        privacyEnd: "",
+        vendorPrivacyPrefix: "《",
+        vendorPrivacySuffix: "》",
+        privacyVenderIndex: 0,
+        isDialog: false, // 是否是弹窗样式
+        manualClose: true, // 是否手动关闭弹窗/授权页
+        isPrePageType: false,
+        isShowProtocolDesc: false,
+      },
+      h5AuthInfo: {
+        jwtToken: '',
+        accessToken: '',
+      },
+      h5TokenInfo: {
+        outId: '',
+        requestId: '',
+        spToken: '',
+        vender: '', // CM/CU/CT CM:中国移动,CU:中国联通,CT:中国电信
+      },
+      prePayload: {}
+    }
+  },
+  created: function () {
+    this.prePayload = this.getPrePayload()
+    this.calcAuthPageOption()
+  },
+  methods: {
+    // 此方法有误差,在ios可能识别为unknown
+    checkLoginEnvAvailable: function () {
+      // 注: h5下为jssdk获取的wifi/cellular/unknown,app下为客户端sdk获取的'0'/'1'
+      var connection =  phoneNumberServer.getConnection()
+      // 只要不是wifi就可以
+      console.log('当前网络:', connection)
+      return connection !== 'wifi'
+    },
+    unavailableEnvToast: function () {
+      var actionType = this.prePayload.actionType
+      if (actionType === 'B') {
+        this.$toast('当前网络环境不支持一键绑定认证')
+      } else {
+        this.$toast('当前网络环境不支持一键登录认证')
+      }
+    },
+    getAuthInfo: function () {
+      var _this = this
+      if (!this.checkLoginEnvAvailable()) {
+        if (this.toast.enable) {
+          this.unavailableEnvToast()
+        }
+        return this.enableToast()
+      }
+      this.loading()
+      $.ajax({
+        url: '/publicapply/oneClick/getAuthToken',
+        method: 'POST',
+        success: function (r) {
+          if (r && r.data) {
+            _this.h5AuthInfo = r.data
+            _this.doCheckLogin()
+          } else {
+            if (_this.toast.enable && r.error_msg) {
+              _this.$toast(r.error_msg)
+            } else {
+              _this.loadingClear()
+            }
+            _this.enableToast()
+          }
+        },
+        error: function () {
+          _this.$toast('获取授权信息失败')
+        }
+      })
+    },
+    doCheckLogin: function () {
+      // 调用之前先去用户服务端获取accessToken和jwtToken
+      // var h5TokenInfo = {
+      //   jwtToken: "OhT****************dw",
+      //   accessToken: "qaxz*******************0qazx",
+      // };
+      var h5TokenInfo = this.h5AuthInfo
+
+      this.checkLogin(h5TokenInfo.jwtToken, h5TokenInfo.accessToken);
+    },
+    calcAuthPageOption: function () {
+      if (utils.$envs.inApp || utils.$envs.inH5) {
+        // do something
+      } else {
+        this.authPageOption.privacyOne = ["《使用协议》", "/front/staticPage/permission_rules.html"]
+        this.authPageOption.privacyTwo = ["《隐私政策》", "/front/staticPage/privacy_rules.html"]
+        // this.authPageOption.btnText = '一键绑定手机号'
+      }
+    },
+    getToken: function (jwtToken, accessToken) {
+      var _this = this
+      var authPageOption = this.authPageOption
+      phoneNumberServer.getLoginToken({
+        // 配置选项
+        authPageOption: authPageOption,
+        // 成功回调
+        success: function (res) {
+          console.log('取号成功', res)
+          // 一键登录: 可发请求到服务端调用 GetPhoneWithToken API, 获取用户手机号, 完成登录
+          // 拿到spToken去服务端发起Token验证
+          if (res.code === 600000) {
+            var h5TokenInfo = {
+              outId: res.requestId,
+              requestId: res.requestId,
+              spToken: res.spToken,
+              vender: res.vender,
+            }
+            Object.assign(_this.h5TokenInfo, h5TokenInfo)
+            phoneNumberServer.closeLoginPage(); // 手动关闭授权页时调用关闭页面
+            res.clearInput(); // 清空输入框并将光标置于第一个输入框
+            res.focusOn(2); // 将光标置于第1-4个输入框
+            res.setMessage({
+              // 设置弹出Toast提示框(有默认样式)
+              showMessage: true, // 是否弹出Toast提示框
+              messageContent: "验证成功", // 弹出内容
+              messageStyle: {
+                // 自定义弹窗样式,写入css样式即可
+                color: "#fff",
+                borderRadius: "8px",
+              },
+              time: 2000, // 弹出时间/ms,默认3000毫秒
+            });
+            _this.verifyPhoneSuccess()
+          }
+        },
+        // 失败回调
+        error: function (res) {
+          // 提示用户关闭Wi-Fi或者尝试其他登录方案
+          // _this.showInputLogin()
+          console.log('取号失败', res)
+          if (_this.toast.enable) {
+            // _this.$toast(res.msg)
+            _this.unavailableEnvToast()
+          } else {
+            _this.enableToast()
+            _this.loadingClear()
+          }
+        },
+        // 授权页状态监听函数
+        watch: function (status, data) {
+          // console.log('-----------------status', status, data);
+          // 当status为2时整个流程结束,比如如果按钮有loading状态此处置为false
+          console.log(status, data)
+        },
+      });
+    },
+    checkLogin: function (jwtToken, accessToken) {
+      var _this = this
+      phoneNumberServer.checkLoginAvailable({
+        accessToken: accessToken,
+        jwtToken: jwtToken,
+        success: function (res) {
+          console.log("身份鉴权成功, 可唤起登录/绑定界面", res);
+          if (res.code === 600000) {
+            // 在此调用getLoginToken方法
+            _this.loadingClear()
+            _this.getToken();
+          }
+          _this.enableToast()
+        },
+        error: function (res) {
+          console.log("身份鉴权失败", res);
+          // 提示用户关闭Wi-Fi或者尝试其他登录方案
+          if (_this.toast.enable) {
+            if (_this.actionType === 'B') {
+              _this.$toast('身份鉴权失败,请使用其他方式绑定')
+            } else {
+              _this.$toast('身份鉴权失败,请使用其他方式登录/注册')
+            }
+          } else {
+            _this.loadingClear()
+          }
+          _this.enableToast()
+        },
+      });
+    },
+    verifyPhoneSuccess: function () {
+      // h5TokenInfo = {
+      //   outId: requestId,
+      //   requestId: requestId,
+      //   spToken: spToken,
+      //   vender: vender,
+      // }
+      var h5TokenInfo = this.h5TokenInfo
+      this.doPhoneFastLogin(h5TokenInfo)
+    },
+  }
+}

+ 1 - 1
src/web/staticres/common-module/account/js/verify.js

@@ -304,7 +304,7 @@ var vNode = {
       goBack: function () {
           if(history.length === 1) {
             try {
-              JyObj.backUrl('')
+              JyObj.backUrl('H')
             } catch (error) {}
           } else {
             history.back()

+ 10 - 0
src/web/staticres/common-module/big-member/js/page_client_follow_detail.js

@@ -985,9 +985,19 @@ var vNode = {
                 },
                 success: function (res) {
                     console.log(res)
+                    if (res.error_code !== 0) {
+                      _this.$toast(res.error_msg || '设置提醒失败')
+                      _this.showTimes = '去开启'
+                      _this.remindershow = false
+                      _this.isAddClass = false
+                    }
                 },
                 error: function (err) {
                     console.log(err)
+                    _this.$toast('设置提醒失败')
+                    _this.showTimes = '去开启'
+                    _this.remindershow = false
+                    _this.isAddClass = false
                 }
             })
         },

+ 1 - 0
src/web/staticres/common-module/collection/js/analysis-report-example.js

@@ -158,6 +158,7 @@ var chartExample = {
       // 【前往升级】:超级订阅老版用户+购买了非全国采购单位画像余额为0的超级订阅新版用户,点击进入超级订阅升级页
       // 【联系客服】:购买了全国采购单位画像余额为0的超级订阅新版用户+无采购单位画像权限的大会员客户;点击调起智齿在线客服
       if (info.isFree) {
+        // btnText = '去开通'
         if (info.freeBuyerPort === 0) {
           btnText = '立即解锁'
         } else {

+ 8 - 6
src/web/staticres/common-module/collection/js/buyer-example.js

@@ -204,12 +204,14 @@ var buyerExample = {
       if (!info.isLogin) {
         btnText = '登录查看'
       } else if (info.isFree) {
-        if (info.freeBuyerPort === 0) {
-          // btnText = '免费体验'
-          btnText = '免费体验'
-        } else {
-          btnText = '去开通'
-        }
+        // 免费体验功能已经下掉
+        btnText = '去开通'
+        // if (info.freeBuyerPort === 0) {
+        //   // btnText = '免费体验'
+        //   btnText = '免费体验'
+        // } else {
+        //   btnText = '去开通'
+        // }
       } else {
         // 老超级订阅用户
         var oldVip = info.vipStatus > 0 && !info.viper

+ 2 - 0
src/web/staticres/common-module/collection/js/ent_portrait.js

@@ -20,6 +20,7 @@ var vNode = {
     return {
       sessKey: '$data-ent_portrait',
       conf: {
+        isFree: true,
         // 权限查询是否完成
         powerLoaded: false,
         // 是否只显示完整的企业画像
@@ -838,6 +839,7 @@ var vNode = {
               }
             }
             _this.conf.isMember = res.data.memberStatus
+            _this.conf.isFree = res.data.isFree
             _this.conf.arr = res.data.power
             _this.conf.vipStatus = res.data.vipStatus
             _this.getDataFn()

+ 3 - 2
src/web/staticres/common-module/collection/js/vip-dialog.js

@@ -135,7 +135,8 @@ var vipComponent = {
         // (2)【立即解锁】:未体验过企业画像的免费用户,中标分析各模块,点击进行“欢迎体验企业中标分析”留资;
         if (this.canFreeExp) {
           // textMap.btnText = '立即解锁'
-          textMap.btnText = '免费体验'
+          // 免费体验功能已经下掉,此处改为引导购买
+          textMap.btnText = '去开通'
         } else {
           if (this.power.vipStatus <= 0) {
             textMap.btnText = '去开通'
@@ -228,7 +229,7 @@ var vipComponent = {
         // 统计信息-概况
         case 'item_10': {
           textMap.titleText = ''
-          textMap.btnText = this.power.isMember > 0 && this.power.arr.indexOf(4) == -1 ? '联系客服' : '免费体验'
+          textMap.btnText = this.power.isFree ? '去开通' : '前往升级'
           textMap.headText.top = '全面透视企业历史中标项目、中标'
           textMap.headText.bot = '金额、客户数量'
           textMap.source = 'ent_portrait_bidInfoDesc'

二进制
src/web/staticres/common-module/public/image/register_logo.png


二进制
src/web/staticres/common-module/public/image/register_logo2.png


+ 5 - 2
src/web/staticres/entnichePush/js/common.js

@@ -321,7 +321,7 @@ $(function () {
       },
       /*跳转到指定的webview
        * name 对应的值:
-       *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
+       *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
        */
       skipAppointTab: function (name) {
         JyObjMessage.name = name
@@ -330,7 +330,7 @@ $(function () {
       },
       /*刷新指定的webview
        * name 对应的值:
-       *   search:搜索 subscribe:订阅 box:百宝箱 me:我的 message:消息
+       *   search:搜索 subscribe:订阅 box:工作台 me:我的 message:消息
        * type 对应的值:
        *   0:当前页 1:一级页面
        */
@@ -1424,6 +1424,9 @@ function afterPageInit () {
   	savePushIdMsg();
 }
 
+// 版本号对比
+// curVersion < upVersion true
+// curVersion >= upVersion false
 function compareVersion (curVersion, upVersion) {
   v1 = curVersion.split(".");
   v2 = upVersion.split(".");

+ 10 - 2
src/web/staticres/js/login.js

@@ -537,7 +537,9 @@ var processpage = function(item,num){
   if (backToUrl) {
     return location.replace(decodeURIComponent(backToUrl))
   }
-
+  if (document.referrer === location.href) {
+    return location.replace('/')
+  }
 	var toHref=$("#bidLogin").attr("data-rec")
 	switch (toHref) {
 		case "sjdc":
@@ -734,6 +736,10 @@ function clearLoginStorage (reg) {
   clearObjKeyForRegFn(localStorage, reg)
 }
 
+var removeLocalStorage = function(){
+  // 移除userId (大会员中标预测历史记录用到)
+  localStorage.removeItem('BIGMEMBER_PC')
+}
 
 //退出登录
 var signout = function(){
@@ -765,6 +771,8 @@ var signout = function(){
             window.localStorage.removeItem('bus-key-group-SCOPE')
             window.localStorage.removeItem('noMesg')
             clearInterval(msgTimer)
+      // 移除浏览器缓存
+      removeLocalStorage()
 		}
 	})
 }
@@ -1251,7 +1259,7 @@ $(function(){
 		if($("#bidLogin").attr("data-rec")){
       $("#bidLogin").removeAttr("data-rec");
 		}
-    if(Direct.loginInfo.userInfo.result === 'ok') {
+    if(Direct.loginInfo.userInfo && Direct.loginInfo.userInfo.result === 'ok') {
       location.reload()
     }
 	});

+ 7 - 4
src/web/staticres/js/superSearch.js

@@ -1952,10 +1952,13 @@ function getWhetherInAntiSpiderWhiteList () {
         // 延迟执行,需要等到Vue实例初始化, clear按钮事件绑定完成, whitelist内容获取完成之后在校验
         var urlSearchValue = getParam('keywords')
         if (urlSearchValue && !onAntiSpiderWhitelist) {
-          setTimeout(function () {
-            var hasCommonWords = checkAndClearTextIncludesCommonWords(searchvalue || urlSearchValue)
-            if (hasCommonWords) {
-              showToast('请输入项目名称等关键词')
+          var timer = setInterval(function () {
+            if (typeof searchInnerVue === 'object' ) {
+              clearInterval(timer)
+              var hasCommonWords = checkAndClearTextIncludesCommonWords(searchvalue || urlSearchValue)
+              if (hasCommonWords) {
+                showToast('请输入项目名称等关键词')
+              }
             }
           }, 500)
         }

+ 15 - 11
src/web/staticres/me/js/phone_bind.js

@@ -368,23 +368,27 @@ var vm = new Vue({
         onCancel: function () {
             history.back()
         },
+        bindPhoneSuccess: function (state) {
+            var _this = this
+            if (state == 1) {
+                // 绑定手机号完成后,如果已经填写过公司。则不发送提交公司的请求
+                // 可以直接判断计算属性showEntItem,来判断需不需要填写公司
+                if (_this.showEntItem) {
+                    _this.setCompany(_this.afterSetPhoneSuccess)
+                } else {
+                    _this.afterSetPhoneSuccess()
+                }
+            } else if (state == 2) {
+                location.replace('/weixin/frontPage/userMerge/free/index?token=' + _this.token)
+            }
+        },
         onSubmit: function () {
             var _this = this
             if (this.type === 'bind') {
                 this.trackClick('绑定-立即绑定')
                 console.log('绑定手机号...')
                 this.setPhone(function (state) {
-                    if (state == 1) {
-                        // 绑定手机号完成后,如果已经填写过公司。则不发送提交公司的请求
-                        // 可以直接判断计算属性showEntItem,来判断需不需要填写公司
-                        if (_this.showEntItem) {
-                            _this.setCompany(_this.afterSetPhoneSuccess)
-                        } else {
-                            _this.afterSetPhoneSuccess()
-                        }
-                    } else if (state == 2) {
-                        location.replace('/weixin/frontPage/userMerge/free/index?token=' + _this.token)
-                    }
+                    _this.bindPhoneSuccess(state)
                 })
             } else {
                 console.log('更换手机号...')

+ 6 - 0
src/web/staticres/pccss/pc-detail.css

@@ -1014,3 +1014,9 @@ a{
 .third-party-verify-attention {
   margin: 10px 0;
 }
+.page-detail.j-content {
+  padding-top: 24px;
+}
+.page-detail .nijian-guide.hidden +.caigouyixiang-guide.hidden + .cutline {
+  display: none;
+}

+ 20 - 0
src/web/staticres/public-pc/js/baiducc.js

@@ -1,6 +1,25 @@
 var _hmt = _hmt || [];
 var advUrl = window.location.href;
 
+// 判断是否已加载 head.js
+function isHeadJSLoaded() {
+  var scripts = document.getElementsByTagName('script');
+  for (var i = 0; i < scripts.length; i++) {
+    if (scripts[i].src.indexOf('/common-module/public/head.js') !== -1) {
+      return true;
+    }
+  }
+  return false;
+}
+
+// 如果未加载 head.js,则通过 append 添加
+if (!isHeadJSLoaded()) {
+  const scriptElement = document.createElement('script');
+  scriptElement.src = '/common-module/public/head.js';
+  scriptElement.defer = true;
+  document.head.appendChild(scriptElement);
+}
+
 // 原业务,百度SDK已迁移到Head
 if (is_weixin()) {
   if (window.location.pathname.indexOf("/article/content/") > -1) {
@@ -111,3 +130,4 @@ function grafana_statistics(advName) {
 }
 
 
+

文件差异内容过多而无法显示
+ 0 - 0
src/web/staticres/public-pc/js/detection-min.js


+ 1 - 1
src/web/staticres/public-pc/js/detection.js

@@ -3,7 +3,7 @@
     try {
       Sentry.init({
         dsn: "https://ea0521e5b3584ca1879b940c165916e4@jysentry.jydev.jianyu360.cn/3",
-        release: "v8.9.45.4",
+        release: "v9.6.4850",
         environment: "produce",
         sampleRate: 0.02
       });

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

@@ -1079,11 +1079,14 @@ function companyAdd(){
   }
 
   function getElementLeft(element){
-    var actualLeft = element.offsetLeft;
-    var current = element.offsetParent;
-    while (current !== null){
-      actualLeft += current.offsetLeft;
-      current = current.offsetParent;
+    var actualLeft = 0
+    if(element) {
+      actualLeft = element.offsetLeft;
+      var current = element.offsetParent;
+      while (current !== null){
+        actualLeft += current.offsetLeft;
+        current = current.offsetParent;
+      }
     }
     return actualLeft;
   }
@@ -1453,7 +1456,11 @@ if(typeof(type) == "undefined" || type == null || type == ""){
   }
 }
 if(typeof(type) != "undefined" && type != null && type != ""){
-  $(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  if(type=="拟建"||type=="采购意向"){
+    $(".com-statusbar").append('<span class="com-type"><a href="javascript:volid(0);">'+type+'</a></span>');
+  }else{
+    $(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  }
 }
 //
 if(industry && industry!="undefined"){

+ 3 - 1
src/web/templates/big-member/wx/meta.html

@@ -14,7 +14,9 @@
 <meta name="format-detection" content="telephone=no">
 <link rel="icon" href="/favicon.ico">
 <script src='https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js'></script>
-<script src='{{Msg "seo" "cdn"}}/common-module/track/j-track.min.js?v={{Msg "seo" "version"}}'></script>
+<!--S 加载百度统计及剑鱼自定义埋点 -->
+<script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+<!--E 加载百度统计及剑鱼自定义埋点 -->
 <!--E-meta-->
 <!--监控-->
 <script src='/js/monitor/web.min.js?v={{Msg "seo" "version"}}'></script>

+ 3 - 0
src/web/templates/big-member/wx/page_analysis_filter.html

@@ -11,6 +11,9 @@
     <title>投标决策分析</title>
     <!--S-当前页必定需要预加载的资源-->
     <script src="/big-member/js/rem.js"></script>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />

+ 3 - 0
src/web/templates/big-member/wx/page_analysis_search.html

@@ -11,6 +11,9 @@
     <title>投标决策分析</title>
     <!--S-当前页必定需要预加载的资源-->
     <script src="/big-member/js/rem.js"></script>
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />

+ 3 - 0
src/web/templates/big-member/wx/page_buy_commit.html

@@ -11,6 +11,9 @@
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <title>大会员</title>
         <script src="/big-member/js/rem.js"></script>
+        <!--S 加载百度统计及剑鱼自定义埋点 -->
+        <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+        <!--E 加载百度统计及剑鱼自定义埋点 -->
         <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
         <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
         <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />

+ 3 - 0
src/web/templates/big-member/wx/page_customer.html

@@ -46,6 +46,9 @@
 <!--S-当前页面的资源-->
 <script src='{{Msg "seo" "cdn"}}/js/rem.js'></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
+<!--S 加载百度统计及剑鱼自定义埋点 -->
+<script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+<!--E 加载百度统计及剑鱼自定义埋点 -->
 <script>
     sessionStorage.removeItem('conversation-login-clear')
 

+ 3 - 0
src/web/templates/big-member/wx/page_free_contrast_trial.html

@@ -17,6 +17,9 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <meta name="format-detection" content="telephone=no">
     <link rel="icon" href="/favicon.ico">
+    <!--S 加载百度统计及剑鱼自定义埋点 -->
+    <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+    <!--E 加载百度统计及剑鱼自定义埋点 -->
 
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />

文件差异内容过多而无法显示
+ 3 - 0
src/web/templates/big-member/wx/page_index.html


+ 3 - 0
src/web/templates/big-member/wx/page_landingPage.html

@@ -11,6 +11,9 @@
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <title>剑鱼大会员</title>
         <script src="/big-member/js/rem.js"></script>
+        <!--S 加载百度统计及剑鱼自定义埋点 -->
+        <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+        <!--E 加载百度统计及剑鱼自定义埋点 -->
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css" />
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css" />
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css" />

+ 3 - 0
src/web/templates/big-member/wx/page_landingPage2.html

@@ -11,6 +11,9 @@
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <title>剑鱼大会员</title>
         <script src="/big-member/js/rem.js"></script>
+        <!--S 加载百度统计及剑鱼自定义埋点 -->
+        <script src='{{Msg "seo" "cdn"}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+        <!--E 加载百度统计及剑鱼自定义埋点 -->
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css" />
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css" />
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css" />

部分文件因为文件数量过多而无法显示