Sfoglia il codice sorgente

Merge branch 'master' into feature/v4.8.10

lianbingjie 2 anni fa
parent
commit
2a47c37784
100 ha cambiato i file con 4001 aggiunte e 530 eliminazioni
  1. 17 1
      src/config.json
  2. 3 2
      src/config.yaml
  3. 3 3
      src/go.mod
  4. 4 4
      src/go.sum
  5. 2 1
      src/jfw/filter/pcfilter.go
  6. 18 0
      src/jfw/front/bankScheme.go
  7. 41 0
      src/jfw/front/dataMarket.go
  8. 1 22
      src/jfw/front/front.go
  9. 18 18
      src/jfw/front/frontRouter.go
  10. 5 108
      src/jfw/front/swordfish.go
  11. 25 25
      src/jfw/front/tags.go
  12. 0 5
      src/jfw/front/test/http-client.env.json
  13. 0 26
      src/jfw/front/test/test.http
  14. 620 0
      src/jfw/jyutil/classroomiInfo.go
  15. 54 40
      src/jfw/jyutil/jyCms.go
  16. 14 0
      src/jfw/jyutil/jysite.go
  17. 40 0
      src/jfw/jyutil/jyutil.go
  18. 1 0
      src/jfw/modules/app/src/app/filter/loginfilter.go
  19. 17 0
      src/jfw/modules/app/src/app/front/bankScheme.go
  20. 1 1
      src/jfw/modules/app/src/go.mod
  21. 2 2
      src/jfw/modules/app/src/go.sum
  22. 566 0
      src/jfw/modules/app/src/web/templates/frontRouter/bigmember/free/perfect_info_bank.html
  23. 110 0
      src/jfw/modules/app/src/web/templates/site/page/bankLanding/index.html
  24. 1 1
      src/jfw/modules/subscribepay/src/go.mod
  25. 2 2
      src/jfw/modules/subscribepay/src/go.sum
  26. 307 237
      src/jfw/modules/subscribepay/src/service/dataExportPay.go
  27. 19 0
      src/jfw/paging/paging.go
  28. 105 0
      src/jfw/site/IndustryInfo/IndustryInfo.go
  29. 72 0
      src/jfw/site/IndustryInfo/service.go
  30. 18 0
      src/jfw/site/a_init.go
  31. 15 0
      src/jfw/site/bank/bankScheme.go
  32. 121 0
      src/jfw/site/helpCenter/helpCenter.go
  33. 92 0
      src/jfw/site/helpCenter/service.go
  34. 89 0
      src/jfw/site/jySchool/school.go
  35. 122 0
      src/jfw/site/jySchool/service.go
  36. 42 0
      src/jfw/site/jyblog/entity.go
  37. 118 0
      src/jfw/site/jyblog/service.go
  38. 17 0
      src/jfw/tag/a_init.go
  39. 194 0
      src/jfw/tag/menu.go
  40. 26 0
      src/jfw/tag/util.go
  41. 5 9
      src/main.go
  42. 96 0
      src/web/staticres/common-module/consult-dialog/css/index.css
  43. BIN
      src/web/staticres/common-module/consult-dialog/images/close.png
  44. 88 0
      src/web/staticres/common-module/consult-dialog/js/index.js
  45. 9 4
      src/web/staticres/common-module/pc-dialog/css/leave-info-dialog.css
  46. BIN
      src/web/staticres/common-module/pc-dialog/image/leave-title-api.png
  47. BIN
      src/web/staticres/common-module/pc-dialog/image/leave-title-custom.png
  48. 34 8
      src/web/staticres/common-module/pc-dialog/js/leave-info-dialog.js
  49. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/bg-1.png
  50. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/bg-2.png
  51. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/bg-3.png
  52. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/bg-4.png
  53. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/bg-head.png
  54. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/ic-1.png
  55. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/ic-2.png
  56. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/img-1.png
  57. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/img-2.png
  58. BIN
      src/web/staticres/common-module/site/page/bankLanding/images/img-3.png
  59. 246 0
      src/web/staticres/common-module/site/page/bankLanding/index.css
  60. 7 0
      src/web/staticres/common-module/site/page/bankLanding/index.js
  61. 72 11
      src/web/staticres/css/pc.css
  62. 522 0
      src/web/staticres/frontRouter/pc/customExport/css/index.css
  63. BIN
      src/web/staticres/frontRouter/pc/customExport/image/bg-icon1@2x.png
  64. BIN
      src/web/staticres/frontRouter/pc/customExport/image/bg-icon2@2x.png
  65. BIN
      src/web/staticres/frontRouter/pc/customExport/image/bottom-fixed-ad.png
  66. BIN
      src/web/staticres/frontRouter/pc/customExport/image/bottom-fixed-button.png
  67. BIN
      src/web/staticres/frontRouter/pc/customExport/image/box-icon1@2x.png
  68. BIN
      src/web/staticres/frontRouter/pc/customExport/image/box-icon2@2x.png
  69. BIN
      src/web/staticres/frontRouter/pc/customExport/image/box-icon3@2x.png
  70. BIN
      src/web/staticres/frontRouter/pc/customExport/image/close.png
  71. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-bg.png
  72. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-icon1.png
  73. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-icon2.png
  74. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-icon3.png
  75. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-icon4.png
  76. BIN
      src/web/staticres/frontRouter/pc/customExport/image/core-title.png
  77. BIN
      src/web/staticres/frontRouter/pc/customExport/image/dzfw-text.png
  78. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-icon1.png
  79. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-icon2.png
  80. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-icon3.png
  81. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-icon4.png
  82. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-text1.png
  83. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-text2.png
  84. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-text3.png
  85. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-text4.png
  86. BIN
      src/web/staticres/frontRouter/pc/customExport/image/export-b-title.png
  87. BIN
      src/web/staticres/frontRouter/pc/customExport/image/jbzx-text.png
  88. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-bg.png
  89. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-icon1.png
  90. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-icon2.png
  91. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-icon3.png
  92. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-icon4.png
  93. BIN
      src/web/staticres/frontRouter/pc/customExport/image/process-title.png
  94. BIN
      src/web/staticres/frontRouter/pc/customExport/image/report-bg1.png
  95. BIN
      src/web/staticres/frontRouter/pc/customExport/image/report-title.png
  96. BIN
      src/web/staticres/frontRouter/pc/customExport/image/sjdc-text.png
  97. BIN
      src/web/staticres/frontRouter/pc/customExport/image/solution-bg1.png
  98. BIN
      src/web/staticres/frontRouter/pc/customExport/image/solution-bg2.png
  99. BIN
      src/web/staticres/frontRouter/pc/customExport/image/solution-bg3.png
  100. BIN
      src/web/staticres/frontRouter/pc/customExport/image/solution-bg4.png

+ 17 - 1
src/config.json

@@ -396,5 +396,21 @@
     "limitDay": 7,
     "limitCount": 3
   },
-  "workDesktopUrl":"/page_workDesktop/work-bench/page?aside=0&link="
+  "workDesktopUrl":"/page_workDesktop/work-bench/page?aside=0&link=",
+  "columnCode":{
+    "招投标攻略": "ztbgl",
+    "行业资讯": "hyzx",
+    "帮助中心": "bzzx"
+  },
+  "libraryTopList": "http://192.168.3.240:822/jydocs/topList?sign=new&num=%v",
+  "industryInfoUrl":{
+    "homeUrl": "/industryInfo/index",
+    "towUrl": "/industryInfo/%s/index.html"
+  },
+  "jySchoolUrl":{
+    "homeUrl": "/jySchool/strategy",
+    "towUrl": "/jySchool/%s/index.html"
+  },
+  "dataMarketShowAB": 0,
+  "activityApi": "http://127.0.0.1:8888"
 }

+ 3 - 2
src/config.yaml

@@ -1,7 +1,8 @@
 etcd:
   hosts:
-  - 192.168.3.149:2379
+  - 192.168.3.206:2379
 userCenterKey: "usercenter.rpc" #用户中台rpc
 powerCheckCenterKey: "powercheck.rpc" #权益校验中台
 resourceCenterKey: "resource.rpc" #资源中台
-entManageApplication: "entmanageapplication.rpc" #企业管理中台
+entManageApplication: "entmanageapplication.rpc" #企业管理中台
+activityKey: "activity.rpc" #营销中台rpc

+ 3 - 3
src/go.mod

@@ -3,20 +3,21 @@ module jy/src
 go 1.18
 
 require (
+	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230307011807-2ef7ef8e0c09
 	app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a
-	app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62
+	app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/dchest/captcha v1.0.0
 	github.com/fsnotify/fsnotify v1.6.0
 	github.com/gogf/gf/v2 v2.3.1
 	github.com/robfig/cron v1.2.0
+	github.com/zeromicro/go-zero v1.4.4
 	go.mongodb.org/mongo-driver v1.11.1
 )
 
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
-	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
 	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230222052351-9d6fad062447 // indirect
@@ -83,7 +84,6 @@ require (
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
-	github.com/zeromicro/go-zero v1.4.4 // indirect
 	github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb // indirect
 	go.etcd.io/etcd/api/v3 v3.5.5 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect

+ 4 - 4
src/go.sum

@@ -1,13 +1,13 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 h1:cCmWQW8DUBD2nuZNDz9aIe6MrlioxTbdaA2YiJhlzjY=
-app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:JvIs8uKjdT963+7JnZGIEcL4ctBiBjwkoz0kNyigE78=
+app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230307011807-2ef7ef8e0c09 h1:ckax2O7nHCFa0RD1qM7cUYaPNQQpR9j+kimXdyDOiQk=
+app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230307011807-2ef7ef8e0c09/go.mod h1:JvIs8uKjdT963+7JnZGIEcL4ctBiBjwkoz0kNyigE78=
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a h1:wD4aWPSYdiX1cIP4lzzPD2s7fYhKa3muIf97l9tonJE=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62 h1:HNoByTbAT3juYEPQqScQ902LbSE8WKYJD5LZhJNUYQE=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca h1:1vX1uTIRH05n+RXGBi7nAP+H41xBfk9/OUUiReeyKv4=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 2 - 1
src/jfw/filter/pcfilter.go

@@ -62,7 +62,8 @@ func (this *pcFilter) Do() bool {
 			} else {
 				//与redis中的session不一致 本账号退出登录
 				redis.Del("session", sessid)
-				http.SetCookie(this.W, this.cookie("", "userid_secure"))
+				//http.SetCookie(this.W, this.cookie("", "userid_secure"))
+				jyutil.ClearCookie(this.W, fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
 			}
 		}
 	} else {

+ 18 - 0
src/jfw/front/bankScheme.go

@@ -0,0 +1,18 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+)
+
+type BankSchemeCommon struct {
+	*xweb.Action
+	bankScheme xweb.Mapper `xweb:"/bank/(\\w+)/scheme"` //银行解决方案
+}
+
+func init() {
+	xweb.AddAction(&BankSchemeCommon{})
+}
+func (w *BankSchemeCommon) BankScheme(doType string) error {
+	return w.Render(fmt.Sprintf("/site/page/bankLanding/%s/index.html", doType), &w.T)
+}

+ 41 - 0
src/jfw/front/dataMarket.go

@@ -0,0 +1,41 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"jy/src/jfw/config"
+)
+
+// DataMarket 数据市场
+type DataMarket struct {
+	*xweb.Action
+	index         xweb.Mapper `xweb:"/front/dataMarket/index"`         //数据市场首页
+	customExport  xweb.Mapper `xweb:"/front/dataMarket/customExport"`  //数据定制导出
+	dataInterface xweb.Mapper `xweb:"/front/dataMarket/dataInterface"` //数据Api接口
+}
+
+func init() {
+	xweb.AddAction(&DataMarket{})
+}
+
+// Index 数据市场首页
+func (this *DataMarket) Index() {
+	this.Render("/dataMarket/index.html")
+}
+
+// CustomExport 数据定制导出
+func (this *DataMarket) CustomExport() {
+	showA := false
+	if uA := this.Header("User-Agent"); uA != "" {
+		fmt.Println(int(uA[len(uA)-1])/10, "<", common.IntAll(config.Sysconfig["dataMarketShowAB"]), int(uA[len(uA)-1])/10 < common.IntAll(config.Sysconfig["dataMarketShowAB"]))
+		showA = int(uA[len(uA)-1])/10 < common.IntAll(config.Sysconfig["dataMarketShowAB"])
+	}
+	this.T["AB"] = showA
+	this.Render("/dataMarket/customExport/index.html")
+}
+
+// DataInterface 数据Api接口
+func (this *DataMarket) DataInterface() {
+	this.Render("/dataMarket/dataInterface/index.html")
+}

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

@@ -9,7 +9,6 @@ import (
 	"jy/src/jfw/wx"
 	"log"
 	"math/rand"
-	"net/http"
 	"net/url"
 	"regexp"
 	"strconv"
@@ -669,31 +668,11 @@ func (f *Front) SignOut() error {
 		config.Middleground.PowerCheckCenter.DelCheckRedis("10000", positionId)
 	}
 	f.Session().Clear()
-	f.ClearCookie(fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
+	jyutil.ClearCookie(f.ResponseWriter, fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
 	f.ServeJson("ok")
 	return nil
 }
 
-// ClearCookie 清楚前端cookie 缓存
-func (f *Front) ClearCookie(name string) {
-	if name == "" {
-		name = jyutil.SKCookieName
-	}
-	for _, nk := range strings.Split(name, ",") {
-		if nk != "" {
-			http.SetCookie(f.ResponseWriter, &http.Cookie{
-				Name:     nk,
-				Value:    "",
-				Path:     "/",
-				HttpOnly: false,
-				MaxAge:   -1,
-				Expires:  time.Now().Add(-1),
-				Domain:   httpsession.Domain,
-			})
-		}
-	}
-}
-
 // GetLoginNum 微信公众号获取数字
 func (f *Front) GetLoginNum(prestr string) error {
 	var oid = f.GetString("oid")

+ 18 - 18
src/jfw/front/frontRouter.go

@@ -137,7 +137,7 @@ func (this *CommonRouter) SocialPcPage(page string) error {
 	return this.Render(fmt.Sprintf("/micro/social-pc/index.html"))
 }
 
-//积分
+// 积分
 func (this *CommonRouter) IntegralIndex() error {
 	return this.doIntegralPage()
 }
@@ -152,7 +152,7 @@ func (this *CommonRouter) doIntegralPage() error {
 	return this.Render(fmt.Sprintf("/frontRouter/pc/integral/sess/index.html"))
 }
 
-//文库
+// 文库
 func (this *CommonRouter) DocsIndex() error {
 	return this.doDocsPage()
 }
@@ -160,14 +160,14 @@ func (this *CommonRouter) DocsPage(htmlPage string) error {
 	return this.doDocsPage()
 }
 func (this *CommonRouter) doDocsPage() error {
-	userid, _ := this.GetSession("userId").(string)
-	if userid == "" {
-		return this.Redirect("/notin/page")
-	}
+	//userid, _ := this.GetSession("userId").(string)
+	//if userid == "" {
+	//	return this.Redirect("/notin/page")
+	//}
 	return this.Render(fmt.Sprintf("/frontRouter/pc/docs/sess/index.html"))
 }
 
-//线上课程
+// XspcIndex 线上课程
 func (this *CommonRouter) XspcIndex() error {
 	return this.doXspcPage()
 }
@@ -175,14 +175,14 @@ func (this *CommonRouter) XspcPage(htmlPage string) error {
 	return this.doXspcPage()
 }
 func (this *CommonRouter) doXspcPage() error {
-	userid, _ := this.GetSession("userId").(string)
-	if userid == "" {
-		return this.Redirect("/notin/page")
-	}
+	//userid, _ := this.GetSession("userId").(string)
+	//if userid == "" {
+	//	return this.Redirect("/notin/page")
+	//}
 	return this.Render(fmt.Sprintf("/frontRouter/pc/xspc/sess/index.html"))
 }
 
-//商机管理
+// 商机管理
 func (this *CommonRouter) EntpcIndex() error {
 	return this.doEntpcPage()
 }
@@ -197,7 +197,7 @@ func (this *CommonRouter) doEntpcPage() error {
 	return this.Render(fmt.Sprintf("/frontRouter/pc/entpc/sess/index.html"))
 }
 
-//大会员
+// 大会员
 func (this *CommonRouter) BigpcIndex() error {
 	return this.doPcBigPage("", "")
 }
@@ -208,7 +208,7 @@ func (this *CommonRouter) BigpcPage(htmlPage string) error {
 
 var bigVipFreePageReg = regexp.MustCompile(`set_.*|free|unit_portrayal|analysis_(search|result)|pro_follow_detail|client_portrayal`)
 
-//工作桌面需求 不需要判断用户权限
+// 工作桌面需求 不需要判断用户权限
 func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 	//page := pageSign
 	userid, _ := this.GetSession("userId").(string)
@@ -243,7 +243,7 @@ func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 	return this.Render(fmt.Sprintf("/frontRouter/pc/page_big_pc/sess/index.html"))
 }
 
-//卡卷
+// 卡卷
 func (this *CommonRouter) CouponIndex() error {
 	return this.doCouponPage()
 }
@@ -258,7 +258,7 @@ func (this *CommonRouter) doCouponPage() error {
 	return this.Render(fmt.Sprintf("/frontRouter/pc/coupon/sess/index.html"))
 }
 
-//卡卷活动中转页
+// 卡卷活动中转页
 func (this *CommonRouter) CouponActive() error {
 	var url = "/"
 	if this.GetString("url") != "" {
@@ -278,7 +278,7 @@ func (this *CommonRouter) CouponActive() error {
 	return this.Redirect(url)
 }
 
-//活动留资
+// 活动留资
 func (this *CommonRouter) ActivityLeads(sign string) error {
 	userid, _ := this.GetSession("userId").(string)
 	if data, ok := mongodb.FindOne("saleLeads", map[string]interface{}{
@@ -290,7 +290,7 @@ func (this *CommonRouter) ActivityLeads(sign string) error {
 	return this.Redirect(fmt.Sprintf("/weixin/frontPage/bigmember/free/perfect_info?source=%v", sign))
 }
 
-//组织架构
+// 组织架构
 func (this *CommonRouter) OrgpcIndex() error {
 	return this.doEntpcPage()
 }

+ 5 - 108
src/jfw/front/swordfish.go

@@ -4,7 +4,6 @@ import (
 	"encoding/base64"
 	"encoding/json"
 	"fmt"
-	"html/template"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
 	"jy/src/jfw/wx"
@@ -1502,42 +1501,14 @@ func saveBehaviorRecord(sess *httpsession.Session, data bson.M) bool {
 	return len(mongodb.Save("behavior", data)) > 0
 }
 
-// 取得剑鱼标讯博客的信息列表
-func (f *Front) Jyblog(param /*参数*/ string) error {
-	querymap := map[string]string{}
-	if len(param) == 0 {
-		querymap = map[string]string{
-			"perPage":     f.GetString("perPage"),
-			"currentPage": f.GetString("currentPage"),
-			"contentType": "jybk",
-			"query":       f.GetString("query"),
-		}
-	} else {
-		//反转生成map
-		paramstr := param[1:]
-		bs, _ := base64.StdEncoding.DecodeString(paramstr)
-		json.Unmarshal(bs, &querymap)
-	}
-	var shareid = f.GetString("id")
-	if len(shareid) == 0 {
-		shareid = fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
-	}
-	f.T["logid"] = config.Seoconfig["jybky"].(string)
-	f.DisableHttpCache()
-	shareid = se.EncodeString(shareid)
-	data, pagination := jyutil.JyCmsSearch(querymap)
-	f.Render("/pc/jyblog.html", &xweb.T{"querymap": querymap, "data": data, "pagination": pagination, "shareid": shareid})
-	return nil
-}
-
 func (f *Front) JyCms(cType, param string) error {
 	querymap := map[string]string{}
 	if len(param) == 0 {
 		querymap = map[string]string{
-			"perPage":     f.GetString("perPage"),
-			"currentPage": f.GetString("currentPage"),
-			"contentType": cType,
-			"query":       f.GetString("query"),
+			"perPage":       f.GetString("perPage"),
+			"currentPage":   f.GetString("currentPage"),
+			"s_contenttype": cType,
+			"query":         f.GetString("query"),
 		}
 	} else {
 		//反转生成map
@@ -1546,84 +1517,10 @@ func (f *Front) JyCms(cType, param string) error {
 		json.Unmarshal(bs, &querymap)
 	}
 	f.DisableHttpCache()
-	data, pagination := jyutil.JyCmsSearch(querymap)
+	data, pagination, _ := jyutil.JyCmsSearch(querymap, "/jyblog/index_%s.html")
 	return f.Render("/pc/jyblog.html", &xweb.T{"querymap": querymap, "data": data, "pagination": pagination})
 }
 
-// 博客三级页
-func (f *Front) Jybdetail(_id string) error {
-	var shareid = f.GetString("id")
-	if len(shareid) == 0 {
-		shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
-	}
-	f.T["logid"] = config.Seoconfig["jybky"].(string)
-	shareid = se.EncodeString(shareid)
-	if ret := redis.Get("other", "jyblog_"+_id); ret != nil {
-		var retlist *map[string]interface{}
-		b, _ := json.Marshal(ret)
-		json.Unmarshal(b, &retlist)
-		(*retlist)["s_content"] = template.HTML((*retlist)["s_content"].(string))
-		(*retlist)["_id"] = (*retlist)["_id"].(string)
-		f.T["data"] = retlist
-	} else {
-		id := se.DecodeString(_id)
-		//r := elastic.GetByIdField("content", "content", id, `"_id","s_title","l_createdate","s_pic","s_author","s_editorname","s_contenttype","praise","releasetime","s_subcontent","s_url","s_content","s_source","s_keywords","s_description","s_contenttype","s_pic1"`)
-		r, _ := public.MQFW.FindById("content", id, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1,"s_editorname":1,"s_url":1,"s_subcontent":1,"s_keywords":1}`)
-		if r != nil {
-			tmpdate1, _ := (*r)["l_createdate"]
-			(*r)["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
-			tmpdate2, _ := (*r)["releasetime"]
-			(*r)["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate2), 0))
-			(*r)["s_content"] = template.HTML(util.ObjToString((*r)["s_content"]))
-			(*r)["_id"] = se.EncodeString(BsonIdToSId((*r)["_id"]))
-			s_pic, _ := (*r)["s_pic"].(string)
-			if s_pic != "" {
-				s_pic = config.Seoconfig["jyadd"].(string) + s_pic
-			}
-			(*r)["s_pic"] = s_pic
-			s_pic1, _ := (*r)["s_pic1"].(string)
-			if s_pic1 != "" {
-				s_pic1 = config.Seoconfig["jyadd"].(string) + s_pic1
-			}
-			(*r)["s_pic1"] = s_pic1
-		}
-		f.DisableHttpCache()
-		redis.Put("other", "jyblog_"+_id, r, 2*60*60)
-		f.T["data"] = r
-	}
-	f.T["shareid"] = shareid
-	return f.Render("/pc/jyblogdetail.html", &f.T)
-}
-
-func (f *Front) Blogpraise() error {
-	defer util.Catch()
-	id := se.DecodeString(f.GetString("id"))
-	stype := f.GetString("type")
-	flag := "F"
-	var blogflag = true
-	util.Try(func() {
-		if id != "" {
-			if stype == "up" {
-				blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : 1 }}`, false, false)
-			} else if stype == "down" {
-				blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : -1 }}`, false, false)
-			}
-			if blogflag {
-				flag = "T"
-				r, _ := mongodb.FindById("content", id, "")
-				elastic.UpdateNewDoc("content", "content", r)
-				redis.Del("other", "jyblog_"+f.GetString("id"))
-			}
-		}
-	}, func(e interface{}) {
-		log.Println("文章点赞出错", e)
-	})
-	f.ServeJson(map[string]interface{}{
-		"flag": flag,
-	})
-	return nil
-}
-
 func getRewardText() (string, string) {
 	rewardText, _ := config.Sysconfig["rewardText"].([]interface{})
 	advertText, _ := config.Sysconfig["advertText"].([]interface{})

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

@@ -23,7 +23,7 @@ import (
 	"app.yhyue.com/moapp/jypkg/public"
 )
 
-//剑鱼标签页
+// 剑鱼标签页
 type Tags struct {
 	*xweb.Action
 	// searchResult xweb.Mapper `xweb:"/list/(\\w+)/(\\w+).html"` //剑鱼标讯分类 地区结果列表
@@ -255,8 +255,8 @@ func (this *Tags) Index(types, name string) {
 	this.Render("/pc/tags/index.html", &this.T)
 }
 
-//标签行业获取
-//地区汇总页:"/tags/area/all_%v_all.html"
+// 标签行业获取
+// 地区汇总页:"/tags/area/all_%v_all.html"
 func (this *Tags) GetArea(href string) []map[string]interface{} {
 	m := []map[string]interface{}{}
 	provinceArr, _, _, nameToCode, codeToName, codeArr := this.GetSEOArea()
@@ -288,12 +288,12 @@ func (this *Tags) GetArea(href string) []map[string]interface{} {
 }
 
 /*
-	provinceArr       //省份数组
-	cityArr           //市数组
-	districtArr     //区县数组
-	nameToCode  //根据名称获取code
-	codeToName  //根据code获取名称
-	codeArr   //code 及 pcode的从属关系
+provinceArr       //省份数组
+cityArr           //市数组
+districtArr     //区县数组
+nameToCode  //根据名称获取code
+codeToName  //根据code获取名称
+codeArr   //code 及 pcode的从属关系
 */
 func (this *Tags) GetSEOArea() (provinceArr, cityArr, districtArr []string, nameToCode map[string]int64, codeToName map[int64]string, codeArr map[int64][]int64) {
 	provinceArr = []string{}        //省份数组
@@ -336,7 +336,7 @@ func (this *Tags) GetSEOArea() (provinceArr, cityArr, districtArr []string, name
 	return
 }
 
-//获取字母表跳转
+// 获取字母表跳转
 func (this *Tags) GetAlphabet() []map[string]interface{} {
 	m := []map[string]interface{}{}
 	for _, v := range LetterArr {
@@ -413,7 +413,7 @@ func (this *Tags) GetIndustry(industryHref string) interface{} {
 	return nil
 }
 
-//判断字符串是否再数组str内
+// 判断字符串是否再数组str内
 func IsInArr(arr []string, s string) bool {
 	for _, v := range arr {
 		if v == s {
@@ -423,7 +423,7 @@ func IsInArr(arr []string, s string) bool {
 	return false
 }
 
-//获取最新招标信息
+// 获取最新招标信息
 func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
 	rediskey := fmt.Sprintf("pcindex_newArticle")
 	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
@@ -451,7 +451,7 @@ func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
 	return list
 }
 
-//获取信息类型相关url
+// 获取信息类型相关url
 func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 	rediskey := fmt.Sprintf("pcseo_stypelist_%s", href)
 	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
@@ -496,17 +496,17 @@ func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 	return list
 }
 
-//剑鱼博客
+// 剑鱼博客
 func (this *Tags) GetConsult() (list []map[string]interface{}) {
 	rediskey := fmt.Sprintf("pcseo_jybk")
 	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		list = qu.ObjArrToMapArr(l)
 	} else {
 
-		rs, _ := jyutil.JyCmsSearch(map[string]string{
-			"contentType": "hyzc",
-			"perPage":     "10",
-		})
+		rs, _, _ := jyutil.JyCmsSearch(map[string]string{
+			"s_contenttype": "hyzc",
+			"perPage":       "10",
+		}, "/jyblog/index_%s.html")
 		if rs != nil {
 			for _, v := range *rs {
 				delete(v, "praise")
@@ -575,7 +575,7 @@ func (this *Tags) GetHotLabel(length int64) []map[string]interface{} {
 	return nil
 }
 
-//获取招标平台类型
+// 获取招标平台类型
 func GetBiddingPlatformType() (nameToCode map[string]int64, codeToName map[int64]string) {
 	nameToCode = map[string]int64{}
 	codeToName = map[int64]string{}
@@ -684,7 +684,7 @@ func (this *Tags) GetBidding(industry, area, city, stype, keyword string, reques
 	return nil, 0, false
 }
 
-//获取关键词
+// 获取关键词
 func (this *Tags) GetSeoKeyWords(id string) (string, string) {
 	i_id, _ := strconv.Atoi(id)
 	data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource where id=? limit 1`, i_id)
@@ -695,7 +695,7 @@ func (this *Tags) GetSeoKeyWords(id string) (string, string) {
 	return "", ""
 }
 
-//获取行业分类下的标签
+// 获取行业分类下的标签
 func (this *Tags) GetInsturyKeywords(idstr string) (name, class_1, class_2 string) {
 	id, _ := strconv.Atoi(idstr)
 	data := public.BaseMysql.SelectBySql(`select id,class_1,class_2,name from seo_words.seo_industry where id =?`, id)
@@ -710,7 +710,7 @@ func (this *Tags) GetInsturyKeywords(idstr string) (name, class_1, class_2 strin
 	return "", "", ""
 }
 
-//获取信息类型 【全部是虚假的全部、实则是不包含拟建和采购意向的全部】
+// 获取信息类型 【全部是虚假的全部、实则是不包含拟建和采购意向的全部】
 func (this *Tags) GetInfoType(idstr string) (string, string) {
 	if idstr == "all" {
 		return "招标,邀标,询价,竞谈,单一,竞价,变更,中标,成交,废标,流标,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果", ""
@@ -726,7 +726,7 @@ func (this *Tags) GetInfoType(idstr string) (string, string) {
 	return "", ""
 }
 
-//this.T["letterList"],this.T["letterListCount"],this.T["pagingMap"]=this.GetLetterPaging(pageNum,checkedLetter)
+// this.T["letterList"],this.T["letterListCount"],this.T["pagingMap"]=this.GetLetterPaging(pageNum,checkedLetter)
 func (this *Tags) GetLetterPaging(pageNum int, checkedLetter string) (letterList []map[string]interface{}, letterListCount int64, pagingMap map[string]interface{}) {
 	seoLetterPageSize := qu.Int64All(config.Seoconfig["seoLetterPageSize"])
 	if pageNum == 0 {
@@ -745,8 +745,8 @@ func (this *Tags) GetLetterPaging(pageNum int, checkedLetter string) (letterList
 	return
 }
 
-//itype 1:汇总页 2:标签页
-//stype area:地区  industy:行业 letter:字母类
+// itype 1:汇总页 2:标签页
+// stype area:地区  industy:行业 letter:字母类
 func (this *Tags) GetTDK(isDetails bool, stype string, keywords string, pagenum int, letter string, industryWord string, areaWord, letterWord string) map[string]interface{} {
 	title, keywordsContent, descriptionContent := "", "", ""
 	if !isDetails {

+ 0 - 5
src/jfw/front/test/http-client.env.json

@@ -1,5 +0,0 @@
-{
-  "local": {
-    "host": "127.0.0.1:83"
-  }
-}

+ 0 - 26
src/jfw/front/test/test.http

@@ -1,26 +0,0 @@
-// 接口测试
-
-### 分页请求
-POST http://{{host}}/front/pcAjaxReq
-Content-Type: application/x-www-form-urlencoded
-Cookie: SESSIONID=95e5eda49ae964ff4092dd148446493fdf9b5ff9;
-
-pageNumber=1&reqType=lastNews&searchvalue=&area=&subtype=招标&publishtime=fiveyear&selectType=content,title&minprice=&maxprice=&buyertel=&winnertel=&notkey=&fileExists=0&city=&bid_field=0101
-
-
-###  请求缓存
-
-POST http://{{host}}/jylab/supsearch/getNewBids
-Content-Type: application/x-www-form-urlencoded
-Cookie: SESSIONID=95e5eda49ae964ff4092dd148446493fdf9b5ff9;
-
-pageNumber=1&pageType=medical&fileExists=0
-
-### 首页
-POST http://{{host}}/jylab/supsearch/index.html
-Content-Type: application/x-www-form-urlencoded
-Cookie: SESSIONID=95e5eda49ae964ff4092dd148446493fdf9b5ff9;
-
-keywords=医院&publishtime=fiveyear&timeslot=&area=&subtype=&minprice=&maxprice=&buyertel=&winnertel=&selectType=content,title&notkey=&fileExists=1&city=&bid_field=0101
-
-

+ 620 - 0
src/jfw/jyutil/classroomiInfo.go

@@ -0,0 +1,620 @@
+package jyutil
+
+import (
+	"app.yhyue.com/moapp/jyMarketing/rpc/activity"
+	util "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	mgo "app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gcfg"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/zeromicro/go-zero/core/discov"
+	"github.com/zeromicro/go-zero/zrpc"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"html/template"
+	"io/ioutil"
+	"jy/src/jfw/config"
+	"log"
+	"math"
+	"math/rand"
+	"net/http"
+	"sort"
+	"strings"
+	"time"
+)
+
+var (
+	ColumnRelationship map[string]Navigation
+)
+
+type Navigation struct {
+	Name string
+	Code string
+	Href string
+	Pid  string
+}
+
+type HelpColumn struct {
+	Id       string       `json:"id"`       //文章id
+	Name     string       `json:"name"`     //栏目名称或文章标题
+	Code     string       `json:"code"`     //栏目code
+	IsColumn int          `json:"isColumn"` //0 栏目 1 文章 2 视频
+	Href     string       `json:"href"`
+	SeedData []HelpColumn `json:"seedData"` //子集
+}
+
+func init() {
+	go ActivityInit()
+	log.Println("开始初始化column")
+	ColumnRelationship = make(map[string]Navigation)
+	industryInfoUrl, _ := config.Sysconfig["industryInfoUrl"].(map[string]interface{})
+	jySchoolUrl, _ := config.Sysconfig["jySchoolUrl"].(map[string]interface{})
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	jySchoolCode := util.InterfaceToStr(columnCode["招投标攻略"])
+	industryInfoCode := util.InterfaceToStr(columnCode["行业资讯"])
+
+	util.InterfaceToStr(columnCode["行业资讯"])
+	column, _ := mongodb.Find("column", nil, "", "", false, -1, -1)
+	if column != nil && len(*column) > 0 {
+		for _, v := range *column {
+			var (
+				data Navigation
+				href string
+			)
+			code := util.InterfaceToStr(v["s_columncode"])
+			pid := util.InterfaceToStr(v["pid"])
+			if code == jySchoolCode {
+				href = util.InterfaceToStr(jySchoolUrl["homeUrl"])
+			} else if code == industryInfoCode {
+				href = util.InterfaceToStr(industryInfoUrl["homeUrl"])
+			} else if pid == jySchoolCode {
+				href = fmt.Sprintf(util.InterfaceToStr(jySchoolUrl["towUrl"]), code)
+			} else if pid == industryInfoCode {
+				href = fmt.Sprintf(util.InterfaceToStr(industryInfoUrl["towUrl"]), code)
+			} else {
+				log.Printf("未知栏目code,code:%s", code)
+				continue
+			}
+			data.Href = href
+			data.Code = code
+			data.Name = util.InterfaceToStr(v["s_columnname"])
+			data.Pid = pid
+			ColumnRelationship[code] = data
+		}
+	}
+}
+
+var Activity activity.Activity
+
+// 活动初始化
+func ActivityInit() {
+	log.Println("开始初始化活动rpc")
+	g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("config.yaml")
+	var ctx = gctx.New()
+	Activity = activity.NewActivity(zrpc.MustNewClient(zrpc.RpcClientConf{
+		Etcd: discov.EtcdConf{
+			Hosts: g.Cfg().MustGet(ctx, "etcd.hosts").Strings(),
+			Key:   g.Cfg().MustGet(ctx, "activityKey").String(),
+		},
+	}))
+}
+
+func ActivityData() map[string][]*activity.LotteryJson {
+	resp, err := Activity.GetAllLottery(context.Background(), &activity.Request{
+		AppId:       "10000",
+		ProductCode: "111",
+	})
+	log.Println(resp, err)
+	if err != nil {
+		log.Println("奖券获取失败")
+		return nil
+	}
+	lotteryMap := map[string][]*activity.LotteryJson{}
+	for _, activityValue := range resp.ActivityJson {
+		for _, lotteryValue := range activityValue.LotteryJson {
+			for _, productValue := range lotteryValue.UseProductList {
+				lotteryValue.UseProductList = []*activity.ProductJson{}
+				lotteryMap[productValue.ProductCode] = append(lotteryMap[productValue.ProductCode], lotteryValue)
+			}
+		}
+	}
+	return lotteryMap
+}
+
+// Course 剑鱼课堂首页课程 & 帮助中心热门视频 classify:0:中标比听课视频 1:帮助中心视频(获取所有)
+func Course(num, iType int) *[]map[string]interface{} {
+	//热门课程
+	/*var HotCourse *[]map[string]interface{}
+	  hotQuery := map[string]interface{}{"i_type": 3, "i_status": 1, "l_endtime": map[string]interface{}{"$gt": time.Now().Unix()}, "l_publishtime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	  HotCourse = mongodb.Find("jy_course", hotQuery, `{"i_clickRate":-1}`, nil, false, 0, 8)
+	  if HotCourse != nil && len(*HotCourse) > 0 {
+	  	for key, value := range *HotCourse {
+	  		timeNow := time.Now().Unix()
+	  		if util.Int64All(value["l_endtime"]) < timeNow {
+	  			(*HotCourse)[key]["isExpired"] = true
+	  		} else {
+	  			(*HotCourse)[key]["isExpired"] = false
+	  		}
+	  	}
+	  }*/
+	var page int
+	if iType == 4 {
+		page = -1
+		num = -1
+	}
+	//最新课程
+	lotteryMap := ActivityData()
+	var LatestCourses *[]map[string]interface{}
+	latestQuery := map[string]interface{}{"i_type": iType, "i_status": 1, "l_endtime": map[string]interface{}{"$gt": time.Now().Unix()}, "l_publishtime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	LatestCourses, _ = mongodb.Find("jy_course", latestQuery, `{"l_publishtime":-1}`, "", false, page, num)
+	if LatestCourses != nil && len(*LatestCourses) > 0 {
+		for key, value := range *LatestCourses {
+			(*LatestCourses)[key]["_id"] = util.InterfaceToStr((*LatestCourses)[key]["_id"])
+			timeNow := time.Now().Unix()
+			if util.Int64All(value["l_endtime"]) < timeNow {
+				(*LatestCourses)[key]["isExpired"] = true
+			} else {
+				(*LatestCourses)[key]["isExpired"] = false
+			}
+			productPrice := util.Float64All(value["i_price"])
+			fool, discountPrice := OptimalSelection(util.InterfaceToStr(value["_id"]), productPrice, lotteryMap)
+			(*LatestCourses)[key]["isDiscount"] = fool
+			if fool {
+				(*LatestCourses)[key]["discountPrice"] = productPrice - discountPrice
+			}
+		}
+	}
+
+	//精选课程
+	/*var idSlice []primitive.ObjectID
+	  for _, value := range *HotCourse {
+	  	idSlice = append(idSlice, value["_id"].(primitive.ObjectID))
+	  }
+	  for _, value := range *LatestCourses {
+	  	idSlice = append(idSlice, value["_id"].(primitive.ObjectID))
+	  }
+	  var SelectedCourse *[]map[string]interface{}
+	  otherQuery := map[string]interface{}{"i_type": 3, "i_status": 1, "_id": map[string]interface{}{"$nin": idSlice}, "l_publishtime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	  SelectedCourse = mongodb.Find("jy_course", otherQuery, "-l_endtime,-i_tradeRate,-i_clickRate,-l_publishtime", "", false, 0, 0)
+	  for key, value := range *SelectedCourse {
+	  	timeNow := time.Now().Unix()
+	  	if util.Int64All(value["l_endtime"]) < timeNow {
+	  		(*SelectedCourse)[key]["isExpired"] = true
+	  	} else {
+	  		(*SelectedCourse)[key]["isExpired"] = false
+	  	}
+	  }*/
+	//IdFormat(LatestCourses)
+	return LatestCourses
+}
+
+// 奖券详情
+func OptimalSelection(id string, price float64, lotteryMap map[string][]*activity.LotteryJson) (bool, float64) {
+	if price == 0 {
+		return false, 0
+	}
+	discountPrice := float64(0)
+
+	lotteryStr := lotteryMap[id]
+	if lotteryStr == nil {
+		return false, discountPrice
+	}
+	for _, lottery := range lotteryStr {
+		lotteryType := lottery.LotteryType
+		full := util.Float64All(lottery.Full)
+		full *= 100
+		//类型:0满减、1折扣券、2满赠、3促销、4限时折扣、5限时减免
+		switch lotteryType {
+		case 1: //满折
+			if full <= price {
+				discount := util.Float64All(lottery.Discount)
+				preferential := (1 - discount/10) * price
+				preferential = math.Trunc(preferential*1e0 + 0.5)
+				if preferential > discountPrice {
+					discountPrice = preferential
+				}
+			}
+			break
+		case 3: //3促销
+			promotionalPrice := util.Float64All(lottery.PromotionalPrice)
+			if util.Float64All(price-promotionalPrice) > discountPrice {
+				discountPrice = util.Float64All(price - promotionalPrice)
+			}
+			break
+		case 4: //4限时折扣
+			discount := util.Float64All(lottery.Discount)
+			preferential := (1 - discount/10) * price
+			preferential = math.Trunc(preferential*1e0 + 0.5)
+			if preferential > discountPrice {
+				discountPrice = preferential
+			}
+			break
+		case 5: //5限时减免
+			reduce := util.Float64All(lottery.Reduce)
+			if reduce > discountPrice {
+				discountPrice = reduce
+			}
+			break
+		default:
+			if full <= price {
+				reduce := util.Float64All(lottery.Reduce) * 100
+				if reduce > discountPrice {
+					discountPrice = reduce
+				}
+			}
+			break
+		}
+	}
+	if discountPrice > 0 {
+		return true, discountPrice
+	}
+	return false, discountPrice
+}
+
+// Library 文库
+func Library(num int) (map[string]interface{}, error) {
+	if data := redis.Get("other", fmt.Sprintf("library_%d", num)); data != nil {
+		dataMap, _ := data.(map[string]interface{})
+		return dataMap, nil
+	}
+	b, _ := json.Marshal(map[string]interface{}{
+		"sign": "new",
+		"num":  num,
+	})
+	buffer := bytes.NewBuffer(b)
+	client := NewClient()
+	log.Println("libraryTopList====", config.Sysconfig["libraryTopList"])
+	req, _ := http.NewRequest("POST", fmt.Sprintf(util.InterfaceToStr(config.Sysconfig["libraryTopList"]), num), buffer)
+	res, err := client.Do(req)
+	if err != nil {
+		log.Printf("post topList err:%s", err.Error())
+		return nil, err
+	}
+	defer req.Body.Close()
+	bArr, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		log.Printf("ReadAll topList err:%s", err.Error())
+		return nil, err
+	}
+	m := map[string]interface{}{}
+	err = json.Unmarshal(bArr, &m)
+	data, _ := m["data"].([]interface{})
+	for _, v := range util.ObjArrToMapArr(data) {
+		v["docFileSize"] = FormatSize(util.Float64All(v["docFileSize"]), "B")
+	}
+	m["data"] = data
+	redis.Put("other", fmt.Sprintf("library_%d", num), m, 5*60)
+	return m, nil
+}
+
+//	function formatSize (size, pointLength, units) {
+//	 size = Number(size)
+//	 let unit = ''
+//	 units = units || ['B', 'K', 'M', 'G', 'TB']
+//	 while ((unit = units.shift()) && size > 1024) {
+//	   size = size / 1024
+//	 }
+//	 return (unit === 'B' ? size : size.toFixed(pointLength === undefined ? 2 : pointLength)) + (unit || '')
+//	}
+func FormatSize(size float64, unit string) string {
+	sizeName := fmt.Sprintf("%.2f%s", size, unit)
+	var units = []string{"B", "K", "M", "G", "TB"}
+	if size >= 1024 {
+		for k, v := range units {
+			if v == unit && unit != units[len(units)-1] && k < len(units)-1 {
+				size = size / 1024
+				if size >= 1024 {
+					return strings.ReplaceAll(FormatSize(size, units[k+1]), ".00", "")
+				} else {
+					sizeName = fmt.Sprintf("%.2f%s", size, units[k+1])
+				}
+				break
+			}
+		}
+	}
+
+	return strings.ReplaceAll(sizeName, ".00", "")
+}
+
+// GuidelineAndInformation t:一级栏目 s二级栏目 (首页剑鱼攻略与行业资讯首页公用)
+func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
+	query := map[string]interface{}{"s_contenttype": t, "s_secondclassifytype": s, "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	data, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	if data != nil {
+		for _, v := range *data {
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+			tmpdate, _ := v["l_createdate"]
+			v["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	//IdFormat(data)
+	return data
+}
+
+// SPic 图片链接处理
+func SPic(sPic string) string {
+	if sPic != "" && !strings.HasPrefix(sPic, "http") {
+		if strings.HasPrefix(sPic, "/") &&
+			strings.HasSuffix(util.InterfaceToStr(config.Seoconfig["jyadd"]), "/") {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + sPic[1:]
+		} else if !strings.HasPrefix(sPic, "/") &&
+			!strings.HasSuffix(util.InterfaceToStr(config.Seoconfig["jyadd"]), "/") {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + "/" + sPic
+		} else {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + sPic
+		}
+	}
+	return sPic
+}
+
+// 生成count个[start,end)结束的不重复的随机数
+func GenerateRandomNumber(start int, end int, count int) []int {
+	//范围检查
+	if end < start || (end-start) < count {
+		return nil
+	}
+	//存放结果的slice
+	nums := make([]int, 0)
+	//随机数生成器,加入时间戳保证每次生成的随机数不一样
+	r := rand.New(rand.NewSource(time.Now().UnixNano()))
+	for len(nums) < count {
+		//生成随机数
+		num := r.Intn(end-start) + start
+		//查重
+		exist := false
+		for _, v := range nums {
+			if v == num {
+				exist = true
+				break
+			}
+		}
+		if !exist {
+			nums = append(nums, num)
+		}
+	}
+	sort.Ints(nums)
+	return nums
+}
+
+// ArticleRecommendation 攻略&资讯详情页 内容推荐&重要咨询
+// 传参 t 一级栏目 num数量
+func ArticleRecommendation(t string, num int) map[string]interface{} {
+	var res2 []map[string]interface{}
+	//用招投标攻略文章最新10篇&随机调用招投标攻略文章,显示10篇
+	query := map[string]interface{}{
+		"s_contenttype": t, //一级栏目
+		"i_status":      1,
+		"releasetime":   map[string]interface{}{"$lt": time.Now().Unix()},
+		//"s_secondclassifytype": 1, //二级栏目
+	}
+	res1, ok := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	if ok && res1 != nil && len(*res1) > 0 {
+		if len(*res1) == num {
+			res, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+			for _, v := range GenerateRandomNumber(0, len(*res), num) {
+				s_title, _ := (*res)[v]["s_title"].(string)
+				(*res)[v]["s_title"] = template.HTML(s_title)
+				tmpdate, _ := (*res)[v]["l_createdate"]
+				(*res)[v]["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+				tmpdate1, _ := (*res)[v]["releasetime"]
+				//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+				reltime := time.Unix(util.Int64All(tmpdate1), 0)
+				(*res)[v]["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+				(*res)[v]["s_pic"] = SPic(util.InterfaceToStr((*res)[v]["s_pic"]))
+				(*res)[v]["s_pic1"] = SPic(util.InterfaceToStr((*res)[v]["s_pic1"]))
+				(*res)[v]["_id"] = se.EncodeString(util.InterfaceToStr((*res)[v]["_id"]))
+				res2 = append(res2, (*res)[v])
+			}
+		}
+		for _, v := range *res1 {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+			tmpdate, _ := v["l_createdate"]
+			v["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	if len(res2) > 0 {
+		return map[string]interface{}{"latestPush": res1, "randomExtraction": res2}
+	}
+	return map[string]interface{}{"latestPush": res1, "randomExtraction": res1}
+}
+
+// GetNextInfo 获取同类别上一篇、下一篇
+func GetNextInfo(_id string, keyWord ...string) (lastId, nextId string) {
+	doc, _ := mongodb.FindById("content", _id, `{"releasetime":1,"i_viewnum":1,s_contenttype":1,"s_secondclassifytype":1,"s_threeclassifytype":1}`)
+	if doc == nil || len(*doc) == 0 {
+		return
+	}
+	commonQuery := map[string]interface{}{
+		"i_status": 1,
+		"releasetime": map[string]interface{}{
+			"$lt": time.Now().Unix(),
+		},
+	}
+	for _, t := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if tv, _ := (*doc)[t].(string); tv != "" && tv != "0" {
+			commonQuery[t] = tv
+		}
+	}
+	if len(keyWord) > 0 {
+		commonQuery["s_title"] = map[string]interface{}{
+			"$regex": keyWord[0],
+		}
+	}
+	log.Println("content上下文query:", commonQuery)
+	dataOn, ok := mongodb.Find("content", commonQuery, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,releasetime":-1,"l_createdate":1}`, false, -1, -1)
+	if ok && dataOn != nil && len(*dataOn) > 0 {
+		for k, v := range *dataOn {
+			if util.InterfaceToStr(v["_id"]) == _id {
+				if k != 0 {
+					lastId = se.EncodeString(util.InterfaceToStr((*dataOn)[k-1]["_id"]))
+				}
+				if k < len(*dataOn)-1 {
+					nextId = se.EncodeString(util.InterfaceToStr((*dataOn)[k+1]["_id"]))
+				}
+				break
+			}
+		}
+	}
+	return
+}
+
+// GuidelineDetails 详情页 推荐
+func GuidelineDetails(id string, keyWord ...string) []map[string]interface{} {
+	doc, _ := mongodb.FindById("content", id, `{"releasetime":1,"i_viewnum":1,"s_contenttype":1,"s_secondclassifytype":1,"s_threeclassifytype":1}`)
+	if doc == nil || len(*doc) == 0 {
+		return nil
+	}
+	query := map[string]interface{}{
+		"i_status":    1,
+		"releasetime": map[string]interface{}{"$lt": time.Now().Unix()},
+	}
+	for _, t := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if tv, _ := (*doc)[t].(string); tv != "" && tv != "0" {
+			query[t] = tv
+		}
+	}
+	_id, _ := primitive.ObjectIDFromHex(id)
+	if len(keyWord) > 0 {
+		query["s_title"] = map[string]interface{}{
+			"$regex": keyWord[0],
+		}
+	}
+	//相关内容推荐
+	query["_id"] = map[string]interface{}{
+		"$ne": _id,
+	}
+
+	log.Println(" 详情页 推荐3", query)
+	var recommend []map[string]interface{}
+	dataRe, ok := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+	if ok && dataRe != nil && len(*dataRe) > 0 {
+		if len(*dataRe) > 3 {
+			for _, key := range GenerateRandomNumber(0, len(*dataRe), 3) {
+				recommend = append(recommend, (*dataRe)[key])
+			}
+		} else {
+			recommend = append(recommend, *dataRe...)
+		}
+		for _, v := range recommend {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+
+			tmpdate, _ := v["l_createdate"]
+			v["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	//IdFormat(&recommend)
+	return recommend
+}
+
+// GuidelineAndIndustry 获取攻略&资讯一级栏目与二级栏目 columnCode栏目code
+func GuidelineAndIndustry(columnCode string) HelpColumn {
+	var res HelpColumn
+	data1, ok := mongodb.FindOne("column", map[string]interface{}{
+		"s_columncode": columnCode,
+	})
+	//招投标攻略栏目一二级栏目获取
+	if ok && data1 != nil && len(*data1) > 0 {
+		res.Code = util.InterfaceToStr((*data1)["s_columncode"])
+		res.Name = util.InterfaceToStr((*data1)["s_columnname"])
+		data2, ok1 := mongodb.Find("column", map[string]interface{}{
+			"pid": columnCode,
+		}, `{"i_order":1}`, nil, false, -1, -1)
+		if ok1 && data2 != nil && len(*data2) > 0 {
+			var ss []HelpColumn
+			for _, v := range *data2 {
+				var s HelpColumn
+				s.Code = util.InterfaceToStr(v["s_columncode"])
+				s.Name = util.InterfaceToStr(v["s_columnname"])
+				ss = append(ss, s)
+			}
+			res.SeedData = ss
+		}
+	}
+	return res
+}
+
+// 导航栏
+func NavigationBar(code string) []Navigation {
+	//config.Sysconfig["libraryTopList"]
+	var (
+		contentNavigat Navigation
+		navigation     []Navigation
+	)
+	if mgo.IsObjectIdHex(code) {
+		doc, ok := mongodb.FindById("content", code, `{"s_title":1,"s_contente":1,"s_stypecondclassifytype":1}`)
+		if ok && doc == nil || len(*doc) == 0 {
+			return nil
+		}
+		contentNavigat = Navigation{Name: util.InterfaceToStr((*doc)["s_title"])}
+		for _, v := range []string{"s_stypecondclassifytype", "s_contente"} {
+			if util.InterfaceToStr((*doc)[v]) != "" {
+				code = util.InterfaceToStr((*doc)[v])
+				break
+			}
+		}
+	}
+	navigation = PidColumn(code)
+	if contentNavigat.Name != "" {
+		navigation = append(navigation, contentNavigat)
+	}
+
+	return navigation
+}
+
+func PidColumn(id string) []Navigation {
+	var allColumn []Navigation
+	if ColumnRelationship[id].Pid != "" {
+		//存在父级目录
+		allColumn = append(allColumn, PidColumn(ColumnRelationship[id].Pid)...)
+		allColumn = append(allColumn, ColumnRelationship[id])
+	} else {
+		//剑鱼首页地址
+		allColumn = append(allColumn, Navigation{Name: "剑鱼标讯", Href: "/"})
+		columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+		if id == util.InterfaceToStr(columnCode["招投标攻略"]) {
+			//剑鱼课堂首页地址
+			allColumn = append(allColumn, Navigation{Name: "剑鱼学堂", Href: "/jySchool/index"})
+		}
+		//上级地址
+		allColumn = append(allColumn, ColumnRelationship[id])
+	}
+
+	return allColumn
+
+}
+
+func Browsing(id string, viewNum int) {
+	mongodb.UpdateById("content", id, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_viewnum": viewNum + 1,
+		}})
+}

+ 54 - 40
src/jfw/jyutil/jyCms.go

@@ -16,8 +16,6 @@ import (
 
 	util "app.yhyue.com/moapp/jybase/common"
 
-	elastic "app.yhyue.com/moapp/jybase/esv1"
-
 	. "app.yhyue.com/moapp/jybase/mongodb"
 )
 
@@ -26,7 +24,7 @@ const (
 	jyMsgFirstCacheTime = 5 * 60
 )
 
-//GetFirstJyCms 获取首评信息
+// GetFirstJyCms 获取首评信息
 func GetFirstJyCms(contentType string, size int) (r []map[string]interface{}) {
 	// 默认剑鱼博客栏目
 	contentType = util.If(contentType == "", "jybk", contentType).(string)
@@ -34,10 +32,10 @@ func GetFirstJyCms(contentType string, size int) (r []map[string]interface{}) {
 	if data, ok := redis.Get("other", redisKey).([]interface{}); ok && data != nil && len(data) > 0 {
 		r = util.ObjArrToMapArr(data)
 	} else {
-		rs, _ := JyCmsSearch(map[string]string{
-			"contentType": contentType,
-			"perPage":     fmt.Sprintf("%d", size),
-		})
+		rs, _, _ := JyCmsSearch(map[string]string{
+			"s_contenttype": contentType,
+			"perPage":       fmt.Sprintf("%d", size),
+		}, "")
 		if rs != nil {
 			for _, v := range *rs {
 				delete(v, "praise")
@@ -51,44 +49,58 @@ func GetFirstJyCms(contentType string, size int) (r []map[string]interface{}) {
 	return r
 }
 
-// JyCmsSearch 剑鱼文章检索
-func JyCmsSearch(query map[string]string) (*[]map[string]interface{}, *[]interface{}) {
+func JyCmsSearch(query map[string]string, makePageFormat string) (*[]map[string]interface{}, *[]interface{}, int) {
 	perPage, _ := strconv.Atoi(query["perPage"])
 	currentPage, _ := strconv.Atoi(query["currentPage"])
-	//修复
-	if perPage == 0 {
+	//限制每页数量
+	if perPage <= 0 || perPage > 20 {
 		perPage = 5
 	}
 	if currentPage < 1 {
 		currentPage = 1
 	}
-	contentType := query["contentType"]
-	queryStr := query["query"]
 
+	queryStr := query["query"]
 	queryMap := map[string]interface{}{
-		"s_contenttype": contentType,
+		"i_status": 1,
 	}
-
+	for _, v := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if query[v] != "" {
+			queryMap[v] = query[v]
+		}
+	}
+	queryStrType := query["queryType"]
 	if queryStr != "" {
-		queryMap["$or"] = []interface{}{
-			map[string]interface{}{
-				"s_title": map[string]interface{}{"$regex": queryStr},
-			},
-			map[string]interface{}{
-				"s_content": map[string]interface{}{"$regex": queryStr},
-			},
+		//攻略搜索只搜索标题
+		if queryStrType == "" {
+			queryMap["$or"] = []interface{}{
+				map[string]interface{}{
+					"s_title": map[string]interface{}{"$regex": queryStr},
+				},
+				map[string]interface{}{
+					"s_content": map[string]interface{}{"$regex": queryStr},
+				},
+			}
+		} else {
+			queryMap["$or"] = []interface{}{
+				map[string]interface{}{
+					"s_title": map[string]interface{}{"$regex": queryStr},
+				},
+			}
 		}
 	}
 
 	total := public.MQFW.Count("content", queryMap)
-
-	//查询列表数据
-	client := elastic.GetEsConn()
-	defer elastic.DestoryEsConn(client)
-	if client == nil {
-		return nil, nil
+	if total == 0 {
+		return nil, nil, 0
 	}
-	searchResult, _ := public.MQFW.Find("content", queryMap, `{"releasetime":-1}`, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1}`, false, (currentPage-1)*perPage, perPage)
+	//查询列表数据
+	//client := elastic.GetEsConn()
+	//defer elastic.DestoryEsConn(client)
+	//if client == nil {
+	//	return nil, nil, 0
+	//}
+	searchResult, _ := public.MQFW.Find("content", queryMap, `{"releasetime":-1}`, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1,"i_viewnum":1}`, false, (currentPage-1)*perPage, perPage)
 
 	var res []map[string]interface{}
 	if searchResult != nil && len(*searchResult) > 0 {
@@ -127,11 +139,14 @@ func JyCmsSearch(query map[string]string) (*[]map[string]interface{}, *[]interfa
 		}
 	}
 	//生成分页
-	pagination := MakePagination(perPage, currentPage, int(total), query, "/jyblog/index_%s.html")
-	return &res, &pagination
+	if makePageFormat != "" {
+		pagination := MakePagination(perPage, currentPage, total, query, makePageFormat)
+		return &res, &pagination, total
+	}
+	return &res, nil, total
 }
 
-//计算分页,分页显示规则
+// 计算分页,分页显示规则
 func MakePagination(perPage, currentPage, total int, param map[string]string, urltpl string) []interface{} {
 	var totalPages int //总页数
 	if total == 0 {
@@ -170,13 +185,12 @@ func MakePagination(perPage, currentPage, total int, param map[string]string, ur
 	iscurrent = currentPage == totalPages
 	ret[index] = map[string]interface{}{"page": "下一页 >", "url": url, "iscurrent": iscurrent}
 
-	//
-	u := map[string]interface{}{
-		"currentPage": 1,
-		"query":       "招标",
-		"contentType": param["contentType"],
-	}
-	bs, _ = json.Marshal(u)
-	paramstr = base64.StdEncoding.EncodeToString(bs)
+	//u := map[string]interface{}{
+	//	"currentPage": 1,
+	//	"query":       "招标",
+	//	"contentType": param["contentType"],
+	//}
+	//bs, _ = json.Marshal(u)
+	//paramstr = base64.StdEncoding.EncodeToString(bs)
 	return ret
 }

+ 14 - 0
src/jfw/jyutil/jysite.go

@@ -0,0 +1,14 @@
+package jyutil
+
+// GetSiteInfo 获取栏目
+func GetSiteInfo(id string) (sType, tType string) {
+	if res, _ := mongodb.FindById("content", id, `{"s_contenttype":1,"s_secondclassifytype":1}`); res != nil && len(*res) > 0 {
+		if value, ok := (*res)["s_contenttype"]; ok {
+			sType, _ = value.(string)
+		}
+		if value, ok := (*res)["s_secondclassifytype"]; ok {
+			tType, _ = value.(string)
+		}
+	}
+	return
+}

+ 40 - 0
src/jfw/jyutil/jyutil.go

@@ -8,6 +8,7 @@ import (
 	"io/ioutil"
 	"jy/src/jfw/config"
 	"log"
+	"net"
 	"net/http"
 	"reflect"
 	"regexp"
@@ -35,6 +36,26 @@ var (
 	KeepLoginCookieName = "klcn_value"
 )
 
+// ClearCookie 清楚前端cookie 缓存
+func ClearCookie(w http.ResponseWriter, name string) {
+	if name == "" {
+		name = SKCookieName
+	}
+	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,
+			})
+		}
+	}
+}
+
 // SetCookieValueForAutoLogin 为延长用户登录时间 往cookie 中加入标识,在过滤器判断是否自动登录
 func SetCookieValueForAutoLogin(rw http.ResponseWriter, baseUserId int64) {
 	log.Println("-----111--------;", rw.Header())
@@ -229,3 +250,22 @@ func Bind(data interface{}, ret interface{}) error {
 	}
 	return nil
 }
+
+func NewClient() *http.Client {
+	//不保持连接
+	transport := &http.Transport{
+		Dial: func(netw, addr string) (net.Conn, error) {
+			deadline := time.Now().Add(25 * time.Second)
+			c, err := net.DialTimeout(netw, addr, 5*time.Second)
+			if err != nil {
+				return nil, err
+			}
+			tcp_conn := c.(*net.TCPConn)
+			tcp_conn.SetKeepAlive(false)
+			tcp_conn.SetDeadline(deadline)
+			return tcp_conn, nil
+		},
+		DisableKeepAlives: true,
+	}
+	return &http.Client{Transport: transport}
+}

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

@@ -24,6 +24,7 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/vipsubscribe/introducePage"),
 	regexp.MustCompile("^/jyapp/structed/index"),
 	regexp.MustCompile("^/jyapp/exhibition/.*"),
+	regexp.MustCompile("^/jyapp/bank/scheme"),
 }
 
 type loginFilter struct {

+ 17 - 0
src/jfw/modules/app/src/app/front/bankScheme.go

@@ -0,0 +1,17 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+)
+
+type BankSchemeCommon struct {
+	*xweb.Action
+	bankScheme xweb.Mapper `xweb:"/jyapp/bank/scheme"` //银行解决方案
+}
+
+func init() {
+	xweb.AddAction(&BankSchemeCommon{})
+}
+func (w *BankSchemeCommon) BankScheme() error {
+	return w.Render("/site/page/bankLanding/index.html", &w.T)
+}

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

@@ -4,7 +4,7 @@ go 1.18
 
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a
-	app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62
+	app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/dchest/captcha v1.0.0

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

@@ -6,8 +6,8 @@ app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Y
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a h1:wD4aWPSYdiX1cIP4lzzPD2s7fYhKa3muIf97l9tonJE=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62 h1:HNoByTbAT3juYEPQqScQ902LbSE8WKYJD5LZhJNUYQE=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca h1:1vX1uTIRH05n+RXGBi7nAP+H41xBfk9/OUUiReeyKv4=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 566 - 0
src/jfw/modules/app/src/web/templates/frontRouter/bigmember/free/perfect_info_bank.html

@@ -0,0 +1,566 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+
+<head>
+    <title>完善信息</title>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+
+    <!--S-当前页必定需要预加载的资源-->
+    <link rel="preload" as="style" href='//cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/lib/index.css'/>
+    <link rel="preload" as="style" href='//cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/lib/icon/local.css'/>
+    <link rel="preload" as="style"
+          href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_info_collect.css?v={{Msg "seo" "version"}}'/>
+    <!--E-当前页必定需要预加载的资源-->
+
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href='//cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/lib/index.css'/>
+    <link rel="stylesheet" href='//cdn-common.jianyu360.com/cdn/lib/vant/2.8.2/lib/icon/local.css'/>
+    <link rel="stylesheet"
+          href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/perfect-info/index.css?v={{Msg "seo" "version"}}'/>
+    <!--E-当前页面的css资源-->
+    <script>
+      try {
+        window.JyObj.hiddenBottom('0')
+      } catch (e) {
+        console.log('error: app not function')
+      }
+    </script>
+</head>
+
+<body>
+<div class="j-container">
+    {{include "/big-member/header.html"}}
+    <div class="j-main perfect-info-group" id="perfect-info-page" v-cloak>
+        <div class="j-container">
+            <div class="j-main info-collect">
+                <div class="top-tip-group">
+                    <p class="top-tip-text">@@title@@
+                    </p>
+                </div>
+                <div class="form-card-group">
+                    <div class="form-title">基本信息</div>
+                    <div class="form-content-card">
+                        <van-field v-model.trim="infoMap.name" label="姓名" @focus="infoCheckMap.name = ''" @blur="getCheckMap('name')"
+                                   :error-message="infoCheckMap.name" required placeholder="请输入姓名"></van-field>
+                        <van-field v-model.trim="infoMap.phone" label="手机号" @focus="infoCheckMap.phone = ''"
+                                   @blur="getCheckMap('phone')" :error-message="infoCheckMap.phone" required
+                                   placeholder="请输入准确的手机号"></van-field>
+                        <!-- <van-field v-model.trim="infoMap.email" label="邮箱" @focus="infoCheckMap.email = ''" @blur="getCheckMap('email')"
+                                   :error-message="infoCheckMap.email" required placeholder="请输入邮箱"></van-field> -->
+                    </div>
+                </div>
+                <div class="form-card-group">
+                    <div class="form-title">公司信息</div>
+                    <div class="form-content-card">
+                        <div class="associate-ent-group" v-show="isAssociateShow">
+                            <div class="associate-ent-item" @click="selectEnt(item)" v-for="(item, i) in searchList" v-bind:key="i" v-html="highlightText(item, infoMap.company)"></div>
+                        </div>
+                        <van-field @input="entOnChange('input')" @blur="entOnChange('blur')" @focus="infoCheckMap.company = ''"
+                                   :error-message="infoCheckMap.company" required v-model.trim="infoMap.company" label="公司名称" placeholder="请输入准确的公司名称"></van-field>
+                        <van-field :class="{'hide-border': infoMap.position === '其他'}"  required v-model="infoMap.position" label="职位" @click="openPop('职位')" readonly is-link
+                                   placeholder="请选择职位"></van-field>
+                        <van-field class="other-input-group" @focus="infoCheckMap.position_other = ''" @blur="getCheckMap('position')"
+                                   :error-message="infoCheckMap.position_other" v-model.trim="infoMap.position_other" v-show="infoMap.position === '其他'" label="职位" placeholder="请输入职位"></van-field>
+                        <van-field v-if="showBranch" v-model="infoMap.branch" required label="部门" @click="openPop('部门')" readonly is-link placeholder="请选择部门"></van-field>
+                    </div>
+                </div>
+                <div class="warm-prompt">
+                  <span class="icon-warning"></span>
+                  <span class="warm-text">温馨提示:请提供准确的信息,我们将为您推荐更准确、更个性化的商机和服务</span>
+                </div>
+            </div>
+            <div class="j-footer">
+                <div class="j-button-group">
+                    <button class="j-button-cancel" @click="cancelForm">暂不提供</button>
+                    <button class="j-button-confirm" :disabled="isSubmitDisabled" @click="submitForm">提交</button>
+                </div>
+            </div>
+            <van-popup class="prefect-pop-group" v-model="popInfo.show" round position="bottom"
+                       :style="{ height: getPopHeight }">
+                <div class="j-container">
+                    <div class="j-header">
+                        <div class="pop-title-group">
+                            <span>@@popInfo.title@@</span>
+                            <div class="close-padding-box" @click="popInfo.show = false">
+                                <i class="j-icon base-icon icon-delete-gray"></i>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="j-main" v-show="conditionMap[popInfo.label]">
+                        <div class="condition-select-group" :class="{more: isMoreSelect}">
+                            <div class="condition-select-item" @click="onSelectItem(item, popInfo.label)" v-for="(item,i) in conditionMap[popInfo.label]" :class="{checked: item.checked}">
+                                <div>@@item.title@@</div>
+                                <i v-if="!isMoreSelect" class="j-icon base-icon icon-tick"></i>
+                                <div class="more-icon-box" v-else>
+                                    <i  class="j-icon base-icon icon-tick-circle"></i>
+                                    <i  class="j-icon base-icon icon-tick-circle-fill"></i>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="j-footer">
+                        <div class="j-button-group">
+                            <button class="j-button-confirm" :disabled="isNextDisabled" @click="submitPop">确认</button>
+                        </div>
+                    </div>
+                </div>
+            </van-popup>
+        </div>
+    </div>
+</div>
+
+<script rel="preload" as="script" src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+<script rel="preload" as="script" src=//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.8.2/vant.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>
+  var vNode = {
+    delimiters: ['@@', '@@'],
+    el: '#perfect-info-page',
+    data: {
+      title:'标讯数据深度挖掘,拓客+风险评估更高效!',
+      searchList: [],
+      isAssociateShow: false,
+      isAssociateUpTime: -1,
+      infoMap: {
+        name: '',
+        phone: '',
+        email: '',
+        company: '',
+        position: '',
+        position_other: '',
+        branch: ''
+      },
+      infoCheckMap: {
+        name: '',
+        phone: '',
+        email: '',
+        company: '',
+        position: '',
+        position_other: '',
+        branch: ''
+      },
+      isEchoInfoLoading: true,
+      popInfo: {
+        show: false,
+        label: '',
+        title: ''
+      },
+      conditionMap: {
+        '职位': [
+          {
+            title: '总裁',
+            checked: false
+          },
+          {
+            title: '总经理',
+            checked: false
+          },
+          {
+            title: '总监',
+            checked: false
+          },
+          {
+            title: '经理',
+            checked: false
+          },
+          {
+            title: '主管',
+            checked: false
+          },
+          {
+            title: '职员',
+            checked: false
+          }
+        ],
+        '部门': [
+          {
+            title: '市场',
+            checked: false
+          },
+          {
+            title: '产品',
+            checked: false
+          },
+          {
+            title: '销售',
+            checked: false
+          },
+          {
+            title: '渠道',
+            checked: false
+          },
+          {
+            title: '其他',
+            checked: false
+          }
+        ]
+      },
+      ajaxParams: {
+        "name": "",
+        "phone": "",
+        "source": utils.getParam('source'), // 推送消息点进来的
+        "mail": "",
+        "company": "",
+        "position": "",
+        "branch": "",
+        origin: location.origin
+      },
+      jobJson: [
+        '总裁',
+        '总经理',
+        '总监',
+        '经理',
+        '主管',
+        '职员'
+      ]
+    },
+    mounted() {
+      // source=message_bigmember app消息大会员留资地
+      // source=message_structeddata app消息结构化数据留资地
+      if(utils.getParam('title')){
+        this.title = utils.getParam('title')
+      }
+      this.ajaxGetEchoInfo()
+    },
+    computed: {
+      getPopHeight () {
+        return this.popInfo.label === '受雇类型' ?  '5.42rem' : '8.36rem'
+      },
+      checkName () {
+        if (this.infoMap.name.length > 10) {
+          return false
+        }
+        var namereg = /^[\u4E00-\u9FA5A-Za-z\s]+(·[\u4E00-\u9FA5A-Za-z]+)*$/;//中英文或加.的少数民族名字
+        return namereg.test(this.infoMap.name)
+      },
+      checkPhone () {
+        return /^1[3-9]\d{9}$/.test(this.infoMap.phone)
+      },
+      checkEmail () {
+        if (this.infoMap.email.length > 50) {
+          return false
+        }
+        return /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(this.infoMap.email)
+      },
+      checkEntName () {
+        if (this.infoMap.company.trim().length > 50 || this.infoMap.company.trim().length < 2) {
+          return false
+        }
+        return true
+      },
+      isMoreSelect () {
+        return this.popInfo.label === '公司类型'
+      },
+      checkPosition () {
+        if (this.infoMap.position !== "" && this.infoMap.position !== '其他') {
+          return true
+        }
+        if (this.infoMap.position_other.length > 50) {
+          return false
+        }
+        var namereg = /^[\u4E00-\u9FA5A-Za-z\s]+(·[\u4E00-\u9FA5A-Za-z]+)*$/;
+        return namereg.test(this.infoMap.position_other)
+      },
+      isSubmitDisabled () {
+        return !this.checkName || !this.checkPhone || !this.checkEntName || !this.checkPosition || (this.showBranch && !this.infoMap.branch)
+      },
+      isNextDisabled () {
+        var type = this.popInfo.label
+        var result = false
+        switch (type) {
+          case '职位': {
+            result = this.conditionMap[type].filter(v => v.checked).length
+            break
+          }
+          case '部门': {
+            result = this.conditionMap[type].filter(v => v.checked).length
+            break
+          }
+        }
+        return !result
+      },
+      showBranch () {
+        // 切换到总裁或总经理之后 把之前选择的部门清空
+        if (this.infoMap.position.indexOf('总裁') > -1 || this.infoMap.position.indexOf('总经理') > -1) {
+          this.infoMap.branch = ''
+          this.conditionMap['部门'].forEach(v => {
+            v.checked = false
+          })
+        }
+        var zc = this.infoMap.position.indexOf('总裁') > -1
+        var zjl = this.infoMap.position.indexOf('总经理') > -1
+        return !(zc || zjl) && this.infoMap.position
+      }
+    },
+    methods: {
+      ajaxFn: function (url, data, callback, type) {
+        return $.ajax({
+          type: 'post',
+          url: url,
+          contentType: type ? 'application/x-www-form-urlencoded' : "application/json;charset=utf-8",
+          data: type ? data : JSON.stringify(data),
+          dataType: "json",
+          success: typeof callback === 'function' ? callback.bind(this) : new Function()
+        })
+      },
+      ajaxGetEchoInfo() {
+        this.isEchoInfoLoading = true
+        this.ajaxFn('/salesLeads/retainedCapital' + '?source=' + this.ajaxParams.source, {}, function (r) {
+          this.isEchoInfoLoading = false
+          if (r && r.info) {
+            r.data = r.info
+          }
+          if (r && r.error_msg === '' && r.data) {
+            this.setEchoInfo(r.data)
+            var result = checkRequiredKeys(['name', 'phone', 'company', 'position', 'branch'], r.data)
+            if (result) {
+              var skipAuto = ['jyarticle_see3', 'article_collection', 'article_original', 'jypush_see10']
+              var _this = this
+              var canAuto = !skipAuto.some(function (v) {
+                return _this.ajaxParams.source.indexOf(v) > -1
+              })
+              this.submitForm(canAuto)
+            }
+          }
+        })
+      },
+      highlightText (value, keyStr) {
+        return utils.replaceKeyword(value, keyStr, '<span class="highlight-text">' + keyStr + '</span>')
+      },
+      entOnChange (type) {
+        if (type === 'blur') {
+          this.getCheckMap('company')
+          setTimeout(() => {
+            this.isAssociateShow = false
+            this.searchList = []
+          }, 300)
+        } else {
+          clearTimeout(this.isAssociateUpTime)
+          this.isAssociateUpTime = setTimeout(() => {
+            this.ajaxEntList(this.infoMap.company)
+          }, 200)
+        }
+      },
+      selectEnt (item) {
+        console.log('item', item)
+        this.infoMap.company = item
+        this.isAssociateShow = false
+        this.searchList = []
+      },
+      ajaxEntList (str) {
+        if (str.length <= 2) {
+          return
+        }
+        this.ajaxFn('/jypay/user/company/association', { name: str,companyCount:10 }, function (r) {
+          if (r && r.error_msg === '' && r.data) {
+            this.isAssociateShow = true
+            this.searchList = r.data
+          }
+        }, true)
+      },
+      setEchoInfo (data) {
+        if (data.position) {
+          this.setCheckForData('position', 'position', data.position, '职位')
+        }
+        if (data.name) {
+          this.setCheckForData('name', 'name', data.name)
+        }
+        if (data.phone) {
+          this.setCheckForData('phone', 'phone', data.phone)
+        }
+        if (data.mail) {
+          this.setCheckForData('mail', 'email', data.mail)
+        }
+        if (data.company) {
+          this.setCheckForData('company', 'company', data.company)
+        }
+        if (data.branch) {
+          this.setCheckForData('branch', 'branch', data.branch, '部门')
+        }
+      },
+      setCheckForData (aKey, iKey, cKey, label) {
+        this.ajaxParams[aKey] = cKey
+        this.infoMap[iKey] = cKey
+        if (label === '职位' && this.jobJson.indexOf(cKey) === -1) {
+            // this.infoMap[iKey] = '其他'
+            // this.infoMap.position_other = cKey.split('/')[1]
+            this.infoMap[iKey] = ''
+            this.infoMap.position_other = ''
+        }
+        if (label) {
+          var checkDatas = [cKey]
+          this.conditionMap[label].forEach(v => {
+            if (checkDatas.indexOf(v.title) !== -1) {
+              v.checked = true
+            }
+          })
+        }
+      },
+      submitPop() {
+        var type = this.popInfo.label
+        switch (type) {
+          case '职位': {
+            var tempData = this.conditionMap[type].filter(v => v.checked)
+            this.setCheckForData('position', 'position', tempData[0].title)
+            break
+          }
+          case '部门': {
+            var tempData = this.conditionMap[type].filter(v => v.checked)
+            this.setCheckForData('branch', 'branch', tempData[0].title)
+            break
+          }
+        }
+        this.popInfo.show = false
+      },
+      openPop(type) {
+        switch (type) {
+          case '职位': {
+            this.popInfo.title = '职位'
+            break
+          }
+          case '部门': {
+            this.popInfo.title = '部门'
+            break
+          }
+        }
+        this.popInfo.label = type
+        this.popInfo.show = true
+      },
+      onSelectItem (item, index) {
+        if (this.isMoreSelect) {
+          item.checked = !item.checked
+        } else {
+          this.conditionMap[index].forEach(function (v) {
+            v.checked = false
+          })
+          item.checked = true
+        }
+      },
+      getCheckMap (type) {
+        switch (type) {
+            case 'name': {
+              this.infoCheckMap.name = this.infoMap.name === '' ? '姓名为必填项' : ''
+              if (this.infoCheckMap.name === '' && !this.checkName) {
+                this.infoCheckMap.name = '请输入正确格式的姓名'
+              }
+              break
+            }
+            case 'phone': {
+              this.infoCheckMap.phone = this.infoMap.phone === '' ? '手机号码为必填项' : ''
+              if (this.infoCheckMap.phone === '' && !this.checkPhone) {
+                this.infoCheckMap.phone = '请输入正确格式的手机号码'
+              }
+              break
+            }
+            case 'email': {
+              this.infoCheckMap.email = this.infoMap.email === '' ? '邮箱为必填项' : ''
+              if (this.infoCheckMap.email === '' && !this.checkEmail) {
+                this.infoCheckMap.email = '请输入正确格式的邮箱'
+              }
+              break
+            }
+            case 'company': {
+              this.infoCheckMap.company = this.infoMap.company === '' ? '公司名称为必填项' : ''
+              if (this.infoCheckMap.company === '' && !this.checkEntName) {
+                this.infoCheckMap.company = '请输入正确格式的公司名称'
+                if (this.infoMap.company.length < 2) {
+                  this.infoCheckMap.company = '公司名称至少输入2个字'
+                }
+                if (this.infoMap.company.length > 50) {
+                  this.infoCheckMap.company = '公司名称最多输入50个字'
+                }
+              }
+              break
+            }
+            case 'position': {
+              var isOther = this.infoMap.position === '其他' && this.infoMap.position_other === ''
+              this.infoCheckMap.position_other =  isOther ? '职位为必填项' : ''
+              if (this.infoCheckMap.position_other === '' && !this.checkPosition) {
+                this.infoCheckMap.position_other = '请输入正确格式的职位'
+              }
+              break
+            }
+        }
+      },
+      cancelForm () {
+        history.back()
+      },
+      submitForm (auto) {
+        this.ajaxParams.name = this.infoMap.name
+        this.ajaxParams.phone = this.infoMap.phone
+        this.ajaxParams.mail = this.infoMap.email
+        this.ajaxParams.company = this.infoMap.company
+        this.ajaxParams.position = this.infoMap.position
+        this.ajaxParams.branch = this.infoMap.branch.indexOf('总裁') > -1 || this.infoMap.branch.indexOf('总经理') > -1 ?  '' : this.infoMap.branch
+        if (this.infoMap.position === '其他') {
+          this.ajaxParams.position = '其他/' + this.infoMap.position_other
+        }
+        console.log(this.ajaxParams)
+        var _this = this
+        var loading = _this.showLoading()
+        var ajax_url= this.ajaxParams.source.indexOf('bankLanding') !== -1 ? '/salesLeads/official/notLogin' : '/salesLeads/collectInfo'
+        this.ajaxFn(ajax_url, this.ajaxParams, function (r) {
+          if (r) {
+            loading.clear()
+            if (r.error_msg === '') {
+              _this.$dialog.close()
+              // _this.$dialog.confirm({
+              //   message: '您的申请已提交,我们会尽快联系您并预约演示时间,请耐心等待~您将获得免费体验大会员全部功能!',
+              //   className: 'ent-search-dialog max-54',
+              //   overlayClass: 'z-2030',
+              //   showCancelButton: false,
+              //   getContainer: '.perfect-info-group',
+              //   confirmButtonText: '我知道了',
+              // }).then(function () {
+              //   history.back()
+              // }).catch(function () {
+              //   history.back()
+              // });
+              _this.$dialog.confirm({
+                title:'提交成功',
+                message: '我们的客户经理会在24小时内尽快与您联系。',
+                className: 'ent-search-dialog max-54',
+                overlayClass: 'z-2030',
+                showCancelButton: false,
+                getContainer: '.perfect-info-group',
+                confirmButtonText: '我知道了',
+              }).then(function () {
+                history.back()
+              }).catch(function () {
+                history.back()
+              });
+            } else {
+              _this.showToast(r.error_msg || '提交失败')
+            }
+          }
+        })
+      },
+      showLoading: function () {
+        var loading = this.$toast.loading({
+          duration: 0,
+          forbidClick: true,
+          message: '提交中...',
+        })
+        return loading
+      },
+      showToast: function (message) {
+        this.$toast({
+          duration: 1500,
+          forbidClick: true,
+          message: message,
+        })
+      }
+    }
+  }
+  var vPerfect = new Vue(vNode)
+</script>
+{{include "/common/baiducc.html"}}
+</body>
+
+</html>

+ 110 - 0
src/jfw/modules/app/src/web/templates/site/page/bankLanding/index.html

@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+
+<head>
+  <title>银行行业解决方案-剑鱼标讯</title>
+  <meta content="IE=edge,Chrome=1" http-equiv="X-UA-Compatible" />
+  <meta content="银行行业解决方案,招标商机,人工智能,招标大数据,企业情报,剑鱼标讯" name="Keywords" />
+  <meta
+    content="银行行业解决方案依托剑鱼标讯海量招标信息,为你提供招标商机服务、人工智能预测新项目服务、中标企业预测服务、招标大数据服务和企业情报大数据服务,帮助你全面获取销售机会、辅助进行投标决策、全面分析洞察市场、拓展客户和代理渠道。"
+    name="Description" />
+  <meta charset="UTF-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <meta name="format-detection" content="telephone=yes" />
+  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+  <meta content="webkit" name="renderer">
+  <meta content="telephone=no" name="format-detection" />
+  <meta content="银行行业解决方案" name="enable-header" data-theme="dark" />
+  <link rel="stylesheet" type="text/css" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/local/weui.min.css">
+  <link rel="stylesheet" type="text/css" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/local/layout.css" />
+  <link rel="stylesheet" type="text/css" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version" }}" />
+  <link rel="stylesheet" type="text/css" href="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/css/appbutton.css?v={{Msg "seo" "version" }}" />
+  <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/site/page/bankLanding/index.css?v={{Msg "seo" "version" }}" />
+  <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+  <style>
+    .app-layout-header{
+      position: fixed;
+      left:0;
+      top:0;
+      z-index:10;
+    }
+  </style>
+  {{include "/common/js.html"}}
+</head>
+
+<body>
+  <div id="bankLanding" class="pt-21vw">
+    <div class="app-layout-header jy-app-header">
+      <span class="app-back jyapp-icon jyapp-icon-zuojiantou"></span>
+      银行行业解决方案
+      <span></span>
+    </div>
+    <div class="head">
+      <img src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/bg-head.png?v={{Msg "seo" "version" }}" alt="">
+      <div class="text_box">
+        <p><span class="tit">剑鱼标讯 </span><span>拥有多年toB大数据营销服务的经验,建立并持续维护全国招投标数据、企业工商数据、组织机构、新闻舆情、企业智能标签等多个大型主题数据库。</span></p>
+        <br>
+        <p><span> 剑鱼标讯充分利用人工智能和大数据技术,帮助银行对公营销挖掘“机构、大中小”客户,为银行提供基于大数据技术构建的批量、精准、高效的整合营销解决方案。</span></p>
+      </div>
+    </div>
+    <div class="usageScenario">
+      <div class="item bg-business">
+        <div class="header">
+          <img src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/ic-2.png?v={{Msg "seo" "version" }}" alt="" class="ic_left">
+          <p>使用场景</p>
+          <img src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/ic-1.png?v={{Msg "seo" "version" }}" alt="" class="ic_right">
+        </div>
+        <p class="title">挖掘商机</p>
+        <p class="text">覆盖政企市场主流需求和交易,帮助银行及时全面的了解客户和供应商。通过招投标信息,挖掘政府机构、企事业单位、学校等相关机构的存款和贷款需求。</p>
+      </div>
+      <div class="item_short bg-risk">
+        <p class="title">风险评估</p>
+        <p class="text">招投标信息可实时反映企业需求和交易状况,可通过相关数据更了解企业。通过企业在大型项目中的中标情况,评估企业经济实力,预估银行贷款风险。</p>
+      </div>
+      <div class="item_short bg-bid">
+        <p class="title">投标保函</p>
+        <p class="text">银行通过查询投标企业的政府采购项目信息,为投标企业提供投标保函。</p>
+      </div>
+      <div class="item_short bg-honour">
+        <p class="title">履约保函</p>
+        <p class="text">银行通过调用政府采购中标企业的中标项目信息,为企业提供履约保函业务。</p>
+      </div>
+    </div>
+    <div class="ok_btn">点击了解更多</div>
+    <div class="service_content">
+      <div class="header">
+        <img src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/ic-2.png?v={{Msg "seo" "version" }}" alt="" class="ic_left">
+        <p>服务内容</p>
+        <img src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/ic-1.png?v={{Msg "seo" "version" }}" alt="" class="ic_right">
+      </div>
+      <div class="item">
+        <p class="title">数据服务</p>
+        <p class="text">可定期针对银行行业的标讯数据信息进行整合输出,按照企业的实际业务需求,提供多维度的数据分析服务,可直接供企业使用。</p>
+        <img class="p_right" src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/img-3.png?v={{Msg "seo" "version" }}" alt="">
+      </div>
+      <div class="item">
+        <p class="title ml-2">接口服务</p>
+        <p class="text ml-2">专属技术服务团队支持定制程序开发,可提供实时标讯的API接口,开放相应的数据库权限,定制程序可直接和业务单位内部程序对接。实现数据的快捷实时调用。</p>
+        <img class="p_left" src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/img-1.png?v={{Msg "seo" "version" }}" alt="">
+      </div>
+      <div class="item">
+        <p class="title">售后维护</p>
+        <p class="text">根据业务单位的实际需求,经验丰富的数据团队可对数据进行深度加工分析,有针对性的解决企业获客及风险评估版块个性化问题。</p>
+        <img class="p_right" src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/images/img-2.png?v={{Msg "seo" "version" }}" alt="">
+      </div>
+    </div>
+    <div class="ok_btn">点击了解更多</div>
+  </div>
+  <script src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/jyapp/local/weui.min.js"></script>
+  <!-- 本身逻辑js -->
+  <script src="{{Cdns .Host " seo" "cdn" |SafeUrl}}/common-module/site/page/bankLanding/index.js?v={{Msg "seo" "version" }}"></script>
+  <script>
+  </script>
+  <!--百度统计-->
+  {{include "/common/baiducc.html"}}
+</body>
+
+</html>

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

@@ -4,7 +4,7 @@ go 1.18
 
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a
-	app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62
+	app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67

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

@@ -6,8 +6,8 @@ app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Y
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a h1:wD4aWPSYdiX1cIP4lzzPD2s7fYhKa3muIf97l9tonJE=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62 h1:HNoByTbAT3juYEPQqScQ902LbSE8WKYJD5LZhJNUYQE=
-app.yhyue.com/moapp/jypkg v0.0.0-20230313120532-c305dbfd6a62/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca h1:1vX1uTIRH05n+RXGBi7nAP+H41xBfk9/OUUiReeyKv4=
+app.yhyue.com/moapp/jypkg v0.0.0-20230316082241-340a7810baca/go.mod h1:cWnWKx0bOu5dHKAVAoYFRCDqEWDw2lOVWUAA5a0u+74=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 307 - 237
src/jfw/modules/subscribepay/src/service/dataExportPay.go

@@ -1,34 +1,36 @@
 package service
 
 import (
-        "bytes"
-        "encoding/json"
-        "fmt"
-        "jy/src/jfw/modules/subscribepay/src/config"
-        "jy/src/jfw/modules/subscribepay/src/entity"
-        "jy/src/jfw/modules/subscribepay/src/pay"
-        "jy/src/jfw/modules/subscribepay/src/util"
-        "log"
-        "math"
-        "regexp"
-        "time"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/entity"
+	"jy/src/jfw/modules/subscribepay/src/pay"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"log"
+	"math"
+	"regexp"
+	"strings"
+	"time"
 
-        . "app.yhyue.com/moapp/jybase/date"
-        "app.yhyue.com/moapp/jybase/encrypt"
-        "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-        "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-        "app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
 
-        qutil "app.yhyue.com/moapp/jybase/common"
+	qutil "app.yhyue.com/moapp/jybase/common"
 )
 
 type DataExportPay struct {
-        *xweb.Action
-        getPrice    xweb.Mapper `xweb:"/dataexport/getPrice"`    //获取数据导出价格
-        createOrder xweb.Mapper `xweb:"/dataExport/createOrder"` //移动端创建订单
-        //vipDailyDataExport        xweb.Mapper `xweb:"/dataExport/vipDaily"`        //大会员数据包数据导出
-        //vipDailyDataExportSuccess xweb.Mapper `xweb:"/dataExport/vipDailySuccess"` //大会员数据包导出生成是否成功
-        historyById xweb.Mapper `xweb:"/dataExport/historyById"` //历史条件
+	*xweb.Action
+	getPrice    xweb.Mapper `xweb:"/dataexport/getPrice"`    //获取数据导出价格
+	createOrder xweb.Mapper `xweb:"/dataExport/createOrder"` //移动端创建订单
+	//vipDailyDataExport        xweb.Mapper `xweb:"/dataExport/vipDaily"`        //大会员数据包数据导出
+	//vipDailyDataExportSuccess xweb.Mapper `xweb:"/dataExport/vipDailySuccess"` //大会员数据包导出生成是否成功
+	historyById xweb.Mapper `xweb:"/dataExport/historyById"` //历史条件
 }
 
 var reg *regexp.Regexp //匹配特殊字符
@@ -36,241 +38,309 @@ var reg *regexp.Regexp //匹配特殊字符
 var DateFullLayout = "2006-01-02 15:04:05"
 
 func init() {
-        reg, _ = regexp.Compile("[^A-Za-z0-9\u4e00-\u9fa5]")
+	reg, _ = regexp.Compile("[^A-Za-z0-9\u4e00-\u9fa5]")
 }
 
 // dataExportPhoneAndMailCheck 数据导出获取邮箱和手机号
 func dataExportPhoneAndMailCheck(sess *httpsession.Session) (phone, mail string, mailCheck bool) {
-        mail, _ = sess.Get("DataExportVerifyEmail_val").(string)
-        phone, _ = sess.Get("DataExportVerifyPhone").(string)
-        if phone != "" {
-                sess.Set("DataExportVerifyPhone_val", phone) //提交后下次默认带出手机号
-        } else {
-                phone, _ = sess.Get("DataExportVerifyPhone_val").(string)
-        }
-        mailCheck = qutil.ObjToString(sess.Get("DataExportVerifyEmail_val")) != ""
-        return
+	mail, _ = sess.Get("DataExportVerifyEmail_val").(string)
+	phone, _ = sess.Get("DataExportVerifyPhone").(string)
+	if phone != "" {
+		sess.Set("DataExportVerifyPhone_val", phone) //提交后下次默认带出手机号
+	} else {
+		phone, _ = sess.Get("DataExportVerifyPhone_val").(string)
+	}
+	mailCheck = qutil.ObjToString(sess.Get("DataExportVerifyEmail_val")) != ""
+	return
 }
 
 //移动端创建订单
 func (p *DataExportPay) CreateOrder() {
-        defer qutil.Catch()
-        openId, _ := p.GetSession("s_m_openid").(string)
-        userId, _ := p.GetSession("userId").(string)
-        id := encrypt.SE.Decode4Hex(p.GetString("id"))
-        if userId == "" || id == "" {
-                p.ServeJson(map[string]interface{}{
-                        "status": "n",
-                })
-                return
-        }
-        //
-        data_spec := p.GetString("data_spec")
-        if data_spec == "standard" {
-                data_spec = "标准字段包"
-        } else if data_spec == "senior" {
-                data_spec = "高级字段包"
-        }
+	defer qutil.Catch()
+	openId, _ := p.GetSession("s_m_openid").(string)
+	userId, _ := p.GetSession("userId").(string)
+	id := encrypt.SE.Decode4Hex(p.GetString("id"))
+	if userId == "" || id == "" {
+		p.ServeJson(map[string]interface{}{
+			"status": "n",
+		})
+		return
+	}
+	//
+	data_spec := p.GetString("data_spec")
+	if data_spec == "standard" {
+		data_spec = "标准字段包"
+	} else if data_spec == "senior" {
+		data_spec = "高级字段包"
+	}
 
-        data_count := dataexport.GetDataExportSearchCountByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id)
-        if data_count > config.ExConf.MsgMaxCount || data_count == -1 {
-                data_count = config.ExConf.MsgMaxCount
-        }
+	data_count := dataexport.GetDataExportSearchCountByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id)
+	if data_count > config.ExConf.MsgMaxCount || data_count == -1 {
+		data_count = config.ExConf.MsgMaxCount
+	}
 
-        if data_count <= 0 {
-                p.ServeJson(map[string]interface{}{
-                        "status": "n",
-                })
-                return
-        }
+	if data_count <= 0 {
+		p.ServeJson(map[string]interface{}{
+			"status": "n",
+		})
+		return
+	}
 
-        user_phone, user_mail, user_mail_status := entity.JyCommonOrderStruct.DataExportPhoneAndMailCheck(p.Session())
+	user_phone, user_mail, user_mail_status := entity.JyCommonOrderStruct.DataExportPhoneAndMailCheck(p.Session())
 
-        order_money_, original_price_ := float64(0), float64(0)
-        if data_spec == "标准字段包" {
-                original_price_ = float64(data_count) * config.ExConf.UnitPrice_normal
-        } else if data_spec == "高级字段包" {
-                original_price_ = float64(data_count) * config.ExConf.UnitPrice_senior
-        }
-        order_money_ = float64(original_price_) * config.ExConf.Discount
-        if order_money_ < config.ExConf.OrderMinPrice {
-                order_money_ = config.ExConf.OrderMinPrice
-        }
-        if original_price_ < config.ExConf.OrderMinPrice {
-                original_price_ = config.ExConf.OrderMinPrice
-        }
-        order_money := int(order_money_ * 100)
-        original_price := int(original_price_ * 100)
+	order_money_, original_price_ := float64(0), float64(0)
+	if data_spec == "标准字段包" {
+		original_price_ = float64(data_count) * config.ExConf.UnitPrice_normal
+	} else if data_spec == "高级字段包" {
+		original_price_ = float64(data_count) * config.ExConf.UnitPrice_senior
+	}
+	order_money_ = float64(original_price_) * config.ExConf.Discount
+	if order_money_ < config.ExConf.OrderMinPrice {
+		order_money_ = config.ExConf.OrderMinPrice
+	}
+	if original_price_ < config.ExConf.OrderMinPrice {
+		original_price_ = config.ExConf.OrderMinPrice
+	}
+	order_money := int(order_money_ * 100)
+	original_price := int(original_price_ * 100)
 
-        filter_keys, filter_publishtime, filter, disWord := "", "", "", ""
+	filter_keys, filter_publishtime, filter, disWord := "", "", "", ""
 
-        isPass := func() bool {
-                if user_mail == "" || user_phone == "" || !user_mail_status || data_spec == "" || order_money <= 0 || data_count <= 0 || original_price <= 0 {
-                        log.Println("参数不合法! user_mail,user_phone, user_mail_status, data_spec, order_money, data_count, original_price", user_mail, user_phone, user_mail_status, data_spec, order_money, data_count, original_price)
-                        return false
-                }
-                userfilter, ok := util.MQFW.FindById("export_search", id, nil)
-                if ok && userfilter != nil {
-                        keywords, _ := (*userfilter)["keywords"].([]interface{})
-                        var buffer bytes.Buffer
-                        for _, v := range keywords {
-                                vm, _ := v.(map[string]interface{})
-                                if buffer.Len() > 0 {
-                                        buffer.WriteString(",")
-                                }
-                                buffer.WriteString(qutil.ObjToString(vm["keyword"]))
-                        }
-                        filter_keys = buffer.String()
-                        filter_publishtime = qutil.ObjToString((*userfilter)["publishtime"])
-                        disWord = qutil.ObjToString((*userfilter)["disWord"])
-                        log.Println("口令:", disWord, config.Config.TermValidity)
-                        delete(*userfilter, "selectIds")
-                        filterByte, _ := json.Marshal(userfilter)
-                        filter = string(filterByte)
+	isPass := func() bool {
+		if user_mail == "" || user_phone == "" || !user_mail_status || data_spec == "" || order_money <= 0 || data_count <= 0 || original_price <= 0 {
+			log.Println("参数不合法! user_mail,user_phone, user_mail_status, data_spec, order_money, data_count, original_price", user_mail, user_phone, user_mail_status, data_spec, order_money, data_count, original_price)
+			return false
+		}
+		userfilter, ok := util.MQFW.FindById("export_search", id, nil)
+		if ok && userfilter != nil {
+			keywords, _ := (*userfilter)["keywords"].([]interface{})
+			var buffer bytes.Buffer
+			for _, v := range keywords {
+				vm, _ := v.(map[string]interface{})
+				if buffer.Len() > 0 {
+					buffer.WriteString(",")
+				}
+				buffer.WriteString(qutil.ObjToString(vm["keyword"]))
+			}
+			filter_keys = buffer.String()
+			filter_publishtime = qutil.ObjToString((*userfilter)["publishtime"])
+			disWord = qutil.ObjToString((*userfilter)["disWord"])
+			log.Println("口令:", disWord, config.Config.TermValidity)
+			delete(*userfilter, "selectIds")
+			filterByte, _ := json.Marshal(userfilter)
+			filter = string(filterByte)
 
-                } else {
-                        return false
-                }
-                return true
-        }()
-        nickname, _ := p.GetSession("s_nickname").(string)
-        result := map[string]interface{}{
-                "status": "n",
-        }
-        if isPass {
-                //用户当前使用卡卷
-                userLotteryId := ""
-                var discount float64
-                full_price, reduce_price := 0, 0
-                //卡卷信息的id
-                lotteryId := p.GetString("lotteryId")
-                discount_price := 0
-                if lotteryId != "" {
-                        full_price, reduce_price, discount, userLotteryId = util.GetCouponInfo(userId, lotteryId, config.CouponConfig.Products["数据导出"])
-                        if full_price <= order_money {
-                                if discount == 100 {
-                                        order_money = order_money - reduce_price
-                                        discount_price = reduce_price
-                                } else {
-                                        //折扣
-                                        disCount_int := int(math.Ceil(discount * 100))
-                                        discount_price = order_money - order_money*disCount_int/1000
-                                        order_money = order_money * disCount_int / 1000
-                                }
-                        } else {
-                                userLotteryId = ""
-                        }
-                }
-                ordercode := pay.GetOrderCode(openId)
-                download_url := util.GetExcelFilePath(ordercode)
-                go func() {
-                        list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id, qutil.If(data_spec == "高级字段包", "2", "1").(string), data_count)
-                        if err == nil && list != nil && len(*list) > 0 {
-                                list = dataexport.FormatExportData(util.MQFWENT, list, config.Config.WebDomain, qutil.If(data_spec == "高级字段包", "2", "1").(string))
-                                err = util.CreateDataExportExcelFile(list, data_spec == "高级字段包", config.ExConf.ExcelReadyPath+download_url)
-                        }
-                        if err != nil {
-                                errMeg := fmt.Sprintf("数据导出生成订单异常\n用户id:%s\n订单号:%s\n异常信息:%v:", userId, ordercode, err)
-                                util.SendErrNoteToMail(errMeg)
-                        }
-                }()
-                now := time.Now()
-                distributionChannel, orderChannel := util.GetJyOrderChannel(disWord, p.Header("User-Agent"))
-                entId := qutil.Int64All(p.GetSession("entId"))
-                buy_subject := 1
-                if entId > 0 {
-                        buy_subject = 2
-                }
-                orderid := util.Mysql.Insert("dataexport_order", map[string]interface{}{
-                        "order_money":          order_money,
-                        "order_status":         0,
-                        "service_status":       0,
-                        "user_nickname":        nickname,
-                        "user_openid":          openId,
-                        "filter":               filter,
-                        "order_code":           ordercode,
-                        "product_type":         "历史数据",
-                        "create_time":          FormatDate(&now, Date_Full_Layout),
-                        "original_price":       original_price,
-                        "data_spec":            data_spec,
-                        "user_mail":            user_mail,
-                        "user_phone":           user_phone,
-                        "data_count":           data_count,
-                        "filter_publishtime":   filter_publishtime,
-                        "filter_keys":          filter_keys,
-                        "filter_id":            id,
-                        "user_id":              userId, //20190719 移动端数据导出 生订单添加用户id
-                        "download_url":         download_url,
-                        "discount_price":       discount_price,
-                        "d_relation_id":        userLotteryId,
-                        "dis_word":             disWord,             //202020817分销口令
-                        "distribution_channel": distributionChannel, //销售渠道
-                        "order_channel":        orderChannel,        //下单渠道
-                        "audit_status":         3,                   //默认审核通过
-                        "buy_subject":          buy_subject,
-                        "ent_id":               entId,
-                })
-                if orderid > 0 {
-                        p.SetSession("DataExportVerifyPhone_val", user_phone)
-                        result["status"] = "y"
-                        result["code"] = ordercode
-                        //保存结构化数据信息 记录
-                        go func() {
-                                if p.GetSession("Structed") != nil && p.GetSession("Structed").(bool) {
-                                        //姓名  手机号  邮箱
-                                        nickname, _ := p.GetSession("s_nickname").(string)
-                                        user_mail, _ := p.GetSession("DataExportVerifyEmail_val").(string)
-                                        user_phone, _ := p.GetSession("DataExportVerifyPhone").(string)
-                                        if user_phone == "" {
-                                                user_phone, _ = p.GetSession("DataExportVerifyPhone_val").(string)
-                                        }
-                                        util.StructedDataByExportData(nickname, user_mail, user_phone)
-                                        //清除存储标识
-                                        p.DelSession("Structed")
-                                }
-                        }()
-                        //绑定卡卷
-                        if userLotteryId != "" && lotteryId != "" {
-                                go func(userId, userLotteryId, order_code string) {
-                                        nickname, _ := p.Session().Get("s_nickname").(string)
-                                        phone, _ := p.Session().Get("phone").(string)
-                                        if !util.UpdateCouponState(userId, userLotteryId, nickname, phone, order_code, "数据导出", "", 3, 0) {
-                                                log.Println(fmt.Sprintf("单号%s-绑定失败-卡卷%s", order_code, userLotteryId))
-                                        }
-                                }(userId, userLotteryId, ordercode)
-                        }
-                }
-        }
-        p.ServeJson(result)
+		} else {
+			return false
+		}
+		return true
+	}()
+	nickname, _ := p.GetSession("s_nickname").(string)
+	result := map[string]interface{}{
+		"status": "n",
+	}
+	if isPass {
+		//用户当前使用卡卷
+		userLotteryId := ""
+		var discount float64
+		full_price, reduce_price := 0, 0
+		//卡卷信息的id
+		lotteryId := p.GetString("lotteryId")
+		discount_price := 0
+		if lotteryId != "" {
+			full_price, reduce_price, discount, userLotteryId = util.GetCouponInfo(userId, lotteryId, config.CouponConfig.Products["数据导出"])
+			if full_price <= order_money {
+				if discount == 100 {
+					order_money = order_money - reduce_price
+					discount_price = reduce_price
+				} else {
+					//折扣
+					disCount_int := int(math.Ceil(discount * 100))
+					discount_price = order_money - order_money*disCount_int/1000
+					order_money = order_money * disCount_int / 1000
+				}
+			} else {
+				userLotteryId = ""
+			}
+		}
+		ordercode := pay.GetOrderCode(openId)
+		download_url := util.GetExcelFilePath(ordercode)
+		go func() {
+			list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id, qutil.If(data_spec == "高级字段包", "2", "1").(string), data_count)
+			if err == nil && list != nil && len(*list) > 0 {
+				list = dataexport.FormatExportData(util.MQFWENT, list, config.Config.WebDomain, qutil.If(data_spec == "高级字段包", "2", "1").(string))
+				err = util.CreateDataExportExcelFile(list, data_spec == "高级字段包", config.ExConf.ExcelReadyPath+download_url)
+			}
+			if err != nil {
+				errMeg := fmt.Sprintf("数据导出生成订单异常\n用户id:%s\n订单号:%s\n异常信息:%v:", userId, ordercode, err)
+				util.SendErrNoteToMail(errMeg)
+			}
+		}()
+		now := time.Now()
+		distributionChannel, orderChannel := util.GetJyOrderChannel(disWord, p.Header("User-Agent"))
+		entId := qutil.Int64All(p.GetSession("entId"))
+		buy_subject := 1
+		if entId > 0 {
+			buy_subject = 2
+		}
+		orderid := util.Mysql.Insert("dataexport_order", map[string]interface{}{
+			"order_money":          order_money,
+			"order_status":         0,
+			"service_status":       0,
+			"user_nickname":        nickname,
+			"user_openid":          openId,
+			"filter":               filter,
+			"order_code":           ordercode,
+			"product_type":         "历史数据",
+			"create_time":          FormatDate(&now, Date_Full_Layout),
+			"original_price":       original_price,
+			"data_spec":            data_spec,
+			"user_mail":            user_mail,
+			"user_phone":           user_phone,
+			"data_count":           data_count,
+			"filter_publishtime":   filter_publishtime,
+			"filter_keys":          filter_keys,
+			"filter_id":            id,
+			"user_id":              userId, //20190719 移动端数据导出 生订单添加用户id
+			"download_url":         download_url,
+			"discount_price":       discount_price,
+			"d_relation_id":        userLotteryId,
+			"dis_word":             disWord,             //202020817分销口令
+			"distribution_channel": distributionChannel, //销售渠道
+			"order_channel":        orderChannel,        //下单渠道
+			"audit_status":         3,                   //默认审核通过
+			"buy_subject":          buy_subject,
+			"ent_id":               entId,
+		})
+		if orderid > 0 {
+			p.SetSession("DataExportVerifyPhone_val", user_phone)
+			result["status"] = "y"
+			result["code"] = ordercode
+			//保存结构化数据信息 记录
+			go func() {
+				if p.GetSession("Structed") != nil && p.GetSession("Structed").(bool) {
+					//姓名  手机号  邮箱
+					nickname, _ := p.GetSession("s_nickname").(string)
+					user_mail, _ := p.GetSession("DataExportVerifyEmail_val").(string)
+					user_phone, _ := p.GetSession("DataExportVerifyPhone").(string)
+					if user_phone == "" {
+						user_phone, _ = p.GetSession("DataExportVerifyPhone_val").(string)
+					}
+					util.StructedDataByExportData(nickname, user_mail, user_phone)
+					//清除存储标识
+					p.DelSession("Structed")
+				}
+			}()
+			//绑定卡卷
+			if userLotteryId != "" && lotteryId != "" {
+				go func(userId, userLotteryId, order_code string) {
+					nickname, _ := p.Session().Get("s_nickname").(string)
+					phone, _ := p.Session().Get("phone").(string)
+					if !util.UpdateCouponState(userId, userLotteryId, nickname, phone, order_code, "数据导出", "", 3, 0) {
+						log.Println(fmt.Sprintf("单号%s-绑定失败-卡卷%s", order_code, userLotteryId))
+					}
+				}(userId, userLotteryId, ordercode)
+			}
+		}
+	}
+	p.ServeJson(result)
 }
 
 //获取价格
 func (p *DataExportPay) GetPrice() {
-        //获取数量
-        p.ServeJson(map[string]interface{}{
-                "unitPrice_normal": config.ExConf.UnitPrice_normal,
-                "unitPrice_senior": config.ExConf.UnitPrice_senior,
-                "discount":         config.ExConf.Discount,
-                "orderMinPrice":    config.ExConf.OrderMinPrice,
-                "msgMaxCount":      config.ExConf.MsgMaxCount,
-        })
+	//获取数量
+	p.ServeJson(map[string]interface{}{
+		"unitPrice_normal": config.ExConf.UnitPrice_normal,
+		"unitPrice_senior": config.ExConf.UnitPrice_senior,
+		"discount":         config.ExConf.Discount,
+		"orderMinPrice":    config.ExConf.OrderMinPrice,
+		"msgMaxCount":      config.ExConf.MsgMaxCount,
+	})
 }
 
 //根据id获取导出条件
 func (p *DataExportPay) HistoryById() {
-        id := p.GetString("id")
-        id = encrypt.SE.Decode4Hex(id)
-        if id != "" {
-                data, _ := util.MQFW.FindById("export_search", id, nil)
-                if data != nil {
-                        delete(*data, "_id")
-                        delete(*data, "comeintime")
-                        delete(*data, "comeinfrom")
-                        delete(*data, "s_openid")
-                        delete(*data, "s_userid")
-                }
-                p.ServeJson(data)
-                return
-        }
-        p.ServeJson(map[string]interface{}{})
+	id := p.GetString("id")
+	id = encrypt.SE.Decode4Hex(id)
+	if id != "" {
+		data, _ := util.MQFW.FindById("export_search", id, nil)
+		if data != nil {
+			delete(*data, "_id")
+			delete(*data, "comeintime")
+			delete(*data, "comeinfrom")
+			delete(*data, "s_openid")
+			delete(*data, "s_userid")
+			searchMode := qutil.IntAll((*data)["searchMode"]) //搜索模式:0:精准搜索;1:模糊搜索
+			wordsMode := qutil.IntAll((*data)["wordsMode"])   //搜索关键词模式;默认0:包含所有,1:包含任意
+			if (*data)["keywords"] != nil && (searchMode > 0 || wordsMode > 0) {
+				if keywords := qutil.ObjArrToMapArr((*data)["keywords"].([]interface{})); len(keywords) > 0 {
+					var (
+						kws []map[string]interface{}
+					)
+					for _, kv := range keywords {
+						kw := KeywordExport{}
+						b, e := json.Marshal(kv)
+						if e != nil {
+							log.Println(e.Error())
+						}
+						json.Unmarshal(b, &kw)
+						kws = append(kws, kw.KeywordsFormat(wordsMode, searchMode)...)
+					}
+					(*data)["keywords"] = kws
+					log.Println("kws:", kws)
+				} //关键词
+			}
+		}
+		p.ServeJson(data)
+		return
+	}
+	p.ServeJson(map[string]interface{}{})
+}
+
+type KeywordExport struct {
+	Keyword  string   `json:"keyword"`
+	Appended []string `json:"appended"`
+	Exclude  []string `json:"exclude"`
+}
+
+// KeywordsFormat 关键词处理
+func (k *KeywordExport) KeywordsFormat(wordsMode, searchMode int) (res []map[string]interface{}) {
+	esAddrS := config.Config.Elasticsearch
+	//搜索模式:0:精准搜索;1:模糊搜索
+	if searchMode == 1 && esAddrS != "" {
+		esAddr := strings.Split(esAddrS, ",")[0]
+		if ikWords := jy.HttpEs(k.Keyword, "ik_smart", esAddr); ikWords != "" {
+			k.Keyword = strings.ReplaceAll(ikWords, "+", " ")
+		}
+		if len(k.Appended) > 0 {
+			for kai, kav := range k.Appended {
+				if ikWords := jy.HttpEs(kav, "ik_smart", esAddr); ikWords != "" {
+					k.Appended[kai] = strings.ReplaceAll(ikWords, "+", " ")
+				}
+			}
+		}
+	}
+	//搜索关键词模式;默认0:包含所有,1:包含任意
+	if wordsMode == 1 {
+		if len(k.Appended) > 0 {
+			res = append(res, map[string]interface{}{
+				"keyword":  k.Keyword,
+				"appended": []string{},
+				"exclude":  k.Exclude,
+			})
+			for _, kav := range k.Appended {
+				res = append(res, map[string]interface{}{
+					"keyword":  kav,
+					"appended": []string{},
+					"exclude":  k.Exclude,
+				})
+			}
+		}
+		return res
+	}
+	return append(res, map[string]interface{}{
+		"keyword":  k.Keyword,
+		"appended": k.Appended,
+		"exclude":  k.Exclude,
+	})
 }

+ 19 - 0
src/jfw/paging/paging.go

@@ -1,7 +1,9 @@
 package paging
 
 import (
+	qu "app.yhyue.com/moapp/jybase/common"
 	"fmt"
+	"math"
 	"strconv"
 )
 
@@ -24,6 +26,23 @@ const (
 	currPrevNextSize = 2 //当前页前后多少页开始显示点点点
 )
 
+func GetLetterPaging(pageNum, pageSize, count int, urlFormat string) (pagingMap map[string]interface{}) {
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	pagecount := int(math.Ceil(qu.Float64All(count) / float64(pageSize)))
+	paging := PaggingHtml(pageNum, pagecount, urlFormat)
+
+	pagingMap = map[string]interface{}{
+		"paging":    paging,
+		"pageNum":   pageNum,
+		"pageCount": pagecount,
+		"pageSize":  pageSize,
+		"urlFormat": urlFormat,
+	}
+	return
+}
+
 func PaggingHtml(currentPage, totalPage int, href string) string {
 	if currentPage > totalPage {
 		return ""

+ 105 - 0
src/jfw/site/IndustryInfo/IndustryInfo.go

@@ -0,0 +1,105 @@
+package IndustryInfo
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/public"
+	"html/template"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"time"
+)
+
+var (
+	mongodb = public.MQFW
+	se      = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
+)
+
+// 行业栏目页 右侧-中标必听课&剑鱼文库&攻略文章
+func industryColumn() map[string]interface{} {
+	req := make(map[string]interface{})
+	//右侧-调用中标必听课内容
+	data1 := jyutil.Course(500, 3)
+	var res1, res2, res3 []map[string]interface{}
+	if data1 != nil {
+		if len(*data1) > 3 {
+			for _, k := range jyutil.GenerateRandomNumber(0, len(*data1), 3) {
+				res1 = append(res1, (*data1)[k])
+			}
+		} else {
+			res1 = append(res1, *data1...)
+		}
+		req["course"] = res1
+	}
+	//右侧-调用剑鱼文库内容
+	data2, _ := jyutil.Library(500)
+	if data2 != nil {
+		_d, _ := data2["data"].([]interface{})
+		data := util.ObjArrToMapArr(_d)
+		if len(data) > 3 {
+			for _, k := range jyutil.GenerateRandomNumber(0, len(data), 3) {
+				res2 = append(res2, (data)[k])
+			}
+		} else {
+			res2 = append(res2, data...)
+		}
+		req["article"] = res2
+	}
+	//右侧-知识库精选,调用招投标攻略的文章,动态展示
+	data3, ok := mongodb.Find("content", map[string]interface{}{
+		"s_contenttype": "ztbgl",
+		"i_status":      1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()},
+	}, `{"releasetime":-1,"l_createdate":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+	if ok && data3 != nil {
+		if len(*data3) > 10 {
+			for _, k := range jyutil.GenerateRandomNumber(0, len(*data3), 10) {
+				res3 = append(res3, (*data3)[k])
+			}
+		} else {
+			res3 = append(res3, *data3...)
+
+		}
+		for _, v := range res3 {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+		}
+		req["guideline"] = res3
+	}
+	return req
+}
+
+// NewIndustry 首页 今日热点
+func NewIndustry(num int) *[]map[string]interface{} {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+
+	query := map[string]interface{}{"s_contenttype": util.InterfaceToStr(columnCode["行业资讯"]), "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	data, _ := mongodb.Find("content", query, `{"releasetime":-1,"l_createdate":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	if data != nil {
+		for _, v := range *data {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+			tmpdate, _ := v["l_createdate"]
+			v["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+			v["s_pic"] = jyutil.SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = jyutil.SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	return data
+}
+
+func Information(s string, num int) *[]map[string]interface{} {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+
+	return jyutil.GuidelineAndInformation(util.InterfaceToStr(columnCode["行业资讯"]), s, num)
+}
+
+// IndustryColumn 资讯一级栏目与二级栏目
+func IndustryColumn() jyutil.HelpColumn {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	return jyutil.GuidelineAndIndustry(util.InterfaceToStr(columnCode["行业资讯"]))
+}

+ 72 - 0
src/jfw/site/IndustryInfo/service.go

@@ -0,0 +1,72 @@
+package IndustryInfo
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"jy/src/jfw/jyutil"
+	"jy/src/jfw/paging"
+)
+
+const pageSize = 20
+
+// IndustryInfoService 行业资讯
+type IndustryInfoService struct {
+	*xweb.Action
+	index xweb.Mapper `xweb:"/industryInfo/index"`                  //行业资讯首页
+	class xweb.Mapper `xweb:"/industryInfo/(.*)/index([^.]*).html"` //行业资讯-攻略分类页面
+}
+
+func (this *IndustryInfoService) Index() {
+	var industryList []map[string]interface{}
+	for _, item := range IndustryColumn().SeedData {
+		if res := Information(item.Code, 3); res != nil && len(*res) > 0 {
+			industryList = append(industryList, map[string]interface{}{
+				"name": item.Name,
+				"code": item.Code,
+				"list": res,
+			})
+		}
+	}
+	this.T["industryList"] = industryList
+	this.T["dailyNews"] = NewIndustry(7)
+	this.Render("/site/page/industryInfo/index.html", &this.T)
+}
+
+// Class 攻略分类
+func (this *IndustryInfoService) Class(thisCode string, pageNumStr string) {
+	var classList []map[string]interface{}
+	for _, v := range IndustryColumn().SeedData {
+		if v.Name != "" && v.Code != "" {
+			classList = append(classList, map[string]interface{}{
+				"name": v.Name,
+				"code": v.Code,
+			})
+		}
+	}
+	this.T["classList"] = classList
+	// 中标必听课&剑鱼文库&攻略文章
+	this.T["rightData"] = industryColumn()
+	// 列表正文
+	var pageNum string = "1"
+	if pageNumStr != "" {
+		pageNum = pageNumStr[1:]
+	}
+	// 数据查询
+	data, _, total := jyutil.JyCmsSearch(map[string]string{
+		"perPage":              fmt.Sprint(pageSize),
+		"currentPage":          pageNum,
+		"s_secondclassifytype": thisCode,
+	}, "")
+
+	// 分页
+	if total > 0 {
+		this.T["pagingMap"] = paging.GetLetterPaging(common.IntAll(pageNum), pageSize, total, fmt.Sprintf("/industryInfo/%s/index_%s.html", thisCode, "%d"))
+	}
+
+	this.T["list"] = data
+	this.T["total"] = total
+	this.T["code"] = thisCode
+	this.T["nav"] = jyutil.NavigationBar(thisCode)
+	this.Render("/site/page/industryInfo/class.html", &this.T)
+}

+ 18 - 0
src/jfw/site/a_init.go

@@ -0,0 +1,18 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"jy/src/jfw/site/IndustryInfo"
+	"jy/src/jfw/site/bank"
+	"jy/src/jfw/site/helpCenter"
+	"jy/src/jfw/site/jySchool"
+	"jy/src/jfw/site/jyblog"
+)
+
+func init() {
+	xweb.AddAction(&jySchool.JySchoolService{})         //剑鱼学堂
+	xweb.AddAction(&helpCenter.HelpCenterService{})     //帮助中心
+	xweb.AddAction(&IndustryInfo.IndustryInfoService{}) //行业资讯
+	xweb.AddAction(&jyblog.JyBlog{})                    //剑鱼博客
+	xweb.AddAction(&bank.BankSchemeCommon{})            //银行解决方案
+}

+ 15 - 0
src/jfw/site/bank/bankScheme.go

@@ -0,0 +1,15 @@
+package bank
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+)
+
+type BankSchemeCommon struct {
+	*xweb.Action
+	bankScheme xweb.Mapper `xweb:"/bank/(\\w+)/scheme"` //银行解决方案
+}
+
+func (w *BankSchemeCommon) BankScheme(doType string) error {
+	return w.Render(fmt.Sprintf("/site/page/bankLanding/%s/index.html", doType), &w.T)
+}

+ 121 - 0
src/jfw/site/helpCenter/helpCenter.go

@@ -0,0 +1,121 @@
+package helpCenter
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/public"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"log"
+	"time"
+)
+
+var (
+	mongodb = public.MQFW
+	se      = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
+)
+
+// HelpHome 帮助中心 栏目
+// helpId栏目id isHome 是否帮助中心首页请求 num 获取数量
+func HelpHome(helpCode string, isHome bool, num int) []jyutil.HelpColumn {
+	log.Printf("帮助中心参数helpCode:%s,isHome:%v,num:%d", helpCode, isHome, num)
+	//获取帮助中心所有栏目
+	if helpCode == "" {
+		//获取帮助中心栏目id
+		columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+		helpCode = util.InterfaceToStr(columnCode["帮助中心"])
+	} else {
+		var ss jyutil.HelpColumn
+		data, ok := mongodb.FindOne("column", map[string]interface{}{
+			"s_columncode": helpCode,
+		})
+		if ok && data != nil && len(*data) > 0 {
+			//栏目页 获取下一级所有栏目
+			ss.Name = util.InterfaceToStr((*data)["s_columnname"])
+			ss.Code = util.InterfaceToStr((*data)["s_columncode"])
+			ss.Href = fmt.Sprintf("/helpCenter/catalog/%s", ss.Code)
+			if dataSeed := RecursiveQuery(ss.Code, true, num); dataSeed != nil && len(dataSeed) > 0 {
+				ss.SeedData = dataSeed
+			}
+		}
+		return []jyutil.HelpColumn{ss}
+	}
+	if isHome { //首页 最多获取两级目录
+		data, ok := mongodb.Find("column", map[string]interface{}{
+			"pid": helpCode,
+		}, `{"i_order":1}`, nil, false, -1, -1)
+		if ok && data != nil && len(*data) > 0 {
+			var allColumn []jyutil.HelpColumn
+			for _, v := range *data {
+				var ss jyutil.HelpColumn
+				ss.Name = util.InterfaceToStr(v["s_columnname"])
+				ss.Code = util.InterfaceToStr(v["s_columncode"])
+				ss.Href = fmt.Sprintf("/helpCenter/catalog/%s", ss.Code)
+				if dataSeed := RecursiveQuery(ss.Code, true, num); dataSeed != nil && len(dataSeed) > 0 {
+					ss.SeedData = dataSeed
+				}
+				allColumn = append(allColumn, ss)
+			}
+			return allColumn
+		}
+	}
+	return RecursiveQuery(helpCode, isHome, num)
+}
+
+// RecursiveQuery pid:父级id isHome 是否首页展示(首页展示只获取一层子集) num 栏目&文章获取数量限制
+func RecursiveQuery(pid string, isHome bool, num int) []jyutil.HelpColumn {
+	if pid == "" {
+		return nil
+	}
+	start, end := -1, -1
+	if num != 0 {
+		start, end = 0, num
+	}
+	var allColumn []jyutil.HelpColumn
+	data, ok := mongodb.Find("column", map[string]interface{}{
+		"pid": pid,
+	}, `{"i_order":1}`, nil, false, start, end)
+	if ok && data != nil && len(*data) > 0 {
+		//存在子栏目
+		for _, v := range *data {
+			var ss jyutil.HelpColumn
+			ss.Code = util.InterfaceToStr(v["s_columncode"]) //栏目情况下不需要id 只需要code
+			ss.Name = util.InterfaceToStr(v["s_columnname"])
+			ss.Href = fmt.Sprintf("/helpCenter/catalog/%s", ss.Code)
+			if !isHome {
+				//子栏目信息
+				ss.SeedData = RecursiveQuery(ss.Code, isHome, num)
+			}
+			//栏目信息
+			allColumn = append(allColumn, ss)
+		}
+		return allColumn
+	}
+
+	//无子栏目信息 获取文章信息
+	dataArticle, ok := mongodb.FindOne("column", map[string]interface{}{
+		"s_columncode": pid,
+	})
+	if ok && dataArticle != nil && len(*dataArticle) > 0 {
+		columnCode := util.InterfaceToStr((*dataArticle)["s_columncode"])
+		typeName := util.InterfaceToStr((*dataArticle)["s_columnlevel"])
+		dataAll, ok1 := mongodb.Find("content", map[string]interface{}{
+			typeName:   columnCode,
+			"i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()},
+		}, `{"releasetime":-1,"l_createdate":-1}`, nil, false, start, num)
+		if ok1 && dataAll != nil && len(*dataAll) > 0 {
+			for _, v := range *dataAll {
+				var ss jyutil.HelpColumn
+				//文章信息
+				ss.IsColumn = 1
+				ss.Id = se.EncodeString(util.InterfaceToStr(v["_id"]))
+				ss.Name = util.InterfaceToStr(v["s_title"])
+				ss.Href = fmt.Sprintf("/helpCenter/detail/%s.html", ss.Id)
+				ss.Code = columnCode
+				allColumn = append(allColumn, ss)
+			}
+		}
+	}
+	return allColumn
+}

+ 92 - 0
src/jfw/site/helpCenter/service.go

@@ -0,0 +1,92 @@
+package helpCenter
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"jy/src/jfw/jyutil"
+	"jy/src/jfw/site/jyblog"
+	"time"
+	"unicode/utf8"
+)
+
+// HelpCenterService 帮助中心接口
+type HelpCenterService struct {
+	*xweb.Action
+	index        xweb.Mapper `xweb:"/helpCenter/index"`            //帮助中心首页
+	feedbackPage xweb.Mapper `xweb:"/helpCenter/feedback"`         //帮助中心意见反馈
+	catalog      xweb.Mapper `xweb:"/helpCenter/catalog/(.*)"`     //帮助中心意见反馈
+	detail       xweb.Mapper `xweb:"/helpCenter/detail/(.*).html"` //帮助中心意见反馈
+
+	helpVideoIndex xweb.Mapper `xweb:"/helpVideo/"`
+	helpVideoPage  xweb.Mapper `xweb:"/helpVideo/(.*)"`
+
+	feedbackSubmit xweb.Mapper `xweb:"/helpCenter/feedback/submit"` //帮助中心意见反馈
+}
+
+func (this *HelpCenterService) Index() {
+	this.T["content"] = HelpHome("", true, 3)
+	this.T["helpVideo"] = jyutil.Course(0, 4)
+	this.Render("/site/page/helpCenter/index.html", &this.T)
+}
+
+// Catalog 帮助中心目录
+func (this *HelpCenterService) Catalog(code string) {
+	//所有栏目树
+	this.T["catalog"] = HelpHome("", false, 0)
+	//当前栏目下内容
+	this.T["detail"] = HelpHome(code, false, 0)
+	this.Render("/site/page/helpCenter/catalog.html", &this.T)
+}
+
+// Detail 帮助中心详情
+func (this *HelpCenterService) Detail(id string) {
+	//所有栏目树
+	this.T["catalog"] = HelpHome("", false, 0)
+	//当前文章内容
+	this.T["detail"] = jyblog.GetBlogDetail(id)
+	this.Render("/site/page/helpCenter/detail.html", &this.T)
+}
+
+// FeedbackPage 意见反馈页面
+func (this *HelpCenterService) FeedbackPage() {
+	this.Render("/site/page/helpCenter/feedback.html", &this.T)
+}
+
+// FeedbackSubmit 意见反馈
+func (this *HelpCenterService) FeedbackSubmit() {
+	userId := util.InterfaceToStr(this.Session().Get("userId"))
+	rData, errMsg := func() (interface{}, error) {
+		mold := this.Query("mold")
+		content := this.Query("content")
+		if userId == "" {
+			return nil, fmt.Errorf("未登陆")
+		}
+		if utf8.RuneCountInString(content) > 1000 {
+			return nil, fmt.Errorf("长度异常")
+		}
+		saveId := mongodb.Save("feedback", map[string]interface{}{
+			"s_type":       mold,
+			"s_opinion":    content,
+			"s_userid":     userId,
+			"l_createtime": time.Now().Unix(),
+		})
+		if saveId == "" {
+			return nil, fmt.Errorf("存储异常")
+		}
+		return true, nil
+	}()
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
+// HelpVideoIndex 帮助中心视频
+func (this *HelpCenterService) HelpVideoIndex() error {
+	return this.doVideoPage()
+}
+func (this *HelpCenterService) HelpVideoPage(htmlPage string) error {
+	return this.doVideoPage()
+}
+func (this *HelpCenterService) doVideoPage() error {
+	return this.Render("/site/page/helpCenter/videoDetail.html")
+}

+ 89 - 0
src/jfw/site/jySchool/school.go

@@ -0,0 +1,89 @@
+package jySchool
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/public"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"time"
+)
+
+var (
+	mongodb = public.MQFW
+	se      = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
+)
+
+// Course 剑鱼课堂首页课程 中标比听课视频
+func Course(num int) *[]map[string]interface{} {
+	return jyutil.Course(num, 3)
+}
+
+// 首页剑鱼攻略 s二级栏目
+func Guideline(s string, num int) *[]map[string]interface{} {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	return jyutil.GuidelineAndInformation(util.InterfaceToStr(columnCode["招投标攻略"]), s, num)
+}
+
+// ArticleRecommendation 攻略详情页 内容推荐&重要咨询
+// 传参 num数量
+func ArticleRecommendation(num int) map[string]interface{} {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	return jyutil.ArticleRecommendation(util.InterfaceToStr(columnCode["招投标攻略"]), num)
+}
+
+// Consultation (攻略栏目页)热点咨询,重要咨询
+// n 当前栏目 i 获取多少条
+func Consultation(n string, num int) map[string]interface{} {
+	var (
+		res1, res2 []map[string]interface{}
+	)
+	req := make(map[string]interface{})
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	//热点咨询
+	query := map[string]interface{}{"s_contenttype": util.InterfaceToStr(columnCode["行业资讯"]), "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}} //调用行业资讯板块内内容 随机显示10篇
+	data1, ok := mongodb.Find("content", query, `{"releasetime":-1,"l_createdate":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+	if ok && data1 != nil && len(*data1) > 0 {
+		if len(*data1) > num {
+			for _, v := range jyutil.GenerateRandomNumber(0, len(*data1), num) {
+				res1 = append(res1, (*data1)[v])
+			}
+		} else {
+			res1 = append(res1, *data1...)
+		}
+		for _, v := range res1 {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+		}
+	}
+
+	//IdFormat(&res1)
+	req["hotspot"] = res1
+	//重要咨询 important
+	query["s_contenttype"] = "ztbgl" //调用招投标攻略的当前栏目外的其他栏目内容
+	query["s_secondclassifytype"] = map[string]interface{}{
+		"$ne": n,
+	}
+	data2, ok := mongodb.Find("content", query, `{"releasetime":-1,"l_createdate":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+	if ok && data2 != nil && len(*data1) > 0 {
+		if len(*data2) > num {
+			for _, v := range jyutil.GenerateRandomNumber(0, len(*data2), num) {
+				res2 = append(res2, (*data2)[v])
+			}
+		} else {
+			res2 = append(res2, *data2...)
+		}
+		for _, v := range res2 {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+		}
+	}
+
+	//IdFormat(&res2)
+	req["important"] = res2
+	return req
+}
+
+// GuidelineColumn 攻略一级栏目与二级栏目
+func GuidelineColumn() jyutil.HelpColumn {
+	columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	return jyutil.GuidelineAndIndustry(util.InterfaceToStr(columnCode["招投标攻略"]))
+}

+ 122 - 0
src/jfw/site/jySchool/service.go

@@ -0,0 +1,122 @@
+package jySchool
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"jy/src/jfw/jyutil"
+	"jy/src/jfw/paging"
+	"log"
+)
+
+const pageSize = 20
+
+// JySchoolService 剑鱼学堂
+type JySchoolService struct {
+	*xweb.Action
+	index    xweb.Mapper `xweb:"/jySchool/index"`                       //剑鱼学堂首页
+	strategy xweb.Mapper `xweb:"/jySchool/strategy"`                    //剑鱼-攻略首页
+	search   xweb.Mapper `xweb:"/jySchool/strategy/search([^.]*).html"` //剑鱼-攻略搜索
+	class    xweb.Mapper `xweb:"/jySchool/(.*)/index([^.]*).html"`      //剑鱼-攻略分类页面
+}
+
+// Index 课堂首页
+func (this *JySchoolService) Index() {
+	newJydoc, err := jyutil.Library(6) //最新文库
+	if err != nil {
+		log.Printf("JySchoolService Index.Library Error:%v\n", err)
+	}
+	//最新课程
+	hotCourse := Course(8)
+	//招投标攻略子栏目
+	var strategyList []map[string]interface{}
+	for _, item := range GuidelineColumn().SeedData {
+		if res := Guideline(item.Code, 2); res != nil && len(*res) > 0 {
+			strategyList = append(strategyList, map[string]interface{}{
+				"name": item.Name,
+				"code": item.Code,
+				"list": res,
+			})
+		}
+	}
+	this.T["hotCourse"] = hotCourse
+	this.T["newJyDoc"] = newJydoc["data"]
+	this.T["strategyList"] = strategyList
+	this.Render("/site/page/jySchool/index.html", &this.T)
+}
+
+// Strategy 攻略首页
+func (this *JySchoolService) Strategy() {
+	var strategyList []map[string]interface{}
+	for _, item := range GuidelineColumn().SeedData {
+		if res := Guideline(item.Code, 3); res != nil && len(*res) > 0 {
+			strategyList = append(strategyList, map[string]interface{}{
+				"name": item.Name,
+				"code": item.Code,
+				"list": res,
+			})
+		}
+	}
+	this.T["strategyList"] = strategyList
+	this.Render("/site/page/jySchool/strategy.html", &this.T)
+}
+
+// Search 攻略搜索
+func (this *JySchoolService) Search(pageNumStr string) {
+	query := this.GetString("query")
+	var pageNum string = "1"
+	if pageNumStr != "" {
+		pageNum = pageNumStr[1:]
+	}
+	data, _, total := jyutil.JyCmsSearch(map[string]string{
+		"perPage":       fmt.Sprint(pageSize),
+		"currentPage":   pageNum,
+		"s_contenttype": "ztbgl",
+		"queryType":     "1",
+		"query":         query,
+	}, "")
+	// 分页
+	if total > 0 {
+		this.T["pagingMap"] = paging.GetLetterPaging(common.IntAll(pageNum), pageSize, total, fmt.Sprintf("/jySchool/strategy/search_%s.html%s", "%d", common.If(query == "", "", "?query="+query)))
+	}
+	this.T["list"] = data
+	this.T["total"] = total
+	this.T["query"] = query
+	this.T["other"] = ArticleRecommendation(10)
+	this.Render("/site/page/jySchool/search.html", &this.T)
+}
+
+// Class 攻略分类
+func (this *JySchoolService) Class(thisCode string, pageNumStr string) {
+	var classList []map[string]interface{}
+	for _, v := range GuidelineColumn().SeedData {
+		if v.Name != "" && v.Code != "" {
+			classList = append(classList, map[string]interface{}{
+				"name": v.Name,
+				"code": v.Code,
+			})
+		}
+	}
+	// 右侧热点及重要资讯
+	this.T["classList"] = classList
+	this.T["rightData"] = Consultation(thisCode, 10)
+	// 列表正文
+	var pageNum string = "1"
+	if pageNumStr != "" {
+		pageNum = pageNumStr[1:]
+	}
+	data, _, total := jyutil.JyCmsSearch(map[string]string{
+		"perPage":              fmt.Sprint(pageSize),
+		"currentPage":          pageNum,
+		"s_secondclassifytype": thisCode,
+	}, "")
+	// 分页
+	if total > 0 {
+		this.T["pagingMap"] = paging.GetLetterPaging(common.IntAll(pageNum), pageSize, total, fmt.Sprintf("/jySchool/%s/index_%s.html", thisCode, "%d"))
+	}
+	this.T["list"] = data
+	this.T["total"] = total
+	this.T["code"] = thisCode
+	this.T["nav"] = jyutil.NavigationBar(thisCode)
+	this.Render("/site/page/jySchool/class.html", &this.T)
+}

+ 42 - 0
src/jfw/site/jyblog/entity.go

@@ -0,0 +1,42 @@
+package jyblog
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jypkg/public"
+	"html/template"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"time"
+)
+
+// GetBlogDetail 获取详情页内容
+func GetBlogDetail(_id string) (data *map[string]interface{}) {
+	id := se.DecodeString(_id)
+	r, _ := public.MQFW.FindById("content", id, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1,"s_editorname":1,"s_url":1,"s_subcontent":1,"s_keywords":1,"i_viewnum":1}`)
+	if r != nil {
+		tmpdate1, _ := (*r)["l_createdate"]
+		(*r)["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+		tmpdate2, _ := (*r)["releasetime"]
+		(*r)["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate2), 0))
+		(*r)["s_content"] = template.HTML(util.ObjToString((*r)["s_content"]))
+		(*r)["_id"] = se.EncodeString(BsonIdToSId((*r)["_id"]))
+		s_pic, _ := (*r)["s_pic"].(string)
+		if s_pic != "" {
+			s_pic = config.Seoconfig["jyadd"].(string) + s_pic
+		}
+		(*r)["s_pic"] = s_pic
+		s_pic1, _ := (*r)["s_pic1"].(string)
+		if s_pic1 != "" {
+			s_pic1 = config.Seoconfig["jyadd"].(string) + s_pic1
+		}
+		(*r)["s_pic1"] = s_pic1
+		i_viewnum := util.IntAll((*r)["i_viewnum"])
+		(*r)["i_viewnum"] = i_viewnum + 1
+		data = r
+
+		//增加浏览次数
+		go jyutil.Browsing(id, i_viewnum)
+	}
+	return
+}

+ 118 - 0
src/jfw/site/jyblog/service.go

@@ -0,0 +1,118 @@
+package jyblog
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/esv1"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/public"
+	"encoding/base64"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"log"
+	"math/rand"
+	"time"
+)
+
+var se = encrypt.SE
+var mongodb = public.MQFW
+
+type JyBlog struct {
+	*xweb.Action
+	jyblog     xweb.Mapper `xweb:"/jyblog/index([^.]*).html"` //剑鱼标讯博客
+	jybdetail  xweb.Mapper `xweb:"/jyblog/([^.]*).html"`      //剑鱼标讯博客三级页
+	blogpraise xweb.Mapper `xweb:"/jyblog/blogpraise"`        //剑鱼标讯博客三级页点赞
+
+	jyBlogDetailNew xweb.Mapper `xweb:"/jySite/([^.]*).html"` //剑鱼标讯博客-新版详情页
+}
+
+// Jyblog 取得剑鱼标讯博客的信息列表
+func (f *JyBlog) Jyblog(param /*参数*/ string) error {
+	querymap := map[string]string{}
+	if len(param) == 0 {
+		querymap = map[string]string{
+			"perPage":       f.GetString("perPage"),
+			"currentPage":   f.GetString("currentPage"),
+			"s_contenttype": "jybk",
+			"query":         f.GetString("query"),
+		}
+	} else {
+		//反转生成map
+		paramstr := param[1:]
+		bs, _ := base64.StdEncoding.DecodeString(paramstr)
+		json.Unmarshal(bs, &querymap)
+	}
+	var shareid = f.GetString("id")
+	if len(shareid) == 0 {
+		shareid = fmt.Sprintf("%s%d", config.Seoconfig["jybky"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
+	}
+	f.T["logid"] = config.Seoconfig["jybky"].(string)
+	f.DisableHttpCache()
+	shareid = se.EncodeString(shareid)
+	data, pagination, _ := jyutil.JyCmsSearch(querymap, "/jyblog/index_%s.html")
+	f.Render("/pc/jyblog.html", &xweb.T{"querymap": querymap, "data": data, "pagination": pagination, "shareid": shareid})
+	return nil
+}
+
+// Jybdetail 博客三级页(旧版本)
+func (f *JyBlog) Jybdetail(_id string) error {
+	var shareid = f.GetString("id")
+	if len(shareid) == 0 {
+		shareid = "10"
+	}
+	f.T["logid"] = config.Seoconfig["jybky"].(string)
+	f.T["data"] = GetBlogDetail(_id)
+	f.T["shareid"] = se.EncodeString(shareid)
+	return f.Render("/pc/jyblogdetail.html", &f.T)
+}
+
+// JyBlogDetailNew 新版本三级页
+func (f *JyBlog) JyBlogDetailNew(id string) error {
+	sid := se.DecodeString(id)
+	sCode, tCode := jyutil.GetSiteInfo(sid)
+	// 文章栏目名
+	f.T["pCode"] = sCode
+	// 文章内容
+	f.T["data"] = GetBlogDetail(id)
+	//上一页、下一页
+	f.T["lastId"], f.T["nextId"] = jyutil.GetNextInfo(sid)
+	//右侧推荐
+	f.T["rightInfo"] = jyutil.ArticleRecommendation(sCode, 10)
+	//下方推荐
+	f.T["bottomInfo"] = jyutil.GuidelineDetails(sid)
+	//导航
+	f.T["nav"] = jyutil.NavigationBar(tCode)
+	return f.Render("/site/page/jyblogdetail.html", &f.T)
+}
+
+func (f *JyBlog) Blogpraise() error {
+	defer util.Catch()
+	id := se.DecodeString(f.GetString("id"))
+	stype := f.GetString("type")
+	flag := "F"
+	var blogflag = true
+	util.Try(func() {
+		if id != "" {
+			if stype == "up" {
+				blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : 1 }}`, false, false)
+			} else if stype == "down" {
+				blogflag = mongodb.Update("content", `{"_id":"`+id+`"}`, `{ "$inc" : { "praise" : -1 }}`, false, false)
+			}
+			if blogflag {
+				flag = "T"
+				r, _ := mongodb.FindById("content", id, "")
+				elastic.UpdateNewDoc("content", "content", r)
+				redis.Del("other", "jyblog_"+f.GetString("id"))
+			}
+		}
+	}, func(e interface{}) {
+		log.Println("文章点赞出错", e)
+	})
+	f.ServeJson(map[string]interface{}{
+		"flag": flag,
+	})
+	return nil
+}

+ 17 - 0
src/jfw/tag/a_init.go

@@ -0,0 +1,17 @@
+package tag
+
+import (
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"jy/src/jfw/jyutil"
+)
+
+func init() {
+	xweb.RootApp().AddTmplVar("Msg", Msg)
+	xweb.RootApp().AddTmplVar("Ad", Ad)
+	xweb.RootApp().AddTmplVar("JyCms", jyutil.GetFirstJyCms)
+	xweb.RootApp().AddTmplVar("JyTopMenu", Menu)
+	xweb.RootApp().AddTmplVar("Division", Division)
+	xweb.RootApp().AddTmplVar("ParseHtml", ParseHtml)
+	xweb.RootApp().AddTmplVar("ParseHtmlCss", ParseHtmlCss)
+	xweb.RootApp().AddTmplVar("ParseHtmlAttr", ParseHtmlAttr)
+}

+ 194 - 0
src/jfw/tag/menu.go

@@ -0,0 +1,194 @@
+package tag
+
+import (
+	"app.yhyue.com/moapp/jybase/redis"
+	"encoding/json"
+	"log"
+)
+
+const TmpData = `[
+  {
+    "title": "产品",
+    "link": "/product/index?serviceType=0",
+    "child": []
+  },
+  {
+    "title": "服务",
+    "link": "/swordfish/page_web_pc/issued/info",
+    "tag" : "dotTag",
+    "child": [
+      {
+        "title": "信息发布",
+        "link": "/swordfish/page_web_pc/issued/info",
+        "tag":"限免"
+      },
+      {
+        "title": "广告服务",
+        "link": "/front/advservices.html"
+      },
+      {
+        "title": "标书制作",
+        "link": "/swordfish/frontPage/bidedoc/free/index"
+      },
+      {
+        "title": "企业认证",
+        "link": "/swordfish/frontPage/enterpriseCertificatio/free/index"
+      },
+      {
+        "title": "行业展会",
+        "link": "/active/transit/exhibitionPage",
+        "tag":"NEW"
+      }]
+  },
+  {
+    "title": "数据",
+    "link": "/front/dataExport/toSieve",
+    "attr": [],
+    "child": [
+      {
+        "title": "数据导出",
+        "link": "/front/dataExport/toSieve"
+      },
+      {
+        "title": "定制服务",
+        "link": "/front/structed/pc_index.html"
+      },
+      {
+        "title": "数据流量包",
+        "tag": "特惠",
+        "link": "/front/dataPack/createOrder"
+      }
+    ]
+  },
+  {
+    "title": "解决方案",
+    "link" : "/swordfish/frontPage/solution/free/index",
+    "flex" : "row",
+    "child":[
+     {
+        "title": "电信行业解决方案",
+        "icon":"/frontRouter/pc/solution/image/nav-dx.png",
+        "link": "/swordfish/frontPage/solution/free/index"
+      },
+     {
+        "title": "医械通",
+        "icon":"/frontRouter/pc/solution/image/nav-medical.png",
+        "link": "http://clpages.cn/yxtgwyxy?from_wecom=1"
+      }
+    ]
+  },
+  {
+    "title": "百宝箱",
+    "tag" : "hotTag",
+    "link": "/swordfish/page_web_pc/issued/info",
+    "child": [
+      {
+        "title": "信息发布",
+        "tag": "限免",
+        "link": "/swordfish/page_web_pc/issued/info"
+      },
+      {
+        "title": "中标必听课",
+        "link": "/jyxspc"
+      },
+      {
+        "title": "剑鱼文库",
+        "link": "/swordfish/docs"
+      },
+      {
+        "title": "中标预测",
+        "link": "/big/page/zb"
+      },
+      {
+        "title": "潜在客户挖掘",
+        "link": "/big/page/yw"
+      },
+      {
+        "title": "潜在合作伙伴挖掘",
+        "link": "/big/page/yw"
+      },
+      {
+        "title": "投标决策分析",
+        "link": "/big/page/tb"
+      },
+      {
+        "title": "竞争对手分析",
+        "link": "/big/page/qy"
+      },
+      {
+        "title": "市场分析",
+        "link": "/big/page/sc"
+      },
+      {
+        "title": "客户分析",
+        "link": "/big/page/cg"
+      }
+    ]
+  },
+  {
+    "title": "品牌",
+    "link": "/brand/index",
+    "child": [
+      {
+        "title": "公司介绍",
+        "link": "/brand/index"
+      },
+      {
+        "title": "发展历程",
+        "link": "/brand/index#history"
+      },
+      {
+        "title": "公司动态",
+        "link": "/brand/index#Company_Dynamic"
+      },
+      {
+        "title": "加入我们",
+        "link": "/brand/index#join_us"
+      },
+      {
+        "title": "联系我们",
+        "link": "/brand/index#contact_us"
+      }
+    ]
+  }
+]`
+
+type MenuItem struct {
+	Title string `json:"title"` // 标题文字
+	Style string `json:"style"` // css样式
+	Link  string `json:"link"`  // 跳转连接
+	Tag   string `json:"tag"`   // 节点设置
+	Icon  string `json:"icon"`  // 图标
+	Attr  string `json:"attr"`  // 节点属性
+
+}
+
+type TopMenuItem struct {
+	*MenuItem
+	Flex  string     `json:"flex"`  // 展示方案:行展示column(默认);列展示:row
+	Child []MenuItem `json:"child"` // 子节点
+}
+
+// Menu 剑鱼顶部菜单
+func Menu() (topMenu []*TopMenuItem) {
+	if bytes, _ := redis.GetBytes("other", "jyTopMenuCache"); bytes != nil {
+		if err := json.Unmarshal(*bytes, &topMenu); err == nil {
+			return
+		}
+	}
+	list, _ := mongodb.Find("jy_topMenu", `{"i_status":1}`, `{"i_sort":1,"l_createdate":1}`, nil, false, -1, -1)
+	if list == nil || len(*list) == 0 {
+		return
+	}
+	bytes, err := json.Marshal(list)
+	if err != nil {
+		log.Println("Menu Marshal err:", err)
+		return
+	}
+	if err = json.Unmarshal(bytes, &topMenu); err != nil {
+		log.Println("Menu Unmarshal err:", err)
+		return
+	}
+	redis.Put("other", "jyTopMenuCache", topMenu, -1)
+	return
+}

+ 26 - 0
src/jfw/tag/util.go

@@ -0,0 +1,26 @@
+package tag
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"html/template"
+)
+
+func ParseHtmlCss(str string) template.CSS {
+	return template.CSS(str)
+}
+
+func ParseHtmlAttr(str string) template.HTMLAttr {
+	return template.HTMLAttr(str)
+}
+
+func ParseHtml(str string) template.HTML {
+	return template.HTML(str)
+}
+
+func Division(num1, num2 interface{}) interface{} {
+	n1, n2 := common.Float64All(num1), common.Float64All(num2)
+	if num2 == 0 {
+		return 0
+	}
+	return n1 / n2
+}

+ 5 - 9
src/main.go

@@ -1,14 +1,12 @@
 package main
 
 import (
+	"app.yhyue.com/moapp/jybase/fsw"
+	_ "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jylog"
 	_ "jy/src/jfw/active"
 	"jy/src/jfw/config"
 	. "jy/src/jfw/config"
-
-	"jy/src/jfw/jyutil"
-
-	"app.yhyue.com/moapp/jybase/fsw"
-	_ "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jylog"
+	_ "jy/src/jfw/site"
 
 	// _ "jy/src/jfw/modules/app/src/jfw/course"  线下课程 dev3.5.2 21年2.24 下线
 	_ "jy/src/jfw/filter"
@@ -18,7 +16,7 @@ import (
 	//_ "jy/src/jfw/modules/app/src/jfw/pay"
 	"jy/src/jfw/qrmanager"
 	"jy/src/jfw/rpcfollow"
-	"jy/src/jfw/tag"
+	_ "jy/src/jfw/tag"
 	"jy/src/jfw/timetask"
 	"log"
 	"net/http"
@@ -106,8 +104,6 @@ func initXweb() {
 	xweb.RootApp().AppConfig.ReloadTemplates = true
 	xweb.RootApp().AppConfig.SessionTimeout = time.Hour * time.Duration(util.IntAllDef(Sysconfig["sessionTimeout"], 24))
 	xweb.RootApp().AppConfig.CacheTemplates = Sysconfig["cacheflag"].(bool)
-	xweb.RootApp().AddTmplVar("Msg", tag.Msg)
-	xweb.RootApp().AddTmplVar("Ad", tag.Ad)
-	xweb.RootApp().AddTmplVar("JyCms", jyutil.GetFirstJyCms)
+
 	xweb.RootApp().Logger.SetOutputLevel(1) //输出日志,改为4则不输出任何日志
 }

+ 96 - 0
src/web/staticres/common-module/consult-dialog/css/index.css

@@ -0,0 +1,96 @@
+[v-cloak] {
+  display: none !important;
+}
+clearfix:after {
+  content: ".";
+  display: block;
+  clear: both;
+  visibility: hidden;
+  line-height: 0;
+  height: 0;
+  font-size: 0;
+}
+
+.clearfix {
+  *zoom: 1;
+}
+
+.model_ {
+  position: fixed;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+  z-index: 9999;
+  background: rgb(29 29 29 / 50%);
+
+}
+
+.model_ .pop-up {
+  position: absolute;
+  width: 400px;
+  height: 440px;
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%, -50%);
+  background: url('/serviceSystem/img/t_k.png');
+  border-radius: 8px;
+  padding-top: 1;
+}
+
+.model_ .pop-up .close {
+  position: absolute;
+  right: 20px;
+  top: 20px;
+  width: 20px;
+  height: 20px;
+}
+
+.model_ .pop-up .title {
+  font-style: normal;
+  font-weight: 700;
+  font-size: 20px;
+  line-height: 26px;
+  color: #1D1D1D;
+  text-align: center;
+  margin-top: 67px;
+}
+
+.model_ .pop-up .text {
+  font-style: normal;
+  font-weight: 400;
+  font-size: 14px;
+  line-height: 18px;
+  color: #686868;
+  text-align: center;
+  margin-top: 24px;
+}
+
+.model_ .pop-up .box {
+  width: 200px;
+  height: 200px;
+  margin: auto;
+  background: #EAF8FA;
+  border-radius: 8px;
+  margin-top: 36px;
+}
+
+.model_ .pop-up img {
+  width: 100%;
+}
+
+@keyframes CfadeInUp {
+  from {
+      transform: translateY(50px);
+  }
+
+  to {
+      transform: translateY(0px);
+      opacity: 1;
+  }
+}
+
+.CfadeInUp {
+  opacity: 0;
+  animation: 1s ease forwards alternate;
+}

BIN
src/web/staticres/common-module/consult-dialog/images/close.png


+ 88 - 0
src/web/staticres/common-module/consult-dialog/js/index.js

@@ -0,0 +1,88 @@
+var consultDialog = new Vue({
+  el: '#consultDialog',
+  delimiters: ['{', '}'],
+  data: function () {
+      return {
+          isshow: false,
+          text: '扫一扫,立即联系客户经理',
+          // 扫一扫,立即联系您的专属客服
+          url: '',
+          img: "",
+          vip_img: "",
+          isbuy_vip: false,
+          isbuy_big: false,
+          vipshow: false
+      }
+  },
+  created() {
+  },
+  mounted() {
+    this.getimage()
+  },
+  methods: {
+      getimage() {
+          let this_ = this
+          $.ajax({
+              type: 'POST',
+              url: '/bigmember/use/equity',
+              data: {
+
+              },
+              success: function (res) {
+                  if (res.data) {
+                      let customers = res.data.customers
+                      customers.forEach(ele => {
+                          if (ele.vip == false) {
+                              this_.img = ele.wxer
+
+                          } else if (ele.vip == true) {
+                              this_.vip_img = ele.wxer
+
+                          }
+                      });
+                      this_.getstates()
+                  }
+              }
+          })
+      },
+      getstates() {
+        let this_ = this
+        $.ajax({
+            type: 'POST',
+            url: '/bigmember/use/isAdd',
+            data: {
+
+            },
+            success: function (res) {
+                if (res.data) {
+                    if (res.data.vipStatus > 0) {
+                        this_.isbuy_vip = true
+
+                    } else {
+                        this_.isbuy_vip = false
+                    }
+                    if (res.data.memberStatus > 0) {
+                        this_.isbuy_big = true
+
+                    } else {
+                        this_.isbuy_big = false
+
+                    }
+                }
+                if(this_.isbuy_big){
+                  this_.url = this_.vip_img
+                  this_.text='扫一扫,立即联系您的专属客服'
+
+                }else{
+                  this_.url = this_.img
+                  this_.text='扫一扫,立即联系客户经理'
+                }
+            }
+        })
+    },
+    close(val) {
+          this[val] = false
+   },   
+  }
+})
+

+ 9 - 4
src/web/staticres/common-module/pc-dialog/css/leave-info-dialog.css

@@ -60,11 +60,11 @@
   border-radius: 4px 4px 4px 4px;
   opacity: 1;
   margin-bottom: 10px;
-  text-align: center;  
+  text-align: center;
   display: flex;
   justify-content: center;
   align-items: center;
-  } 
+  }
   .warm-prompt .icon-warning{
     display: flex;
     width: 15px;
@@ -98,7 +98,7 @@
 }
 @media screen and (min-width: 800px) and (max-width: 1366px) {
   #collectUserInfoDialog .dialog-container {
-    top: 65%; 
+    top: 65%;
   }
 }
 #collectUserInfoDialog .dialog-header{
@@ -108,7 +108,9 @@
   font-size: 18px;
   line-height: 28px;
   text-align: center;
-  background: url('/common-module/pc-dialog/image/structed-title.png?v={{Msg "seo" "version"}}') no-repeat top center;
+  background-position: top center;
+  background-repeat: no-repeat;
+  background-image: url('/common-module/pc-dialog/image/structed-title.png?v={{Msg "seo" "version"}}');
   background-size: 100% 250px;
 }
 #collectUserInfoDialog .dialog-content{
@@ -239,6 +241,9 @@
   padding: 0px 0 0 90px;
   top: 98%;
 }
+.no-label .el-form-item__error{
+  padding: 0;
+}
 .el-form-item__label{
   width: 80px;
   padding: 0;

BIN
src/web/staticres/common-module/pc-dialog/image/leave-title-api.png


BIN
src/web/staticres/common-module/pc-dialog/image/leave-title-custom.png


+ 34 - 8
src/web/staticres/common-module/pc-dialog/js/leave-info-dialog.js

@@ -67,13 +67,17 @@ var temp = `
                     </el-checkbox-group>
                   </el-form-item>
                 </div>
-                <div class="long-control">
+                <div class="short-control fl">
                   <el-form-item label="职位 :" prop="job">
-                    <el-select v-model="form.job" placeholder="请选择职位"  class="item-input short-input" clearable>
+                    <el-select v-model="form.job" placeholder="请选择职位"  class="item-input" clearable>
                       <el-option v-for="item in jobData" :key="item.value" :label="item.label" :value="item.value">
                       </el-option>
                     </el-select>
-                    <el-select v-show="showBranch" v-model="form.branch" placeholder="请选择部门" class="item-input short-input" clearable>
+                  </el-form-item>
+                </div>
+                <div class="short-control fr" v-if="showBranch">
+                 <el-form-item label-width="0" label="" prop="branch" class="no-label">
+                      <el-select  v-model="form.branch" placeholder="请选择部门" class="item-input" clearable>
                       <el-option v-for="item in branchData" :key="item.value" :label="item.label" :value="item.value">
                       </el-option>
                     </el-select>
@@ -315,7 +319,14 @@ var vm = new Vue({
             validator: validJob,
             trigger: 'blur'
           }
-        ]
+        ],
+        branch: [
+          {
+            required: true,
+            trigger: 'blur',
+            message: '请选择部门'
+          }
+        ],
       },
       showSearchResult: false,
       companyList: [],
@@ -335,7 +346,8 @@ var vm = new Vue({
     },
     defaultSource: function() {
       // 默认提交成功不显示广告图和邮箱文案 如果是结构化数据则显示
-      return this.source.indexOf('structed') === -1
+      var noEmailSource = ['structedData', 'pc_data_custom_export']
+      return noEmailSource.indexOf(this.source) === -1
     },
     showBranch: function () {
       // 切换到总裁或总经理之后 把之前选择的部门清空
@@ -426,7 +438,6 @@ var vm = new Vue({
     },
     // 校验验证码
     checkCode: function(val) {
-      console.log(val)
       var _this = this
       if (val.length !== 6) return
       $.ajax({
@@ -482,6 +493,8 @@ var vm = new Vue({
             _this.isForce = res.data.fource
             if (res.data.retainedCapital) {
               _this.showForm = true
+            // 当前头部背景图
+              _this.isSelfHeader()
               _this.changeTop()
               if (res.info) {
                 echoRequiredValues(_this.form, res.info, ['name', 'phone', 'mail', 'branch'])
@@ -509,6 +522,18 @@ var vm = new Vue({
         }
       })
     },
+    // 自定义弹窗头部
+    isSelfHeader: function(){
+      var imgUrl = '/common-module/pc-dialog/image/structed-title.png'
+      if (this.source.indexOf('custom_export') > -1 || this.source.indexOf('custom_data') > -1) {
+        imgUrl =  '/common-module/pc-dialog/image/leave-title-custom.png'
+      } else if (this.source.indexOf('api_interface') > -1) {
+        imgUrl =  '/common-module/pc-dialog/image/leave-title-api.png'
+      }
+      this.$nextTick(function(){
+        $('#collectUserInfoDialog .dialog-header').css('background-image', 'url(' + imgUrl + ')')
+      })
+    },
     // 表单提交事件
     submitForm: function(formName) {
       var _this = this
@@ -542,7 +567,7 @@ var vm = new Vue({
       var _this = this
       $.ajax({
         type:'POST',
-        url:'/salesLeads/collectInfo',
+        url: '/salesLeads/collectInfo',
         contentType: "application/json;charset=utf-8",
         data: JSON.stringify(params),
         success:function (res) {
@@ -616,7 +641,8 @@ var vm = new Vue({
       this.form.job = ''
       this.form.otherJob = ''
       this.form.code = ''
-      if (this.source.indexOf('structed') > -1) {
+      var needExportSource = ['structedData', 'pc_data_custom_export', 'pc_data_custom_data']
+      if (needExportSource.indexOf(this.source) > -1) {
         this.showForm = false
         this.showExport = true
       } else {

BIN
src/web/staticres/common-module/site/page/bankLanding/images/bg-1.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/bg-2.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/bg-3.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/bg-4.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/bg-head.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/ic-1.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/ic-2.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/img-1.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/img-2.png


BIN
src/web/staticres/common-module/site/page/bankLanding/images/img-3.png


+ 246 - 0
src/web/staticres/common-module/site/page/bankLanding/index.css

@@ -0,0 +1,246 @@
+#bankLanding {
+  background: linear-gradient(94.57deg, #4684EF 7.03%, #3383DE 84.72%);
+  padding-bottom: 0.72rem;
+  overflow: hidden;
+}
+.pt-21vw{
+  padding-top: 21.3vw;
+}
+#bankLanding .head {
+  height: 14.3rem;
+  position: relative;
+}
+
+#bankLanding .head img {
+  width: 7.5rem;
+}
+
+.head .text_box {
+  position: absolute;
+  width: 6.87rem;
+  left: 50%;
+  transform: translateX(-50%);
+  top: 10.36rem;
+}
+
+.text_box p {
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+  width: 100%;
+  font-weight: 500;
+  color: #FFFFFF;
+  text-align: justify;
+}
+
+.text_box .tit {
+  font-size: 0.44rem;
+}
+
+.usageScenario {
+  margin-top: 0.42rem;
+}
+
+.usageScenario .item {
+  width: 7rem;
+  height: 5rem;
+  border-radius: 0.24rem;
+  margin: auto;
+  padding-top: 1.06rem;
+  box-sizing: border-box;
+  background-size: 100% 100%;
+  position: relative;
+}
+
+.usageScenario .item_short {
+  width: 7rem;
+  height: 4.56rem;
+  border-radius: 0.24rem;
+  margin: auto;
+  padding-top: 0.64rem;
+  box-sizing: border-box;
+  background-size: 100% 100%;
+  position: relative;
+  margin-top: 0.24rem;
+}
+
+.usageScenario .item .header {
+  position: absolute;
+  width: 4.82rem;
+  height: 0.84rem;
+  left: 50%;
+  top: -0.42rem;
+  transform: translateX(-50%);
+  font-weight: 500;
+  font-size: 0.36rem;
+  background: linear-gradient(180deg, #0E6AF7 0%, #0033E7 100%);
+  border-radius: 0.16rem;
+  display: flex;
+  padding-left: 0.62rem;
+  box-sizing: border-box;
+}
+
+.usageScenario .item .header img {
+  width: 0.68rem;
+  height: 0.16rem;
+  margin-top: 17px;
+}
+
+.usageScenario .item .header p {
+  line-height: 0.84rem;
+  margin: 0 0.16rem;
+  font-weight: 400;
+  font-size: 0.48rem;
+  color: #FFFFFF;
+}
+
+.usageScenario .item .title {
+  font-weight: 500;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  /* identical to box height, or 144% */
+  color: #006BF4;
+  text-align: center;
+}
+
+.usageScenario .item .text {
+  width: 6.22rem;
+  margin: auto;
+  font-weight: 500;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+  color: #686868;
+  margin-top: 0.24rem;
+}
+
+.usageScenario .item_short .title {
+  font-weight: 500;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  /* identical to box height, or 144% */
+  color: #006BF4;
+  text-align: center;
+}
+
+.usageScenario .item_short .text {
+  width: 6.22rem;
+  margin: auto;
+  font-weight: 500;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+  color: #686868;
+  margin-top: 0.24rem;
+}
+
+.ok_btn {
+  width: 6.98rem;
+  height: 0.96rem;
+  background: linear-gradient(92.23deg, #F1FBFF 3.48%, #D1E9FF 96.72%);
+  border-radius: 0.16rem;
+  line-height: 0.96rem;
+  text-align: center;
+  font-weight: 500;
+  font-size: 0.36rem;
+  /* identical to box height, or 144% */
+  margin: auto;
+  color: #006BF4;
+  margin-top: 0.48rem;
+}
+
+.service_content {
+  width: 7rem;
+  padding: 0.28rem 0.4rem 0.86rem 0.4rem;
+  background: #F1F8FF;
+  border-radius: 0.24rem;
+  box-sizing: border-box;
+  margin: auto;
+  margin-top: 1.4rem;
+  position: relative;
+}
+
+.service_content .header {
+  position: absolute;
+  width: 4.82rem;
+  height: 0.84rem;
+  left: 50%;
+  top: -0.42rem;
+  transform: translateX(-50%);
+  font-weight: 500;
+  font-size: 0.36rem;
+  background: linear-gradient(180deg, #0E6AF7 0%, #0033E7 100%);
+  border-radius: 0.16rem;
+  display: flex;
+  padding-left: 0.62rem;
+  box-sizing: border-box;
+}
+
+.service_content .header img {
+  width: 0.68rem;
+  height: 0.16rem;
+  margin-top: 17px;
+}
+
+.service_content .header p {
+  line-height: 0.84rem;
+  margin: 0 0.16rem;
+  font-weight: 400;
+  font-size: 0.48rem;
+  color: #FFFFFF;
+}
+.service_content .item{
+  position: relative;
+}
+.service_content .item img{
+  width: 2rem;
+}
+.service_content .title {
+  font-weight: 500;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  /* identical to box height, or 144% */
+  color: #006BF4;
+  margin-top: 0.9rem;
+}
+
+.service_content .text {
+  width: 4.28rem;
+  font-weight: 500;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+  /* or 143% */
+  /* Font/#686868 */
+  color: #686868;
+  margin-top: 0.24rem;
+}
+.ml-2{
+  margin-left: 2rem;
+
+}
+.p_right{
+  position: absolute;
+  right: -0.66rem;
+  top: 0;
+}
+.p_left{
+  position: absolute;
+  left: -0.66rem;
+  top: 0;
+}
+.bg-business {
+  background-image: url('/common-module/site/page/bankLanding/images/bg-1.png');
+
+}
+
+.bg-risk {
+  background-image: url('/common-module/site/page/bankLanding/images/bg-2.png');
+
+}
+
+.bg-bid {
+  background-image: url('/common-module/site/page/bankLanding/images/bg-3.png');
+
+}
+
+.bg-honour {
+  background-image: url('/common-module/site/page/bankLanding/images/bg-4.png');
+
+}

+ 7 - 0
src/web/staticres/common-module/site/page/bankLanding/index.js

@@ -0,0 +1,7 @@
+$(function () {
+  $('.ok_btn').click(function () {
+    var isWeiXinBrowser = navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1
+    window.location.href = `${isWeiXinBrowser ? '/weixin/frontPage' : '/jyapp/frontPage'
+      }/bigmember/free/perfect_info_bank?source=${isWeiXinBrowser ? 'wx' : 'app'}-bankLanding`
+  })   
+})

+ 72 - 11
src/web/staticres/css/pc.css

@@ -1959,23 +1959,42 @@ form{
 
 
 .jy_classify{
- margin-top: 32px;
+ padding: 32px 0 68px;
  display: flex;
  justify-content: space-between;
 }
 .jy_classify_l{
+  position: relative;
 	display: flex;
+  /* border-right: 1px solid rgba(255, 255, 255, 0.12); */
+}
+.jy_classify_l::after{
+  position: absolute;
+  content: '';
+  top: 0;
+  right: -28px;
+  width: 1px;
+  height: 168px;
+  background: rgba(255, 255, 255, 0.12);
+  z-index: 9;
 }
 .jy_classify_l dl{
-	margin-right: 80px;
+	margin-right: 40px;
 	flex: 1;
 }
-.jy_classify_l dl dt{
+.jy_classify_l dl dt,
+.jy_classify_l dl dt > a{
 	font-size: 14px;
 	color: rgba(255,255,255,.8);
 	line-height: 22px;
 	margin-bottom: 8px;
+  white-space: nowrap;
 }
+.jy_classify_l dl dt > a:hover{
+  text-decoration: none;
+  color: #2cb7ca;
+}
+
 .jy_classify_l dl dd{
 	position: relative;
 }
@@ -2013,7 +2032,8 @@ form{
 }
 .jy_classify_r .jy_classify_kefu{
 	display: flex;
-	align-items: center;
+	/* align-items: center; */
+  flex-direction: column;
 }
 .jy_classify_r .jy_classify_kefu img{
   width: 128px;
@@ -2022,15 +2042,17 @@ form{
 	font-size: 16px;
 	color: rgba(255,255,255,.8);
 	line-height: 22px;
-	height: 30px;
-	line-height: 30px;
+	height: 24px;
+	line-height: 24px;
 	padding-left: 25px;
 	background: url(/images/pc/phone-grey.png) no-repeat left center;
 	background-size: 20px;
-	margin-left: 20px;
+	/* margin-left: 20px; */
+  margin-top: 12px;
+  white-space: nowrap;
 }
 .jy_classify_list ul{
-	margin-top: 26px;
+	margin-top: 16px;
   display: flex;
 }
 .jy_classify_list ul li{
@@ -2099,6 +2121,7 @@ form{
 	display: none;
 	border-radius: 4px;
 	overflow: hidden;
+  z-index: 9;
 }
 .jy_classify_list ul li img{
 	width: 80px;
@@ -4635,7 +4658,8 @@ h6 {
   top: 50%;
   overflow: hidden;
   margin-top: -282px;
-  left: calc(50vw - 360px);
+  /* left: calc(50vw - 360px); */
+  left: 50%;
   box-sizing: border-box;
   border-radius: 16px;
   font-family: Microsoft YaHei,sans-serif;
@@ -4645,6 +4669,23 @@ h6 {
   display: block;
 }
 
+/* 此处代码处理登录注册弹框居在宽度未知情况居中问题,且保证bootstrap动画效果(淡入淡出) */
+.modal.bidLogin.fade .modal-dialog{
+  -webkit-transform: translate(-50%,-25%);
+  -ms-transform: translate(-50%,-25%);
+  -o-transform: translate(-50%,-25%);
+  transform: translate(-50%,-25%);
+  -webkit-transition: -webkit-transform .3s ease-out;
+  -o-transition: -o-transform .3s ease-out;
+  transition: transform .3s ease-out;
+}
+.modal.bidLogin.in .modal-dialog {
+  -webkit-transform: translate(-50%,0);
+  -ms-transform: translate(-50%,0);
+  -o-transform: translate(-50%,0);
+  transform: translate(-50%,0);
+}
+
 .login-dig-box .logo {
   width: 96px;
   height: 25px;
@@ -4999,7 +5040,6 @@ h6 {
   line-height: 24px;
   color: #686868;
   cursor: pointer;
-  margin-bottom: 32px;
 }
 
 .login-dig-top-back-box span {
@@ -5249,5 +5289,26 @@ h6 {
 }
 
 .login-dig-footer-box p.passTip{
-  margin-top: 100px;
+	margin-top: 100px;
 }
+
+.guide-intro-dialog{
+  left: 50%;
+  margin: 120px 0;
+}
+
+.modal.guide-intro-dialog-mask.fade .modal-dialog{
+  -webkit-transform: translate(-50%,-25%);
+  -ms-transform: translate(-50%,-25%);
+  -o-transform: translate(-50%,-25%);
+  transform: translate(-50%,-25%);
+  -webkit-transition: -webkit-transform .3s ease-out;
+  -o-transition: -o-transform .3s ease-out;
+  transition: transform .3s ease-out;
+}
+.modal.guide-intro-dialog-mask.in .modal-dialog {
+  -webkit-transform: translate(-50%,0);
+  -ms-transform: translate(-50%,0);
+  -o-transform: translate(-50%,0);
+  transform: translate(-50%,0);
+}

+ 522 - 0
src/web/staticres/frontRouter/pc/customExport/css/index.css

@@ -0,0 +1,522 @@
+.public-nav{
+  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+}
+.w1200{
+  width: 1200px;
+  margin: 0 auto;
+}
+.custom-export-index{
+  width: 100%;
+  height: 100%;
+}
+section{
+  box-sizing: border-box;
+}
+.bg-contain{
+  background-size: contain;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+.bg-cover{
+  background-size: cover;
+  background-repeat: no-repeat;
+  background-position: center;
+}
+h2.title{
+  margin:68px auto 40px auto;
+  height:72px;
+}
+.f-space-between{
+  display: flex;
+  justify-content: space-between;
+}
+.common-custom-btn{
+  width: 240px;
+  height: 48px;
+  background: linear-gradient(180deg, #33CCCC 0%, #3399FF 100%);
+  border-radius: 8px;
+  color:#fff;
+  font-weight: 700;
+  font-size: 20px;
+  line-height: 48px;
+  text-align: center;
+  margin: 40px auto 68px auto;
+  position: relative;
+  overflow: hidden;
+  cursor: pointer;
+}
+
+.custom-report-box, .custom-report-box-b{
+  padding-top: 76px;
+  height:814px;
+  background: #3363FA url(/frontRouter/pc/customExport/image/report-bg1.png) no-repeat center;
+  background-size: contain;
+}
+.custom-report-box .title{
+  margin:40px auto;
+  background: url(/frontRouter/pc/customExport/image/report-title.png) no-repeat center;
+  background-size: contain;
+  height:110px;
+}
+.custom-report-box .text-card{
+  height:390px;
+  margin-top:14px;
+  width: 310px;
+  border-radius: 8px;
+  text-align: center;
+  color:rgba(255, 255, 255, 0.88);
+  font-family: 'Microsoft YaHei';
+  font-weight: bold;
+  font-size: 16px;
+  line-height: 24px;
+}
+.custom-report-box .card-1{
+  background:  linear-gradient(180deg, rgba(83, 214, 255, 0) 0%, #06DCEA 100%);
+}
+.custom-report-box .card-2{
+  width:524px;
+  background: linear-gradient(180deg, rgba(107, 83, 255, 0) 0%, #850AE4 100%);
+}
+.custom-report-box .card-3{
+  background: linear-gradient(180deg, rgba(83, 152, 255, 0) 0%, #0A54E4 100%);
+}
+.custom-report-box .text-card .icon{
+  display: inline-block;
+  width:96px;
+  height:96px;
+  margin-top:-14px;
+}
+.custom-report-box .text-card .text{
+  height:26px;
+  width:77px;
+  margin:4px auto 20px auto;
+}
+.custom-report-box .card-1 .icon{
+  background-image: url(/frontRouter/pc/customExport/image/box-icon1@2x.png);
+}
+.custom-report-box .card-1 .text{
+  background-image: url(/frontRouter/pc/customExport/image/sjdc-text.png);
+}
+
+.custom-report-box .card-2 .icon{
+  background-image: url(/frontRouter/pc/customExport/image/box-icon2@2x.png);
+}
+.custom-report-box .card-2 .text{
+  background-image: url(/frontRouter/pc/customExport/image/dzfw-text.png);
+}
+.custom-report-box .card-3 .icon{
+  background-image: url(/frontRouter/pc/customExport/image/box-icon3@2x.png);
+}
+.custom-report-box .card-3 .text{
+  background-image: url(/frontRouter/pc/customExport/image/jbzx-text.png);
+}
+.custom-report-box .text-card .content{
+  padding:0 42px;
+  text-align: left;
+  height:253px;
+}
+.custom-report-box .card-1 .content {
+  padding:0 60px;
+  background: url(/frontRouter/pc/customExport/image/bg-icon1@2x.png) no-repeat bottom right;
+  background-size: 40%;
+}
+.custom-report-box .card-2 .content {
+  background: url(/frontRouter/pc/customExport/image/bg-icon2@2x.png) no-repeat bottom right;
+  background-size: 26%;
+}
+.custom-report-box .card-1 .con-row:before{
+  content: '';
+  width:6px;
+  height:6px;
+  background: #62F4F4;
+  border-radius: 50%;
+  margin-right:5px;
+  margin-top:9px;
+}
+.custom-report-box .con-row{
+  display: flex;
+  align-content: flex-start;
+}
+.custom-report-box .con-row i{
+  width:6px;
+  height:6px;
+  background: #62F4F4;
+  border-radius: 3px;
+  margin-top: 9px;
+  margin-right:6px;
+}
+.custom-report-box .con-row .desc{
+  font-weight:normal;
+  font-size:14px;
+  line-height: 20px;
+  margin-top:2px;
+}
+.custom-report-box .card-2 .con-row{
+  margin-top:10px;
+}
+.custom-report-box .btn-con, .custom-report-box-b .btn-con{
+  width: 240px;
+  height: 48px;
+  background: linear-gradient(180deg, #FFFFFF 0%, #E3F2FF 100%);
+  border: 1px solid #FFFFFF;
+  border-radius: 8px;
+  font-weight: 700;
+  font-size: 20px;
+  line-height: 48px;
+  margin: 49px auto 0 auto;
+  text-align: center;
+  position: relative;
+  overflow: hidden;
+  cursor: pointer;
+}
+.custom-report-box .btn-con span, .custom-report-box-b .btn-con span{
+  background: linear-gradient(180deg, #33CCCC 0%, #3399FF 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  text-fill-color: transparent;
+}
+.custom-report-box-b{
+  height: 696px;
+}
+.custom-report-box-b .content{
+  margin-top:50px;
+}
+.custom-report-box-b .content .con-row{
+  width: 282px;
+  height: 220px;
+  background: linear-gradient(180deg, rgba(83, 214, 255, 0) 0%, #0AD7E4 100%);
+  border-radius: 8px;
+  text-align: center;
+  padding:0 20px;
+}
+.custom-report-box-b .content .row-text {
+  margin-top:-14px;
+}
+.custom-report-box-b .content .row-text img{
+  width:108px;
+  height:108px;
+}
+.custom-report-box-b .content .con-info img{
+  height:24px;
+}
+.custom-report-box-b .content .con-info p{
+  font-size:16px;
+  line-height:24px;
+  color:rgba(255, 255, 255, 0.88);
+  margin-top:12px;
+}
+.title{
+  margin:40px auto;
+  background: url(/frontRouter/pc/customExport/image/export-b-title.png) no-repeat center;
+  background-size: contain;
+  height:162px;
+}
+
+.core-advantage-box{
+  padding-top:68px;
+  height:642px;
+  width: 100%;
+  background-image:url(/frontRouter/pc/customExport/image/core-bg.png);
+  color: rgba(30, 30, 30, 0.88);
+}
+.core-advantage-box h2{
+  margin:0 auto;
+  background-image: url(/frontRouter/pc/customExport/image/core-title.png);
+}
+.core-advantage-box .content{
+  margin-top:72px;
+  text-align: center;
+}
+.core-advantage-box .con-row{
+  width:242px;
+}
+.core-advantage-box .con-row img{
+  width:117px;
+  margin-bottom:16px;
+}
+.core-advantage-box .con-row:nth-of-type(4) img, .core-advantage-box .con-row:nth-of-type(1) img{
+  width:119px;
+}
+.core-advantage-box .con-row .info{
+  font-size: 16px;
+  line-height: 24px;
+  text-align: center;
+}
+.core-advantage-box .btn-cell{
+  margin: 64px auto 0 auto;
+}
+.industry-solution-box{
+  position:relative;
+}
+.industry-solution-box .solution-container{
+  height:588px !important;
+}
+.industry-solution-box .self-handle-bar{
+  position:absolute;
+  width: 188px;
+  height: 272px;
+  left: 72%;
+  top: 180px;
+  background: rgba(0, 0, 0, 0.75);
+  /*background: #fff;*/
+  border-radius: 8px;
+  padding: 16px 0;
+  z-index:2;
+  color: #fff;
+}
+.industry-solution-box ul.self-handle-bar li{
+  float:unset;
+  height: 40px;
+  padding: 0 28px;
+  font-size: 16px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+.industry-solution-box .self-handle-bar img{
+  width:24px;
+  height: 24px;
+  margin-right:4px;
+}
+
+.industry-solution-box .self-handle-bar .active{
+  background: rgba(42, 190, 209, 0.2);
+  color: #2ABED1;
+}
+.industry-solution-box .box-container .swiper-wrapper .swiper-slide{
+  height: 100%;
+  overflow:hidden;
+}
+.industry-solution-box .swiper-wrapper .swiper1{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg1.png);
+}
+.industry-solution-box .swiper-wrapper .swiper2{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg2.png);
+}
+.industry-solution-box .swiper-wrapper .swiper3{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg3.png);
+}
+.industry-solution-box .swiper-wrapper .swiper4{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg4.png);
+}
+.industry-solution-box .swiper-wrapper .swiper5{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg5.png);
+}
+.industry-solution-box .swiper-wrapper .swiper6{
+  background-image: url(/frontRouter/pc/customExport/image/solution-bg6.png);
+}
+
+.industry-solution-box .swiper-wrapper .title{
+  background: url(/frontRouter/pc/customExport/image/solution-title.png) no-repeat center;
+  background-size: contain;
+}
+.industry-solution-box .content{
+  color: #fff;
+  font-size: 24px;
+  line-height: 24px;
+}
+.industry-solution-box .swiper-wrapper .con-info{
+  font-size: 16px;
+  margin: 32px 0 40px 0;
+}
+.industry-solution-box .data-demo-btn{
+  width: 180px;
+  height: 48px;
+  border: 1px solid #FFFFFF;
+  border-radius: 8px;
+  text-align: center;
+  line-height:48px;
+  font-weight: 700;
+  font-size: 20px;
+  margin-top:56px;
+  color: #fff;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.industry-solution-box .swiper1 .pro-logo, .industry-solution-box .swiper4 .pro-logo{
+  width: 570px;
+}
+.industry-solution-box .swiper2 .pro-logo, .industry-solution-box .swiper5 .pro-logo{
+  width: 380px;
+}
+.industry-solution-box .swiper3 .pro-logo{
+  width: 760px;
+}
+.industry-solution-box .pro-logo{
+  align-items: center;
+  background: rgba(255, 255, 255, 0.75);
+  backdrop-filter: blur(3px);
+  border-radius: 4px;
+  height:80px;
+}
+
+.industry-solution-box .pro-logo img{
+  height:64px;
+}
+.industry-solution-box .swiper6 .con-info{
+  width:642px;
+  font-size: 16px;
+  line-height: 24px;
+}
+.industry-solution-box .swiper6 .con-info em{
+  color:#2ABED1;
+}
+.industry-solution-box .swiper6 .con-info p:nth-of-type(3){
+  margin-top:20px;
+}
+.custom-way-box{
+  padding-top:68px;
+  height:678px;
+  background: linear-gradient(180deg, #F1FEFF 0%, #D9F1FF 100%);
+}
+.custom-way-box .title{
+  margin:0 auto 40px auto;
+  background-image: url(/frontRouter/pc/customExport/image/way-title.png);
+}
+.custom-way-box .con-row{
+  width:316px;
+  text-align: center;
+}
+
+.custom-way-box .con-row img{
+  height:200px;
+}
+.custom-way-box .con-row p>img{
+  height:30px;
+  margin:0 auto 12px auto;
+}
+.custom-way-box .con-row .info{
+  font-size: 16px;
+  line-height: 24px;
+  color:#1E1E1E;
+  text-align: center;
+}
+.custom-process-box{
+  height:676px;
+  padding-top:68px;
+  background-image: url(/frontRouter/pc/customExport/image/process-bg.png);
+  color:#fff;
+  font-size: 16px;
+  line-height: 24px;
+}
+.custom-process-box > div{
+  position:relative;
+}
+
+.custom-process-box .title{
+  margin-top:0;
+  background-image: url(/frontRouter/pc/customExport/image/process-title.png);
+}
+
+.custom-process-box .con-row{
+  width:300px;
+  text-align: center;
+  padding:0 31px;
+}
+
+.custom-process-box .con-row img{
+  width:140px;
+  height:140px;
+  z-index:1;
+  position: relative;
+}
+.custom-process-box .con-info p:nth-of-type(1){
+  margin: 14px 0 8px 0;
+  font-size:18px;
+}
+.custom-process-box .con-row:nth-of-type(4){
+  padding:0 20px;
+}
+.custom-process-box .btn-cell{
+  margin-top:53px;
+}
+.custom-process-box .dot-line{
+  height: 10px;
+  width: 788px;
+  border-bottom: 1px dashed #70DFFF;
+  position: absolute;
+  top: 203px;
+  left: 206px;
+}
+
+.i-need-more {
+  padding: 0 20px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  font-size: 28px;
+  color: #fff;
+  background: #003396;
+}
+.i-need-more.fixed {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  z-index: 999;
+}
+.i-need-more .closed {
+  cursor: pointer;
+  width:16px;
+  height:16px;
+  background-image: url(/frontRouter/pc/customExport/image/close.png);
+}
+.i-need-more .i-n-m-bg {
+  position: relative;
+  height: 88px;
+  background-image: url(/frontRouter/pc/customExport/image/bottom-fixed-ad.png);
+}
+
+.i-need-more .get-data-example-button {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 400px;
+  height: 100%;
+  cursor: pointer;
+  background-image: url(/frontRouter/pc/customExport/image/bottom-fixed-button.png);
+}
+
+@keyframes CfadeInUp {
+  from {
+    transform: translateY(50px);
+  }
+
+  to {
+    transform: translateY(0px);
+    opacity: 1;
+  }
+}
+
+.CfadeInUp {
+  /* opacity: 0; */
+  animation: 1s ease forwards alternate;
+}
+
+.btn-light::after {
+  content: '';
+  display: block;
+  position: absolute;
+  top: -120px;
+  left: -80px;
+  width: 36px;
+  height: 360px;
+  background: #fff;
+  opacity: 0.36;
+  transform: rotate(-45deg);
+  transition: all 500ms ease-out;
+}
+
+.btn-light:hover::after {
+  left: 200%;
+}
+
+
+
+
+
+
+
+

BIN
src/web/staticres/frontRouter/pc/customExport/image/bg-icon1@2x.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/bg-icon2@2x.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/bottom-fixed-ad.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/bottom-fixed-button.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/box-icon1@2x.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/box-icon2@2x.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/box-icon3@2x.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/close.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-bg.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-icon1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-icon2.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-icon3.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-icon4.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/core-title.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/dzfw-text.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-icon1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-icon2.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-icon3.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-icon4.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-text1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-text2.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-text3.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-text4.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/export-b-title.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/jbzx-text.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-bg.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-icon1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-icon2.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-icon3.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-icon4.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/process-title.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/report-bg1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/report-title.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/sjdc-text.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/solution-bg1.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/solution-bg2.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/solution-bg3.png


BIN
src/web/staticres/frontRouter/pc/customExport/image/solution-bg4.png


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