Эх сурвалжийг харах

Merge branch 'feature/v4.10.7' into dev/v4.10.7_tsz

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 4 сар өмнө
parent
commit
5ca4e512d4
100 өөрчлөгдсөн 3103 нэмэгдсэн , 1445 устгасан
  1. 1 1
      src/go.mod
  2. 2 2
      src/go.sum
  3. 18 4
      src/jfw/filter/phonefilter.go
  4. 12 1
      src/jfw/filter/wxUserSalesFilter.go
  5. 37 24
      src/jfw/front/commonPayPc.go
  6. 27 10
      src/jfw/front/commonPayWx.go
  7. 14 13
      src/jfw/front/front.go
  8. 14 13
      src/jfw/front/login.go
  9. 12 11
      src/jfw/front/org_structure.go
  10. 6 5
      src/jfw/front/otherAct.go
  11. 8 7
      src/jfw/front/pchelper.go
  12. 2 1
      src/jfw/front/shorturl.go
  13. 47 0
      src/jfw/front/singleLogin.go
  14. 2 1
      src/jfw/jyutil/jyutil.go
  15. 19 2
      src/jfw/modules/app/src/app/filter/phonefilter.go
  16. 10 4
      src/jfw/modules/app/src/app/front/accountPage.go
  17. 19 0
      src/jfw/modules/app/src/app/front/commonPay.go
  18. 573 570
      src/jfw/modules/app/src/app/front/login.go
  19. 5 0
      src/jfw/modules/app/src/app/front/shorturl.go
  20. 3 3
      src/jfw/modules/app/src/config.yaml
  21. 1 3
      src/jfw/modules/app/src/go.mod
  22. 2 2
      src/jfw/modules/app/src/go.sum
  23. 75 6
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  24. 55 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  25. 4 3
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  26. 8 8
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html
  27. 4 0
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait_change.html
  28. 4 4
      src/jfw/modules/app/src/web/templates/big-member/page_free_buyer_project_news.html
  29. 4 4
      src/jfw/modules/app/src/web/templates/big-member/page_free_ent_project_news.html
  30. 33 7
      src/jfw/modules/app/src/web/templates/big-member/page_landingPage.html
  31. 7 7
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  32. 30 1
      src/jfw/modules/app/src/web/templates/exhibition/index.html
  33. 2 1
      src/jfw/modules/app/src/web/templates/frontRouter/bidedoc/free/index.html
  34. 2 1
      src/jfw/modules/app/src/web/templates/frontRouter/bidedoc/sess/index.html
  35. 2 1
      src/jfw/modules/app/src/web/templates/frontRouter/declaration/free/relationship.html
  36. 29 1
      src/jfw/modules/app/src/web/templates/frontRouter/partner/free/index.html
  37. 25 1
      src/jfw/modules/app/src/web/templates/frontRouter/partner/sess/index.html
  38. 6 4
      src/jfw/modules/app/src/web/templates/frontRouter/solution/free/dataInterface.html
  39. 55 18
      src/jfw/modules/app/src/web/templates/frontRouter/solution/free/index.html
  40. 29 3
      src/jfw/modules/app/src/web/templates/frontRouter/solution/sess/index.html
  41. 1 1
      src/jfw/modules/app/src/web/templates/me/account/phone_bind.html
  42. 61 17
      src/jfw/modules/app/src/web/templates/structeddata/marketing.html
  43. 40 10
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html
  44. 37 2
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_pay_success.html
  45. 3 1
      src/jfw/modules/publicapply/src/activityday/dao/raffle.go
  46. 10 0
      src/jfw/modules/publicapply/src/filter/cookie.go
  47. 1 1
      src/jfw/modules/publicapply/src/go.mod
  48. 2 2
      src/jfw/modules/publicapply/src/go.sum
  49. 2 1
      src/jfw/modules/publicapply/src/oneclick/entity/entity.go
  50. 533 533
      src/jfw/modules/publicapply/src/util/util.go
  51. 2 0
      src/jfw/modules/subscribepay/src/a/init.go
  52. 3 1
      src/jfw/modules/subscribepay/src/config.json
  53. 2 0
      src/jfw/modules/subscribepay/src/config/config.go
  54. 9 1
      src/jfw/modules/subscribepay/src/filter/mergefilter.go
  55. 2 0
      src/jfw/modules/subscribepay/src/filter/sessionfilter.go
  56. 1 1
      src/jfw/modules/subscribepay/src/go.mod
  57. 2 2
      src/jfw/modules/subscribepay/src/go.sum
  58. 3 4
      src/jfw/modules/subscribepay/src/main.go
  59. 390 0
      src/jfw/modules/subscribepay/src/service/transferVipSub.go
  60. 43 13
      src/jfw/modules/subscribepay/src/service/userAccountInfo.go
  61. 138 0
      src/jfw/modules/subscribepay/src/service/vipGift.go
  62. 44 21
      src/jfw/modules/subscribepay/src/util/util.go
  63. 1 1
      src/jfw/modules/weixin/src/config.json
  64. 1 0
      src/jfw/modules/weixin/src/config.yaml
  65. 6 6
      src/jfw/modules/weixin/src/go.mod
  66. 13 13
      src/jfw/modules/weixin/src/go.sum
  67. 14 2
      src/jfw/modules/weixin/src/wx/wx.go
  68. 48 1
      src/web/staticres/big-member/js/unit_portrayal.js
  69. 3 0
      src/web/staticres/big-member/weixin/css/public.css
  70. 16 0
      src/web/staticres/common-module/bidedoc/js/index.js
  71. 16 0
      src/web/staticres/common-module/bidedoc/js/relationship.js
  72. 27 0
      src/web/staticres/common-module/big-member/js/buyer_project_news.js
  73. 27 0
      src/web/staticres/common-module/big-member/js/ent_project_news.js
  74. 17 1
      src/web/staticres/common-module/collection/js/buyer-example.js
  75. 65 7
      src/web/staticres/common-module/collection/js/ent_portrait.js
  76. 12 1
      src/web/staticres/common-module/collection/js/vip-dialog.js
  77. 0 0
      src/web/staticres/common-module/gift-friends-js/jy-gift-friends.mjs
  78. 0 0
      src/web/staticres/common-module/gift-friends-js/jy-gift-friends.mjs.map
  79. 0 0
      src/web/staticres/common-module/gift-friends-js/jy-gift-friends.umd.js
  80. 0 0
      src/web/staticres/common-module/gift-friends-js/jy-gift-friends.umd.js.map
  81. 36 3
      src/web/staticres/common-module/mobile-portrayal-footer/js/mobile-portrayal-footer.js
  82. 0 0
      src/web/staticres/common-module/plugins/js/jy-bind-phone.umd.js
  83. 32 7
      src/web/staticres/common-module/solution/js/data-interface.js
  84. 0 0
      src/web/staticres/common-module/track/j-track.amd.min.js
  85. 0 0
      src/web/staticres/common-module/track/j-track.es.min.js
  86. 0 0
      src/web/staticres/common-module/track/j-track.min.js
  87. 2 1
      src/web/staticres/vipsubscribe/css/vip_pay_success.css
  88. 4 4
      src/web/templates/big-member/wx/page_free_buyer_project_news.html
  89. 4 4
      src/web/templates/big-member/wx/page_free_ent_project_news.html
  90. 37 11
      src/web/templates/big-member/wx/page_landingPage.html
  91. 6 5
      src/web/templates/big-member/wx/page_unit_portrayal.html
  92. 25 1
      src/web/templates/exhibition/weixin/index.html
  93. 2 1
      src/web/templates/frontRouter/wx/bidedoc/sess/index.html
  94. 7 6
      src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html
  95. 4 0
      src/web/templates/frontRouter/wx/collection/sess/ent_portrait_change.html
  96. 2 1
      src/web/templates/frontRouter/wx/declaration/free/relationship.html
  97. 16 2
      src/web/templates/frontRouter/wx/partner/sess/index.html
  98. 5 4
      src/web/templates/frontRouter/wx/solution/free/dataInterface.html
  99. 30 4
      src/web/templates/frontRouter/wx/solution/sess/index.html
  100. 88 1
      src/web/templates/order/pc/paySuccess.html

+ 1 - 1
src/go.mod

@@ -6,7 +6,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.33.4
+	app.yhyue.com/moapp/jypkg v1.33.6
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/bwmarrin/snowflake v0.3.0

+ 2 - 2
src/go.sum

@@ -20,8 +20,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916/go.mod h1:/HT/UZ4d
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 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 v1.33.3 h1:vC3o/w1tFLkcoG0ulO1P1XHRFzxQT+BG0hzNrDG344s=
-app.yhyue.com/moapp/jypkg v1.33.3/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
+app.yhyue.com/moapp/jypkg v1.33.5 h1:XVzoi4POBZ8Tprr9Sk/HSC0CB3WcbPFwMpuu0o3B4jI=
+app.yhyue.com/moapp/jypkg v1.33.5/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 h1:WGi4OEIoqw6NpNFGioUEBZnjK9aBa+xJqf/5WY+QyhM=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161/go.mod h1:0Oj8SB4pVjdCLD28sy2zyM3hS0WHGpNuVcakLW43GmI=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=

+ 18 - 4
src/jfw/filter/phonefilter.go

@@ -46,10 +46,23 @@ func init() {
 }
 
 func (l *phoneFilter) Do() bool {
+	userId, _ := l.GetSession["mgoUserId"].(string)
 	if qu.Int64All(l.GetSession["positionType"]) == 1 {
 		return true
 	}
-	userId, _ := l.GetSession["mgoUserId"].(string)
+	//体验-绑定-标识
+	var (
+		phone, _   = l.GetSession["phone"].(string)
+		expBinding bool
+		//host       = l.R.Host
+	)
+	//if !strings.HasPrefix(host, ".") {
+	//	host = "." + host
+	//}
+	if phone == "" && qu.Int64All(l.GetSession["experience_binding"]) == 1 {
+		//jy.SetCookie(l.W, l.R, jy.ExperienceSign, "experiencing", host, 8*60*60)
+		expBinding = true
+	}
 	// 请求过滤
 	pass := func() bool {
 		if !initflag || l.R.Method == "POST" || userId == "" {
@@ -63,7 +76,6 @@ func (l *phoneFilter) Do() bool {
 			if (v.MatchString(l.R.URL.Path) || v.MatchString(l.R.URL.String())) && !strings.Contains(l.R.URL.Path, "bidedoc") && !strings.Contains(l.R.URL.Path, "squeeze") && !strings.Contains(l.R.URL.Path, "partner") {
 				return true
 			}
-
 		}
 		return false
 	}()
@@ -74,7 +86,7 @@ func (l *phoneFilter) Do() bool {
 	//是否需要跳转绑定手机号
 	needBindPhone := func() bool {
 		//绑定手机号判断
-		if phone := l.GetSession["phone"]; phone != nil && phone != "" {
+		if phone != "" {
 			return false
 		}
 		if person, sessionVal := jyutil.GetSessionVal(map[string]interface{}{"_id": mongodb.StringTOBsonId(qu.ObjToString(userId))}); len(sessionVal) > 0 && person != nil {
@@ -130,10 +142,12 @@ func (l *phoneFilter) Do() bool {
 		}
 		return false
 	}()
-
 	var href string
 	// 跳转绑定手机号页面
 	if needBindPhone {
+		if expBinding {
+			return expBinding
+		}
 		if mobileReg.MatchString(l.R.UserAgent()) {
 			href = "/front/account/phone/bind?mode=mergeBind&redirectTo=" + encodeURIComponent(l.R.URL.String())
 		} else {

+ 12 - 1
src/jfw/filter/wxUserSalesFilter.go

@@ -40,9 +40,20 @@ func (l *salesFilter) Do() bool {
 	if userAgent := l.R.UserAgent(); mobileReg.MatchString(userAgent) || public.CheckWxBrowser(l.R) {
 		href := "/jy_mobile/uersales/newuser" //wx判断是否需要留资
 		if uid := l.GetSession["userId"]; uid != nil && uid != "" {
-			data := jyutil.Compatible.Select(qu.InterfaceToStr(uid), `{"l_registedate":1,"app_first_login":1}`)
+			data := jyutil.Compatible.Select(qu.InterfaceToStr(uid), `{"l_registedate":1,"app_first_login":1,"experience_binding":1}`)
 			if data != nil && len(*data) > 0 {
 				if qu.Int64All((*data)["l_registedate"]) >= qu.Int64All(config.Seoconfig["appNewUserTime"]) && qu.IntAll((*data)["app_first_login"]) == 0 {
+					expBinding := qu.IntAll((*data)["experience_binding"])
+					if expBinding == 1 { //体验绑定手机号 用户标识
+						rd := time.Unix(qu.Int64All((*data)["l_registedate"]), 10)
+						nextDay := time.Date(rd.Year(), rd.Month(), rd.Day(), 0, 0, 0, 0, time.Local).AddDate(0, 0, 1)
+						if time.Now().Sub(nextDay) > 0 { //用户注册当天  不进设置兴趣爱好页面
+							expBinding = 0
+						}
+					}
+					if expBinding > 0 {
+						return true
+					}
 					//设置cookie 前端跳转
 					SetCookie(l.R.URL.String(), int(time.Hour*24/time.Second), l.W)
 					http.Redirect(l.W, l.R, href, 302)

+ 37 - 24
src/jfw/front/commonPayPc.go

@@ -1,14 +1,16 @@
 package front
 
 import (
-	"fmt"
-	"jy/src/jfw/config"
-	"strings"
-	"time"
+    "app.yhyue.com/moapp/jypkg/public"
+    "fmt"
+    "github.com/gogf/gf/v2/util/gconv"
+    "jy/src/jfw/config"
+    "strings"
+    "time"
 
-	qutil "app.yhyue.com/moapp/jybase/common"
+    qutil "app.yhyue.com/moapp/jybase/common"
 
-	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
 
 type JyOrder struct {
@@ -23,13 +25,13 @@ func init() {
 	xweb.AddAction(&JyOrder{})
 }
 
-//pc端详情页
+// pc端详情页
 func (this *JyOrder) OrderDetail(orderType, orderCode string) {
 	this.T["orderId"] = orderCode
 	this.Render(fmt.Sprintf("/order/pc/%s/detail.html", orderType))
 }
 
-//pc端订单支付页
+// pc端订单支付页
 func (this *JyOrder) OrderPay(orderType, orderCode string) error {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	if userId == "" {
@@ -41,25 +43,36 @@ func (this *JyOrder) OrderPay(orderType, orderCode string) error {
 	return this.Render("/order/pc/orderPay.html")
 }
 
-//pc支付成功页面
+// pc支付成功页面
 func (this *JyOrder) PaySuccess(orderType, orderCode string) error {
-	userId := qutil.ObjToString(this.GetSession("userId"))
-	if userId == "" {
-		return this.Redirect("/notin/page")
-	}
-	this.T["payway"] = qutil.If(strings.Index(this.GetString("payway"), "wx") > -1, "微信", "支付宝")
-	this.T["email"] = this.GetString("email")
-	if payTime, err := this.GetInt("payTime"); err == nil {
-		this.T["payTime"] = time.Unix(payTime, 0).Format("2006年01月02日")
-	}
-	this.T["price"] = this.GetString("price")
-	this.T["shareid"] = "10"
-	this.T["orderType"] = orderType
-	this.T["orderCode"] = orderCode
-	return this.Render("/order/pc/paySuccess.html")
+    userId := qutil.ObjToString(this.GetSession("userId"))
+    if userId == "" {
+        return this.Redirect("/notin/page")
+    }
+    this.T["payway"] = qutil.If(strings.Index(this.GetString("payway"), "wx") > -1, "微信", "支付宝")
+    this.T["email"] = this.GetString("email")
+    if payTime, err := this.GetInt("payTime"); err == nil {
+        this.T["payTime"] = time.Unix(payTime, 0).Format("2006年01月02日")
+    }
+    positionType := gconv.String(this.GetSession("positionType"))
+    this.T["price"] = this.GetString("price")
+    this.T["shareid"] = "10"
+    this.T["positionType"] = positionType
+    this.T["orderType"] = orderType
+    this.T["orderCode"] = orderCode
+    //订单详情查询
+    data := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+        "order_code": orderCode,
+    }, "vip_type", "")
+    vipType := int64(0)
+    if data != nil && len(*data) > 0 {
+        vipType = gconv.Int64((*data)["vip_type"])
+    }
+    this.T["vipType"] = vipType
+    return this.Render("/order/pc/paySuccess.html")
 }
 
-//我的订单
+// 我的订单
 func (this *JyOrder) ToMyOrder() error {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	if userId == "" {

+ 27 - 10
src/jfw/front/commonPayWx.go

@@ -3,7 +3,8 @@ package front
 import (
 	"errors"
 	"fmt"
-	"jy/src/jfw/config"
+    "github.com/gogf/gf/v2/util/gconv"
+    "jy/src/jfw/config"
 	"jy/src/jfw/wx"
 	"net/url"
 
@@ -83,15 +84,31 @@ func (w *WxPayCommon) PaySuccess(doType string) error {
 	w.T["title"] = "支付"
 	titleArr, exist := titleMap[doType]
 	if exist && t < len(titleArr) {
-		w.T["title"] = titleArr[t]
-	}
-	if doType == "dataexport" { //数据导出支付成功
-		return w.Render("/weixin/dataExport/dataExport_paySuccess.html", &w.T)
-	} else if doType == "subvip" { //vip订阅支付成功
-		return w.Render("/weixin/vipsubscribe/vip_pay_success.html")
-	}
-	w.T["doType"] = doType
-	return w.Render("/weixin/commonPay/paySuccess.html", &w.T)
+        w.T["title"] = titleArr[t]
+    }
+    productType := ""
+    if doType == "subvip" {
+        productType = "VIP订阅"
+    }
+    sessVal := w.Session().GetMultiple()
+    positionType := gconv.String(sessVal["positionType"])
+    w.T["productType"] = productType
+    w.T["positionType"] = positionType
+    data := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+        "order_code": w.GetString("orderCode"),
+    }, "vip_type", "")
+    vipType := int64(0)
+    if data != nil && len(*data) > 0 {
+        vipType = gconv.Int64((*data)["vip_type"])
+    }
+    w.T["vipType"] = vipType
+    if doType == "dataexport" { //数据导出支付成功
+        return w.Render("/weixin/dataExport/dataExport_paySuccess.html", &w.T)
+    } else if doType == "subvip" { //vip订阅支付成功
+        return w.Render("/weixin/vipsubscribe/vip_pay_success.html")
+    }
+    w.T["doType"] = doType
+    return w.Render("/weixin/commonPay/paySuccess.html", &w.T)
 }
 
 func (w *WxPayCommon) ToMyWxOrder() error {

+ 14 - 13
src/jfw/front/front.go

@@ -969,25 +969,26 @@ func (m *Front) Sess(ostr string) error {
 				}
 			}
 			if actionurl != "" {
-				//绑定手机号 跳转
-				if flag, _ := config.Sysconfig["phoneFilterFlag"].(bool); flag { //开关是否开启
-					//action走的nginx配置,需要单独在sess中判断
-					for k, v := range config.PhoneFilterConfig["sessUrl"].(map[string]interface{}) {
-						if strings.Contains(actionurl, k) {
-							uid, _ := m.GetSession("userId").(string)
-							if NeedBind(uid) {
-								if mobileReg.MatchString(m.UserAgent()) {
-									redirectTo := actionurl
-									if util.ObjToString(v) != "" {
-										redirectTo = util.ObjToString(v)
+				if util.Int64All(m.GetSession("experience_binding")) != 1 {
+					//绑定手机号 跳转
+					if flag, _ := config.Sysconfig["phoneFilterFlag"].(bool); flag { //开关是否开启
+						//action走的nginx配置,需要单独在sess中判断
+						for k, v := range config.PhoneFilterConfig["sessUrl"].(map[string]interface{}) {
+							if strings.Contains(actionurl, k) {
+								uid, _ := m.GetSession("userId").(string)
+								if NeedBind(uid) {
+									if mobileReg.MatchString(m.UserAgent()) {
+										redirectTo := actionurl
+										if util.ObjToString(v) != "" {
+											redirectTo = util.ObjToString(v)
+										}
+										actionurl = bindUrl + "&redirectTo=" + encodeURIComponent(redirectTo)
 									}
-									actionurl = bindUrl + "&redirectTo=" + encodeURIComponent(redirectTo)
 								}
 							}
 						}
 					}
 				}
-
 				//工作桌面内嵌 塞斯 PC
 				if !mobileReg.MatchString(m.UserAgent()) && !strings.Contains(actionurl, "page_workDesktop") && strings.Contains(actionurl, "/succbi/crm_system/") {
 					return m.Redirect(fmt.Sprintf("%s%s%s", strings.ReplaceAll(config.Sysconfig["workDesktopUrl"].(string), "aside=0&", ""), config.Sysconfig["webdomain"].(string), url.QueryEscape(actionurl)))

+ 14 - 13
src/jfw/front/login.go

@@ -220,19 +220,20 @@ func (l *Login) Login() error {
 					}
 					_id := mongodb.Save("user", data)
 					if _id != "" {
-						redis.Del("limitation", fmt.Sprintf("firstVisitTagByWX_%s", l.Session().Id()))
-						//用户日志保存
-						go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", source, "", gconv.String(l.GetSession("RSource")), gconv.String(sessVal["RSource"]), qutil.GetIp(l.Request), l.UserAgent(), "jybx", "")
-						jy.ClearPhoneIdentSession(l.Session())
-						ok, _, userInfo := afterLogin(l.Request, phone, l.Session(), false)
-						userInfo["isNewUser"] = true
-						nsqPath, _ := config.Sysconfig["nsq"].(string)
-						nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
-						er := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jypc_phone_register, _id, jy.Jyweb_node2, nil)
-						if er != nil {
-							log.Println("nsq队列写入失败-->", jy.Jypc_phone_register, _id)
-						}
-						if ok {
+                        redis.Del("limitation", fmt.Sprintf("firstVisitTagByWX_%s", l.Session().Id()))
+                        //用户日志保存
+                        referer := l.Refer()
+                        go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", source, "", gconv.String(l.GetSession("RSource")), gconv.String(sessVal["RSource"]), qutil.GetIp(l.Request), l.UserAgent(), "jybx", "", referer)
+                        jy.ClearPhoneIdentSession(l.Session())
+                        ok, _, userInfo := afterLogin(l.Request, phone, l.Session(), false)
+                        userInfo["isNewUser"] = true
+                        nsqPath, _ := config.Sysconfig["nsq"].(string)
+                        nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
+                        er := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jypc_phone_register, _id, jy.Jyweb_node2, nil)
+                        if er != nil {
+                            log.Println("nsq队列写入失败-->", jy.Jypc_phone_register, _id)
+                        }
+                        if ok {
 							sessVal = l.Session().GetMultiple()
 							result["userInfo"] = userInfo
 							go anonymousLogin(l.Session(), l.Cookie("JYTrustedId"))

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

@@ -197,17 +197,18 @@ func (this *OrgStructure) AutoLogon() error {
 			}); resp != nil && resp.Data.Id > 0 {
 				data["base_user_id"] = resp.Data.Id
 				if id := mongodb.Save("user", data); id != "" {
-					go jy.SaveUserLog(public.Mgo_Log, id, openId, "wx", "pc", source, openId, gconv.String(this.GetSession("RSource")), gconv.String(this.GetSession("RSource")), util.GetIp(this.Request), this.UserAgent(), "jybx", "")
-					nsqPath, _ := config.Sysconfig["nsq"].(string)
-					nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
-					jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, "task", id, jy.Jyweb_node2, map[string]interface{}{
-						"code":       1007,
-						"types":      "bindPhone",
-						"num":        50,
-						"baseUserId": resp.Data.Id,
-						"positionId": this.GetSession("positionId"),
-					})
-					if mail != "" {
+                    referer := this.Refer()
+                    go jy.SaveUserLog(public.Mgo_Log, id, openId, "wx", "pc", source, openId, gconv.String(this.GetSession("RSource")), gconv.String(this.GetSession("RSource")), util.GetIp(this.Request), this.UserAgent(), "jybx", "", referer)
+                    nsqPath, _ := config.Sysconfig["nsq"].(string)
+                    nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
+                    jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, "task", id, jy.Jyweb_node2, map[string]interface{}{
+                        "code":       1007,
+                        "types":      "bindPhone",
+                        "num":        50,
+                        "baseUserId": resp.Data.Id,
+                        "positionId": this.GetSession("positionId"),
+                    })
+                    if mail != "" {
 						jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, "task", id, jy.Jyweb_node2, map[string]interface{}{
 							"code":       1009,
 							"types":      "bindMail",

+ 6 - 5
src/jfw/front/otherAct.go

@@ -154,11 +154,12 @@ func (f *Front) Lpsubmit() error {
 			}
 			_id := mongodb.Save("user", data)
 			if _id != "" {
-				//用户日志保存
-				go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", "landPage", "", gconv.String(f.GetSession("RSource")), util.ObjToString(f.GetSession("RSource")), util.GetIp(f.Request), f.UserAgent(), "jybx", "")
-				deleteIdentSession(f.Session())
-				return "y"
-			}
+                //用户日志保存
+                referer := f.Refer()
+                go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", "landPage", "", gconv.String(f.GetSession("RSource")), util.ObjToString(f.GetSession("RSource")), util.GetIp(f.Request), f.UserAgent(), "jybx", "", referer)
+                deleteIdentSession(f.Session())
+                return "y"
+            }
 			return "saveError"
 		}()
 	}

+ 8 - 7
src/jfw/front/pchelper.go

@@ -154,13 +154,14 @@ func (l *PcHelper) Login() error {
 						}
 						_id := mongodb.Save("user", data)
 						if _id != "" {
-							go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", "pc", "", gconv.String(l.GetSession("RSource")), gconv.String(l.GetSession("RSource")), util.GetIp(l.Request), l.UserAgent(), "jybx", "")
-							jy.ClearPhoneIdentSession(l.Session())
-							reToken = getUToken(mac, phone)
-							reOpenId = phone
-							reNickname = phone
-							return 1
-						}
+                            referer := l.Refer()
+                            go jy.SaveUserLog(public.Mgo_Log, _id, phone, "phone", "pc", "pc", "", gconv.String(l.GetSession("RSource")), gconv.String(l.GetSession("RSource")), util.GetIp(l.Request), l.UserAgent(), "jybx", "", referer)
+                            jy.ClearPhoneIdentSession(l.Session())
+                            reToken = getUToken(mac, phone)
+                            reOpenId = phone
+                            reNickname = phone
+                            return 1
+                        }
 					} else {
 						updataMap := map[string]interface{}{}
 						if (*datas)[0]["s_m_phone"] != nil {

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

@@ -155,10 +155,11 @@ func (s *Short) Article(stype, id string) error {
 							//生session后 重新获取一下
 							//userId, _ = s.GetSession("userId").(string)
 							sess = s.Session().GetMultiple()
+							experienceBinding := util.Int64All(sess["experience_binding"])
 							userId, _ = sess["userId"].(string)
 							//新关注微信公众号用户是否绑定手机号
 							phone, ok := sess["phone"].(string)
-							if ok && phone == "" {
+							if ok && phone == "" && experienceBinding != 1 { //微信用户 体验绑定手机号
 								//注册时间
 								regTime := util.Int64All(s.GetSession("registedate"))
 								//新用户时间

+ 47 - 0
src/jfw/front/singleLogin.go

@@ -1,7 +1,9 @@
 package front
 
 import (
+	"app.yhyue.com/moapp/jybase/encrypt"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
 	"log"
@@ -27,6 +29,7 @@ type SingleLogin struct {
 	singleLogin xweb.Mapper `xweb:"/swordfish/SingleLogin"` //微信登录中转
 	shortUrl    xweb.Mapper `xweb:"/stl/(.*)"`              //短地址跳转
 	keyPhrases  xweb.Mapper `xweb:"/kph/(.*)"`              //微信自动回复关键字组
+	vipGiftUrl  xweb.Mapper `xweb:"/vipGiftUrl/(.*)"`       //告知页面跳转链接
 }
 
 func init() {
@@ -39,6 +42,50 @@ const (
 	setPage = "/front/vipsubscribe/toSubVipSetPage?vSwitch=%s"
 )
 
+// 709vip赠送  告知页面跳转
+func (this *SingleLogin) VipGiftUrl(key string) error {
+	var redirectUrl = ""
+	isSubscribe := false
+	chatIdInt := gconv.Int64(encrypt.SE.Decode4HexByCheck(key))
+	isWxB := public.CheckWxBrowser(this.Request)
+	sess := this.Session().GetMultiple()
+	userId, _ := sess["userId"].(string)
+	openid := ""
+	log.Println("1111", key, chatIdInt, isWxB, userId)
+	if isWxB && userId == "" {
+		if this.GetString("state") == "wx" {
+			//微信跳回来的
+			if code := this.GetString("code"); code != "" {
+				openid = jyutil.Getopenid(code)
+				if CheckUserIsSubscribe(openid) {
+					FindUserAndCreateSess(openid, this.Session(), "wx", false, true)
+					//生session后 重新获取一下
+					sess = this.Session().GetMultiple()
+					userId, _ = sess["userId"].(string)
+				}
+			}
+		} else {
+			//所有参数都不再使用,跳到微信验证用户
+			log.Println(fmt.Sprintf(config.Wxoauth, url.QueryEscape(this.Site()+this.Url()), "wx"))
+			return this.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(this.Site()+this.Url()), "wx"), 302)
+		}
+	}
+	if key != "" && chatIdInt > 0 {
+		openid = qutil.InterfaceToStr(this.GetSession("s_m_openid"))
+		//查看是否关注公众号
+		log.Println("VIP订阅赠送", key, chatIdInt, openid)
+		if openid == "" || (openid != "" && !CheckUserIsSubscribe(openid)) {
+			//没有关注  跳转关注页面
+		} else {
+			isSubscribe = true
+		}
+		redirectUrl = fmt.Sprintf("/jy_mobile/giving/share?isSubscribe=%v&giftId=%s", isSubscribe, key)
+	} else {
+		redirectUrl = "/swordfish/about"
+	}
+	return this.Redirect(redirectUrl)
+}
+
 // P506 关键词组 短地址跳转
 func (this *SingleLogin) KeyPhrases(key string) error {
 	defer qutil.Catch()

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

@@ -132,7 +132,7 @@ func Getopenid(code string) (openid string) {
 }
 
 func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[string]interface{}) {
-	person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1}`)
+	person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1,"experience_binding":1}`)
 	sessionVal := make(map[string]interface{})
 	if !ok || person == nil || len(*person) == 0 {
 		return nil, sessionVal
@@ -166,6 +166,7 @@ func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[strin
 		phone = util.ObjToString((*person)["s_m_phone"])
 	}
 	sessionVal["phone"] = phone
+	sessionVal["experience_binding"] = util.IntAll((*person)["experience_binding"]) //体验-绑定-手机号
 	sessionVal["i_unlimited"] = util.IntAll((*person)["i_unlimited"])
 	sessionVal["base_user_id"] = util.IntAll((*person)["base_user_id"])   //用户中台的uid
 	sessionVal["registedate"] = util.Int64All((*person)["l_registedate"]) //注册时间

+ 19 - 2
src/jfw/modules/app/src/app/filter/phonefilter.go

@@ -41,10 +41,23 @@ func init() {
 }
 
 func (l *phoneFilter) Do() bool {
+	userId, _ := l.GetSession["mgoUserId"].(string)
 	if qu.Int64All(l.GetSession["positionType"]) == 1 {
 		return true
 	}
-	userId, _ := l.GetSession["mgoUserId"].(string)
+	//体验-绑定-标识
+	var (
+		phone, _   = l.GetSession["phone"].(string)
+		expBinding bool
+		//host       = l.R.Host
+	)
+	//if !strings.HasPrefix(host, ".") {
+	//	host = "." + host
+	//}
+	if phone == "" && qu.Int64All(l.GetSession["experience_binding"]) == 1 {
+		//jy.SetCookie(l.W, l.R, jy.ExperienceSign, "experiencing", host, 8*60*60)
+		expBinding = true
+	}
 	// 请求过滤
 	pass := func() bool {
 		if !initflag || l.R.Method == "POST" || userId == "" {
@@ -63,10 +76,11 @@ func (l *phoneFilter) Do() bool {
 	if pass {
 		return true
 	}
+
 	isNewUser := false
 	//是否需要跳转绑定手机号
 	needBindPhone := func() bool {
-		if phone := l.GetSession["phone"]; phone != nil && phone != "" {
+		if phone != "" {
 			return false
 		}
 		if person := utils.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"l_registedate":1}`); person != nil {
@@ -120,6 +134,9 @@ func (l *phoneFilter) Do() bool {
 	}()
 	var href string
 	if needBindPhone {
+		if expBinding {
+			return expBinding
+		}
 		href = "/jyapp/account/phone/bind?mode=mergeBind"
 		if isNewUser {
 			href += "&act=logout"

+ 10 - 4
src/jfw/modules/app/src/app/front/accountPage.go

@@ -1,11 +1,12 @@
 package front
 
 import (
-	"fmt"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"net/http"
 )
 
-//用户账户前端路由
+// 用户账户前端路由
 type AccountPage struct {
 	*xweb.Action
 	privacy     xweb.Mapper `xweb:"/jyapp/free/privacy"`     //隐私协议
@@ -33,8 +34,13 @@ func (this *AccountPage) AuthCheck() {
 	this.Render("/me/account/auth_check.html")
 }
 
-func (this *AccountPage) Phone(page string) {
-	this.Render(fmt.Sprintf("/me/account/phone_%s.html", page))
+func (this *AccountPage) Phone(page string) error {
+	sessVal := this.Session().GetMultiple()
+	phone, _ := sessVal["phone"].(string)
+	if phone != "" && page == "bind" && this.Refer() != "" {
+		return this.Redirect(this.Refer(), http.StatusFound)
+	}
+	return this.Render(fmt.Sprintf("/me/account/phone_%s.html", page))
 }
 
 func (this *AccountPage) Mail(page string) {

+ 19 - 0
src/jfw/modules/app/src/app/front/commonPay.go

@@ -1,8 +1,10 @@
 package front
 
 import (
+	"app.yhyue.com/moapp/jypkg/public"
 	"errors"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"strings"
 
 	util "app.yhyue.com/moapp/jybase/common"
@@ -85,12 +87,29 @@ func (w *AppPayCommon) PaySuccess(doType string) error {
 	if exist && t < len(titleArr) {
 		w.T["title"] = titleArr[t]
 	}
+	productType := ""
+	if doType == "subvip" {
+		productType = "VIP订阅"
+	}
+	sessVal := w.Session().GetMultiple()
+	positionType := gconv.String(sessVal["positionType"])
+	w.T["productType"] = productType
+	w.T["positionType"] = positionType
+	data := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+		"order_code": w.GetString("orderCode"),
+	}, "vip_type", "")
+	vipType := int64(0)
+	if data != nil && len(*data) > 0 {
+		vipType = gconv.Int64((*data)["vip_type"])
+	}
+	w.T["vipType"] = vipType
 	if doType == "dataexport" { //数据导出支付成功页面
 		return w.Render("/dataExport/dataExport_paySuccess.html", &w.T)
 	} else if doType == "subvip" { //vip订阅支付成功
 		return w.Render("/vipsubscribe/vip_pay_success.html")
 	}
 	w.T["doType"] = doType
+
 	return w.Render("/commonPay/paySuccess.html", &w.T)
 }
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 573 - 570
src/jfw/modules/app/src/app/front/login.go


+ 5 - 0
src/jfw/modules/app/src/app/front/shorturl.go

@@ -923,6 +923,11 @@ func (s *Short) TransitRoute(key string) error {
 			if util.ObjToString(shortUrl["href"]) != "" && util.ObjToString(s.GetSession("userId")) == "" {
 				redirectUrl = util.ObjToString(shortUrl["href"])
 			}
+			go func(pageLabel string) {
+				if ui := public.Mysql.UpdateOrDeleteBySql(`update short_url SET visits=visits+1 WHERE mold = 1 AND code = ?;`, pageLabel); ui <= 0 {
+					log.Println("update short_url visits false ,source:", pageLabel)
+				}
+			}(key)
 		}
 
 		//未登录

+ 3 - 3
src/jfw/modules/app/src/config.yaml

@@ -1,8 +1,6 @@
 etcd:
   hosts:
-    - 172.31.31.203:2379
-  #- 192.168.3.165:2379
-  #- 192.168.3.204:2379
+  - 172.31.31.203:2379
 userCenterKey: "usercenter.rpc" #用户中台rpc
 powerCheckCenterKey: "powercheck.rpc" #权益校验中台
 entManageApplication: "entmanageapplication.rpc" #企业管理中台
@@ -15,3 +13,5 @@ miniprogram:
     appid: "wx37f06c38292f7d82"
     appsecret: "f7dba667a47b4b10c1f581e3de46d0d3"
 wxTokenRpc: "172.17.162.29:1166"
+GuideRegistedate: 1735034400  #该时间之前注册的付费用户不用进订阅向导
+experienceRatio: 2

+ 1 - 3
src/jfw/modules/app/src/go.mod

@@ -5,7 +5,7 @@ go 1.20
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.33.3
+	app.yhyue.com/moapp/jypkg v1.33.5
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20231226074509-942d80dc34eb
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
@@ -14,8 +14,6 @@ require (
 	go.mongodb.org/mongo-driver v1.14.0
 )
 
-replace github.com/go-xorm/xorm v0.7.9 => gitea.com/xorm/xorm v0.7.9
-
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect

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

@@ -22,8 +22,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916/go.mod h1:/HT/UZ4d
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 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 v1.33.3 h1:vC3o/w1tFLkcoG0ulO1P1XHRFzxQT+BG0hzNrDG344s=
-app.yhyue.com/moapp/jypkg v1.33.3/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
+app.yhyue.com/moapp/jypkg v1.33.5 h1:XVzoi4POBZ8Tprr9Sk/HSC0CB3WcbPFwMpuu0o3B4jI=
+app.yhyue.com/moapp/jypkg v1.33.5/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 h1:WGi4OEIoqw6NpNFGioUEBZnjK9aBa+xJqf/5WY+QyhM=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161/go.mod h1:0Oj8SB4pVjdCLD28sy2zyM3hS0WHGpNuVcakLW43GmI=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=

+ 75 - 6
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js

@@ -1,3 +1,6 @@
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
   delimiters: ['${', '}'],
   el: '#ent-portrait',
@@ -343,7 +346,7 @@ var vNode = {
       var info = this.powerInfo
       var isNoMember = info.memberStatus <= 0
       var isOldVip = info.vipStatus > 0 && !info.viper
-      var isNewVip = info.vipStatus > 0 && info.viper && !this.surplus
+      var isNewVip = info.vipStatus > 0 && info.viper && !this.surplus && !this.entvisit.visited
       var isNotAll = this.entvisit.provin !== -1
       return (isOldVip || (isNewVip && isNotAll)) && isNoMember
     },
@@ -441,7 +444,7 @@ var vNode = {
             const filterSelect = _this.groupingList.filter(item => !!item.isSelect)
             const selectList = filterSelect.map(item => item.s_name) || ['默认分组']
             _this.$refs.portrayalGrouping.setState(selectList)
-            
+
           } else {
             if(!res?.data?.status) {
                 // 监控达到上限
@@ -930,7 +933,7 @@ var vNode = {
     },
     changeGroupState: function (type) {
       console.log(type);
-      this.getEntGroupListData() 
+      this.getEntGroupListData()
       this.$nextTick(() => {
         this.setGroupState = type
         this.showGroupingDialog = true
@@ -996,7 +999,7 @@ var vNode = {
         } else {
           _this.changeFollowStateRequest()
         }
-        
+
       } else {
         this.getEntFollowState((res) => {
           const { surplus, used } = res.info
@@ -1245,13 +1248,13 @@ var vNode = {
                   //  展开监控菜单 active:3
                   window.location.href = location.origin + '/jy_mobile/push/pushsetting?active=' + active
                 })
-        
+
               } else if(res.data.msg_open && res.data.status){
                 _this.$toast({
                   duration: 2000,
                   message: '监控成功,您可前往“工作台-商机-企业情报监控”查看'
                 })
-        
+
               }
             } else {
               return _this.showToast(res.error_msg || '监控失败')
@@ -1937,6 +1940,72 @@ var vNode = {
         }
       }
       this.isOneRow = isOneRow
+    },
+    bindPhoneDataExport: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-中标动态数据导出'
+        },
+        next: function() {
+          _this.onExport()
+        }
+      }
+    },
+    bindPhoneAddKeep: function(item) {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-中标动态收藏'
+        },
+        next: function() {
+          _this.addKeepStatus(item)
+        }
+      }
+    },
+    bindPhoneUnlock: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-工商信息解锁查看'
+        },
+        next: function() {
+          _this.goToUnlock()
+        }
+      }
+    },
+    bindPhoneEntHistory: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-工商变动'
+        },
+        next: function() {
+          _this.goToEntHistory()
+        }
+      }
+    },
+    bindPhoneGoGiveAnalysis: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像- 免费赠送1次【企业中标分析】权益体验机会!-去解锁'
+        },
+        next: function() {
+          _this.goGiveAnalysis()
+        }
+      } 
+    },
+    bindPhoneDtTextClick: function(type) {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-开通超级订阅'
+        },
+        next: function () {
+          _this.onDtTextClick(type)
+        }
+      }
     }
   }
 }

+ 55 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -1,5 +1,8 @@
 // var hotChart = null;
 // var pieChart = null;
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
   delimiters: ['${', '}'],
   el: '#unit_portrayal',
@@ -2077,6 +2080,58 @@ var vNode = {
       } else if (type === 'buy') {
         location.href = '/jy_mobile/common/order/create/svip?type=buy'
       }
+    },
+    bindPhoneDataExport: function() {
+      var _this = this
+      var pass = !this.isLogin ? function () {
+        window.location.href = "/jyapp/free/login?to=back";
+      } : null
+      return {
+        props: {
+          name: '采购单位画像-招标动态数据导出'
+        },
+        pass: pass,
+        next: function () {
+          _this.onExport()
+        }
+      }
+    },
+    bindPhoneAddKeep: function (item) {
+      var _this = this
+      var pass =!this.isLogin ? function () {
+        window.location.href = "/jyapp/free/login?to=back"; 
+      } : null
+      return {
+        props: {
+          name: '采购单位画像-招标动态收藏'
+        },
+        pass: pass,
+        next: function () {
+          _this.addKeepStatus(item)
+        }
+      }
+    },
+    bindPhoneGoGiveAnalysis: function() {
+      var _this = this
+      return {
+        props: {
+          name: '采购单位画像- 免费赠送1次【采购单位全景分析】权益体验机会!-去解锁'
+        },
+        next: function () {
+          _this.goGiveAnalysis()
+        }
+      }
+    },
+    bindPhoneDtTextClick: function(type) {
+      var _this = this
+      return {
+        props: {
+          name: '采购单位画像-开通超级订阅'
+        },
+        next: function () {
+          _this.onDtTextClick(type)
+        }
+      }
     }
   }
 }

+ 4 - 3
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -1628,18 +1628,19 @@ function checkNeedGoNewUserSettingPage () {
  * @returns {*}
  */
 function checkNeedGoBindPhonePage () {
-  var userPhone
+  let userPhone,expBinding;
   $.ajax({
     url: "/jypay/user/getAccountInfo?t=" + Date.now(),
     type: "GET",
     async: false,
     success: function(res){
-      if(res.error_code == 0 && res.data){
+      if(res.error_code === 0 && res.data){
         userPhone = res.data.phone;
+        expBinding = res.data.expBinding
       }
     }
   })
-  if (!userPhone) {
+  if (!userPhone&&expBinding===0) {
     locationReplace('/jyapp/account/phone/bind?mode=mergeBind&act=logout')
     return true
   }

+ 8 - 8
src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html

@@ -6,7 +6,6 @@
 
   <!--引入公共资源头部-->
   {{include "/big-member/meta.html"}}
-
   <!--S-当前页面的css资源-->
   <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 />
@@ -192,7 +191,7 @@
                   <div class="ent-info-label">企业通讯录</div>
                   <div class="ent-info-text">
                     <p>${entBaseInfo.phone ? entBaseInfo.phone : '-'}</p>
-                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock">解锁查看</p>
+                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock" v-bound-phone="bindPhoneUnlock()">解锁查看</p>
                   </div>
                 </div>
               </div>
@@ -291,7 +290,7 @@
         </van-tab>
         <!-- 工商变动 -->
         <van-tab :name="moduleList[1].name" :title="moduleList[1].title">
-          <div class="module-title-container bg-white tab-card ent-change-history" @click="goToEntHistory">
+          <div class="module-title-container bg-white tab-card ent-change-history" @click="goToEntHistory" v-bound-phone="bindPhoneEntHistory()">
             <div class="module-title ent-change-l">
               <span>工商变动</span>
               <!-- <span class="module-title-num">10</span> -->
@@ -325,7 +324,7 @@
                 <span class="module-title-num">${topProject.total}</span>
               </div>
               <div class="action-group" key="action-group">
-                <div class="action-button export" @click="onExport" v-if="topProject.list.length">
+                <div class="action-button export" @click="onExport" v-bound-phone="bindPhoneDataExport()" v-if="topProject.list.length">
                     <i class="j-icon base-icon icon-download"></i>
                     <em class="action-button-text">数据导出</em>
                 </div>
@@ -350,7 +349,7 @@
                     @click="toProjectDetail(item)">
                   <div class="head-group">
                     <p class="i_title visited-hd">${item.title}</p>
-                    <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                    <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeep(item)"></span>
                   </div>
                 <div class="project-name" v-if="false">${item.title}</div>
                   <div class="project-info">
@@ -370,7 +369,7 @@
                 <li v-if="powerInfo.power.indexOf(4) == -1 && ((isFree && !canFreeTrial) || updateVipStatus || customerServiceStatus)" class="dt-text-tips light-bg">
                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${topProject.updateTime},您可
                   <!-- 免费用户 -->
-                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')"  v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                   <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                   <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                   <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -393,7 +392,7 @@
                 <div v-if="(isFree && !canFreeTrial) || updateVipStatus || customerServiceStatus" class="dt-text-tips">
                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${topProject.updateTime},您可
                   <!-- 免费用户 -->
-                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')"  v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                   <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                   <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                   <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -414,7 +413,7 @@
           <!-- 免费用户采购单位全景分析提示 -->
         <div v-if="canFreeExp && isLogin" style="margin-top: .24rem; " class="free-give">
           <div class="highlight-text"> 免费赠送1次【企业中标分析】权益体验机会!</div>
-          <div class="go-btn" @click="goGiveAnalysis">去解锁</div>
+          <div class="go-btn" @click="goGiveAnalysis" v-bound-phone="bindPhoneGoGiveAnalysis()">去解锁</div>
         </div>
           <!-- 留完资的免费用户 已体验和未体验的展示去开通 -->
           <div v-if="freeWinnerOpen" class="banner-sticky" ref="bannerRef">
@@ -744,6 +743,7 @@
 {{include "/big-member/commonjs.html"}}
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/antiRes/js/mainHook.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/vip-dialog.js?v={{Msg "seo" "version"}}'>
 </script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'>

+ 4 - 0
src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait_change.html

@@ -77,9 +77,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='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/vip-dialog.js?v={{Msg "seo" "version"}}'></script>
 {{include "/big-member/commonjs.html"}}
 <script>
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
     delimiters: ['${', '}'],
     el: '#ent-portrait-change',

+ 4 - 4
src/jfw/modules/app/src/web/templates/big-member/page_free_buyer_project_news.html

@@ -225,7 +225,7 @@
                             <span v-else @click="changeList">表格显示</span>
                         </div>
                         <div class="export">
-	                        <span @click="onExport">
+	                        <span @click="onExport" v-bound-phone="bindPhoneDataExport('采购单位画像-更多招标动态-数据导出')">
 	                            <i class="j-icon base-icon icon-download"></i>
 	                            <em id="mainSearch-selLable-dataExport">数据导出</em>
 	                        </span>
@@ -247,11 +247,10 @@
                             class="project-info-item bg-white border-line-b clickable"
                             :class="{ visited: item.visited }"
                             :immediate-check="false"
-                            @click="goToDetail(item)"
                             :key="item.id">
                             <div class="head-group">
-                              <div class="project-name visited-hd">${ item.title }</div>
-                              <span :data-id="item.id" class="icon" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                              <div class="project-name visited-hd" @click="goToDetail(item)">${ item.title }</div>
+                              <span :data-id="item.id" class="icon" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeepStatus(item, '采购单位画像-招标动态-收藏')"></span>
                             </div>
                             <div class="project-info">
                                 <span class="tags">
@@ -382,6 +381,7 @@
         platform: 'app'
     }
 </script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>

+ 4 - 4
src/jfw/modules/app/src/web/templates/big-member/page_free_ent_project_news.html

@@ -93,7 +93,7 @@
                     <span v-else @click="changeList">表格显示</span>
                   </div>
                   <div class="export">
-                            <span @click="onExport">
+                            <span @click="onExport" v-bound-phone="bindPhoneDataExport('企业画像-中标动态-数据导出')">
                                 <i class="j-icon base-icon icon-download"></i>
                                 <em id="mainSearch-selLable-dataExport">数据导出</em>
                             </span>
@@ -115,12 +115,11 @@
                             class="project-info-item bg-white border-line-b clickable"
                             :class="{ visited: item.visited }"
                             :immediate-check="false"
-                            @click="goToDetail(item)"
                             :key="item.id">
 <!--                            <div class="project-name">${ item.title }</div>-->
                               <div class="head-group">
-                                <div class="project-name visited-hd">${ item.title }</div>
-                                <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                                <div class="project-name visited-hd" @click="goToDetail(item)">${ item.title }</div>
+                                <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeepStatus(item, '企业画像-中标动态-收藏')"></span>
                               </div>
                             <div class="project-info">
                                 <span class="tags">
@@ -243,6 +242,7 @@
         platform: 'app'
     }
 </script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>

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

@@ -139,7 +139,7 @@
         <div style="font-size: 0;">
           <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemB_04.png'>
         </div>
-        <div class="btn_buy" id="btn_buy" @click="exper_fun('sj', 1)"  style="background-color:#1A1A2A;"><img data-need-bind-phone src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemB_05.jpg' alt="" class="btn_buy_img" id="btn_buy_img"></div>
+        <div class="btn_buy" id="btn_buy"  @click="exper_fun('sj', 1)" v-bound-phone="bindPhoneGoSee()"  style="background-color:#1A1A2A;"><img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/image/landpage_new/itemB_05.jpg' alt="" class="btn_buy_img" id="btn_buy_img"></div>
       </div>
       <!-- 为什么选择 -->
       <div class="insight" id="sj">
@@ -163,16 +163,16 @@
     <div class="j-footer " v-show="isCantrial" style="background-color: #1A1A2A;">
       <div class="j-button-group btbt">
         <div class="buy_btn" v-if="onlyBuy">
-          <div class="sevendays j-btn" @click="exper_fun()">
-            <div data-need-bind-phone class="xiugai" style="color: #FAE7CA">立即体验</div>
+          <div class="sevendays j-btn" @click="exper_fun()" v-bound-phone="bindPhoneGoSee()">
+            <div class="xiugai" style="color: #FAE7CA">立即体验</div>
           </div>
-          <div class="j-button-now j-btn" @click="linkBuy('sj',6)" >
-            <div data-need-bind-phone class="xiugai" style="color: #1A1A2A">点击购买</div>
+          <div class="j-button-now j-btn" @click="linkBuy('sj',6)" v-bound-phone="bindPhoneGoBuy('sj', 6)" >
+            <div class="xiugai" style="color: #1A1A2A">点击购买</div>
           </div>
         </div>
         <div class="buy_btn" v-else>
-          <div class="j-button-nowly j-btn" @click="linkBuy('sj',6)">
-            <div data-need-bind-phone>立即购买</div>
+          <div class="j-button-nowly j-btn" @click="linkBuy('sj',6)" v-bound-phone="bindPhoneGoBuy('sj', 6)">
+            <div>立即购买</div>
           </div>
         </div>
       </div>
@@ -184,6 +184,7 @@
   <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='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script>
     {{$ss1:=(Ad "app-banner-data-info" -1 .Host (cookie "SESSIONID"))}}
     var headerImageList={{$ss1}}
@@ -226,6 +227,9 @@
     var config = {
         cdnHost: {{Cdns .Host "seo" "cdn"|SafeUrl}}
     }
+    try {
+      Vue.use(TestBindPhone)
+    } catch (error) {}
     var vNode = {
         delimiters: ['${', '}'],
         el: '#v-commit',
@@ -418,6 +422,28 @@
                 } catch (e) {
                     console.log('未初始化百度统计')
                 }
+            },
+            bindPhoneGoSee: function() {
+              var _this = this
+              return {
+                props: {
+                  name: '大会员落地页-立即体验'
+                },
+                next: function() {
+                  _this.exper_fun()
+                }
+              }
+            },
+            bindPhoneGoBuy: function(res, i) {
+              var _this = this
+              return {
+                props: {
+                  name: '大会员落地页-立即购买'
+                },
+                next: function() {
+                  _this.linkBuy(res, i)
+                }
+              }
             }
         }
     }

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

@@ -6,7 +6,6 @@
 
   <!--引入公共资源头部-->
   {{include "/big-member/meta.html"}}
-
   <!--S-当前页必定需要预加载的资源-->
   <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 />
@@ -199,7 +198,7 @@
             <!-- 免费用户采购单位全景分析提示 -->
             <div v-if="getfreeBuyerPort && isLogin" class="free-give">
               <div class="go-text"> 免费赠送1次【采购单位全景分析】权益体验机会!</div>
-              <div class="go-btn" @click="goGiveAnalysis">去解锁</div>
+              <div class="go-btn" @click="goGiveAnalysis" v-bound-phone="bindPhoneGoGiveAnalysis()">去解锁</div>
             </div>
             <div v-if="getStatus">
               <div class="vip_component"
@@ -224,7 +223,7 @@
                     <span class="module-title-num">${dt.total}</span>
                   </div>
                   <div class="action-group">
-                    <div class="action-button export" @click="onExport" v-if="dt.list.length">
+                    <div class="action-button export" @click="onExport" v-bound-phone="bindPhoneDataExport()" v-if="dt.list.length">
                         <i class="j-icon base-icon icon-download"></i>
                         <em id="mainSearch-selLable-dataExport" class="action-button-text">数据导出</em>
                     </div>
@@ -245,7 +244,7 @@
                       <div class="head-group">
                         <p class="i_title visited-hd">${item.title}</p>
                         <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'"
-                          @click.stop="addKeepStatus(item)"></span>
+                          @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeep(item)"></span>
                       </div>
                       <div class="i_info">
                         <p class="area_type">
@@ -264,7 +263,7 @@
                     <div v-if="getStatus" class="dt-text-tips light-bg">
                       免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${dt.updateTime},您可
                       <!-- 免费用户 -->
-                      <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                      <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                       <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                       <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                       <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -287,7 +286,7 @@
                     <div v-if="getStatus" class="dt-text-tips">
                       免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${dt.updateTime},您可
                        <!-- 免费用户 -->
-                       <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                       <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                        <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                        <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                        <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -741,6 +740,7 @@
     src="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/index.js"></script>
   <link href="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/theme-chalk/index.css" rel="stylesheet" />
   {{include "/big-member/commonjs.html"}}
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/echarts_option.js?v={{Msg "seo" "version"}}'>
   </script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/chart_options.js?v={{Msg "seo" "version"}}'>
@@ -758,7 +758,7 @@
   </script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/portrait/js/downloadpopup.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module//mobile-portrayal-footer/js/mobile-portrayal-footer.js?v={{Msg "seo" "version"}}'></script>
-  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}11'>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}'>
   </script>
   <script
     src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'>

+ 30 - 1
src/jfw/modules/app/src/web/templates/exhibition/index.html

@@ -24,6 +24,8 @@
   <link rel="stylesheet" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/exhibition/css/reset.css?v={{Msg "seo" "version" }}" />
   <link rel="stylesheet" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/exhibition/css/swiper.css?v={{Msg "seo" "version" }}" />
   <link rel="stylesheet" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/exhibition/css/index.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" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
   <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
   <style>
     .app-layout-header{
@@ -252,10 +254,13 @@
       </div>
       <!-- 移动底部-->
       <div class="footer pc_hide">
-        <div class="btn" onclick="goCustomerPage()">洽谈展会合作</div>
+        <div class="btn" v-bound-phone="bindPhoneGoCustomer()">洽谈展会合作</div>
       </div>
     </div>
   </div>
+  <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='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/exhibition/js/swiper.js?v={{Msg "seo" "version" }}"></script>
   <script src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/local/weui.min.js"></script>
   <!-- 本身逻辑js -->
@@ -291,6 +296,30 @@
       }
 
     }
+    try {
+      Vue.use(TestBindPhone)
+    } catch (error) {}
+    new Vue({
+      el: '#vm_exhibition',
+      delimiters: ['${', '}'],
+      methods: {
+        bindPhoneGoCustomer: function () {
+          var pass = !goTemplateData.params.loginFlag ? function () {
+            sessionStorage.setItem('status_login',true)
+            window.location.href = "/jyapp/free/login?url=" + encodeURIComponent('/jyapp/free/customer?auto=1')
+          } : null
+          return {
+            props: {
+              name: '行业展会-洽谈展会合作'
+            },
+            pass: pass,
+            next: function () {
+              go_kf()
+            }
+          }
+        }
+      }
+    })
   </script>
   <!--百度统计-->
   {{include "/common/baiducc.html"}}

+ 2 - 1
src/jfw/modules/app/src/web/templates/frontRouter/bidedoc/free/index.html

@@ -37,7 +37,7 @@
           <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidedoc/image/B_09.jpg?v={{Msg "seo" "version"}}' alt="">
           <div class="btns-tips">
             <div class="btns">
-                <van-button type="primary" size="large" onclick="getMsgNew()">请留下您的手机号,专业老师将尽快和您联系</van-button>
+                <van-button type="primary" size="large" onclick="getMsgNew()" v-bound-phone="bindPhoneGetMsg()">请留下您的手机号,专业老师将尽快和您联系</van-button>
             </div>
           </div>
         </div>
@@ -51,6 +51,7 @@
   <!--E-当前页面的资源-->
   {{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}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidedoc/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
   <script>

+ 2 - 1
src/jfw/modules/app/src/web/templates/frontRouter/bidedoc/sess/index.html

@@ -32,7 +32,7 @@
           <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidedoc/image/B_09.jpg?v={{Msg "seo" "version"}}' alt="">
           <div class="btns-tips">
             <div class="btns">
-                <van-button type="primary" size="large" @touchstart="getMsg">请留下您的手机号,专业老师将尽快和您联系</van-button>
+                <van-button type="primary" size="large" v-bound-phone="bindPhoneGetMsg()">请留下您的手机号,专业老师将尽快和您联系</van-button>
             </div>
           </div>
         </div>
@@ -46,6 +46,7 @@
   <!--E-当前页面的资源-->
   {{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}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidedoc/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
 </body>

+ 2 - 1
src/jfw/modules/app/src/web/templates/frontRouter/declaration/free/relationship.html

@@ -67,7 +67,7 @@
             <div class="fixed-bottom intro-leave-banner">
                 <div class="text-container">
                     <p class="intro-text">剑鱼可帮助您快速达成业绩倍增</p>
-                    <button class="intro-button button-blink" @click="applyToTrial">申请免费试用</button>
+                    <button class="intro-button button-blink" @click="applyToTrial" v-bound-phone="bindPhoneApplyToTrial()">申请免费试用</button>
                 </div>
                 <div class="img-container">
                     <img src="{{Msg "seo" "cdn"}}/common-module/bidedoc/image/relationship/bottom-banner-mask@2x.png?v={{Msg "seo" "version"}}" alt="" class="img-content">
@@ -82,6 +82,7 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/lodash/4.17.21/lodash.min.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}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidedoc/js/relationship.js?v={{Msg "seo" "version"}}'></script>
     {{include "/common/baiducc.html"}}
 </body>

+ 29 - 1
src/jfw/modules/app/src/web/templates/frontRouter/partner/free/index.html

@@ -16,6 +16,8 @@
   <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/base.css?v={{Msg "seo" "version"}}">
   <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.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" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/partner.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/append.css?v={{Msg "seo" "version"}}">
   <style>
@@ -93,11 +95,14 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<button dataHref="/jyapp/frontPage/bigmember/free/perfect_info_partner?source=partner_recruit_page"  class="j-button-confirm" id="j_confirm">申请加入</button>
+			<button v-bound-phone="bindPhoneJoin('/jyapp/frontPage/bigmember/free/perfect_info_partner?source=partner_recruit_page')" class="j-button-confirm" id="j_confirm">申请加入</button>
 		</div>
 	</div>
 </div>
 </body>
+<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='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/imageViewer.min.js'></script>
@@ -190,6 +195,29 @@
   function tel(phone){
     JyObj.callPhone(phone);
   }
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
+  new Vue({
+    el: '#app',
+    delimiters: ['${', '}'],
+    methods: {
+      bindPhoneJoin: function(url) {
+        var pass = !loginFlag ? function () {
+          window.location.href = "/jyapp/free/login?url=" + encodeURIComponent(url)
+        } : null
+        return {
+          props: {
+            name: '渠道合作-申请加入'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href = url
+          }
+        }
+      }
+    }
+  })
 </script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}

+ 25 - 1
src/jfw/modules/app/src/web/templates/frontRouter/partner/sess/index.html

@@ -18,6 +18,8 @@
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/partner.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/partner/css/append.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" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
   <style>
     .app-layout-header{
       border-bottom: 0px!important;
@@ -93,11 +95,14 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<button onclick="location.href = '/jyapp/frontPage/bigmember/free/perfect_info_partner?source=partner_recruit_page'"  class="j-button-confirm" id="j_confirm">申请加入</button>
+			<button v-bound-phone="bindPhoneJoin()" class="j-button-confirm" id="j_confirm">申请加入</button>
 		</div>
 	</div>
 </div>
 </body>
+<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='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/imageViewer.min.js'></script>
@@ -181,6 +186,25 @@
   function tel(phone){
     JyObj.callPhone(phone);
   }
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
+  new Vue({
+    el: '#app',
+    delimiters: ['${', '}'],
+    methods: {
+      bindPhoneJoin: function() {
+        return {
+          props: {
+            name: '渠道合作-申请加入'
+          },
+          next: function () {
+            window.location.href = '/jyapp/frontPage/bigmember/free/perfect_info_partner?source=partner_recruit_page'
+          }
+        }
+      }
+    }
+  })
 </script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}

+ 6 - 4
src/jfw/modules/app/src/web/templates/frontRouter/solution/free/dataInterface.html

@@ -53,7 +53,7 @@
 </head>
 
 <body>
-    <div class="j-container app">
+    <div class="j-container app" id="app" v-cloak>
         <div class="j-header jy-app-header header-transparent">
           <span class="header-left">
             <span class="icon-back j-icon base-icon"></span>
@@ -62,7 +62,7 @@
           <span class="header-title">剑鱼数据接口</span>
           <span class="header-right"></span>
         </div>
-        <div class="j-main" id="main-app" v-cloak>
+        <div class="j-main" id="main-app">
             <div class="content-banner">
                 <img class="img-content" src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/solution/image/interface-header-top-banner@2x.png'>
             </div>
@@ -255,8 +255,8 @@
         </div>
         <div class="j-footer">
           <div class="j-button-group-new">
-            <button class="j-button-left customer-button">联系客服</button>
-            <button class="j-button-right api-button">接口申请</button>
+            <button class="j-button-left customer-button" v-bound-phone="bindPhoneCustomer()">联系客服</button>
+            <button class="j-button-right api-button" v-bound-phone="bindPhoneApply()">接口申请</button>
           </div>
         </div>
     </div>
@@ -270,7 +270,9 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/countup/2.0.8/dist/countUp.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}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/solution/js/data-interface.js?v={{Msg "seo" "version"}}'></script>
+
     {{include "/common/baiducc.html"}}
 </body>
 

+ 55 - 18
src/jfw/modules/app/src/web/templates/frontRouter/solution/free/index.html

@@ -90,11 +90,11 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<a dataHref="/jyapp/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution" class="j-button-cancel" id="j_cancel">
+			<a v-bound-phone="bindPhoneLearnMore()" dataHref="/jyapp/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution" class="j-button-cancel" id="j_cancel">
 				<!-- <span class="phone_icon"></span> -->
 				<span>了解详情</span>
 			</a>
-			<button dataHref="/jyapp/free/customer"  class="j-button-confirm" id="j_confirm">
+			<button v-bound-phone="bindPhoneCustomer()" dataHref="/jyapp/free/customer"  class="j-button-confirm" id="j_confirm">
 				<span class="icon_phone"></span>
 				<span>立即咨询</span>
 			</button>
@@ -105,10 +105,16 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.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>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script>
+  var loginFlag = {{if .T.loginFlag}}{{.T.loginFlag}}{{else}}false{{end}}
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
+
 	var vmSol = new Vue({
-    el: '#advantage',
+    el: '#app',
     data: {
       show: false,
       index: 0,
@@ -117,11 +123,43 @@
       ],
     },
     methods: {
+      bindPhoneLearnMore: function() {
+        var href = '/jyapp/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution'
+        var pass = !loginFlag ? function() {
+          window.location.href= "/jyapp/free/login?url=" + href
+        } : null
+        return {
+          props: {
+            name: '行业解决方案-了解详情'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= href
+          }	
+        }
+      },
+      bindPhoneCustomer: function() {
+        var href = '/jyapp/free/customer'
+        var pass = !loginFlag? function() {
+          window.location.href= "/jyapp/free/login?url=" + href
+        } : null
+        return {
+          props: {
+            name: '行业解决方案-立即咨询'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= href
+          }
+        }
+      },
       imageView: function(index) {
         this.show = true
       }
     }
   })
+
+
 	// 监听页面滚动
 	var addEvent = (function(){
 		if(window.addEventListener){
@@ -148,23 +186,22 @@
 		}
 	});
 
-  var loginFlag = {{if .T.loginFlag}}{{.T.loginFlag}}{{else}}false{{end}}
   //咨询客服
-  $("#j_cancel").on('click',function(){
-    if(loginFlag){
-      window.location.href=$(this).attr('dataHref')
-    }else{
-      window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
-    }
-  })
+  // $("#j_cancel").on('click',function(){
+  //   if(loginFlag){
+  //     window.location.href=$(this).attr('dataHref')
+  //   }else{
+  //     window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
+  //   }
+  // })
   //获取样例
-  $("#j_confirm").on('click',function(){
-     if(loginFlag){
-      window.location.href=$(this).attr('dataHref')
-    }else{
-      window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
-    }
-  })
+  // $("#j_confirm").on('click',function(){
+  //    if(loginFlag){
+  //     window.location.href=$(this).attr('dataHref')
+  //   }else{
+  //     window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
+  //   }
+  // })
 
 	$('.fanhui').on('click', function() {
 		history.go(-1)

+ 29 - 3
src/jfw/modules/app/src/web/templates/frontRouter/solution/sess/index.html

@@ -90,11 +90,11 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<a onclick="location.href = '/jyapp/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution'" class="j-button-cancel" id="j_cancel">
+			<a v-bound-phone="bindPhoneLearnMore()" class="j-button-cancel" id="j_cancel">
 				<!-- <span class="phone_icon"></span> -->
 				<span>了解详情</span>
 			</a>
-			<button onclick="location.href = '/jyapp/free/customer'"  class="j-button-confirm" id="j_confirm">
+			<button  v-bound-phone="bindPhoneCustomer()" class="j-button-confirm" id="j_confirm">
 				<span class="icon_phone"></span>
 				<span>立即咨询</span>
 			</button>
@@ -105,10 +105,14 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.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>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script>
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
 	var vmSol = new Vue({
-    el: '#advantage',
+    el: '#app',
     data: {
       show: false,
       index: 0,
@@ -119,6 +123,28 @@
     methods: {
       imageView: function(index) {
         this.show = true
+      },
+      bindPhoneLearnMore: function() {
+        var href = '/jyapp/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution'
+        return {
+          props: {
+            name: '行业解决方案-了解详情'
+          },
+          next: function () {
+            window.location.href= href
+          }	
+        }
+      },
+      bindPhoneCustomer: function() {
+        var href = '/jyapp/free/customer'
+        return {
+          props: {
+            name: '行业解决方案-立即咨询'
+          },
+          next: function () {
+            window.location.href= href
+          }
+        }
       }
     }
   })

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

@@ -194,7 +194,7 @@
                         <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>
+                        <button class="fast-login-text fast-login-open-link highlight-text">本机号码一键绑定</button>
                     </div>
                     <div class="tip-text" v-if="showBottomTip">
                       根据《中华人民共和国网络安全法》要求,为避免非正常使用标讯信息,需完成手机号绑定, 保障账户安全和信息的正当使用。

+ 61 - 17
src/jfw/modules/app/src/web/templates/structeddata/marketing.html

@@ -17,6 +17,7 @@
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/css/marketing.css?v={{Msg "seo" "version"}}">
+  <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
   <style>
     .app-layout-header{
       border-bottom: 0px!important;
@@ -85,11 +86,11 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<a dataHref="/jyapp/free/customer" class="j-button-cancel" id="j_cancel">
+			<a v-bound-phone="bindPhoneCustomer()" dataHref="/jyapp/free/customer" class="j-button-cancel" id="j_cancel">
 				<!-- <span class="phone_icon"></span> -->
 				<span>咨询客服</span>
 			</a>
-			<button dataHref="/jyapp/frontPage/bigmember/free/perfect_info_strud?source=structedData"  class="j-button-confirm" id="j_confirm">获取数据样例</button>
+			<button v-bound-phone="bindPhoneLearnMore()" dataHref="/jyapp/frontPage/bigmember/free/perfect_info_strud?source=structedData"  class="j-button-confirm" id="j_confirm">获取数据样例</button>
 		</div>
 	</div>
 </div>
@@ -97,6 +98,9 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/jquery.min.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/structuredata/js/imageViewer.min.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>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script>
 	// 监听页面滚动
@@ -164,21 +168,21 @@
 	})
   var loginFlag = {{if .T.loginFlag}}{{.T.loginFlag}}{{else}}false{{end}}
   //咨询客服
-  $("#j_cancel").on('click',function(){
-    if(loginFlag){
-      window.location.href=$(this).attr('dataHref')
-    }else{
-      window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
-    }
-  })
-  //获取样例
-  $("#j_confirm").on('click',function(){
-     if(loginFlag){
-      window.location.href=$(this).attr('dataHref')
-    }else{
-      window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
-    }
-  })
+  // $("#j_cancel").on('click',function(){
+  //   if(loginFlag){
+  //     window.location.href=$(this).attr('dataHref')
+  //   }else{
+  //     window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
+  //   }
+  // })
+  // //获取样例
+  // $("#j_confirm").on('click',function(){
+  //    if(loginFlag){
+  //     window.location.href=$(this).attr('dataHref')
+  //   }else{
+  //     window.location.href= "/jyapp/free/login?url="+$(this).attr('dataHref')
+  //   }
+  // })
 	function click_view(){
 		var loading = weui.loading('loading', {
 			className: 'custom-classname'
@@ -193,6 +197,46 @@
   function tel(phone){
     JyObj.callPhone(phone);
   }
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
+
+	new Vue({
+    el: '#app',
+    data: {},
+    methods: {
+      bindPhoneLearnMore: function() {
+        var href = '/jyapp/frontPage/bigmember/free/perfect_info_strud?source=structedData'
+        var pass = !loginFlag ? function() {
+          window.location.href= "/jyapp/free/login?url=" + href
+        } : null
+        return {
+          props: {
+            name: '结构化数据-获取数据样例'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= href
+          }	
+        }
+      },
+      bindPhoneCustomer: function() {
+        var href = '/jyapp/free/customer'
+        var pass = !loginFlag? function() {
+          window.location.href= "/jyapp/free/login?url=" + href
+        } : null
+        return {
+          props: {
+            name: '结构化数据-咨询客服'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= href
+          }
+        }
+      }
+    }
+  })
 </script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}

+ 40 - 10
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html

@@ -149,16 +149,8 @@
         </div>
     </div>
     <div class="j-footer j-button-group popup-bottom-group">
-        <!-- <div class="adbottom" style="width:375px;height: 40px;text-align: center;" id="bottomad"></div>
-        <div class="pop-tip-group active" style="display: none">
-                <div>买1年送1年</div>
-        </div>
-        <div class="pop-button" data-need-bind-phone data-url="/jy_mobile/common/order/create/svip?type=buy{{if .T.disWord}}&disWord={{.T.disWord}}{{end}}"  id="vip-introduce">
-                <img data-name="default" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/btnBottom.png?v={{Msg "seo" "version"}}">
-                <img data-name="active" style="display: none"  src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/image/info/btnBottom1212.png?v={{Msg "seo" "version"}}">
-        </div> -->
-        <div class="btn-customer" onclick="location.href= '/jyapp/free/customer'">咨询客服</div>
-        <div class="btn-buy" data-need-bind-phone data-url="/jy_mobile/common/order/create/svip?type=buy{{if .T.disWord}}&disWord={{.T.disWord}}{{end}}">立即购买</div>
+        <div class="btn-customer" v-bound-phone="bindPhoneCustomer('/jyapp/free/customer')">咨询客服</div>
+        <div class="btn-buy" v-bound-phone="bindPhoneGoBuy('/jy_mobile/common/order/create/svip?type=buy{{if .T.disWord}}&disWord={{.T.disWord}}{{end}}')" id="vip-introduce">立即购买</div>
     </div>
 </div>
 <script src='https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js'></script>
@@ -312,6 +304,44 @@
         location.href = $(this).attr('data-href')
       })
     })
+
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
+	new Vue({
+    el: '#vip-intro-container',
+    data: {},
+    methods: {
+      bindPhoneGoBuy: function(url) {
+        var pass = !loginFlag? function() {
+          window.location.href= "/jyapp/free/login?url=" + url
+        } : null
+        return {
+          props: {
+            name: '超级订阅落地页-立即购买'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= url
+          }
+        }
+      },
+      bindPhoneCustomer: function(url) {
+        var pass = !loginFlag? function() {
+          window.location.href= "/jyapp/free/login?url=" + url
+        } : null
+        return {
+          props: {
+            name: '超级订阅落地页-咨询客服'
+          },
+          pass: pass,
+          next: function () {
+            window.location.href= url
+          }
+        }
+      }
+    }
+  })
 </script>
 
 {{include "/common/baiducc.html"}}

+ 37 - 2
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_pay_success.html

@@ -35,7 +35,18 @@
     /* .active-tip-group img {
         display: block;
     } */
-
+    .giving-tip{
+      width: 4.22rem;
+      padding: .12rem 0;
+      margin: .36rem auto 0;
+      border: 1px solid#2ABED1;
+      border-radius: .32rem;
+      text-align: center;
+      font-size: .28rem;
+      line-height: .4rem;
+      background: #fff;
+      color: #2ABED1;
+    }
   </style>
 </head>
 <body>
@@ -53,6 +64,7 @@
                     &yen;
                     <em></em>
                 </p>
+                <div class="giving-tip" style="display: none;" onclick="location.href='/jy_mobile/giving/friend'">将超级订阅赠送给好友</div>
             </div>
             <div class="info_box">
                 <div class="pay_mode">
@@ -96,7 +108,8 @@
 
   var title = {{.T.title}}
   var orderCode = {{.T.orderCode}}
-  console.log(orderCode)
+  var positionType = {{.T.positionType}}
+  var vipType = {{.T.vipType}}
 //   if (title.indexOf('超级订阅') !== -1) {
 //     getActiveInfo()
 //   }
@@ -280,7 +293,29 @@
             var money = t.split('').reverse().join('') + point + right;
             return money;
         }
+        getVipGiftConfig()
   })
+  function getVipGiftConfig() {
+    $.ajax({
+      url: '/subscribepay/vip/gift/configuration',
+      type: 'POST',
+      success: function(res) {
+          if(res && res.data) {
+            var startTime = res.data.startTime
+            var endTime = res.data.endTime
+            var isValidPeriod = startTime && endTime && parseInt(startTime) < parseInt(endTime)
+            var nowTime = Math.floor(Date.now() / 1000)
+            var isNewBuy = vipType != 1 && vipType != 2
+            var vipGiftPeriod = isValidPeriod && nowTime >= parseInt(startTime) && nowTime <= parseInt(endTime) && positionType === '0' && isNewBuy
+            if (vipGiftPeriod) {
+              $('.giving-tip').show()
+            } else {
+              $('.giving-tip').hide()
+            }
+          }
+      }
+    })
+  }
 </script>
 {{include "/common/baiducc.html"}}
 </html>

+ 3 - 1
src/jfw/modules/publicapply/src/activityday/dao/raffle.go

@@ -110,7 +110,9 @@ func (r *RaffleInfo) Raffle() (int, error, entity.WinnerPrizeInfo) {
 			return
 		}
 		//redis加锁
-		client.AcquireLock()
+		if !client.AcquireLock() {
+			return
+		}
 		//redis 释放锁
 		defer client.ReleaseLock()
 		var (

+ 10 - 0
src/jfw/modules/publicapply/src/filter/cookie.go

@@ -24,5 +24,15 @@ func (ci *CookieInfo) Do(w http.ResponseWriter, req *http.Request) bool {
 			}
 		}
 	}
+	//体验-绑定-标识
+	//host := req.Host
+	//if !strings.HasPrefix(host, ".") {
+	//	host = "." + host
+	//}
+	//phone, _ := getSession["phone"].(string)
+	//log.Println(phone, "--host:", host)
+	//if phone == "" && qu.Int64All(getSession["experience_binding"]) == 1 {
+	//	jy.SetCookie(w, req, jy.ExperienceSign, "experiencing", host, 8*60*60)
+	//}
 	return true
 }

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

@@ -5,7 +5,7 @@ go 1.20
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20250227020441-2a6731d90553
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.33.3
+	app.yhyue.com/moapp/jypkg v1.33.5
 	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21
 	github.com/ClickHouse/clickhouse-go/v2 v2.2.0

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

@@ -20,8 +20,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20250227020441-2a6731d90553/go.mod h1:/HT/UZ4d
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 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 v1.33.2 h1:NqtGHlrkgu89T7Km6Kcid309n9LB/CMKHFafnwQtO1A=
-app.yhyue.com/moapp/jypkg v1.33.2/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
+app.yhyue.com/moapp/jypkg v1.33.5 h1:XVzoi4POBZ8Tprr9Sk/HSC0CB3WcbPFwMpuu0o3B4jI=
+app.yhyue.com/moapp/jypkg v1.33.5/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 h1:WGi4OEIoqw6NpNFGioUEBZnjK9aBa+xJqf/5WY+QyhM=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161/go.mod h1:0Oj8SB4pVjdCLD28sy2zyM3hS0WHGpNuVcakLW43GmI=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=

+ 2 - 1
src/jfw/modules/publicapply/src/oneclick/entity/entity.go

@@ -429,7 +429,8 @@ func (o *OneClickInfo) phoneLogin(phone string) (map[string]interface{}, error)
 					}()
 				}
 				userInfo["isNewUser"] = true
-				go jy.SaveUserLog(db.Mgo_Log, _id, phone, "phone", isAndroidOrIOS(client), platform, "", "", gconv.String(data["s_rsource"]), o.R.Proto, isAndroidOrIOS(client), gconv.String(common.If(isAndroidOrIOS(client) == "jyzbw", "jyzbw", "jybx")), "")
+				referer := o.R.Referer()
+				go jy.SaveUserLog(db.Mgo_Log, _id, phone, "phone", isAndroidOrIOS(client), platform, "", "", gconv.String(data["s_rsource"]), o.R.Proto, isAndroidOrIOS(client), gconv.String(common.If(isAndroidOrIOS(client) == "jyzbw", "jyzbw", "jybx")), "", referer)
 				//用户中台同步
 				func(userid string) {
 					if ok := jy.AddUser(db.Mgo, userid, pb.UserAddReq{

+ 533 - 533
src/jfw/modules/publicapply/src/util/util.go

@@ -1,62 +1,62 @@
 package util
 
 import (
-    elastic "app.yhyue.com/moapp/jybase/es"
-    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-    "bytes"
-    "crypto/md5"
-    "encoding/hex"
-    "encoding/json"
-    "fmt"
-    "jy/src/jfw/modules/publicapply/src/config"
-    "jy/src/jfw/modules/publicapply/src/db"
-    "log"
-    "net/http"
-    "regexp"
-    "strconv"
-    "strings"
-    "time"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"bytes"
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/modules/publicapply/src/config"
+	"jy/src/jfw/modules/publicapply/src/db"
+	"log"
+	"net/http"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
 
-    qutil "app.yhyue.com/moapp/jybase/common"
-    . "app.yhyue.com/moapp/jybase/date"
-    "app.yhyue.com/moapp/jybase/encrypt"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 )
 
 var ClearHtml = regexp.MustCompile("<[^>]*>")
 var (
-    queryBoolShould         = `{"bool":{"should":[%s],"minimum_should_match": 1}}`
-    queryBoolMustBoolShould = `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
-    queryBase               = `{"query":{"bool":{"must":[%s]}},"_source":["_id"],"from":0,"size":%d}`
-    gte                     = `"gte": %s`
-    lte                     = `"lte": %s`
-    queryBoolMust           = `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
-    multiMatch              = `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
-    idTerms                 = `{"terms":{"_id":["%s"]}}`
-    topTypeMap              = map[string]string{
-        "招标预告":   "预告",
-        "招标公告":   "招标",
-        "招标结果":   "结果",
-        "招标信用信息": "其它",
-        "拟建项目":   "拟建",
-        "采购意向":   "采购意向",
-    }
+	queryBoolShould         = `{"bool":{"should":[%s],"minimum_should_match": 1}}`
+	queryBoolMustBoolShould = `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
+	queryBase               = `{"query":{"bool":{"must":[%s]}},"_source":["_id"],"from":0,"size":%d}`
+	gte                     = `"gte": %s`
+	lte                     = `"lte": %s`
+	queryBoolMust           = `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
+	multiMatch              = `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
+	idTerms                 = `{"terms":{"_id":["%s"]}}`
+	topTypeMap              = map[string]string{
+		"招标预告":   "预告",
+		"招标公告":   "招标",
+		"招标结果":   "结果",
+		"招标信用信息": "其它",
+		"拟建项目":   "拟建",
+		"采购意向":   "采购意向",
+	}
 )
 
 // 加密
 func EncodeId(sid string) string {
-    if sid == "" {
-        return ""
-    }
-    return encrypt.EncodeArticleId2ByCheck(sid)
+	if sid == "" {
+		return ""
+	}
+	return encrypt.EncodeArticleId2ByCheck(sid)
 }
 
 // 解密
 func DecodeId(eid string) string {
-    if eid == "" {
-        return ""
-    }
-    return encrypt.CommonDecodeArticle("content", eid)[0]
+	if eid == "" {
+		return ""
+	}
+	return encrypt.CommonDecodeArticle("content", eid)[0]
 }
 
 //收藏列表
@@ -68,566 +68,566 @@ func DecodeId(eid string) string {
 	   开始时间-结束时间:1622476800-1623859200
 */
 type CollList struct {
-    Pagenum     int    `json:"pagenum"`     //页数
-    Label       string `json:"label"`       //标签 用,分隔开
-    SelectTime  string `json:"selectTime"`  //收藏时间
-    Buyerclass  string `json:"buyerclass"`  //采购单位 用,分隔开
-    BuyerPhone  string `json:"buyerTel"`    //是否需要采购单位联系方式 y:需要
-    WinnerPhone string `json:"winnerTel"`   //是否需要中标单位联系方式 y:需要
-    Pagesize    int    `json:"pagesize"`    //每页展示数量
-    KeyWords    string `json:"keyWords"`    // 匹配标题正文  到es里面查
-    PublishTime string `json:"publishTime"` // 发布时间  到es里面查
-    TopType     string `json:"topType"`     // 信息类型-一级分类 到es里面查
-    Subtype     string `json:"subtype"`     // 信息类型-二级分类 到es里面查
-    Province    string `json:"province"`    // 项目地区_省份 到es里面查
-    City        string `json:"city"`        // 项目地区_城市 到es里面查
-    District    string `json:"district"`    // 项目地区_区县 到es里面查
-    Price       string `json:"price"`       // 金额区间 到es里面查
-    Industry    string `json:"industry"`    // 行业分类 到es里面查
+	Pagenum     int    `json:"pagenum"`     //页数
+	Label       string `json:"label"`       //标签 用,分隔开
+	SelectTime  string `json:"selectTime"`  //收藏时间
+	Buyerclass  string `json:"buyerclass"`  //采购单位 用,分隔开
+	BuyerPhone  string `json:"buyerTel"`    //是否需要采购单位联系方式 y:需要
+	WinnerPhone string `json:"winnerTel"`   //是否需要中标单位联系方式 y:需要
+	Pagesize    int    `json:"pagesize"`    //每页展示数量
+	KeyWords    string `json:"keyWords"`    // 匹配标题正文  到es里面查
+	PublishTime string `json:"publishTime"` // 发布时间  到es里面查
+	TopType     string `json:"topType"`     // 信息类型-一级分类 到es里面查
+	Subtype     string `json:"subtype"`     // 信息类型-二级分类 到es里面查
+	Province    string `json:"province"`    // 项目地区_省份 到es里面查
+	City        string `json:"city"`        // 项目地区_城市 到es里面查
+	District    string `json:"district"`    // 项目地区_区县 到es里面查
+	Price       string `json:"price"`       // 金额区间 到es里面查
+	Industry    string `json:"industry"`    // 行业分类 到es里面查
 }
 
 // 搜藏列表-tidb 查询条件 个人标签、收藏时间、采购单位、采购单位联系方式、中标单位联系方式
 func CollListSql(c *CollList, isPay bool, userid string) string {
-    sql := fmt.Sprintf(`select bid from %s where userid ='%s'`, db.DbConf.Bdcollection, userid)
-    limit := config.BidCollConfig.FreeUserCollLimit
-    //个人标签
-    if c.Label != "" {
-        i := 0
-        sql += ` and `
-        if labelArr := strings.Split(c.Label, ","); len(labelArr) > 0 {
-            sql += `(`
-            for _, v := range labelArr {
-                i++
-                labid := encrypt.SE.DecodeString(v)
-                if i == len(labelArr) {
-                    sql += fmt.Sprintf(`FIND_IN_SET(%s,labelid)`, labid)
-                } else {
-                    sql += fmt.Sprintf(`FIND_IN_SET(%s,labelid) or `, labid)
-                }
-            }
-            sql += `)`
-        }
-    }
-    now := time.Now()
-    start, end := "", ""
-    //收藏时间
-    if c.SelectTime == "lately-7" { //最近7天
-        start = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
-    } else if c.SelectTime == "lately-30" { //最近30天
-        start = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
-    } else if c.SelectTime == "thisyear" { //去年
-        start = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
-        end = fmt.Sprint(time.Date(now.Year()-1, 12, 31, 23, 59, 59, 0, time.Local).Format(Date_Full_Layout))
-    } else if len(strings.Split(c.SelectTime, "-")) == 2 {
-        if c.SelectTime != "0-0" {
-            starttime := strings.Split(c.SelectTime, "-")[0]
-            startstamp, _ := strconv.Atoi(starttime)
-            start = time.Unix(int64(startstamp), 0).Format(Date_Full_Layout)
-            endtime := strings.Split(c.SelectTime, "-")[1]
-            et, _ := strconv.ParseInt(endtime, 0, 64)
-            etTime := time.Unix(et, 0)
-            end = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
-        }
-    }
-    if start != "" && end != "" {
-        sql += ` and createdate >= '` + start + `' and createdate < '` + end + `'`
-    } else if start != "" && end == "" {
-        sql += ` and createdate >= '` + start + `'`
-    } else if start == "" && end != "" {
-        sql += ` and createdate < '` + end + `'`
-    }
-    if isPay {
+	sql := fmt.Sprintf(`select bid from %s where userid ='%s'`, db.DbConf.Bdcollection, userid)
+	limit := config.BidCollConfig.FreeUserCollLimit
+	//个人标签
+	if c.Label != "" {
+		i := 0
+		sql += ` and `
+		if labelArr := strings.Split(c.Label, ","); len(labelArr) > 0 {
+			sql += `(`
+			for _, v := range labelArr {
+				i++
+				labid := encrypt.SE.DecodeString(v)
+				if i == len(labelArr) {
+					sql += fmt.Sprintf(`FIND_IN_SET(%s,labelid)`, labid)
+				} else {
+					sql += fmt.Sprintf(`FIND_IN_SET(%s,labelid) or `, labid)
+				}
+			}
+			sql += `)`
+		}
+	}
+	now := time.Now()
+	start, end := "", ""
+	//收藏时间
+	if c.SelectTime == "lately-7" { //最近7天
+		start = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
+	} else if c.SelectTime == "lately-30" { //最近30天
+		start = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
+	} else if c.SelectTime == "thisyear" { //去年
+		start = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
+		end = fmt.Sprint(time.Date(now.Year()-1, 12, 31, 23, 59, 59, 0, time.Local).Format(Date_Full_Layout))
+	} else if len(strings.Split(c.SelectTime, "-")) == 2 {
+		if c.SelectTime != "0-0" {
+			starttime := strings.Split(c.SelectTime, "-")[0]
+			startstamp, _ := strconv.Atoi(starttime)
+			start = time.Unix(int64(startstamp), 0).Format(Date_Full_Layout)
+			endtime := strings.Split(c.SelectTime, "-")[1]
+			et, _ := strconv.ParseInt(endtime, 0, 64)
+			etTime := time.Unix(et, 0)
+			end = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Format(Date_Full_Layout))
+		}
+	}
+	if start != "" && end != "" {
+		sql += ` and createdate >= '` + start + `' and createdate < '` + end + `'`
+	} else if start != "" && end == "" {
+		sql += ` and createdate >= '` + start + `'`
+	} else if start == "" && end != "" {
+		sql += ` and createdate < '` + end + `'`
+	}
+	if isPay {
 
-        //采购单位 用,分隔开
-        if c.Buyerclass != "" {
-            i := 0
-            sql += ` and buyerclass in (`
-            if buyClassArr := strings.Split(c.Buyerclass, ","); len(buyClassArr) > 0 {
-                for _, v := range buyClassArr {
-                    i++
-                    buyerclassid := fmt.Sprint(jy.PushMapping.Buyerclass[v])
-                    if i == len(buyClassArr) {
-                        sql += buyerclassid + `)`
-                    } else {
-                        sql += buyerclassid + ","
-                    }
-                }
-            }
-        }
-        //是否存在采购单位电话
-        if c.BuyerPhone == "y" {
-            sql += ` and buyerinfo = 1`
-        } //else if c.BuyerPhone == -1 {
-        //sql += ` and buyerinfo = 0`
-        //}
-        //是否存在中标单位电话
-        if c.WinnerPhone == "y" { // p480二期参数调整
-            sql += ` and winnerinfo = 1`
-        } // else if c.WinnerPhone == -1 {
-        //	sql += ` and winnerinfo = 0`
-        //}
-        limit = config.BidCollConfig.PayUserCollLimit
-    }
-    sql += fmt.Sprintf(` order by createdate desc limit %v`, limit)
-    return sql
+		//采购单位 用,分隔开
+		if c.Buyerclass != "" {
+			i := 0
+			sql += ` and buyerclass in (`
+			if buyClassArr := strings.Split(c.Buyerclass, ","); len(buyClassArr) > 0 {
+				for _, v := range buyClassArr {
+					i++
+					buyerclassid := fmt.Sprint(jy.PushMapping.Buyerclass[v])
+					if i == len(buyClassArr) {
+						sql += buyerclassid + `)`
+					} else {
+						sql += buyerclassid + ","
+					}
+				}
+			}
+		}
+		//是否存在采购单位电话
+		if c.BuyerPhone == "y" {
+			sql += ` and buyerinfo = 1`
+		} //else if c.BuyerPhone == -1 {
+		//sql += ` and buyerinfo = 0`
+		//}
+		//是否存在中标单位电话
+		if c.WinnerPhone == "y" { // p480二期参数调整
+			sql += ` and winnerinfo = 1`
+		} // else if c.WinnerPhone == -1 {
+		//	sql += ` and winnerinfo = 0`
+		//}
+		limit = config.BidCollConfig.PayUserCollLimit
+	}
+	sql += fmt.Sprintf(` order by createdate desc limit %v`, limit)
+	return sql
 }
 
 // CollListESQuery 收藏列表es查询条件  匹配标题正 发布时间 信息类型 项目地区 金额区间
 func CollListESQuery(c *CollList, idmapList []map[string]interface{}) (qstr string, idList []string, keyMustStr string) {
-    m := map[string]struct{}{}
-    musts := []string{}
-    for _, v := range idmapList {
-        if _, ok := m[qutil.ObjToString(v["bid"])]; ok {
-            continue
-        }
-        m[qutil.ObjToString(v["bid"])] = struct{}{}
-        idList = append(idList, qutil.ObjToString(v["bid"]))
-    }
-    musts = append(musts, fmt.Sprintf(idTerms, strings.Join(idList, `","`)))
-    query := ``
-    //省份
-    area := c.Province
-    if area != "" {
-        query += `{"terms":{"area":[`
-        for k, v := range strings.Split(area, ",") {
-            if k > 0 {
-                query += `,`
-            }
-            query += `"` + v + `"`
-        }
-        query += `]}}`
-    }
-    //市--
-    city := c.City
-    if city != "" {
-        if len(query) > 0 {
-            query += ","
-        }
-        query += `{"terms":{"city":[`
-        for k, v := range strings.Split(city, ",") {
-            if k > 0 {
-                query += `,`
-            }
-            query += `"` + v + `"`
-        }
-        query += `]}}`
-    }
-    district := c.District
-    if district != "" {
-        if len(query) > 0 {
-            query += ","
-        }
-        for k, v := range strings.Split(district, ",") {
-            if k > 0 {
-                query += `,`
-            }
-            cityName := strings.Split(v, "_")[0]
-            districtName := strings.Split(v, "_")[1]
-            queryBoolMustAndDistrict := `{"bool":{"must":[{"terms":{"city":["%s"]}},{"terms":{"district":["%s"]}}]}}`
-            query += fmt.Sprintf(queryBoolMustAndDistrict, cityName, districtName)
-        }
+	m := map[string]struct{}{}
+	musts := []string{}
+	for _, v := range idmapList {
+		if _, ok := m[qutil.ObjToString(v["bid"])]; ok {
+			continue
+		}
+		m[qutil.ObjToString(v["bid"])] = struct{}{}
+		idList = append(idList, qutil.ObjToString(v["bid"]))
+	}
+	musts = append(musts, fmt.Sprintf(idTerms, strings.Join(idList, `","`)))
+	query := ``
+	//省份
+	area := c.Province
+	if area != "" {
+		query += `{"terms":{"area":[`
+		for k, v := range strings.Split(area, ",") {
+			if k > 0 {
+				query += `,`
+			}
+			query += `"` + v + `"`
+		}
+		query += `]}}`
+	}
+	//市--
+	city := c.City
+	if city != "" {
+		if len(query) > 0 {
+			query += ","
+		}
+		query += `{"terms":{"city":[`
+		for k, v := range strings.Split(city, ",") {
+			if k > 0 {
+				query += `,`
+			}
+			query += `"` + v + `"`
+		}
+		query += `]}}`
+	}
+	district := c.District
+	if district != "" {
+		if len(query) > 0 {
+			query += ","
+		}
+		for k, v := range strings.Split(district, ",") {
+			if k > 0 {
+				query += `,`
+			}
+			cityName := strings.Split(v, "_")[0]
+			districtName := strings.Split(v, "_")[1]
+			queryBoolMustAndDistrict := `{"bool":{"must":[{"terms":{"city":["%s"]}},{"terms":{"district":["%s"]}}]}}`
+			query += fmt.Sprintf(queryBoolMustAndDistrict, cityName, districtName)
+		}
 
-    }
-    if query != "" {
-        query = fmt.Sprintf(queryBoolShould, query)
-    }
-    //发布时间
-    publishTime := c.PublishTime
-    if publishTime != "" {
-        startTime, endTime := "", ""
-        now := time.Now()
-        switch publishTime {
-        case "lately-7":
-            startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
-        case "lately-30":
-            startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
-        case "thisyear":
-            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())
-        case "threeyear":
-            startTime = fmt.Sprint(time.Date(now.Year()-3, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
-            endTime = fmt.Sprint(now.Unix())
-        case "fiveyear":
-            startTime = fmt.Sprint(time.Date(now.Year()-5, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
-            endTime = fmt.Sprint(now.Unix())
-        default:
-            if len(strings.Split(publishTime, "-")) > 1 {
-                startTime = strings.Split(publishTime, "-")[0]
-                endTime = strings.Split(publishTime, "-")[1]
-                //电脑端 时间选择 开始时间当天和结束时间当天相同
-                if startTime == endTime {
-                    et, _ := strconv.ParseInt(endTime, 0, 64)
-                    etTime := time.Unix(et, 0)
-                    endTime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
-                }
-            }
-        }
-        if startTime != "" || endTime != "" {
-            if len(query) > 0 {
-                query += ","
-            }
-            query += `{"range":{"publishtime":{`
-            if startTime != "" {
-                query += `"gte":` + startTime
-            }
-            if startTime != "" && endTime != "" {
-                query += `,`
-            }
-            if endTime != "" {
-                query += `"lt":` + endTime
-            }
-            query += `}}}`
-        }
-    }
-    //信息类型-二级
-    subtype := c.Subtype
-    topType := qutil.If(c.TopType != "", strings.Split(c.TopType, ","), []string{}).([]string)
-    allType := ``
-    //二级分类
-    if subtype != "" {
-        var typeInt = 0
-        allType += `{"terms":{"subtype":[`
-        for k, v := range strings.Split(subtype, ",") {
-            if tType := qutil.If(topTypeMap[v] != "" && c.TopType == "", topTypeMap[v], "").(string); tType != "" {
-                topType = append(topType, tType)
-                typeInt += 1
-                continue
-            }
-            if k > typeInt {
-                allType += `,`
-            }
-            allType += `"` + v + `"`
-        }
-        allType += `]}}`
-        if typeInt == len(strings.Split(subtype, ",")) {
-            allType = ``
-        }
-    }
-    //信息类型  一级分类
-    log.Println("topType:", topType)
-    if len(topType) > 0 {
-        if allType != "" {
-            allType += ","
-        }
-        allType += `{"terms":{"toptype":[`
-        for k, v := range topType {
-            if k > 0 {
-                allType += `,`
-            }
-            allType += `"` + v + `"`
-        }
-        allType += `]}}`
-    }
+	}
+	if query != "" {
+		query = fmt.Sprintf(queryBoolShould, query)
+	}
+	//发布时间
+	publishTime := c.PublishTime
+	if publishTime != "" {
+		startTime, endTime := "", ""
+		now := time.Now()
+		switch publishTime {
+		case "lately-7":
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
+		case "lately-30":
+			startTime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
+		case "thisyear":
+			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())
+		case "threeyear":
+			startTime = fmt.Sprint(time.Date(now.Year()-3, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+			endTime = fmt.Sprint(now.Unix())
+		case "fiveyear":
+			startTime = fmt.Sprint(time.Date(now.Year()-5, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+			endTime = fmt.Sprint(now.Unix())
+		default:
+			if len(strings.Split(publishTime, "-")) > 1 {
+				startTime = strings.Split(publishTime, "-")[0]
+				endTime = strings.Split(publishTime, "-")[1]
+				//电脑端 时间选择 开始时间当天和结束时间当天相同
+				if startTime == endTime {
+					et, _ := strconv.ParseInt(endTime, 0, 64)
+					etTime := time.Unix(et, 0)
+					endTime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
+				}
+			}
+		}
+		if startTime != "" || endTime != "" {
+			if len(query) > 0 {
+				query += ","
+			}
+			query += `{"range":{"publishtime":{`
+			if startTime != "" {
+				query += `"gte":` + startTime
+			}
+			if startTime != "" && endTime != "" {
+				query += `,`
+			}
+			if endTime != "" {
+				query += `"lt":` + endTime
+			}
+			query += `}}}`
+		}
+	}
+	//信息类型-二级
+	subtype := c.Subtype
+	topType := qutil.If(c.TopType != "", strings.Split(c.TopType, ","), []string{}).([]string)
+	allType := ``
+	//二级分类
+	if subtype != "" {
+		var typeInt = 0
+		allType += `{"terms":{"subtype":[`
+		for k, v := range strings.Split(subtype, ",") {
+			if tType := qutil.If(topTypeMap[v] != "" && c.TopType == "", topTypeMap[v], "").(string); tType != "" {
+				topType = append(topType, tType)
+				typeInt += 1
+				continue
+			}
+			if k > typeInt {
+				allType += `,`
+			}
+			allType += `"` + v + `"`
+		}
+		allType += `]}}`
+		if typeInt == len(strings.Split(subtype, ",")) {
+			allType = ``
+		}
+	}
+	//信息类型  一级分类
+	log.Println("topType:", topType)
+	if len(topType) > 0 {
+		if allType != "" {
+			allType += ","
+		}
+		allType += `{"terms":{"toptype":[`
+		for k, v := range topType {
+			if k > 0 {
+				allType += `,`
+			}
+			allType += `"` + v + `"`
+		}
+		allType += `]}}`
+	}
 
-    if allType != "" {
-        if query != "" {
-            query += ","
-        }
-        query += fmt.Sprintf(queryBoolShould, allType)
-    }
-    if query != "" {
-        musts = append(musts, query)
-    }
-    if c.KeyWords != "" {
-        var (
-            keyWordsMusts, wordsMusts []string
-        )
-        for _, v := range strings.Split(c.KeyWords, " ") {
-            if elastic.ReplaceYH(v) == "" {
-                continue
-            }
-            keyWordsMusts = append(keyWordsMusts, fmt.Sprintf(fmt.Sprintf(multiMatch, "%s", `"title","detail"`), elastic.ReplaceYH(v)))
-        }
-        //包含所有
-        wordsMusts = append(wordsMusts, keyWordsMusts...)
-        if len(wordsMusts) > 0 {
-            keyMustStr = fmt.Sprintf(elastic.NgramMust, strings.Join(wordsMusts, ","))
-            musts = append(musts, keyMustStr)
-        }
-    }
-    //行业
-    if c.Industry != "" {
-        musts = append(musts, fmt.Sprintf(queryBoolMust, `"`+strings.ReplaceAll(c.Industry, ",", `","`)+`"`))
-    }
-    //价格
-    if c.Price != "" && len(strings.Split(c.Price, "-")) > 1 {
-        minPrice, maxPrice := strings.Split(c.Price, "-")[0], strings.Split(c.Price, "-")[1]
-        if minPrice != "" || maxPrice != "" {
-            sq := ``
-            if minPrice != "" {
-                min, _ := strconv.ParseFloat(minPrice, 64)
-                minPrice = fmt.Sprintf("%.0f", min*10000)
-                if minPrice == "0" {
-                    minPrice = ""
-                }
-            }
-            if maxPrice != "" {
-                max, _ := strconv.ParseFloat(maxPrice, 64)
-                maxPrice = fmt.Sprintf("%.0f", max*10000)
-                if maxPrice == "0" {
-                    maxPrice = ""
-                }
-            }
-            if minPrice != "" {
-                sq += fmt.Sprintf(gte, minPrice)
-            }
-            if minPrice != "" && maxPrice != "" {
-                sq += `,`
-            }
-            if maxPrice != "" {
-                sq += fmt.Sprintf(lte, maxPrice)
-            }
-            if minPrice != "" || maxPrice != "" {
-                query_price := fmt.Sprintf(queryBoolShould, fmt.Sprintf(queryBoolMustBoolShould, sq, sq))
-                musts = append(musts, query_price)
-            }
-        }
-    }
-    qstr = fmt.Sprintf(queryBase, strings.Join(musts, ","), len(idList))
-    log.Println("qstr:", qstr)
-    return
+	if allType != "" {
+		if query != "" {
+			query += ","
+		}
+		query += fmt.Sprintf(queryBoolShould, allType)
+	}
+	if query != "" {
+		musts = append(musts, query)
+	}
+	if c.KeyWords != "" {
+		var (
+			keyWordsMusts, wordsMusts []string
+		)
+		for _, v := range strings.Split(c.KeyWords, " ") {
+			if elastic.ReplaceYH(v) == "" {
+				continue
+			}
+			keyWordsMusts = append(keyWordsMusts, fmt.Sprintf(fmt.Sprintf(multiMatch, "%s", `"title","detail"`), elastic.ReplaceYH(v)))
+		}
+		//包含所有
+		wordsMusts = append(wordsMusts, keyWordsMusts...)
+		if len(wordsMusts) > 0 {
+			keyMustStr = fmt.Sprintf(elastic.NgramMust, strings.Join(wordsMusts, ","))
+			musts = append(musts, keyMustStr)
+		}
+	}
+	//行业
+	if c.Industry != "" {
+		musts = append(musts, fmt.Sprintf(queryBoolMust, `"`+strings.ReplaceAll(c.Industry, ",", `","`)+`"`))
+	}
+	//价格
+	if c.Price != "" && len(strings.Split(c.Price, "-")) > 1 {
+		minPrice, maxPrice := strings.Split(c.Price, "-")[0], strings.Split(c.Price, "-")[1]
+		if minPrice != "" || maxPrice != "" {
+			sq := ``
+			if minPrice != "" {
+				min, _ := strconv.ParseFloat(minPrice, 64)
+				minPrice = fmt.Sprintf("%.0f", min*10000)
+				if minPrice == "0" {
+					minPrice = ""
+				}
+			}
+			if maxPrice != "" {
+				max, _ := strconv.ParseFloat(maxPrice, 64)
+				maxPrice = fmt.Sprintf("%.0f", max*10000)
+				if maxPrice == "0" {
+					maxPrice = ""
+				}
+			}
+			if minPrice != "" {
+				sq += fmt.Sprintf(gte, minPrice)
+			}
+			if minPrice != "" && maxPrice != "" {
+				sq += `,`
+			}
+			if maxPrice != "" {
+				sq += fmt.Sprintf(lte, maxPrice)
+			}
+			if minPrice != "" || maxPrice != "" {
+				query_price := fmt.Sprintf(queryBoolShould, fmt.Sprintf(queryBoolMustBoolShould, sq, sq))
+				musts = append(musts, query_price)
+			}
+		}
+	}
+	qstr = fmt.Sprintf(queryBase, strings.Join(musts, ","), len(idList))
+	log.Println("qstr:", qstr)
+	return
 }
 
 // es里面的筛选条件再过滤一次id
 func GetEsCollListId(esQuery string, idList []string) (ids []map[string]interface{}) {
-    //idList 是为了最后处理有序
-    // 查询
-    rs := elastic.Get("bidding", "bidding", esQuery)
-    if rs == nil {
-        log.Println("未获取到数据")
-        return
-    }
-    idMap := map[string]struct{}{}
-    if rs != nil {
-        for _, v := range *rs {
-            _id := qutil.ObjToString(v["_id"])
-            if _, ok := idMap[_id]; !ok {
-                idMap[_id] = struct{}{}
-            }
-        }
-    }
+	//idList 是为了最后处理有序
+	// 查询
+	rs := elastic.Get("bidding", "bidding", esQuery)
+	if rs == nil {
+		log.Println("未获取到数据")
+		return
+	}
+	idMap := map[string]struct{}{}
+	if rs != nil {
+		for _, v := range *rs {
+			_id := qutil.ObjToString(v["_id"])
+			if _, ok := idMap[_id]; !ok {
+				idMap[_id] = struct{}{}
+			}
+		}
+	}
 
-    // 获取有序数组
-    for i := 0; i < len(idList); i++ {
-        if _, ok := idMap[idList[i]]; ok {
-            ids = append(ids, map[string]interface{}{
-                "bid": idList[i],
-            })
-        }
+	// 获取有序数组
+	for i := 0; i < len(idList); i++ {
+		if _, ok := idMap[idList[i]]; ok {
+			ids = append(ids, map[string]interface{}{
+				"bid": idList[i],
+			})
+		}
 
-    }
-    return
+	}
+	return
 }
 func ConfirmIntArr(arr []interface{}) []int {
-    tmp := make([]int, 0)
-    for _, v := range arr {
-        tmp = append(tmp, qutil.IntAll(v))
-    }
-    return tmp
+	tmp := make([]int, 0)
+	for _, v := range arr {
+		tmp = append(tmp, qutil.IntAll(v))
+	}
+	return tmp
 }
 
 // 判断同一个数组是否重复
 func IsRepeat(slice1 []string) bool {
-    m := make(map[string]int)
-    for _, v := range slice1 {
-        m[v]++
-        if m[v] > 1 {
-            return true
-        }
-    }
-    return false
+	m := make(map[string]int)
+	for _, v := range slice1 {
+		m[v]++
+		if m[v] > 1 {
+			return true
+		}
+	}
+	return false
 }
 
 // 判断数组是否包含
 func IsContain(slice []string, s string) bool {
-    for _, qq := range slice {
-        if qq == s {
-            return true
-        }
-    }
-    return false
+	for _, qq := range slice {
+		if qq == s {
+			return true
+		}
+	}
+	return false
 }
 
 // jsonStr转map
 func JsonToMap(jsonStr string) (map[string]interface{}, error) {
-    m := map[string]interface{}{}
-    err := json.Unmarshal([]byte(jsonStr), &m)
-    if err != nil {
-        fmt.Printf("Unmarshal with error: %+v\n", err)
-        return nil, err
-    }
-    return m, nil
+	m := map[string]interface{}{}
+	err := json.Unmarshal([]byte(jsonStr), &m)
+	if err != nil {
+		fmt.Printf("Unmarshal with error: %+v\n", err)
+		return nil, err
+	}
+	return m, nil
 }
 
 // 判断stringArr相等方法
 func StringArrEqual(a, b []string) bool {
-    if (len(a) == 0) != (len(b) == 0) {
-        return false
-    }
-    if len(a) != len(b) {
-        return false
-    }
-    for i := range a {
-        if a[i] != b[i] {
-            return false
-        }
-    }
-    return true
+	if (len(a) == 0) != (len(b) == 0) {
+		return false
+	}
+	if len(a) != len(b) {
+		return false
+	}
+	for i := range a {
+		if a[i] != b[i] {
+			return false
+		}
+	}
+	return true
 }
 
 // 获取频次信息:fre="周-1"(每周周一);"天-3":每三天一个周期;"日-3":每天三点;
 func GetFrequencyInfo(fre string) (string, bool, int) {
-    if fre != "" && len(strings.Split(fre, "-")) > 1 {
-        f := strings.Split(fre, "-")[0]
-        d, _ := strconv.Atoi(strings.Split(fre, "-")[1])
-        switch f {
-        case "月":
-            day := time.Now().Day()
-            return fmt.Sprintf("nps_%s", time.Now().Month().String()), day == d, 31 * 24 * 60 * 60
-        case "周":
-            mi := ConvertWeekday(time.Now().Weekday().String())
-            return fmt.Sprintf("nps_%s", WeekByDate(time.Now())), mi == d, 7 * 24 * 60 * 60
-        case "日":
-            day := time.Now().Day()
-            hour := time.Now().Hour()
-            return fmt.Sprintf("nps_%s", strconv.Itoa(day)), hour == d, 24 * 60 * 60
-        case "天":
-            return func(d int) (string, bool, int) {
-                //周末不显示
-                mi := ConvertWeekday(time.Now().Weekday().String())
-                now := time.Now()
-                isWeekday := mi < d
-                expireTime := 0
-                if isWeekday {
-                    expireTime = int(time.Date(now.Year(), now.Month(), now.Day()+d-mi, 0, 0, 0, 0, now.Location()).Unix() - now.Unix())
-                }
-                return fmt.Sprintf("nps_%d", d), isWeekday, expireTime
-            }(d)
-        }
-    }
-    return "", false, 0
+	if fre != "" && len(strings.Split(fre, "-")) > 1 {
+		f := strings.Split(fre, "-")[0]
+		d, _ := strconv.Atoi(strings.Split(fre, "-")[1])
+		switch f {
+		case "月":
+			day := time.Now().Day()
+			return fmt.Sprintf("nps_%s", time.Now().Month().String()), day == d, 31 * 24 * 60 * 60
+		case "周":
+			mi := ConvertWeekday(time.Now().Weekday().String())
+			return fmt.Sprintf("nps_%s", WeekByDate(time.Now())), mi == d, 7 * 24 * 60 * 60
+		case "日":
+			day := time.Now().Day()
+			hour := time.Now().Hour()
+			return fmt.Sprintf("nps_%s", strconv.Itoa(day)), hour == d, 24 * 60 * 60
+		case "天":
+			return func(d int) (string, bool, int) {
+				//周末不显示
+				mi := ConvertWeekday(time.Now().Weekday().String())
+				now := time.Now()
+				isWeekday := mi < d
+				expireTime := 0
+				if isWeekday {
+					expireTime = int(time.Date(now.Year(), now.Month(), now.Day()+d-mi, 0, 0, 0, 0, now.Location()).Unix() - now.Unix())
+				}
+				return fmt.Sprintf("nps_%d", d), isWeekday, expireTime
+			}(d)
+		}
+	}
+	return "", false, 0
 }
 
 // 获取当年第几周
 func WeekByDate(t time.Time) string {
-    yearDay := t.YearDay()
-    yearFirstDay := t.AddDate(0, 0, -yearDay+1)
-    firstDayInWeek := int(yearFirstDay.Weekday())
+	yearDay := t.YearDay()
+	yearFirstDay := t.AddDate(0, 0, -yearDay+1)
+	firstDayInWeek := int(yearFirstDay.Weekday())
 
-    //今年第一周有几天
-    firstWeekDays := 1
-    if firstDayInWeek != 0 {
-        firstWeekDays = 7 - firstDayInWeek + 1
-    }
-    var week int
-    if yearDay <= firstWeekDays {
-        week = 1
-    } else {
-        week = (yearDay-firstWeekDays)/7 + 2
-    }
-    return fmt.Sprintf("%d-%d", t.Year(), week)
+	//今年第一周有几天
+	firstWeekDays := 1
+	if firstDayInWeek != 0 {
+		firstWeekDays = 7 - firstDayInWeek + 1
+	}
+	var week int
+	if yearDay <= firstWeekDays {
+		week = 1
+	} else {
+		week = (yearDay-firstWeekDays)/7 + 2
+	}
+	return fmt.Sprintf("%d-%d", t.Year(), week)
 }
 
 func ConvertWeekday(weekday string) int {
-    _weekday := 0
-    if weekday == "Sunday" {
-        _weekday = 7
-    } else if weekday == "Monday" {
-        _weekday = 1
-    } else if weekday == "Tuesday" {
-        _weekday = 2
-    } else if weekday == "Wednesday" {
-        _weekday = 3
-    } else if weekday == "Thursday" {
-        _weekday = 4
-    } else if weekday == "Friday" {
-        _weekday = 5
-    } else if weekday == "Saturday" {
-        _weekday = 6
-    }
-    return _weekday
+	_weekday := 0
+	if weekday == "Sunday" {
+		_weekday = 7
+	} else if weekday == "Monday" {
+		_weekday = 1
+	} else if weekday == "Tuesday" {
+		_weekday = 2
+	} else if weekday == "Wednesday" {
+		_weekday = 3
+	} else if weekday == "Thursday" {
+		_weekday = 4
+	} else if weekday == "Friday" {
+		_weekday = 5
+	} else if weekday == "Saturday" {
+		_weekday = 6
+	}
+	return _weekday
 }
 
 // map转结构体
 func JsonUnmarshal(m interface{}, s interface{}) interface{} {
-    var b []byte
-    if v, ok := m.(string); ok {
-        b = []byte(v)
-    } else if v, ok := m.([]byte); ok {
-        b = v
-    } else {
-        b, _ = json.Marshal(m)
-    }
-    json.Unmarshal(b, &s)
-    return s
+	var b []byte
+	if v, ok := m.(string); ok {
+		b = []byte(v)
+	} else if v, ok := m.([]byte); ok {
+		b = v
+	} else {
+		b, _ = json.Marshal(m)
+	}
+	json.Unmarshal(b, &s)
+	return s
 }
 
 // 获取当天剩余时间
 var (
-    timeOut int64 = 24 * 60 * 60
+	timeOut int64 = 24 * 60 * 60
 )
 
 func GetLastTime() int64 {
-    t := time.Now()
-    midnight := time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location())
-    if midnight.After(t) {
-        return midnight.Unix() - t.Unix()
-    }
-    return timeOut
+	t := time.Now()
+	midnight := time.Date(t.Year(), t.Month(), t.Day()+1, 0, 0, 0, 0, t.Location())
+	if midnight.After(t) {
+		return midnight.Unix() - t.Unix()
+	}
+	return timeOut
 }
 
 func GetMD5(data string) string {
-    hash := md5.Sum([]byte(data))
-    encryptedData := hex.EncodeToString(hash[:])
-    return encryptedData
+	hash := md5.Sum([]byte(data))
+	encryptedData := hex.EncodeToString(hash[:])
+	return encryptedData
 }
 
 // 创建订单号
 func GetOrderCode() string {
-    return <-jy.VarOrderCode.Pool
+	return <-jy.VarOrderCode.Pool
 }
 
 // ClearCookie 清楚前端cookie 缓存
 func ClearCookie(w http.ResponseWriter, name string) {
-    if name == "" {
-        return
-    }
-    for _, nk := range strings.Split(name, ",") {
-        if nk != "" {
-            http.SetCookie(w, &http.Cookie{
-                Name:     nk,
-                Value:    "",
-                Path:     "/",
-                HttpOnly: false,
-                MaxAge:   -1,
-                Expires:  time.Now().Add(-1),
-                Domain:   httpsession.Domain,
-            })
-        }
-    }
+	if name == "" {
+		return
+	}
+	for _, nk := range strings.Split(name, ",") {
+		if nk != "" {
+			http.SetCookie(w, &http.Cookie{
+				Name:     nk,
+				Value:    "",
+				Path:     "/",
+				HttpOnly: false,
+				MaxAge:   -1,
+				Expires:  time.Now().Add(-1),
+				Domain:   httpsession.Domain,
+			})
+		}
+	}
 }
 
 func SendBot(webhookURL, msg string) (b bool) {
-    // 构造请求体
-    payload := map[string]interface{}{
-        "msgtype": "text",
-        "text": map[string]string{
-            "content": msg,
-        },
-    }
-    // 转换为 JSON 字符串
-    payloadBytes, err := json.Marshal(payload)
-    if err != nil {
-        log.Println("Error :", err.Error())
-        return
-    }
-    // 发送 POST 请求
-    resp, err := http.Post(webhookURL, "application/json", bytes.NewReader(payloadBytes))
-    if err != nil {
-        log.Println("Error :", err.Error())
-        return
-    }
-    defer resp.Body.Close()
-    b = true
-    return
+	// 构造请求体
+	payload := map[string]interface{}{
+		"msgtype": "text",
+		"text": map[string]string{
+			"content": msg,
+		},
+	}
+	// 转换为 JSON 字符串
+	payloadBytes, err := json.Marshal(payload)
+	if err != nil {
+		log.Println("Error :", err.Error())
+		return
+	}
+	// 发送 POST 请求
+	resp, err := http.Post(webhookURL, "application/json", bytes.NewReader(payloadBytes))
+	if err != nil {
+		log.Println("Error :", err.Error())
+		return
+	}
+	defer resp.Body.Close()
+	b = true
+	return
 }

+ 2 - 0
src/jfw/modules/subscribepay/src/a/init.go

@@ -89,4 +89,6 @@ func init() {
 	//人脉通
 	xweb.AddRouter("/subscribepay", &service.Network{})
 	xweb.AddRouter("/subscribepay", &service.DocMember{})
+	//超级订阅赠送
+	xweb.AddRouter("/subscribepay", &service.VipGift{})
 }

+ 3 - 1
src/jfw/modules/subscribepay/src/config.json

@@ -231,5 +231,7 @@
   },
   "wxProceduresMoney": 0.54,
   "aliProceduresMoney": 0.6,
-  "corporateProceduresMoney": 0
+  "corporateProceduresMoney": 0,
+  "vipGiftStartTime": 1709827200,
+  "vipGiftEndTime":1709827200
 }

+ 2 - 0
src/jfw/modules/subscribepay/src/config/config.go

@@ -159,6 +159,8 @@ type config struct {
 	WxProceduresMoney        float64           `json:"wxProceduresMoney"`
 	AliProceduresMoney       float64           `json:"aliProceduresMoney"`
 	CorporateProceduresMoney float64           `json:"corporateProceduresMoney"`
+	VipGiftEndTime           int64             `json:"vipGiftEndTime"`
+	VipGiftStartTime         int64             `json:"vipGiftStartTime"`
 }
 
 type SiteMsgStruct struct {

+ 9 - 1
src/jfw/modules/subscribepay/src/filter/mergefilter.go

@@ -1,6 +1,7 @@
 package filter
 
 import (
+	qu "app.yhyue.com/moapp/jybase/common"
 	"fmt"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/util"
@@ -13,7 +14,7 @@ import (
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 )
 
-//用户合并删除用户检测
+// 用户合并删除用户检测
 type mergeFilter struct {
 	W          http.ResponseWriter
 	R          *http.Request
@@ -27,6 +28,13 @@ func (l *mergeFilter) Do() bool {
 	if uid == "" {
 		return true
 	}
+	phone, _ := l.GetSession["phone"].(string)
+	//体验用户
+	if phone == "" && qu.Int64All(l.GetSession["experience_binding"]) == 1 {
+		jy.SetCookie(l.W, l.R, jy.ExperienceSign, "experiencing", fmt.Sprintf(".%s", l.R.Host), 7*60*60)
+	} else {
+		jy.SetCookie(l.W, l.R, jy.ExperienceSign, "experiencing", fmt.Sprintf(".%s", l.R.Host), -1)
+	}
 	if flushSession, _ := l.GetSession["flushSession"].(bool); flushSession {
 		jy.CreateUserMerge(util.MQFW, util.Mysql, l.Session, config.Middleground).FlushSession(uid)
 		l.Session.Del("flushSession")

+ 2 - 0
src/jfw/modules/subscribepay/src/filter/sessionfilter.go

@@ -26,6 +26,8 @@ func (l *sessionfilter) Do() bool {
 		strings.HasPrefix(rqu, "/jypay/invoice/submit") || //发票信息提交
 		strings.HasPrefix(rqu, "/jypay/invoice/query") || //发票信息查询
 		strings.HasPrefix(rqu, "/jypay/invoice/newReplace") || //扫码换票
+		strings.HasPrefix(rqu, "/subscribepay/vip/gift/informInfo") || //vip赠送告知页面
+		strings.HasPrefix(rqu, "/subscribepay/vip/gift/configuration") || //vip赠送配置页面
 		rqu == "/jypay/wx/getwxSdkSign" || rqu == "/jypay/user/company/association" ||
 		rqu == "/jypay/equityCode/submit" || rqu == "/jypay/equityCode/captcha" || rqu == "/jypay/getDomain" { //微信js调用参数
 		return true

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

@@ -6,7 +6,7 @@ require (
 	app.yhyue.com/moapp/jyResourcesCenter v0.0.0-20250211075100-eb5d7cd299f8
 	app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.33.3
+	app.yhyue.com/moapp/jypkg v1.33.5
 	bp.jydev.jianyu360.cn/BaseService/jyMicroservices v0.0.2
 	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230911091604-2faa31032743

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

@@ -22,8 +22,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20250225094323-2f6419d0d916/go.mod h1:/HT/UZ4d
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 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 v1.33.3 h1:vC3o/w1tFLkcoG0ulO1P1XHRFzxQT+BG0hzNrDG344s=
-app.yhyue.com/moapp/jypkg v1.33.3/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
+app.yhyue.com/moapp/jypkg v1.33.5 h1:XVzoi4POBZ8Tprr9Sk/HSC0CB3WcbPFwMpuu0o3B4jI=
+app.yhyue.com/moapp/jypkg v1.33.5/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 h1:WGi4OEIoqw6NpNFGioUEBZnjK9aBa+xJqf/5WY+QyhM=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161/go.mod h1:0Oj8SB4pVjdCLD28sy2zyM3hS0WHGpNuVcakLW43GmI=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=

+ 3 - 4
src/jfw/modules/subscribepay/src/main.go

@@ -4,18 +4,17 @@ import (
 	_ "jy/src/jfw/modules/subscribepay/src/a"
 	. "jy/src/jfw/modules/subscribepay/src/config"
 	_ "jy/src/jfw/modules/subscribepay/src/filter"
+	"jy/src/jfw/modules/subscribepay/src/timetask"
 	"log"
 	"net/http"
 	"net/rpc"
 
 	"app.yhyue.com/moapp/jybase/endless"
 
-	"jy/src/jfw/modules/subscribepay/src/rpcfollow"
-	_ "jy/src/jfw/modules/subscribepay/src/service"
-	"jy/src/jfw/modules/subscribepay/src/timetask"
-
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"app.yhyue.com/moapp/jylog"
+	"jy/src/jfw/modules/subscribepay/src/rpcfollow"
+	_ "jy/src/jfw/modules/subscribepay/src/service"
 )
 
 func main() {

+ 390 - 0
src/jfw/modules/subscribepay/src/service/transferVipSub.go

@@ -0,0 +1,390 @@
+package service
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+	"fmt"
+	"github.com/gogf/gf/v2/os/gtime"
+	"github.com/gogf/gf/v2/util/gconv"
+	"go.mongodb.org/mongo-driver/bson"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"log"
+	"time"
+)
+
+// 接收人信息
+type Received struct {
+	Uid        string
+	Phone      string
+	Duration   int
+	BPhone     string // 被赠 手机号
+	StartTime  string // 被赠 开始时间
+	EndTime    string // 被赠 结束时间
+	Itype      int    // 接收人 1: 续费,2: 新购
+	UpdateInfo map[string]interface{}
+}
+
+func (t *VipGift) GetSubDuration() {
+	userid := qutil.ObjToString(t.GetSession("mgoUserId"))
+	rData, errMsg := func() (interface{}, error) {
+		user, ok := util.MQFW.FindById("user", userid, bson.M{"i_vip_status": 1, "l_vip_endtime": 1, "l_vip_starttime": 1, "o_vipjy": 1})
+		if ok && len(*user) > 0 {
+			areacount := 0
+			if vip := gconv.Map((*user)["o_vipjy"]); vip != nil && vip["o_buyset"] != nil {
+				areacount = gconv.Int(gconv.Map(vip["o_buyset"])["areacount"])
+			}
+			if qutil.IntAll((*user)["i_vip_status"]) > 0 {
+				//startTime := qutil.Int64All((*user)["l_vip_starttime"])
+				endTime := qutil.Int64All((*user)["l_vip_endtime"])
+				dif, _ := difMouth(time.Now().Unix(), endTime)
+				return map[string]interface{}{
+					"gifted":    dif,
+					"areacount": areacount,
+				}, nil
+			}
+			return map[string]interface{}{
+				"gifted":    0,
+				"areacount": areacount,
+			}, nil
+		}
+		return nil, fmt.Errorf("未查询到身份信息")
+	}()
+	t.ServeJson(NewResult(rData, errMsg))
+}
+
+func (t *VipGift) GetInfoByPhone() {
+	userid := qutil.ObjToString(t.GetSession("mgoUserId"))
+	phone := t.GetString("phone")
+	rData, errMsg := func() (interface{}, error) {
+		giver := qutil.ObjToString(t.GetSession("phone"))
+		if giver == phone {
+			return map[string]interface{}{
+				"status": -3, // 送自己
+			}, nil
+		}
+		user, _ := util.MQFW.FindById("user", userid, bson.M{"i_vip_status": 1, "l_vip_endtime": 1, "l_vip_starttime": 1, "o_vipjy": 1})
+		if len(*user) > 0 {
+			status, areacount := 0, 0
+			if vip := gconv.Map((*user)["o_vipjy"]); vip != nil && vip["o_buyset"] != nil {
+				areacount = gconv.Int(gconv.Map(vip["o_buyset"])["areacount"])
+			}
+			query1 := bson.M{"$or": []interface{}{
+				bson.M{"s_phone": phone},
+				bson.M{"s_m_phone": phone},
+			}}
+			buser, _ := util.MQFW.FindOneByField("user", query1, bson.M{"i_vip_status": 1, "o_vipjy": 1, "o_jy": 1})
+			if len(*buser) > 0 {
+				if qutil.IntAll((*buser)["i_vip_status"]) > 0 {
+					b_areacount := 0
+					if vip := gconv.Map((*buser)["o_vipjy"]); vip != nil && vip["o_buyset"] != nil {
+						b_areacount = gconv.Int(gconv.Map(vip["o_buyset"])["areacount"])
+					}
+					if areacount == b_areacount {
+						status = 1
+					} else {
+						status = -2 // 订阅地区不一致
+					}
+				} else {
+					if ojy := gconv.Map((*buser)["o_jy"]); ojy != nil && ojy["i_ppstatus"] != nil {
+						if state := gconv.Int(ojy["i_ppstatus"]); state == 1 {
+							return map[string]interface{}{
+								"status": -4, // 省份订阅包用户
+							}, nil
+						}
+					} else {
+						status = 1
+					}
+				}
+			} else {
+				status = -1 // 账号未注册
+			}
+			return map[string]interface{}{
+				"status": status,
+			}, nil
+		}
+		return nil, fmt.Errorf("未查询到身份信息")
+	}()
+	t.ServeJson(NewResult(rData, errMsg))
+}
+
+func (t *VipGift) TransferSubDuration() {
+	userid := qutil.ObjToString(t.GetSession("mgoUserId"))
+	rData, errMsg := func() (interface{}, error) {
+		now := time.Now().Unix()
+		if now < config.Config.VipGiftStartTime && now > config.Config.VipGiftEndTime {
+			return nil, fmt.Errorf("不在活动时间范围内")
+		}
+		user, _ := util.MQFW.FindById("user", userid, bson.M{"i_vip_status": 1, "l_vip_endtime": 1, "l_vip_starttime": 1, "o_vipjy": 1})
+		if len(*user) > 0 {
+			// 1-1 验证个人身份 超级订阅时长
+			if qutil.IntAll((*user)["i_vip_status"]) > 0 {
+				//startTime := qutil.Int64All((*user)["l_vip_starttime"])
+				endTime := qutil.Int64All((*user)["l_vip_endtime"])
+				dif, sameDay := difMouth(time.Now().Unix(), endTime)
+				b_phones := gconv.Map(t.GetString("phones"))
+				num := 0
+				for k, v := range b_phones {
+					log.Println("TransferSubDuration---", "phone: ", k, " gift: ", v)
+					if !jy.PhoneReg.MatchString(k) {
+						return nil, fmt.Errorf("手机号格式异常")
+					}
+					num += gconv.Int(v)
+				}
+				if num == 0 {
+					return nil, fmt.Errorf("赠送时长异常")
+				}
+				if dif >= num {
+					err := transferByPhone(t, *user, b_phones, t.GetString("platform"), dif, sameDay)
+					if err != nil {
+						return nil, err
+					}
+					return nil, nil
+				}
+				return nil, fmt.Errorf("赠送时长大于当前用户可赠时长")
+			}
+			return nil, fmt.Errorf("当前赠送人没有超级订阅权限")
+		}
+		return nil, fmt.Errorf("未查询到身份信息")
+	}()
+	t.ServeJson(NewResult(rData, errMsg))
+}
+
+func difMouth(i1, i2 int64) (int, bool) {
+	st := time.Unix(i1, 0)
+	et := time.Unix(i2, 0)
+	y1, m1, d1 := st.Date()
+	y2, m2, d2 := et.Date()
+	difM := (y2-y1)*12 + int(m2-m1)
+	// 额外判断天数是否需要调整
+	if d1 == 31 && (d2 == 30 || d2 == 28) {
+		//
+	} else if d1 > d2 {
+		difM--
+	}
+	return difM, d1 == d2
+}
+
+// 1-2 验证手机号 未注册去注册
+// 2-1 赠送并验证 赠予时长
+func transferByPhone(t *VipGift, user, phones map[string]interface{}, platform string, dif int, sameDay bool) error {
+	userId := qutil.ObjToString(t.GetSession("mgoUserId"))
+	areacount := 0
+	if vip := gconv.Map(user["o_vipjy"]); vip != nil && vip["o_buyset"] != nil {
+		areacount = gconv.Int(gconv.Map(vip["o_buyset"])["areacount"])
+	}
+	i_vip_status := qutil.IntAll(user["i_vip_status"])
+	updateInfo := make(map[string]*Received)
+	num := 0 // 扣除
+	for k, v := range phones {
+		giver := qutil.ObjToString(t.GetSession("phone"))
+		if giver == k {
+			return fmt.Errorf("赠送人手机号与被赠送人手机号一致")
+		}
+		query1 := bson.M{"$or": []interface{}{
+			bson.M{"s_phone": k},
+			bson.M{"s_m_phone": k},
+		}}
+		buser, _ := util.MQFW.FindOneByField("user", query1, bson.M{"i_vip_status": 1, "o_vipjy": 1, "l_vip_endtime": 1, "l_vip_starttime": 1, "o_jy": 1})
+		var mgoUserId string
+		if len(*buser) == 0 {
+			// 新用户注册
+			mgoUserId, _ = regNewPhone(k, platform)
+		} else {
+			mgoUserId = mongodb.BsonIdToSId((*buser)["_id"])
+		}
+		received := &Received{
+			Uid:    userId,
+			Phone:  gconv.String(t.GetSession("phone")),
+			BPhone: k,
+		}
+		if qutil.IntAll((*buser)["i_vip_status"]) > 0 {
+			received.Itype = 1
+			b_areacount := 0
+			if vip := gconv.Map((*buser)["o_vipjy"]); vip != nil && vip["o_buyset"] != nil {
+				b_areacount = gconv.Int(gconv.Map(vip["o_buyset"])["areacount"])
+			}
+			if areacount == b_areacount {
+				num += gconv.Int(v)
+				dif -= gconv.Int(v)
+				if dif >= 0 {
+					updateVipInfo(*buser, gconv.Int(v), areacount, received)
+				} else {
+					return fmt.Errorf("赠予时长异常,赠送失败")
+				}
+			} else {
+				return fmt.Errorf("该手机号:%s超级订阅地区与赠送人不一致", k)
+			}
+		} else {
+			if len(*buser) > 0 {
+				if ojy := gconv.Map((*buser)["o_jy"]); ojy != nil && ojy["i_ppstatus"] != nil {
+					if status := gconv.Int(ojy["i_ppstatus"]); status == 1 {
+						return fmt.Errorf("省份订阅包用户不能被赠送")
+					}
+				}
+			}
+			received.Itype = 0
+			// 新用户和非超级订阅用户直接赠送
+			num += gconv.Int(v)
+			dif -= gconv.Int(v)
+			if dif >= 0 {
+				updateVipInfo(nil, gconv.Int(v), areacount, received)
+			} else {
+				return fmt.Errorf("赠予时长异常,赠送失败")
+			}
+		}
+		updateInfo[mgoUserId] = received
+	}
+	if len(updateInfo) == 0 && len(updateInfo) != len(phones) {
+		return fmt.Errorf("未知异常")
+	}
+	// 赠送人时长修改  赠送人vip结束时间-赠送月份 对比 当前时间
+	endTime := qutil.Int64All(user["l_vip_endtime"])
+	t1 := time.Unix(endTime, 0).Local()
+	newTime := t1.AddDate(0, -num, 0)
+
+	if (sameDay && dif == 0) || (newTime.Unix() <= time.Now().Unix()) {
+		if !util.Compatible.Update(userId, bson.M{"$set": map[string]interface{}{
+			"i_vip_status":     -i_vip_status,
+			"i_vip_expire_tip": 2,
+			"i_vip_subtips":    0,
+			"i_vip_fastimport": 0,
+			"l_vip_endtime":    newTime.Unix(),
+		},
+			"$unset": map[string]interface{}{
+				"i_vip_expire_tip_retry": "",
+			}}) {
+			return fmt.Errorf("更新异常:%s", userId)
+		}
+	} else {
+		if !util.Compatible.Update(userId, bson.M{"$set": map[string]interface{}{
+			"l_vip_endtime": newTime.Unix(),
+		}}) {
+			return fmt.Errorf("更新异常:%s", userId)
+		}
+	}
+	//else {
+	//    log.Println("sameDay: ", sameDay)
+	//    log.Println("dif: ", dif)
+	//    log.Println("newTime.Unix(): ", newTime.Unix())
+	//    return fmt.Errorf("赠予时长异常,赠送失败, %d", newTime.Unix())
+	//}
+	clearCache(userId) // 赠送人
+	for uid, info := range updateInfo {
+		info1 := gconv.Map(info.UpdateInfo)
+		// 被赠 更新
+		if util.Compatible.Update(uid, bson.M{"$set": info.UpdateInfo}) {
+			if info1["l_vip_starttime"] != nil {
+				// 新开
+				util.MergeKws(uid, 0, 0, 0)                //初始化vip订阅关键词
+				redis.Del("other", "p1_indexMessage_"+uid) //清除redis中vip状态
+			}
+			clearCache(uid)
+			record := map[string]interface{}{
+				"giftUserId":         mongodb.BsonIdToSId(user["_id"]),
+				"giftUserPhone":      info.Phone,
+				"createTime":         date.NowFormat(date.Date_Full_Layout),
+				"recipientUserId":    uid,
+				"recipientUserPhone": info.BPhone,
+				"duration":           info.Duration,
+				"vipStartTime":       info.StartTime,
+				"vipEndTime":         info.EndTime,
+				"areaCount":          areacount,
+				"itype":              info.Itype,
+			}
+			util.Mysql.Insert("vip_gift_records", record)
+		} else {
+			return fmt.Errorf("更新异常:%s, err: %s", uid, info1)
+		}
+	}
+	return nil
+}
+
+func regNewPhone(phone, platform string) (userid string, err error) {
+	userAddReq := pb.UserAddReq{
+		Appid: "10000",
+		Phone: phone,
+	}
+	now := time.Now()
+	mgoData := map[string]interface{}{
+		"i_appid":       2,
+		"s_phone":       phone,
+		"s_password":    "",
+		"l_registedate": now.Unix(),
+		"i_ts_guide":    2,
+		"o_jy": map[string]interface{}{
+			"i_apppush":    1,
+			"i_ratemode":   2,
+			"l_modifydate": now.Unix(),
+		},
+		"s_regsource": "vipgift",
+		"s_platform":  platform,
+	}
+	if resp := config.Middleground.UserCenter.UserAdd(userAddReq); resp != nil {
+		if resp.Data.Id > 0 {
+			mgoData["base_user_id"] = resp.Data.Id
+			uid := util.MQFW.Save("user", mgoData)
+			if uid != "" {
+				util.Mgo_log.Save("register_log", map[string]interface{}{
+					"userid":      uid,
+					"phone":       phone,
+					"way":         "phone",
+					"source":      "vipgift",
+					"create_time": gtime.Timestamp(),
+				})
+				return uid, nil
+			} else {
+				return "", fmt.Errorf("用户user表新增失败")
+			}
+		}
+	}
+	return "", fmt.Errorf("新手机号注册失败:%s", phone)
+}
+
+func updateVipInfo(buser map[string]interface{}, gift, areacount int, received *Received) {
+	updateMap := make(map[string]interface{})
+	if buser != nil {
+		// 被赠 续费
+		etTime := qutil.Int64All(buser["l_vip_endtime"])
+		endTime := util.GetDATE(0, gift, etTime)
+		updateMap["l_vip_endtime"] = endTime.Unix()
+		updateMap["i_vip_status"] = 2
+		updateMap["i_vip_expire_tip"] = 0
+		updateMap["o_vipjy.l_modifydate"] = time.Now().Unix()
+
+		received.Duration = gift
+		received.StartTime = date.FormatDateByInt64(&etTime, date.Date_Full_Layout)
+		received.EndTime = endTime.Format(date.Date_Full_Layout)
+	} else {
+		// 被赠 新开
+		startTime := time.Now().Unix()
+		endTime := util.GetDATE(0, gift, startTime)
+		updateMap["l_vip_starttime"] = startTime
+		updateMap["l_vip_endtime"] = endTime.Unix()
+		updateMap["i_vip_status"] = 2
+		updateMap["i_vip_expire_tip"] = 0
+		updateMap["o_vipjy.o_buyset"] = &map[string]interface{}{"buyerclasscount": -1, "areacount": areacount, "upgrade": 1, "newcitys": []string{}}
+		updateMap["o_vipjy.o_area"] = &map[string]interface{}{"北京": []string{}}
+		updateMap["o_vipjy.i_trial"] = -1
+
+		received.Duration = gift
+		received.StartTime = date.FormatDateByInt64(&startTime, date.Date_Full_Layout)
+		received.EndTime = endTime.Format(date.Date_Full_Layout)
+	}
+	received.UpdateInfo = updateMap
+}
+
+func clearCache(userId string) {
+	positionId := util.MongoIdToPositionId(userId)
+	jy.ClearBigVipUserPower(positionId)
+	config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+		PositionId: positionId,
+		AppId:      "10000",
+	})
+	config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+}

+ 43 - 13
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	jycaptcha "app.yhyue.com/moapp/jybase/captcha"
 	"bytes"
 	"context"
 	"database/sql"
@@ -20,7 +21,6 @@ import (
 	"github.com/gogf/gf/v2/util/gconv"
 
 	. "app.yhyue.com/moapp/jybase/api"
-	jycaptcha "app.yhyue.com/moapp/jybase/captcha"
 	qutil "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/date"
 	"app.yhyue.com/moapp/jybase/dchest/captcha"
@@ -92,11 +92,12 @@ func (this *UserAccount) GetSimpleData() {
 		}
 	}
 	this.ServeJson(map[string]interface{}{
-		"userId":    encrypt.EncodeArticleId(qutil.ObjToString(sessVal["mgoUserId"])),
-		"nickName":  qutil.If(phone != "", phone, name).(string),
-		"phone":     phone,
-		"name":      name,
-		"headImage": headImage,
+		"userId":     encrypt.EncodeArticleId(qutil.ObjToString(sessVal["mgoUserId"])),
+		"nickName":   qutil.If(phone != "", phone, name).(string),
+		"phone":      phone,
+		"name":       name,
+		"headImage":  headImage,
+		"expBinding": qutil.Int64All(sessVal["experience_binding"]),
 	})
 }
 
@@ -260,11 +261,20 @@ func getAccountVipAttr(session *httpsession.Session, powerRes *pcc.CheckResp) (r
 			}
 		}
 
-		rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
-			"renew":   powerRes.Vip.Upgrade == 1 && buyed, //是否有购买订单
-			"upgrade": (powerRes.Vip.Upgrade == 0 || powerRes.Vip.Areacount != -1) && buyed,
-			"buyMsg":  buyMsg,
-		}})
+		if gconv.Int64(session.Get("positionType")) == 0 {
+			rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
+				"renew":   powerRes.Vip.Upgrade == 1,
+				"upgrade": powerRes.Vip.Upgrade == 0 || powerRes.Vip.Areacount != -1,
+				"buyMsg":  buyMsg,
+			}})
+		} else {
+			rData = append(rData, &VipDetail{Name: "超级订阅", EndTime: powerRes.Vip.GetEndTime(), Attr: g.Map{
+				"renew":   qutil.If(gconv.Int64(session.Get("positionType")) == 0, true, powerRes.Vip.Upgrade == 1 && buyed),
+				"upgrade": (powerRes.Vip.Upgrade == 0 || powerRes.Vip.Areacount != -1) && buyed,
+				"buyMsg":  buyMsg,
+			}})
+		}
+
 	}
 	if powerRes.Free.PpStatus > 0 && len(rData) == 0 {
 		rData = append(rData, &VipDetail{Name: "省份订阅包", EndTime: powerRes.Free.GetPpEndTime(), Attr: g.Map{
@@ -289,7 +299,7 @@ func (this *UserAccount) GetAccountInfo() {
 		sessVal := this.Session().GetMultiple()
 		userId, _ := sessVal["mgoUserId"].(string)
 		//由于超级订阅vip状态需要查库,无法从session中获取,所以直接所有字段从数据库中获取
-		userMsg := util.Compatible.Select(userId, `{"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1,"s_unionid":1}`)
+		userMsg := util.Compatible.Select(userId, `{"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1,"s_unionid":1,"experience_binding":1}`)
 		if userMsg == nil || len(*userMsg) == 0 {
 			return nil, DBQUERY_ERROR
 		}
@@ -343,6 +353,7 @@ func (this *UserAccount) GetAccountInfo() {
 			"isWx":          isWx, //是否是微信账号
 			"breakRenewTip": breakRenewTip,
 			"otherMail":     otherMail, //从数据导出填写的邮箱或者从数据定制服务这里获取的邮箱
+			"expBinding":    qutil.IntAll((*userMsg)["experience_binding"]),
 		}, nil
 	}()
 	this.ServeJson(NewResult(rData, errMsg))
@@ -585,6 +596,7 @@ func (this *UserAccount) Authentication(doType string) {
 //       A账户已绑定微信,此微信必须与当前账户绑定的微信一致
 
 func (this *UserAccount) PhoneBind() {
+	log.Println("绑定手机号开始1")
 	sessVal := this.Session().GetMultiple()
 	userId, _ := sessVal["mgoUserId"].(string)
 	step, _ := this.GetInteger("step")
@@ -640,9 +652,13 @@ func (this *UserAccount) PhoneBind() {
 				return "", fmt.Errorf("获取账户信息异常")
 			}
 			exists, relationPhoneId, _ := jy.NewPhoneUtil(util.MQFW).BindPhoneIsOccupy(userId, unionid, phoneVerify)
+			log.Println("绑定手机号开始2", exists, relationPhoneId)
 			if exists { //再次校验是否使用
 				return nil, fmt.Errorf("手机号已被绑定")
 			}
+			if relationPhoneId != "" {
+				rData["isMerge"] = 1
+			}
 			if mode == "" || relationPhoneId == "" { //主动绑定-建立双向绑定关系||跳转绑定新手机号
 				if relationPhoneId == "" {
 					//船新用户 查看是否有邀请关系 shareRedisName
@@ -717,6 +733,7 @@ func (this *UserAccount) PhoneBind() {
 					if jy.IsEmail(email) {
 						data["s_email"] = email
 					}
+					log.Println("绑定手机号开始3", relationPhoneId, data)
 					if util.Compatible.Update(relationPhoneId, map[string]interface{}{
 						"$set": data,
 					}) {
@@ -745,6 +762,8 @@ func (this *UserAccount) PhoneBind() {
 								}
 								backData[k] = v
 							}
+							log.Println("绑定手机号开始4", backData)
+
 							if util.MQFW.Save("user_merge", backData) != "" {
 								util.MQFW.Del("user", map[string]interface{}{"_id": mongodb.StringTOBsonId(userId)})
 								jy.CreateUserMerge(util.MQFW, util.Mysql, this.Session(), config.Middleground).FlushSession(relationPhoneId)
@@ -777,6 +796,16 @@ func (this *UserAccount) PhoneBind() {
 			"positionId": newSessVal["positionId"],
 			"isOnlyBind": true,
 		})
+		phone, _ := newSessVal["phone"].(string)
+		if phone != "" {
+			host := this.Request.Host
+			if !strings.HasPrefix(host, ".") {
+				host = "." + host
+			}
+			this.Session().Del("experience_binding")
+			jy.SetCookie(this.ResponseWriter, this.Request, jy.ExperienceSign, "experiencing", host, -1) //过期
+			jy.SetCookie(this.ResponseWriter, this.Request, "EXPERIENCE", "over", host, 8*60*60)         //结束
+		}
 	}
 	this.ServeJson(NewResult(rData, errMsg))
 }
@@ -1082,7 +1111,8 @@ func (this *UserAccount) WxUnBind() {
 			if saveId == "" {
 				return nil, DBUPDATE_ERROR
 			}
-			go jy.SaveUserLog(util.Mgo_log, saveId, phone, "phone", "wx", "wx", "", "", gconv.String(this.GetSession("RSource")), this.Request.Proto, this.UserAgent(), gconv.String(qutil.If(gconv.String((*unsetMap)["s_rsource"]) == "jyzbw", "jyzbw", "jybx")), "")
+			referer := this.Refer()
+			go jy.SaveUserLog(util.Mgo_log, saveId, phone, "phone", "wx", "wx", "", "", gconv.String(this.GetSession("RSource")), this.Request.Proto, this.UserAgent(), gconv.String(qutil.If(gconv.String((*unsetMap)["s_rsource"]) == "jyzbw", "jyzbw", "jybx")), "", referer)
 
 			flushWxsession = true
 		}

+ 138 - 0
src/jfw/modules/subscribepay/src/service/vipGift.go

@@ -0,0 +1,138 @@
+package service
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	qutil "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"sort"
+	"time"
+)
+
+type VipGift struct {
+	*xweb.Action
+
+	getSubDuration      xweb.Mapper `xweb:"/vip/gift/getSubDuration"`      // 获取vip订阅时长
+	getInfoByPhone      xweb.Mapper `xweb:"/vip/gift/getInfoByPhone"`      // 根据手机号获取提示信息
+	transferSubDuration xweb.Mapper `xweb:"/vip/gift/transferSubDuration"` // 赠送订阅时长
+
+	list          xweb.Mapper `xweb:"/vip/gift/list"`          //赠送记录查询
+	configuration xweb.Mapper `xweb:"/vip/gift/configuration"` //赠送记录配置
+	informInfo    xweb.Mapper `xweb:"/vip/gift/informInfo"`    //告知页面数据
+}
+
+// 赠送记录查询
+func (t *VipGift) List() {
+	rData := map[string]interface{}{}
+	userId := qutil.ObjToString(t.GetSession("userId"))
+	giftType, _ := t.GetInt("giftType")
+	list := &[]map[string]interface{}{}
+	if giftType == 1 {
+		//赠送记录
+		list = util.Mysql.SelectBySql("select   * from   vip_gift_records  where   giftUserId=?   ORDER BY     createTime  desc   ", userId)
+	} else if giftType == 2 {
+		//接收记录
+		list = util.Mysql.SelectBySql("select   * from   vip_gift_records  where   recipientUserId=?   ORDER BY    createTime  desc   ", userId)
+	} else {
+		t.ServeJson(NewResult(rData, nil))
+	}
+	for i := range *list {
+		giftId := encrypt.SE.Encode2HexByCheck(gconv.String((*list)[i]["id"]))
+		(*list)[i]["id"] = giftId
+		(*list)[i]["urlLink"] = fmt.Sprintf("%s/vipGiftUrl/%s", config.Config.WebDomain, giftId)
+		(*list)[i]["qRCodeLink"] = fmt.Sprintf("%s/qr?url=/vipGiftUrl/%s", config.Config.WebDomain, giftId)
+		if giftType == 1 {
+			giftUserPhone := gconv.String((*list)[i]["giftUserPhone"])
+			(*list)[i]["giftUserPhone"] = string(giftUserPhone[0:3]) + "****" + string(giftUserPhone[len(giftUserPhone)-4:])
+		} else if giftType == 2 {
+			recipientUserPhone := gconv.String((*list)[i]["recipientUserPhone"])
+			(*list)[i]["recipientUserPhone"] = string(recipientUserPhone[0:3]) + "****" + string(recipientUserPhone[len(recipientUserPhone)-4:])
+		}
+	}
+	if len(*list) > 0 {
+		rData["list"] = groupAndSortByCreateTime(*list)
+	} else {
+		rData["list"] = []map[string]interface{}{}
+	}
+	t.ServeJson(NewResult(rData, nil))
+}
+func groupAndSortByCreateTime(list []map[string]interface{}) [][]map[string]interface{} {
+	// 1. 按日期分组
+	groups := make(map[string][]map[string]interface{})
+	for _, item := range list {
+		createTime, ok := item["createTime"].(string)
+		if !ok {
+			continue // 忽略无效的 createTime
+		}
+		groups[createTime] = append(groups[createTime], item)
+	}
+
+	// 2. 提取分组键并排序
+	var keys []string
+	for k := range groups {
+		keys = append(keys, k)
+	}
+	sort.Sort(sort.Reverse(sort.StringSlice(keys))) // 按日期降序排列
+	// 3. 对每个组内按时间排序(降序)
+	var result [][]map[string]interface{}
+	for _, key := range keys {
+		group := groups[key]
+		sort.Slice(group, func(i, j int) bool {
+			layout := "2006-01-02 15:04:05"
+			iCreateTime, err1 := time.Parse(layout, group[i]["createTime"].(string))
+			jCreateTime, err2 := time.Parse(layout, group[j]["createTime"].(string))
+			if err1 != nil || err2 != nil {
+				return false // 忽略解析错误,保持原顺序
+			}
+			return iCreateTime.After(jCreateTime) // 降序排序
+		})
+		result = append(result, group)
+	}
+
+	return result
+}
+
+// 赠送记录配置
+func (t *VipGift) Configuration() {
+	rData := map[string]interface{}{
+		"startTime": config.Config.VipGiftStartTime,
+		"endTime":   config.Config.VipGiftEndTime,
+	}
+	t.ServeJson(NewResult(rData, nil))
+}
+
+// 告知页面数据
+func (t *VipGift) InformInfo() {
+	giftId := t.GetString("giftId")
+	chatIdInt := gconv.Int64(encrypt.SE.Decode4HexByCheck(giftId))
+	data := util.Mysql.FindOne("vip_gift_records", map[string]interface{}{
+		"id": chatIdInt,
+	}, "giftUserPhone,createTime,recipientUserPhone,recipientUserId,duration,nickname,vipStartTime,vipEndTime,areacount,itype", "")
+	if data != nil && len(*data) > 0 {
+		giftUserPhone := gconv.String((*data)["giftUserPhone"])
+		(*data)["giftUserPhone"] = string(giftUserPhone[0:3]) + "****" + string(giftUserPhone[len(giftUserPhone)-4:])
+		(*data)["urlLink"] = fmt.Sprintf("%s/vipGiftUrl/%s", config.Config.WebDomain, giftId)
+		(*data)["qRCodeLink"] = fmt.Sprintf("%s/qr?url=/vipGiftUrl/%s", config.Config.WebDomain, giftId)
+		isBinding := false
+		isSame := false
+		//判断是否绑定手机号
+		phone := qutil.InterfaceToStr(t.GetSession("phone"))
+		if phone == "" {
+			//没有绑定手机号
+		} else {
+			isBinding = true
+			userId := qutil.ObjToString(t.GetSession("userId"))
+			recipientUserId := gconv.String((*data)["recipientUserId"])
+			if recipientUserId == userId {
+				isSame = true
+			}
+		}
+		(*data)["isBinding"] = isBinding
+		(*data)["isSame"] = isSame
+	}
+	t.ServeJson(NewResult(data, nil))
+}

+ 44 - 21
src/jfw/modules/subscribepay/src/util/util.go

@@ -1,39 +1,62 @@
 package util
 
 import (
-	qutil "app.yhyue.com/moapp/jybase/common"
-	"app.yhyue.com/moapp/jybase/redis"
-	"app.yhyue.com/moapp/jypkg/compatible"
-	"fmt"
-	"strings"
+    qutil "app.yhyue.com/moapp/jybase/common"
+    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+    "app.yhyue.com/moapp/jybase/redis"
+    "app.yhyue.com/moapp/jypkg/compatible"
+    "fmt"
+    "net/http"
+    "strings"
+    "time"
 )
 
 var (
-	Compatible *compatible.Compatible
+    Compatible *compatible.Compatible
 )
 
 func ConfirmIntArr(arr []interface{}) []int {
-	tmp := make([]int, 0)
-	for _, v := range arr {
-		tmp = append(tmp, qutil.IntAll(v))
-	}
-	return tmp
+    tmp := make([]int, 0)
+    for _, v := range arr {
+        tmp = append(tmp, qutil.IntAll(v))
+    }
+    return tmp
 }
 
 // 移动端ios
 func IsMobileIOS(userAgent string) bool {
-	userAgent = strings.ToLower(userAgent)
-	return mobileReg.MatchString(userAgent)
-	//return strings.Contains(userAgent, "iphone") || strings.Contains(userAgent, "ipad") || strings.Contains(userAgent, "ipod")
+    userAgent = strings.ToLower(userAgent)
+    return mobileReg.MatchString(userAgent)
+    //return strings.Contains(userAgent, "iphone") || strings.Contains(userAgent, "ipad") || strings.Contains(userAgent, "ipod")
 }
 
 // RequestValidation 判断重复
 func RequestValidation(redisCode, repeatKey string) (err error) {
-	if ok, redisErr := redis.Exists(redisCode, repeatKey); ok && redisErr == nil {
-		err = fmt.Errorf("请求频繁 稍后再试")
-		return
-	}
-	//方式重复性请求--1秒内 允许请求一次
-	redis.Put("other", repeatKey, "REPEAT", 1)
-	return
+    if ok, redisErr := redis.Exists(redisCode, repeatKey); ok && redisErr == nil {
+        err = fmt.Errorf("请求频繁 稍后再试")
+        return
+    }
+    //方式重复性请求--1秒内 允许请求一次
+    redis.Put("other", repeatKey, "REPEAT", 1)
+    return
+}
+
+// ClearCookie 清楚前端cookie 缓存
+func ClearCookie(w http.ResponseWriter, name string) {
+    if name == "" {
+        return
+    }
+    for _, nk := range strings.Split(name, ",") {
+        if nk != "" {
+            http.SetCookie(w, &http.Cookie{
+                Name:     nk,
+                Value:    "",
+                Path:     "/",
+                HttpOnly: false,
+                MaxAge:   -1,
+                Expires:  time.Now().Add(-1),
+                Domain:   httpsession.Domain,
+            })
+        }
+    }
 }

+ 1 - 1
src/jfw/modules/weixin/src/config.json

@@ -18,7 +18,7 @@
     "maxOpenConns": 5,
     "maxIdleConns": 5
   },
-  "redisServers": "sso=192.168.3.149:1712,other=192.168.3.149:1712,jyop_other=192.168.3.149:1712,push=192.168.3.149:1712,wxtoken=192.168.3.149:1712,newother=192.168.3.149:1712",
+  "redisServers": "sso=192.168.3.149:1712,other=192.168.3.149:1712,jyop_other=192.168.3.149:1712,push=192.168.3.149:1712,wxtoken=192.168.3.149:1712,newother=192.168.3.149:1712,limitation=192.168.3.149:1713",
   "redisLogin": "login=192.168.3.149:1712",
   "weixinport": "82",
   "weixinrpcport": "8083",

+ 1 - 0
src/jfw/modules/weixin/src/config.yaml

@@ -2,3 +2,4 @@ etcd:
   hosts:
   - 192.168.3.206:2379
 userCenterKey: "usercenter.rpc" #用户中台rpc
+experienceRatio: 2

+ 6 - 6
src/jfw/modules/weixin/src/go.mod

@@ -3,10 +3,10 @@ module jy/src/jfw/modules/weixin/src
 go 1.20
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66
+	app.yhyue.com/moapp/jybase v0.0.0-20250320080310-ef9b45180b29
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.26.7
-	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.18
+	app.yhyue.com/moapp/jypkg v1.33.5
+	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/gogf/gf/v2 v2.7.0
 	go.mongodb.org/mongo-driver v1.14.0
@@ -19,7 +19,7 @@ require (
 	app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20231226074509-942d80dc34eb // indirect
 	bp.jydev.jianyu360.cn/BaseService/jyMicroservices v0.0.2 // indirect
-	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20240607062231-ae1d02891843 // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.3 // indirect
 	filippo.io/edwards25519 v1.1.0 // indirect
 	github.com/BurntSushi/toml v1.2.0 // indirect
@@ -117,10 +117,10 @@ require (
 	golang.org/x/crypto v0.22.0 // indirect
 	golang.org/x/net v0.24.0 // indirect
 	golang.org/x/oauth2 v0.17.0 // indirect
-	golang.org/x/sync v0.6.0 // indirect
+	golang.org/x/sync v0.11.0 // indirect
 	golang.org/x/sys v0.19.0 // indirect
 	golang.org/x/term v0.19.0 // indirect
-	golang.org/x/text v0.14.0 // indirect
+	golang.org/x/text v0.22.0 // indirect
 	golang.org/x/time v0.5.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
 	google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect

+ 13 - 13
src/jfw/modules/weixin/src/go.sum

@@ -15,13 +15,13 @@ app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJ
 app.yhyue.com/moapp/jybase v0.0.0-20230419121327-bedf77840ba6/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
 app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
 app.yhyue.com/moapp/jybase v0.0.0-20231025021840-2f91c944ecdd/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66 h1:kCRYqzclN4dtGuGC89ID2w5lGrJgqZC8bNL8mRR+tiU=
-app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
+app.yhyue.com/moapp/jybase v0.0.0-20250320080310-ef9b45180b29 h1:gm2cwBTPaEL+9nUxjz+og2JfjFMWzp0vUTT+uLJiwCQ=
+app.yhyue.com/moapp/jybase v0.0.0-20250320080310-ef9b45180b29/go.mod h1:/HT/UZ4dKuUKAQqqKrzBBfIZ4vD56DPV4u2QyfH+kbU=
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 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 v1.26.7 h1:tcv7tfwD8YNLCzQTsr35J+EZmEwXeCB8yeyi2HSNBSs=
-app.yhyue.com/moapp/jypkg v1.26.7/go.mod h1:FylaC4MJ4G36WndktgeZfc8jTq3uvBGWIwbk02xfdQI=
+app.yhyue.com/moapp/jypkg v1.33.5 h1:XVzoi4POBZ8Tprr9Sk/HSC0CB3WcbPFwMpuu0o3B4jI=
+app.yhyue.com/moapp/jypkg v1.33.5/go.mod h1:m/OMjugcf4XK5c/2mErxnXEyAZ+WNya8HP0x8jFGw4U=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161 h1:WGi4OEIoqw6NpNFGioUEBZnjK9aBa+xJqf/5WY+QyhM=
 app.yhyue.com/moapp/message v0.0.0-20231204024949-8c7145bfc161/go.mod h1:0Oj8SB4pVjdCLD28sy2zyM3hS0WHGpNuVcakLW43GmI=
 bp.jydev.jianyu360.cn/BP/jynsq v0.0.0-20220222052708-ebc43af90698/go.mod h1:ojo/AUH9Yr1wzarEjOaNMkj1Cet/9r8IgLyba64Z52E=
@@ -31,8 +31,8 @@ bp.jydev.jianyu360.cn/BaseService/gateway v0.0.0-20220419090715-88ddb32961be/go.
 bp.jydev.jianyu360.cn/BaseService/gateway v1.3.4/go.mod h1:BMLd/5wb3BIEGhnEgF9y1sJN9P5/Dw9kYsoiE9V8I9g=
 bp.jydev.jianyu360.cn/BaseService/jyMicroservices v0.0.2 h1:Qi8C7gZeR7+kjOtSl9ilR5HwbjCe8GO1RuotFb4+kFA=
 bp.jydev.jianyu360.cn/BaseService/jyMicroservices v0.0.2/go.mod h1:v8y7FCbkKEIRP4Ie9ZM8NtoRP+Fk4O3C1hnexNusYIQ=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20240607062231-ae1d02891843 h1:u+8k/T0D6EUjj9BhI5RJdRa+8v4FZbyZhaNcm66L6Vs=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20240607062231-ae1d02891843/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec h1:oCO36pHkEHQa5+Z/DU83T5xT5NKptVbw5UVQSN6lJjw=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20241213060113-ac41966a58ec/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230911091604-2faa31032743/go.mod h1:1SQIPPL5Ya5BzQdByFKtTkXrXTWBv+PDqWIhNknLnZw=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220418005748-8ba5d936dd53/go.mod h1:E5lcDI3k4FESLxiAetCfWQTq8qfpy9cv0yN1oKoEO34=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.0-20220419023723-0b32d4a41751/go.mod h1:6KL5LMEku83uRbre0W/bj5kXG2I6pJGBFtktmtp51yM=
@@ -41,8 +41,8 @@ bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.3 h1:lk3he0hY+8VK1/Hm+ZSlc
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.3/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220418072311-2062bed1e700/go.mod h1:KjcrxTzM96tBc6G4B8tlLBn1lrVy5UJYF8+eTdP4xAE=
 bp.jydev.jianyu360.cn/BaseService/userCenter v0.0.0-20220421015128-4a36f3eac5c5/go.mod h1:GT0QC4aaKDuXxAvaU4G02XjCc31TU1ctqBGqxQYOfC4=
-bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.18 h1:aJNS24p6SOAOsCMvdOF0togsiO6HxmLIExVyTjog8Io=
-bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.18/go.mod h1:03bxckJBVCjal3uQ1loJmupbYHWRnaRC3V5LG4bgg6Y=
+bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21 h1:XWTYzWEOPedM0CNjtqya+VTpYQl5rL4MMmlqmuasIK0=
+bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.21/go.mod h1:UB56iVLBV0H06VbTdXychssHSaGoqZMThfOuXZyrUAs=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
@@ -2119,8 +2119,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
-golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
-golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
+golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2287,8 +2287,8 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
+golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
 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=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -2384,7 +2384,7 @@ golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
 golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
 golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
 golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
-golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
 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=

+ 14 - 2
src/jfw/modules/weixin/src/wx/wx.go

@@ -7,6 +7,8 @@ import (
 	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
 	"encoding/json"
 	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/modules/weixin/src/config"
 	"jy/src/jfw/modules/weixin/src/service"
@@ -39,6 +41,7 @@ var (
 	menuClickReplyTextMap map[string]string
 	//time.sleep 用户来源信息收集延时时间
 	userCTS  = 1 * time.Minute
+	ExpBKey  = "experience_binding_num"
 	PhoneReg = regexp.MustCompile("^[1][3-9][0-9]{9}$")
 )
 
@@ -361,6 +364,15 @@ func saveUser(u *UserInfo, source, pre, RSource, CSource string) (bool, string,
 				newUser["s_platform"] = "wx"
 			}
 		}
+		//体验绑定手机号标识
+		num := func() int {
+			eb := redis.GetInt("limitation", ExpBKey)
+			return eb % 10
+		}()
+		if num < g.Cfg().MustGet(gctx.New(), "experienceRatio").Int() {
+			newUser["experience_binding"] = 1
+		}
+		redis.Put("limitation", ExpBKey, num+1, -1)
 		_id := tools.MQFW.Save("user", newUser)
 		if _id != "" {
 			go tools.QRCodeRecord(source, ACTION_SUB)
@@ -373,7 +385,7 @@ func saveUser(u *UserInfo, source, pre, RSource, CSource string) (bool, string,
 			// 	"unionid":  u.UnionId,
 			// }
 			// usercenter.AddBaseUser(tools.MQFW, util.ObjToString(config.Sysconfig["userCenterApi"]), _id, formdata, &http.Cookie{})
-			jy.SaveUserLog(tools.MGLOG, _id, "", "wx", "wx", "wx", u.OpenId, "", RSource, "", "", gconv.String(util.If(RSource == "jyzbw", "jyzbw", "jybx")), gconv.String(util.If(gconv.String(newUser["s_platform"]) == "pc", "wx_pc_scan", "wx_other")), map[string]interface{}{
+			jy.SaveUserLog(tools.MGLOG, _id, "", "wx", "wx", "wx", u.OpenId, "", RSource, "", "", gconv.String(util.If(RSource == "jyzbw", "jyzbw", "jybx")), gconv.String(util.If(gconv.String(newUser["s_platform"]) == "pc", "wx_pc_scan", "wx_other")), "", map[string]interface{}{
 				"subscribe_scene": u.Subscribe_scene,
 				"qr_scene":        u.Qr_scene,
 				"qr_scene_str":    u.Qr_scene_str,
@@ -1004,7 +1016,7 @@ func unfollowSendMail(openid string) (int64, string) {
 		mark := fmt.Sprintf("%d%s%s", 0, "jy@wz", gconv.String(config.Sysconfig["unfollowMailId"]))
 		params = append(params, mark)
 		log.Println(gconv.String(config.Sysconfig["smsServiceRpc"]), gconv.String(config.Sysconfig["unfollowMailId"]), phone, params, len(params))
-		sms.SendSms(gconv.String(config.Sysconfig["smsServiceRpc"]), "", phone, params...)
+		sms.SendSms("", gconv.String(config.Sysconfig["smsServiceRpc"]), "", phone, params...)
 		return 1, ""
 	}
 	return -1, "发送失败"

+ 48 - 1
src/web/staticres/big-member/js/unit_portrayal.js

@@ -1,3 +1,6 @@
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
     delimiters: ['${', '}'],
     el: '#unit_portrayal',
@@ -335,7 +338,7 @@ var vNode = {
     },
     methods: {
       restoreTab: function() {
-        var tab = sea.getParam('tab') || ''
+        var tab = utils.getParam('tab') || ''
         if (tab) {
           this.scrollToTab(tab)
         }
@@ -1941,6 +1944,50 @@ var vNode = {
           } else if (type === 'buy') {
             location.href = '/jy_mobile/common/order/create/svip?type=buy'
           }
+        },
+        bindPhoneDataExport: function() {
+          var _this = this
+          return {
+            props: {
+              name: '采购单位画像-招标动态数据导出'
+            },
+            next: function () {
+              _this.onExport()
+            }
+          }
+        },
+        bindPhoneAddKeep: function (item) {
+          var _this = this
+          return {
+            props: {
+              name: '采购单位画像-招标动态收藏'
+            },
+            next: function () {
+              _this.addKeepStatus(item)
+            }
+          }
+        },
+        bindPhoneGoGiveAnalysis: function() {
+          var _this = this
+          return {
+            props: {
+              name: '采购单位画像- 免费赠送1次【采购单位全景分析】权益体验机会!-去解锁'
+            },
+            next: function () {
+              _this.goGiveAnalysis()
+            }
+          }
+        },
+        bindPhoneDtTextClick: function(type) {
+          var _this = this
+          return {
+            props: {
+              name: '采购单位画像-开通超级订阅'
+            },
+            next: function () {
+              _this.onDtTextClick(type)
+            }
+          }
         }
     }
 }

+ 3 - 0
src/web/staticres/big-member/weixin/css/public.css

@@ -565,3 +565,6 @@ button[disabled] {
 .visited .visited-ft.visited-tag {
   background-color: #F7F9F9;
 }
+input, textarea {
+  caret-color: #2cb7ca;
+}

+ 16 - 0
src/web/staticres/common-module/bidedoc/js/index.js

@@ -7,6 +7,11 @@ function getType () {
     return false
   }
 }
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {
+  console.log(error)
+}
 var vm = new Vue({
   el: '#bided',
   delimiters: ['{', '}'],
@@ -40,6 +45,17 @@ var vm = new Vue({
           console.log(error)
         }
       }
+    },
+    bindPhoneGetMsg: function() {
+      var _this = this
+      return {
+        props: {
+          name: '标书制作-留电话按钮'
+        },
+        next: function() {
+          _this.getMsg()
+        }
+      }
     }
   }
 })

+ 16 - 0
src/web/staticres/common-module/bidedoc/js/relationship.js

@@ -1,3 +1,8 @@
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {
+  
+}
 var page = new Vue({
   el: '#main-app',
   delimiters: ['${', '}'],
@@ -56,5 +61,16 @@ var page = new Vue({
         location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=' + source
       }
     },
+    bindPhoneApplyToTrial: function() {
+      var _this = this
+      return {
+        props: {
+          name: '找人脉-申请免费试用'
+        },
+        next: function() {
+          _this.applyToTrial()
+        }
+      }
+    }
   }
 })

+ 27 - 0
src/web/staticres/common-module/big-member/js/buyer_project_news.js

@@ -691,6 +691,33 @@ var vConfig = {
             }
             return !!$data
         },
+        bindPhoneDataExport: function (name) {
+            var _this = this
+            return {
+              props: {
+                name: name
+              },
+              next: function () {
+                _this.onExport()
+              }
+            } 
+        },
+        bindPhoneAddKeepStatus: function (item, name) {
+            var _this = this
+            return {
+              props: {
+                name: name
+              },
+              next: function () {
+                _this.addKeepStatus(item)
+              }
+            }
+        },
     }
 }
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {
+  console.log(error)
+}
 var vBuyProjectNews = new Vue(vConfig)

+ 27 - 0
src/web/staticres/common-module/big-member/js/ent_project_news.js

@@ -710,6 +710,33 @@ var vConfig = {
             }
             return !!$data
         },
+        bindPhoneDataExport: function (name) {
+          var _this = this
+          return {
+            props: {
+              name: name
+            },
+            next: function () {
+              _this.onExport()
+            }
+          } 
+      },
+      bindPhoneAddKeepStatus: function (item, name) {
+          var _this = this
+          return {
+            props: {
+              name: name
+            },
+            next: function () {
+              _this.addKeepStatus(item)
+            }
+          }
+      }
     }
+}
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {
+  
 }
 var entProjectNews = new Vue(vConfig)

+ 17 - 1
src/web/staticres/common-module/collection/js/buyer-example.js

@@ -11,7 +11,7 @@ var vipDialog = `
       <span class="vip_extend"><span>{{getTextMap.headText.top}}</span><br/>{{getTextMap.headText.bot}}</span>
   </div>
   <div class="openBtn">
-      <button class="goBtn" @click="goOpen(getTextMap.headText.top,getTextMap.headText.bot, getTextMap.source)">{{getTextMap.btnText}}</button>
+      <button @click="goOpen(getTextMap.headText.top,getTextMap.headText.bot, getTextMap.source)" v-bound-phone="bindPhoneUnlock(getTextMap.headText.top,getTextMap.headText.bot, getTextMap.source)" class="goBtn">{{getTextMap.btnText}}</button>
   </div>
   <p class="no-login-tip" v-if="!userinfo.isLogin">登录后解锁会员查看更多内容</p>
 </div>
@@ -371,6 +371,22 @@ var buyerExample = {
       } else {
         _this.linkFn(_this.$parent.encryptId)
       }
+    },
+    // 采购单位通讯录/采购分析立即解锁指令绑定
+    bindPhoneUnlock: function(top, bot, source) {
+      var _this = this
+      var pass = _this.getTextMap.btnText == '登录查看' ? function() {
+        window.location.href = "/jyapp/free/login?to=back";
+      } : null
+      return {
+        props: {
+          name: '采购单位画像-立即解锁'
+        },
+        pass: pass,
+        next: function() {
+          _this.goOpen(top, bot, source)
+        }
+      }
     }
   }
 }

+ 65 - 7
src/web/staticres/common-module/collection/js/ent_portrait.js

@@ -1,3 +1,6 @@
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
   delimiters: ['${', '}'],
   el: '#ent-portrait',
@@ -341,7 +344,7 @@ var vNode = {
       var info = this.powerInfo
       var isNoMember = info.memberStatus <= 0
       var isOldVip = info.vipStatus > 0 && !info.viper
-      var isNewVip = info.vipStatus > 0 && info.viper && !this.surplus
+      var isNewVip = info.vipStatus > 0 && info.viper && !this.surplus && !this.entvisit.visited
       var isNotAll = this.entvisit.provin !== -1
       return (isOldVip || (isNewVip && isNotAll)) && isNoMember
     },
@@ -889,7 +892,7 @@ var vNode = {
     },
     changeGroupState: function (type) {
       console.log(type);
-      this.getEntGroupListData() 
+      this.getEntGroupListData()
       this.$nextTick(() => {
         this.setGroupState = type
         this.showGroupingDialog = true
@@ -952,7 +955,7 @@ var vNode = {
           _this.showGroupingDialog = false
           _this.changeFollowStateRequest()
         }
-        
+
       } else {
         this.getEntFollowState((res) => {
           const { surplus, used } = res.info
@@ -1198,13 +1201,13 @@ var vNode = {
                   //  展开监控菜单 active:3
                   window.location.href = location.origin + '/jy_mobile/push/pushsetting?active=' + active
                 })
-        
+
               } else if(res.data.msg_open && res.data.status){
                 _this.$toast({
                   duration: 2000,
                   message: '监控成功,您可前往“工作台-商机-企业情报监控”查看'
                 })
-        
+
               }
             } else {
               return _this.showToast(res.error_msg || '监控失败')
@@ -1846,11 +1849,11 @@ var vNode = {
       var container = document.querySelector('.sesame-main');
       if(!container) return
       var items = container.getElementsByClassName('sesame-item');
-  
+
       // 获取所有子元素的top值,如果所有子元素的top值相同,则说明只有一行
       var firstItemTop = items[0].offsetTop;
       var isOneRow = true;
-  
+
       for (var i = 1; i < items.length; i++) {
         if (items[i].offsetTop !== firstItemTop) {
           isOneRow = false;
@@ -1858,6 +1861,61 @@ var vNode = {
         }
       }
       this.isOneRow = isOneRow
+    },
+    bindPhoneDataExport: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-中标动态数据导出'
+        },
+        next: function() {
+          _this.onExport()
+        }
+      }
+    },
+    bindPhoneAddKeep: function(item) {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-中标动态收藏'
+        },
+        next: function() {
+          _this.addKeepStatus(item)
+        }
+      }
+    },
+    bindPhoneUnlock: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-工商信息解锁查看'
+        },
+        next: function() {
+          _this.goToUnlock()
+        }
+      }
+    },
+    bindPhoneEntHistory: function() {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-工商变动'
+        },
+        next: function() {
+          _this.goToEntHistory()
+        }
+      }
+    },
+    bindPhoneDtTextClick: function(type) {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-开通超级订阅'
+        },
+        next: function () {
+          _this.onDtTextClick(type)
+        }
+      }
     }
   }
 }

+ 12 - 1
src/web/staticres/common-module/collection/js/vip-dialog.js

@@ -11,7 +11,7 @@ var vipDialog = `
       <span class="vip_extend"><span>{{getTextMap.headText.top}}</span><br/>{{getTextMap.headText.bot}}</span>
   </div>
   <div class="openBtn">
-      <button class="goBtn" @click="goOpen(getTextMap.source)">{{getTextMap.btnText}}</button>
+      <button class="goBtn" @click="goOpen(getTextMap.source)" v-bound-phone="bindPhoneOpen(getTextMap.source)">{{getTextMap.btnText}}</button>
   </div>
    <p class="no-login-tip" v-if="!islogin">登录后解锁会员查看更多内容</p>
 </div>
@@ -350,6 +350,17 @@ var vipComponent = {
       } else {
         this.goOpenOfApp(this.getTextMap.btnText, source)
       }
+    },
+    bindPhoneOpen: function(source) {
+      var _this = this
+      return {
+        props: {
+          name: '企业画像-立即解锁'
+        },
+        next: function() {
+          _this.goOpen(source)
+        }
+      }
     }
   }
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/gift-friends-js/jy-gift-friends.mjs


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/gift-friends-js/jy-gift-friends.mjs.map


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/gift-friends-js/jy-gift-friends.umd.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/gift-friends-js/jy-gift-friends.umd.js.map


+ 36 - 3
src/web/staticres/common-module/mobile-portrayal-footer/js/mobile-portrayal-footer.js

@@ -1,7 +1,7 @@
 var mobileportrayalfootertemp = `
   <div class="mobile-portrayal-footer" v-show="islogin">
     <div class="m-footer-box">
-      <div class="footer-item" v-if="monitorshow" @click="monitorClick">
+      <div class="footer-item" v-if="monitorshow" v-bound-phone="bindPhoneMonitor()">
         <div :class="monitor?'footer-yjk':'footer-jk'">
         </div>
         <p class="footer-text" v-text="monitor?'已监控':'监控'"></p>
@@ -11,7 +11,7 @@ var mobileportrayalfootertemp = `
         </div>
         <p class="footer-text" v-text="claim?'已认领':'认领'"></p>
       </div>
-      <div class="footer-item" @click="setShareEvent" v-if="shareshow">
+      <div class="footer-item" @click="setShareEvent" v-bound-phone="bindPhoneSetShare()" v-if="shareshow">
         <div class="footer-fx">
         </div>
         <p class="footer-text">转给同事</p>
@@ -21,7 +21,7 @@ var mobileportrayalfootertemp = `
         </div>
         <p class="footer-text">分享</p>
       </div>
-      <div class="footer-item" @click="downLoad" v-if="downshow">
+      <div class="footer-item" @click="downLoad" v-bound-phone="bindPhoneDownLoad()" v-if="downshow">
         <div class="footer-xz">
         </div>
         <p class="footer-text">下载报告</p>
@@ -408,5 +408,38 @@ var mobilePortrayalFooter = {
       this.showIframe = true
     })
   },
+  bindPhoneSetShare: function () {
+    var _this = this
+    return {
+      props: {
+        name: '采购单位画像-转给同事'
+      },
+      next: function () {
+        _this.setShareEvent()
+      }
+    }
+  },
+  bindPhoneDownLoad: function () {
+    var _this = this
+    return {
+      props: {
+        name: '采购单位画像-下载报告'
+      },
+      next: function () {
+        _this.downLoad()
+      }
+    }
+  },
+  bindPhoneMonitor: function(){
+    var _this = this
+    return {
+      props: {
+        name: '采购单位画像-监控'
+      },
+      next: function () {
+        _this.monitorClick()
+      }
+    }
+  }
   }
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/plugins/js/jy-bind-phone.umd.js


+ 32 - 7
src/web/staticres/common-module/solution/js/data-interface.js

@@ -1,5 +1,8 @@
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var page = new Vue({
-  el: '#main-app',
+  el: '#app',
   delimiters: ['${', '}'],
   data: {
     platform: utils.$env.platform,
@@ -13,8 +16,8 @@ var page = new Vue({
   },
   mounted: function () {
     this.headerTransparent()
-    this.openCustomer()
-    this.goApiApply()
+    // this.openCustomer()
+    // this.goApiApply()
     this.scrollTopHandler()
     document.querySelector('#main-app ').addEventListener('scroll', this.scrollTopHandler)
   },
@@ -93,17 +96,17 @@ var page = new Vue({
     },
     // 联系客服
     openCustomer: function () {
-      $('.customer-button').click(function () {
+      // $('.customer-button').click(function () {
         if (utils.$envs.inWX) {
           window.location.href = '/big/wx/page/customer'
         } else {
           window.location.href = '/jyapp/free/customer'
         }
-      })
+      // })
     },
     // 接口申请
     goApiApply: function () {
-      $('.api-button').click(function () {
+      // $('.api-button').click(function () {
         if (utils.$envs.inWX) {
           location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=wx_data_api_interface'
         } else {
@@ -115,7 +118,7 @@ var page = new Vue({
             window.location.href = "/jyapp/free/login?url=" + encodeURIComponent(url)
           }
         }
-      })
+      // })
     },
     // 动画数字
     animateNumber: function (numberArr) {
@@ -130,6 +133,28 @@ var page = new Vue({
           console.error(demo.error);
         }
       })
+    },
+    bindPhoneCustomer: function() {
+      var _this = this
+      return {
+        props: {
+          name: '剑鱼数据接口-联系客服'
+        },
+        next: function() {
+          _this.openCustomer()
+        }
+      }
+    },
+    bindPhoneApply: function() {
+      var _this = this
+      return {
+        props: {
+          name: '剑鱼数据接口-接口申请'
+        },
+        next: function() {
+          _this.goApiApply()
+        }
+      }
     }
   }
 })

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/track/j-track.amd.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/track/j-track.es.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/web/staticres/common-module/track/j-track.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
src/web/staticres/vipsubscribe/css/vip_pay_success.css


+ 4 - 4
src/web/templates/big-member/wx/page_free_buyer_project_news.html

@@ -220,7 +220,7 @@
                 <span v-else @click="changeList">表格显示</span>
               </div>
               <div class="export">
-                            <span @click="onExport">
+                            <span @click="onExport" v-bound-phone="bindPhoneDataExport('采购单位画像-更多招标动态-数据导出')">
                                 <i class="j-icon base-icon icon-download"></i>
                                 <em id="mainSearch-selLable-dataExport">数据导出</em>
                             </span>
@@ -242,11 +242,10 @@
                         class="project-info-item bg-white border-line-b clickable"
                         :class="{ visited: item.visited }"
                         :immediate-check="false"
-                        @click="goToDetail(item)"
                         :key="item.id">
                         <div class="head-group">
-                          <div class="project-name visited-hd">${ item.title }</div>
-                          <span class="icon" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                          <div class="project-name visited-hd" @click="goToDetail(item)">${ item.title }</div>
+                          <span class="icon" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeepStatus(item, '采购单位画像-招标动态-收藏')"></span>
                         </div>
                         <div class="project-info">
                             <span class="tags">
@@ -368,6 +367,7 @@
         }
     </script>
     {{include "/big-member/wx/commonjs.html"}}
+    <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>

+ 4 - 4
src/web/templates/big-member/wx/page_free_ent_project_news.html

@@ -88,7 +88,7 @@
               <span v-else @click="changeList">表格显示</span>
             </div>
             <div class="export">
-              <span @click="onExport">
+              <span @click="onExport" v-bound-phone="bindPhoneDataExport('企业画像-中标动态-数据导出')">
                 <i class="j-icon base-icon icon-download"></i>
                 <em id="mainSearch-selLable-dataExport">数据导出</em>
               </span>
@@ -110,12 +110,11 @@
               class="project-info-item bg-white border-line-b clickable"
               :class="{ visited: item.visited }"
               :immediate-check="false"
-              @click="goToDetail(item)"
               :key="item.id">
               <!--                            <div class="project-name">${ item.title }</div>-->
               <div class="head-group">
-                <div class="project-name visited-hd" style="flex: 1">${ item.title }</div>
-                <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                <div class="project-name visited-hd" style="flex: 1" @click="goToDetail(item)">${ item.title }</div>
+                <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeepStatus(item, '企业画像-中标动态-收藏')"></span>
               </div>
               <div class="project-info">
                                 <span class="tags">
@@ -238,6 +237,7 @@
         }
     </script>
     {{include "/big-member/wx/commonjs.html"}}
+    <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>

+ 37 - 11
src/web/templates/big-member/wx/page_landingPage.html

@@ -19,7 +19,7 @@
         <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css" />
         <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/public.css?v={{Msg "seo" "version"}}'>
         <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/j-icons.css?v={{Msg "seo" "version"}}'>
-        <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/page_landingPage_new.css?v={{Msg "seo" "version"}}1'>
+        <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/page_landingPage_new.css?v={{Msg "seo" "version"}}'>
         <style>
             #zc__sdk__sys__btn {
                 display: none;
@@ -140,8 +140,8 @@
                 <div>
                     <img src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemB_04.png'>
                 </div>
-                <div class="btn_buy" id="btn_buy" @click="exper_fun('sj', 1)"  style="background-color:#1A1A2A;margin-top: -0.01rem; ">
-                    <img data-need-bind-phone src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemB_05.jpg' alt="" class="btn_buy_img" id="btn_buy_img" >
+                <div class="btn_buy" id="btn_buy" @click="exper_fun('sj', 1)" v-bound-phone="bindPhoneGoSee()"  style="background-color:#1A1A2A;margin-top: -0.01rem; ">
+                    <img  src='{{Msg "seo" "cdn"}}/big-member/image/landpage_new/itemB_05.jpg' alt="" class="btn_buy_img" id="btn_buy_img" >
                 </div>
             </div>
             <!-- 为什么选择 -->
@@ -166,24 +166,25 @@
         <div class="j-footer " v-show="isCantrial" style="background-color: #1A1A2A">
             <div class="j-button-group btbt">
                 <div class="buy_btn" v-if="onlyBuy">
-                      <div class="sevendays j-btn" @click="exper_fun()">
-                          <div data-need-bind-phone  style="color: #FAE7CA">立即体验</div>
+                      <div class="sevendays j-btn" @click="exper_fun()" v-bound-phone="bindPhoneGoSee()">
+                          <div  style="color: #FAE7CA">立即体验</div>
                       </div>
-                      <div class="j-button-now j-btn" @click="linkBuy('sj',6)" >
-                          <div data-need-bind-phone style="color: #1A1A2A">点击购买</div>
+                      <div class="j-button-now j-btn" @click="linkBuy('sj',6)" v-bound-phone="bindPhoneGoBuy('sj', 6)">
+                          <div style="color: #1A1A2A">点击购买</div>
                       </div>
                 </div>
                 <div class="buy_btn" v-else>
-                    <div class="j-button-nowly j-btn" @click="linkBuy('sj',6)">
-                        <div data-need-bind-phone>立即购买</div>
+                    <div class="j-button-nowly j-btn" @click="linkBuy('sj',6)" v-bound-phone="bindPhoneGoBuy('sj', 6)">
+                        <div>立即购买</div>
                     </div>
                 </div>
             </div>
         </div>
     </div>
-    <script src="https://cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js"> </script>
-    <script src="https://cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/vant.min.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>
     <script src="https://cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js"> </script>
+    <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script>
         {{$ss1:=(Ad "app-banner-data-info" -1 .Host (cookie "SESSIONID"))}}
         var headerImageList={{$ss1}}
@@ -220,6 +221,9 @@
         return flag1 || flag2
 
     }
+    try {
+      Vue.use(TestBindPhone)
+    } catch (error) {}
     var vNode = {
         delimiters: ['${', '}'],
         el: '#v-commit',
@@ -390,6 +394,28 @@
               } catch (e) {
                 console.log('未初始化百度统计')
               }
+            },
+            bindPhoneGoSee: function() {
+              var _this = this
+              return {
+                props: {
+                  source: '大会员落地页-立即体验'
+                },
+                next: function() {
+                  _this.exper_fun()
+                }
+              }
+            },
+            bindPhoneGoBuy: function(res, i) {
+              var _this = this
+              return {
+                props: {
+                  name: '大会员落地页-立即购买'
+                },
+                next: function() {
+                  _this.linkBuy(res, i)
+                }
+              }
             }
         }
     }

+ 6 - 5
src/web/templates/big-member/wx/page_unit_portrayal.html

@@ -357,7 +357,7 @@
                 <!-- 免费用户采购单位全景分析提示 -->
                 <div v-if="getfreeBuyerPort" class="free-give">
                     <div class="go-text"> 免费赠送1次【采购单位全景分析】权益体验机会!</div>
-                    <div class="go-btn"  @click="goGiveAnalysis">去解锁</div>
+                    <div class="go-btn"  @click="goGiveAnalysis" v-bound-phone="bindPhoneGoGiveAnalysis()">去解锁</div>
                 </div>
                 <div v-if="getStatus" key="txl">
                     <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/01-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
@@ -377,7 +377,7 @@
                                 <span class="module-title-num">${dt.total}</span>
                             </div>
                             <div class="action-group">
-                                <div class="action-button export" @click="onExport" v-if="dt.list.length">
+                                <div class="action-button export" @click="onExport" v-bound-phone="bindPhoneDataExport()" v-if="dt.list.length">
                                     <i class="j-icon base-icon icon-download"></i>
                                     <em id="mainSearch-selLable-dataExport" class="action-button-text">数据导出</em>
                                 </div>
@@ -396,7 +396,7 @@
                                 <div class="d_list" :class="{ visited: item.visited }" v-for="(item,index) in dt.list" @click="goDetail(item)" data-cl-event="c_wx_free_buttonclick">
                                 <div class="head-group">
                                     <p class="i_title visited-hd">${item.title}</p>
-                                    <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                                    <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeep(item)"></span>
                                 </div>
                                     <div class="i_info">
                                         <p class="area_type">
@@ -415,7 +415,7 @@
                                 <div v-if="getStatus" class="dt-text-tips light-bg">
                                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${dt.updateTime},您可
                                   <!-- 免费用户 -->
-                                  <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                                  <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                                   <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                                   <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                                   <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -438,7 +438,7 @@
                                 <div v-if="getStatus" class="dt-text-tips">
                                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${dt.updateTime},您可
                                    <!-- 免费用户 -->
-                                   <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                                   <span class="highlight-text" v-if="userInfo.isFree" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                                    <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                                    <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                                    <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -824,6 +824,7 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/echarts_option.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/chart_options.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/buyer-example.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>

+ 25 - 1
src/web/templates/exhibition/weixin/index.html

@@ -18,6 +18,8 @@
   <meta content="telephone=no" name="format-detection" />
   <meta content="行业展会" name="enable-header" data-theme="dark" />
   <script src='{{Msg "seo" "cdn"}}/big-member/js/rem.js?v={{Msg "seo" "version"}}'></script>
+  <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 />
   {{include "/common/weixin.html"}}
   <link rel="stylesheet" href="{{Msg " seo" "cdn" }}/common-module/exhibition/css/reset.css?v={{Msg "seo" "version"}}" />
   <link rel="stylesheet" href="{{Msg " seo" "cdn" }}/common-module/exhibition/css/swiper.css?v={{Msg "seo" "version"}}" />
@@ -249,13 +251,16 @@
       </div>
       <!-- 移动底部-->
       <div class="footer pc_hide">
-        <div class="btn" onclick="go_kf()">洽谈展会合作</div>
+        <div class="btn" onclick="go_kf()" v-bound-phone="bindPhoneGoCustomer()">洽谈展会合作</div>
       </div>
     </div>
   </div>
   <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
   <script src='{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}' type="text/javascript"></script>
   <script src='{{Msg "seo" "cdn"}}/js/jquery.cookie.js?v={{Msg "seo" "version"}}' type="text/javascript"></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='{{Msg " seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src="{{Msg " seo" "cdn" }}/common-module/exhibition/js/swiper.js?v={{Msg "seo" "version" }}"></script>
   <!-- 本身逻辑js -->
   <script src="{{Msg " seo" "cdn" }}/common-module/exhibition/js/index.js?v={{Msg "seo" "version" }}"></script>
@@ -271,6 +276,25 @@
       }
 
     }
+    try {
+      Vue.use(TestBindPhone)
+    } catch (error) {}
+    new Vue({
+      el: '#vm_exhibition',
+      delimiters: ['${', '}'],
+      methods: {
+        bindPhoneGoCustomer: function() {
+          return {
+            props: {
+              name: '行业展会-洽谈展会合作'
+            },
+            next: function () {
+              go_kf()
+            }
+          }
+        }
+      },
+    })
   </script>
   {{include "/common/baiducc.html"}}
 </body>

+ 2 - 1
src/web/templates/frontRouter/wx/bidedoc/sess/index.html

@@ -52,7 +52,7 @@
           <img src='{{Msg "seo" "cdn"}}/common-module/bidedoc/image/B_09.jpg?v={{Msg "seo" "version"}}' alt="">
           <div class="btns-tips">
             <div class="btns">
-                <van-button type="primary" size="large" @touchstart="getMsg">请留下您的手机号,专业老师将尽快和您联系</van-button>
+                <van-button type="primary" size="large" v-bound-phone="bindPhoneGetMsg()">请留下您的手机号,专业老师将尽快和您联系</van-button>
             </div>
           </div>
         </div>
@@ -65,6 +65,7 @@
   <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
   <!--E-当前页面的资源-->
   {{include "/big-member/commonjs.html"}}
+  <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Msg "seo" "cdn"}}/common-module/bidedoc/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
   <script>

+ 7 - 6
src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html

@@ -196,7 +196,7 @@
                                 <div class="ent-info-label">企业通讯录</div>
                                 <div class="ent-info-text">
                                     <p>${entBaseInfo.phone ? entBaseInfo.phone : '-'}</p>
-                                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock">解锁查看</p>
+                                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock" v-bound-phone="bindPhoneUnlock()">解锁查看</p>
                                 </div>
                             </div>
                         </div>
@@ -294,7 +294,7 @@
                 </van-tab>
                 <!-- 工商变动 -->
                 <van-tab :name="moduleList[1].name" :title="moduleList[1].title">
-                    <div class="module-title-container bg-white tab-card ent-change-history" @click="goToEntHistory">
+                    <div class="module-title-container bg-white tab-card ent-change-history" @click="goToEntHistory" v-bound-phone="bindPhoneEntHistory()">
                         <div class="module-title ent-change-l">
                             <span>工商变动</span>
                             <!-- <span class="module-title-num">10</span> -->
@@ -325,7 +325,7 @@
                                 <span class="module-title-num">${topProject.total}</span>
                             </div>
                             <div class="action-group" key="action-group">
-                                <div class="action-button export" @click="onExport" v-if="topProject.list.length">
+                                <div class="action-button export" @click="onExport" v-bound-phone="bindPhoneDataExport()" v-if="topProject.list.length">
                                     <i class="j-icon base-icon icon-download"></i>
                                     <em class="action-button-text">数据导出</em>
                                 </div>
@@ -350,7 +350,7 @@
                                     @click="toProjectDetail(item)">
                                     <div class="head-group">
                                         <p class="i_title visited-hd">${item.title}</p>
-                                        <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
+                                        <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'"  @click.stop="addKeepStatus(item)" v-bound-phone="bindPhoneAddKeep(item)"></span>
                                     </div>
                                     <div class="project-name" v-if="false">${item.title}</div>
                                     <div class="project-info">
@@ -370,7 +370,7 @@
                                 <li v-if="powerInfo.power.indexOf(4) == -1 && ((isFree && !canFreeTrial) || updateVipStatus || customerServiceStatus)" class="dt-text-tips light-bg">
                                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${topProject.updateTime},您可
                                   <!-- 免费用户 -->
-                                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                                   <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                                   <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                                   <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -393,7 +393,7 @@
                                 <div v-if="(isFree && !canFreeTrial) || updateVipStatus || customerServiceStatus" class="dt-text-tips">
                                   免费用户支持查看最近30条招标动态,数据更新频率为每周1次,最近更新时间为${topProject.updateTime},您可
                                   <!-- 免费用户 -->
-                                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
+                                  <span class="highlight-text" v-if="(isFree && !canFreeTrial)" @click="onDtTextClick('buy')" v-bound-phone="bindPhoneDtTextClick('buy')">开通超级订阅实时查看更多数据</span>
                                   <!-- 老版超级订阅用户、新版超级订阅(购买非全国)用户余额为0 -->
                                   <span class="highlight-text" v-if="updateVipStatus" @click="onDtTextClick('update')">升级超级订阅实时查看更多数据</span>
                                   <!-- 新版超级订阅(购买全国)用户余额为0、大会员自定义用户、商机管理用户 -->
@@ -741,6 +741,7 @@
 <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js></script>
 {{include "/big-member/wx/commonjs.html"}}
 <script src='{{Msg "seo" "cdn"}}/antiRes/js/mainHook.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/vip-dialog.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/echarts_option.js?v={{Msg "seo" "version"}}'></script>

+ 4 - 0
src/web/templates/frontRouter/wx/collection/sess/ent_portrait_change.html

@@ -88,9 +88,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='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/vip-dialog.js?v={{Msg "seo" "version"}}'></script>
 {{include "/big-member/commonjs.html"}}
 <script>
+try {
+  Vue.use(TestBindPhone)
+} catch (error) {}
 var vNode = {
     delimiters: ['${', '}'],
     el: '#ent-portrait-change',

+ 2 - 1
src/web/templates/frontRouter/wx/declaration/free/relationship.html

@@ -46,7 +46,7 @@
             <div class="fixed-bottom intro-leave-banner">
                 <div class="text-container">
                     <p class="intro-text">剑鱼可帮助您快速达成业绩倍增</p>
-                    <button class="intro-button button-blink" @click="applyToTrial">申请免费试用</button>
+                    <button class="intro-button button-blink" @click="applyToTrial" v-bound-phone="bindPhoneApplyToTrial()">申请免费试用</button>
                 </div>
                 <div class="img-container">
                     <img src="{{Msg "seo" "cdn"}}/common-module/bidedoc/image/relationship/bottom-banner-mask@2x.png?v={{Msg "seo" "version"}}" alt="" class="img-content">
@@ -60,6 +60,7 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js> </script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/lodash/4.17.21/lodash.min.js></script>
     {{include "/big-member/wx/commonjs.html"}}
+    <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/bidedoc/js/relationship.js?v={{Msg "seo" "version"}}'></script>
 </body>
 

+ 16 - 2
src/web/templates/frontRouter/wx/partner/sess/index.html

@@ -74,7 +74,7 @@
           <img src='{{Msg "seo" "cdn"}}/common-module/partner/image/B_05.jpg?v={{Msg "seo" "version"}}' alt="">
           <div class="btns-tips">
             <div class="btns">
-                <van-button type="primary" size="large" @touchstart="getMsg">申请加入</van-button>
+                <van-button type="primary" size="large" v-bound-phone="bindPhoneJoin()">申请加入</van-button>
             </div>
           </div>
         </div>
@@ -86,10 +86,13 @@
   <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/jquery/3.6.0/jquery.min.js></script>
   <script src='{{Msg "seo" "cdn"}}/common-module/partner/js/partner.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
   <!--E-当前页面的资源-->
   {{include "/big-member/commonjs.html"}}
   <script>
-    
+    try {
+      Vue.use(TestBindPhone)
+    } catch (error) {}
     var vm = new Vue({
       el: '#partner',
       delimiters: ['{', '}'],
@@ -104,6 +107,17 @@
       methods: {
         getMsg() {
           location.href = '/weixin/frontPage/bigmember/free/perfect_info_partner?source=partner_recruit_page'
+        },
+        bindPhoneJoin: function() {
+          var _this = this
+          return {
+            props: {
+              name: '渠道合作-申请加入'
+            },
+            next: function() {
+              _this.getMsg()
+            }
+          }
         }
       }
     })

+ 5 - 4
src/web/templates/frontRouter/wx/solution/free/dataInterface.html

@@ -15,8 +15,8 @@
 </head>
 
 <body>
-    <div class="j-container app">
-        <div class="j-main" id="main-app" v-cloak>
+    <div class="j-container app" id="app" v-cloak>
+        <div class="j-main" id="main-app">
             <div class="content-banner">
                 <img class="img-content" src='{{Msg "seo" "cdn"}}/common-module/solution/image/interface-header-top-banner@2x.png'>
             </div>
@@ -209,8 +209,8 @@
         </div>
         <div class="j-footer">
           <div class="j-button-group-new">
-            <button class="j-button-left customer-button">联系客服</button>
-            <button class="j-button-right api-button">接口申请</button>
+            <button class="j-button-left customer-button" v-bound-phone="bindPhoneCustomer()">联系客服</button>
+            <button class="j-button-right api-button" v-bound-phone="bindPhoneApply()">接口申请</button>
           </div>
         </div>
     </div>
@@ -219,6 +219,7 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js> </script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/countup/2.0.8/dist/countUp.js></script>
     {{include "/big-member/wx/commonjs.html"}}
+    <script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
     <script src='{{Msg "seo" "cdn"}}/common-module/solution/js/data-interface.js?v={{Msg "seo" "version"}}'></script>
 </body>
 

+ 30 - 4
src/web/templates/frontRouter/wx/solution/sess/index.html

@@ -61,11 +61,11 @@
 			</div>
 		</div>
 		<div class="j-button-group">
-			<a class="j-button-cancel" id="j_cancel">
+			<a v-bound-phone="bindPhoneLearnMore()" class="j-button-cancel" id="j_cancel">
 				<!-- <span class="phone_icon"></span> -->
 				<span>了解详情</span>
 			</a>
-            <button class="j-button-confirm" onclick="location.href = '/big/wx/page/customer'" id="j_confirm">
+            <button v-bound-phone="bindPhoneCustomer()" class="j-button-confirm" id="j_confirm">
               <span class="icon_phone"></span>
               <span>立即咨询</span>
             </button>
@@ -76,6 +76,7 @@
 <script src='{{Msg "seo" "cdn"}}/structuredata/mobile/js/jquery.min.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>
+<script src='{{Msg "seo" "cdn"}}/common-module/plugins/js/jy-bind-phone.umd.js?v={{Msg "seo" "version"}}'></script>
 <script>
 	(function() {
 		var ad_from = getParam("adv_from");
@@ -99,9 +100,12 @@
 		r = null;
 		return context == null || context == "" || context == "undefined" ? "" : context;
 	}
-  $("#j_cancel").on('click', learn_more)
+  // $("#j_cancel").on('click', learn_more)
+  try {
+    Vue.use(TestBindPhone)
+  } catch (error) {}
   var vmSol = new Vue({
-    el: '#advantage',
+    el: '#app',
     data: {
       show: false,
       index: 0,
@@ -112,6 +116,28 @@
     methods: {
       imageView: function(index) {
         this.show = true
+      },
+      bindPhoneLearnMore: function() {
+        var href = '/weixin/frontPage/bigmember/free/perfect_info_solution?source=telecom_solution'
+        return {
+          props: {
+            name: '行业解决方案-了解详情'
+          },
+          next: function () {
+            window.location.href= href
+          }	
+        }
+      },
+      bindPhoneCustomer: function() {
+        var href = '/big/wx/page/customer'
+        return {
+          props: {
+            name: '行业解决方案-立即咨询'
+          },
+          next: function () {
+            window.location.href= href
+          }
+        }
       }
     }
   })

+ 88 - 1
src/web/templates/order/pc/paySuccess.html

@@ -20,6 +20,7 @@
     <link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "version"}}" rel="stylesheet">
     <link rel="stylesheet" type="text/css"
           href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}"/>
+          <link href="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/theme-chalk/index.css" rel="stylesheet" />
     <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}23"></script>
   <style>
     .active-tip-group {
@@ -45,6 +46,19 @@
       /* display: block; */
       /* border-radius: 6px; */
     }
+    .gift_friends_btn {
+      margin-top: 16px;
+      text-align: center;
+    }
+    .gift_friends_btn button {
+      padding: 5px 36px;
+      background: #fff;
+      border: 1px solid #2ABED1;
+      border-radius: 16px;
+      color: #2ABED1;
+      font-size: 14px;
+      line-height: 22px;
+    }
   </style>
 </head>
 <body>
@@ -104,6 +118,11 @@
             {{else if eq .T.orderType "dataexport"}}
                 <p class="c_t_tips"> 我们会尽快将历史数据发送至{{.T.email}}邮箱,请稍后查阅。</p>
             {{end}}
+            {{if and (eq .T.orderType "subvip") (eq .T.positionType "0") (ne .T.vipType 1) (ne .T.vipType 2)}}
+              <div class="gift_friends_btn" v-if="isShowGift">
+                <button @click="openGiftFriendsDialog">将超级订阅赠送给好友</button>
+              </div>
+            {{end}}
         </div>
         <div class="c_bottom">
             <p class="order_item">
@@ -185,10 +204,15 @@
 {{include "/common/pcbottom.html"}}
 
 <script src='{{Msg "seo" "cdn"}}/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/element-ui/2.15.13-rc/lib/index.js"></script>
 <!-- 广告位加载 公共js方法 -->
 <script src="{{Msg "seo" "cdn"}}/common-module/message-tip/js/index.js?v={{Msg "seo" "version"}}"></script>
-
+<script src="{{Msg "seo" "cdn"}}/common-module/gift-friends-js/jy-gift-friends.umd.js?v={{Msg "seo" "version"}}"></script>
+<!-- <script src="{{Msg "seo" "cdn"}}/common-module/gift-friends-js/jy-gift-friends.mjs?v={{Msg "seo" "version"}}"></script> -->
 <script type="text/javascript">
+
+
     var myPageNavIsNormal = true;
     var orderType = {{.T.orderType}}
     console.dir(4444444)
@@ -241,6 +265,10 @@
 
     }
 
+    $('.gift_friends_btn>button').click(function () {
+      console.info(window.$GiftFriendsDialog, 'window.$GiftFriendsDialog')
+    })
+
 
     function getFilePackInfo () {
         $.ajax({
@@ -337,6 +365,7 @@
         })
         }
     });
+    
     // 格式化金钱的函数
     // s: 金额(number) 必传
     // n: 保留小数的位数(int:0-100)
@@ -430,6 +459,64 @@
       }
     }
 </script>
+<script>
+
+  // 引入GiftFriends送给朋友超级订阅插件
+  try {
+    Vue.use(GiftFriends.install);
+    Vue.use(GiftFriends.registryToast)
+  } catch (error) {
+    console.error(error)
+  }
+   var GiftFriendsDialogVm = new Vue({
+        delimiters: ['${', '}'],
+        el: '.pay_success',
+        data () {
+          return {
+            isShowGift: false,
+          }
+        },
+        created() {
+          this.fetchConfigTime()
+        },
+
+        methods: {
+          openGiftFriendsDialog() {
+            this.$GiftFriendsDialog({
+              props: {
+                visible: true
+              }
+            })
+          },
+          async fetchConfigTime() {
+            try {
+              const res = await  $.ajax({
+                url: '/subscribepay/vip/gift/configuration',
+                type: 'post'
+              })
+              console.info(res, 'res')
+              const { error_code: code, data } = res
+              if (code === 0) {
+                // 获取当前时间戳
+                const currentTime = Math.floor(Date.now() / 1000)
+                // 判断是否过期
+                const { startTime, endTime } = data
+                if (startTime < currentTime && currentTime < endTime) {
+                  this.isShowGift = true
+                }
+                else {
+                  this.isShowGift = false
+                }
+              }
+            } catch (error) {
+              
+            }
+           
+          },
+        }
+   })
+
+</script>
 
 {{include "/common/baiducc.html"}}
 </body>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно