Browse Source

Merge remote-tracking branch 'origin/feature/v4.8.46' into dev/v4.8.46_wh

WH01243 2 years ago
parent
commit
d701526e64
100 changed files with 3846 additions and 1365 deletions
  1. 0 1
      src/config.json
  2. 1 1
      src/db.json
  3. 4 2
      src/go.mod
  4. 2 36
      src/go.sum
  5. 6 0
      src/jfw/filter/pcfilter.go
  6. 55 32
      src/jfw/front/classificationTag.go
  7. 14 3
      src/jfw/front/entsearch.go
  8. 49 43
      src/jfw/front/front.go
  9. 3 3
      src/jfw/front/frontRouter.go
  10. 25 27
      src/jfw/front/login.go
  11. 12 19
      src/jfw/front/org_structure.go
  12. 83 13
      src/jfw/front/pcIndex.go
  13. 10 17
      src/jfw/front/pchelper.go
  14. 5 0
      src/jfw/front/searchOptimize.go
  15. 253 177
      src/jfw/front/shorturl.go
  16. 115 68
      src/jfw/front/supsearch.go
  17. 85 31
      src/jfw/front/swordfish.go
  18. 137 86
      src/jfw/front/tags.go
  19. 2 0
      src/jfw/modules/app/src/app/filter/loginfilter.go
  20. 53 44
      src/jfw/modules/app/src/app/front/login.go
  21. 90 93
      src/jfw/modules/app/src/app/front/shorturl.go
  22. 1 1
      src/jfw/modules/app/src/app/front/swordfish.go
  23. 2 1
      src/jfw/modules/app/src/app/tag/msg.go
  24. 21 1
      src/jfw/modules/app/src/config.json
  25. 2 2
      src/jfw/modules/app/src/phoneFilter.json
  26. 4 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/ent_portrait.css
  27. 47 13
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  28. 24 4
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  29. 3 3
      src/jfw/modules/app/src/web/staticres/jyapp/css/wxinfocontent.css
  30. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/focontent/ad_bigmember.png
  31. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/focontent/ad_bigmember2.png
  32. 6 1
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  33. 31 10
      src/jfw/modules/app/src/web/staticres/jyapp/me/css/login.css
  34. 52 7
      src/jfw/modules/app/src/web/staticres/jyapp/wxtsguide/main.js
  35. 7 1
      src/jfw/modules/app/src/web/templates/big-member/page_client_follow_detail.html
  36. 6 0
      src/jfw/modules/app/src/web/templates/big-member/page_client_follow_list.html
  37. 36 17
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html
  38. 24 8
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait_change.html
  39. 33 4
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_detail.html
  40. 31 2
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_list.html
  41. 53 19
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  42. 8 2
      src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html
  43. 80 40
      src/jfw/modules/app/src/web/templates/me/login.html
  44. 2 1
      src/jfw/modules/app/src/web/templates/me/register.html
  45. 60 63
      src/jfw/modules/app/src/web/templates/me/setpwd.html
  46. 153 68
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  47. 9 0
      src/jfw/modules/app/src/web/templates/weixin/wxtsguide.html
  48. 16 1
      src/jfw/modules/bigmember/src/entity/marketAnalysis/commonSearch.go
  49. 31 3
      src/jfw/modules/bigmember/src/entity/portrait.go
  50. 3 2
      src/jfw/modules/bigmember/src/entity/portraitBuyerSearch.go
  51. 46 40
      src/jfw/modules/bigmember/src/filter/sessionfilter.go
  52. 4 4
      src/jfw/modules/bigmember/src/go.mod
  53. 8 8
      src/jfw/modules/bigmember/src/go.sum
  54. 38 0
      src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go
  55. 54 4
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  56. 19 16
      src/jfw/modules/bigmember/src/service/report/marketAnalysis.go
  57. 18 5
      src/jfw/modules/bigmember/src/service/use/use.go
  58. 13 22
      src/jfw/modules/publicapply/src/config.json
  59. 4 3
      src/jfw/modules/publicapply/src/config/config.go
  60. 63 21
      src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go
  61. 1 1
      src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go
  62. 3 2
      src/jfw/modules/publicapply/src/filter/sessionfilter.go
  63. 1 0
      src/jfw/modules/publicapply/src/main.go
  64. 96 0
      src/jfw/modules/publicapply/src/password/password.go
  65. 20 21
      src/jfw/modules/subscribepay/src/service/userAccountInfo.go
  66. 1 2
      src/main.go
  67. 81 21
      src/seo.json
  68. 2 1
      src/web/staticres/big-member/js/analysis_filter.js
  69. 3 0
      src/web/staticres/big-member/js/unit_portrayal.js
  70. 15 9
      src/web/staticres/common-module/ad/js/index.js
  71. 106 0
      src/web/staticres/common-module/bidstatus-update/css/bid-status-update.css
  72. BIN
      src/web/staticres/common-module/bidstatus-update/image/right.png
  73. 617 0
      src/web/staticres/common-module/bidstatus-update/js/bid-status-update.js
  74. 1 0
      src/web/staticres/common-module/big-member/js/client_portrayal.js
  75. 27 3
      src/web/staticres/common-module/big-member/js/page_client_follow_detail.js
  76. 23 2
      src/web/staticres/common-module/big-member/js/page_client_follow_list.js
  77. 41 40
      src/web/staticres/common-module/chart-module/js/chart-common.js
  78. 13 2
      src/web/staticres/common-module/collection/css/index.css
  79. BIN
      src/web/staticres/common-module/collection/image/bg/qy-zbtj-bg.png
  80. BIN
      src/web/staticres/common-module/collection/image/bg/qy-zbtj.png
  81. BIN
      src/web/staticres/common-module/collection/image/buyer/09.png
  82. BIN
      src/web/staticres/common-module/collection/image/buyer/10.png
  83. BIN
      src/web/staticres/common-module/collection/image/buyer/11.png
  84. BIN
      src/web/staticres/common-module/collection/image/buyer/cg-tjxx-bg.png
  85. BIN
      src/web/staticres/common-module/collection/image/buyer/cg-tjxx.png
  86. BIN
      src/web/staticres/common-module/collection/image/buyer/cg-zbdt-bg.jpg
  87. BIN
      src/web/staticres/common-module/collection/image/buyer/cg-zbdt.png
  88. 29 14
      src/web/staticres/common-module/collection/js/buyer-example.js
  89. 25 12
      src/web/staticres/common-module/collection/js/ent_portrait.js
  90. 23 2
      src/web/staticres/common-module/collection/js/index-wx.js
  91. 24 3
      src/web/staticres/common-module/collection/js/index.js
  92. 28 1
      src/web/staticres/common-module/collection/js/vip-dialog.js
  93. 9 9
      src/web/staticres/common-module/consult-dialog/js/index.js
  94. 1 0
      src/web/staticres/common-module/js/bundle.min.js
  95. 3 0
      src/web/staticres/common-module/mainSearch/css/j-icons.css
  96. 1 1
      src/web/staticres/common-module/mainSearch/css/third-party-verify-mobile.css
  97. 40 0
      src/web/staticres/common-module/message-tip/css/index.css
  98. 178 0
      src/web/staticres/common-module/message-tip/js/index.js
  99. 292 0
      src/web/staticres/common-module/message-tip/js/msgbuoy.js
  100. 126 126
      src/web/staticres/common-module/pc-dialog/js/leave-info-dialog.js

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


+ 1 - 1
src/db.json

@@ -41,7 +41,7 @@
   },
   "redis": {
     "main":{
-      "address": "other=192.168.3.149:1712,sso=192.168.3.149:1713,push=192.168.3.149:1711,session=192.168.3.149:1713,recovery=192.168.3.149:1715,merge=192.168.3.206:2711,newother=192.168.3.149:1712,poly=192.168.3.149:1713"
+      "address": "other=192.168.3.149:1712,sso=192.168.3.149:1713,push=192.168.3.149:1711,session=192.168.3.149:1713,recovery=192.168.3.149:1715,merge=192.168.3.206:2711,newother=192.168.3.149:1712,poly=192.168.3.149:1713,seoCache=192.168.3.149:1713,limitation=192.168.3.149:1713"
     },
     "login": {
       "address": "login=192.168.3.149:1712"

+ 4 - 2
src/go.mod

@@ -1,10 +1,10 @@
 module jy/src
 
-go 1.18
+go 1.20
 
 require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
-	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
+	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
 	app.yhyue.com/moapp/jypkg v0.0.0-20230630032557-eac72f240f41
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
@@ -146,3 +146,5 @@ require (
 	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
 	sigs.k8s.io/yaml v1.3.0 // indirect
 )
+
+replace github.com/go-xorm/xorm v0.7.9 => gitea.com/xorm/xorm v0.7.9

+ 2 - 36
src/go.sum

@@ -5,8 +5,8 @@ app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88/go.mod h1:J
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb h1:fT7FIKElKjkRHTmDxXPeNr5LWe2RmyJU+5aod1nptek=
-app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf h1:/Tk5haITmGc5c3/y6VxyycIy/LBWO7aYlxTiHKxmzv0=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
 app.yhyue.com/moapp/jypkg v0.0.0-20230630032557-eac72f240f41 h1:AQUCZbYnB6lddbJGvOsWwWKkJnQGh4atRtYHqXT0Kdc=
@@ -23,7 +23,6 @@ bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13 h1:aK3ya7aznINdAuEl7sKq9U2M
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13/go.mod h1:vDEKni2rnCraKgKnnCEIwsFmO92GxnpfKmNQ+83wKP0=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
 cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
@@ -83,9 +82,7 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67 h1:x98/gnpyNAiuvg/gX3KgdfKxnZj3t9pIl3BCVJg3qwg=
 github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67/go.mod h1:g1VZ0nbzBvfsWw22gNVOxWxJxpBR+CBiFNK2n2ogeUo=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -103,7 +100,6 @@ github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kd
 github.com/antlr/antlr4 v0.0.0-20210105212045-464bcbc32de2/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
 github.com/antlr/antlr4 v0.0.0-20210319025552-3590d4d5e18c/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
 github.com/antonlindstrom/pgstore v0.0.0-20200229204646-b08ebf1105e0/go.mod h1:2Ti6VUHVxpC0VSmTZzEvpzysnaGAfGBOoMIz5ykPyyw=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
@@ -164,7 +160,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY=
-github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
@@ -172,7 +167,6 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
 github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
 github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
@@ -258,7 +252,6 @@ github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Px
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
@@ -268,7 +261,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78
 github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
 github.com/go-xorm/builder v0.3.4/go.mod h1:KxkQkNN1DpPKTedxXyTQcmH+rXfvk4LZ9SOOBoZBAxw=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
-github.com/go-xorm/xorm v0.7.9/go.mod h1:XiVxrMMIhFkwSkh96BW7PACl7UhLtx2iJIHMdmjh5sQ=
 github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
@@ -301,7 +293,6 @@ github.com/gogf/gf/v2 v2.0.6/go.mod h1:8uYzw7qNzuq8vrhVlWke1b1925FFqOJIgmyYW1sr/
 github.com/gogf/gf/v2 v2.4.4 h1:+s7PKxd4LJKjJn5ODZvYcbXMM5e+88Ww1W3GdOarLE8=
 github.com/gogf/gf/v2 v2.4.4/go.mod h1:tsbmtwcAl2chcYoq/fP9W2FZf06aw4i89X34nbSHo9Y=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
@@ -343,7 +334,6 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -401,7 +391,6 @@ github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97Dwqy
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
 github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
@@ -441,7 +430,6 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
 github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
 github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
 github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
 github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
 github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
 github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
@@ -470,7 +458,6 @@ github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4
 github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po=
 github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ=
 github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig=
-github.com/jackc/pgx v3.6.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
 github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
 github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
@@ -583,7 +570,6 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m
 github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -637,7 +623,6 @@ github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042
 github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
@@ -646,7 +631,6 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q=
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
 github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
 github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
@@ -671,7 +655,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
 github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
@@ -681,13 +664,11 @@ github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrb
 github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
 github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
 github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
@@ -696,7 +677,6 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+
 github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
 github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
@@ -706,7 +686,6 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf
 github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
 github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
 github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -831,7 +810,6 @@ github.com/zeromicro/go-zero v1.5.3 h1:9poyd+raeL7gSMUu6P19N7bssTppieR2j7Oos2j1y
 github.com/zeromicro/go-zero v1.5.3/go.mod h1:dmoBpgJTxt9KWmgrNGpv06XxZRPXMakrxUVgROFAR3g=
 github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb h1:uWiILQloLUVdtPYr1ZZo2zqtlpzo4G8vUpglo/Fs2H8=
 github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb/go.mod h1:J3xKssoVdrwZ2E29fIox/EKxOZWimS7AZ4fOTCFkOLo=
-github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM=
 go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
@@ -848,7 +826,6 @@ go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCu
 go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
 go.mongodb.org/mongo-driver v1.11.7 h1:LIwYxASDLGUg/8wOhgOOZhX8tQa/9tgZPgzZoVqJvcs=
 go.mongodb.org/mongo-driver v1.11.7/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY=
-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -923,7 +900,6 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
 go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -987,7 +963,6 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -1064,7 +1039,6 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1168,7 +1142,6 @@ golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
 golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1239,7 +1212,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -1262,7 +1234,6 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
@@ -1270,7 +1241,6 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1314,7 +1284,6 @@ google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7/go.mod h1:kGP+zUP2
 google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
 google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1412,7 +1381,6 @@ gorm.io/gorm v1.20.7/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
 gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
 gorm.io/gorm v1.21.3 h1:qDFi55ZOsjZTwk5eN+uhAmHi8GysJ/qCTichM/yO7ME=
 gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1457,5 +1425,3 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
 sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
 sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
-xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
-xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=

+ 6 - 0
src/jfw/filter/pcfilter.go

@@ -37,6 +37,12 @@ func (this *pcFilter) Do() bool {
 		//wx
 		return true
 	}
+	//企业搜索
+	if strings.Contains(this.R.RequestURI, "/jylab/entSearch/index.html") ||
+		strings.Contains(this.R.RequestURI, "/swordfish/page_big_pc/ent_portrait/") ||
+		strings.Contains(this.R.RequestURI, "/swordfish/page_big_pc/svip/ent_ser_portrait/") {
+		return true
+	}
 	//pc助手订阅消息、招标搜索两个菜单链接过滤掉
 	if strings.HasPrefix(this.R.RequestURI, "/jypc/toAct/") || strings.Contains(this.R.RequestURI, "/exhibition/") {
 		return true

+ 55 - 32
src/jfw/front/classificationTag.go

@@ -1,28 +1,28 @@
 package front
 
 import (
-    qu "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jybase/encrypt"
-    elastic "app.yhyue.com/moapp/jybase/es"
-    "app.yhyue.com/moapp/jybase/redis"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
-    "app.yhyue.com/moapp/jypkg/public"
-    "encoding/json"
-    "fmt"
-    "jy/src/jfw/config"
-    "jy/src/jfw/jyutil"
-    "jy/src/jfw/paging"
-    "log"
-    "math"
-    "math/rand"
-    "strconv"
-    "sync"
-    "time"
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
+	"app.yhyue.com/moapp/jypkg/public"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"jy/src/jfw/paging"
+	"log"
+	"math"
+	"math/rand"
+	"strconv"
+	"sync"
+	"time"
 
-    "net/http"
+	"net/http"
 
-    "app.yhyue.com/moapp/jybase/date"
-    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 )
 
 type KeyType struct {
@@ -35,7 +35,6 @@ type KeyType struct {
 func RegionAndInformationAndTender() map[string]interface{} {
 	if bytes, err := redis.GetBytes(RedisNameNew, "regionAndInformationAndTender"); err == nil && bytes != nil {
 		rData := map[string]interface{}{}
-		log.Println()
 		if err := json.Unmarshal(*bytes, &rData); err != nil {
 			log.Printf("[MANAGER-ERR]RegionAndInformationAndTender  GetData Error %v \n", err)
 			return nil
@@ -68,6 +67,25 @@ func HotSubjectMatter() []map[string]interface{} {
 	return subjectMatter
 }
 
+// 随机展示200中标企业
+func GetWinnerInfo() (data []BuyerList) {
+	randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
+	from := randGen.Intn(100)
+
+	//关联中标企业
+	r := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query": {"bool": {"must": []}},"_source": ["_id","company_name"],"from": %d,"size": 200}`, from))
+	if r != nil {
+		for _, v := range *r {
+			var vs BuyerList
+			id := encrypt.EncodeArticleId2ByCheck(qu.InterfaceToStr(v["_id"]))
+			vs.Name = qu.InterfaceToStr(v["company_name"])
+			vs.Url = fmt.Sprintf("/swordfish/page_big_pc/ent_portrait/%s", id)
+			data = append(data, vs)
+		}
+	}
+	return
+}
+
 // ContentRecommendation 实用内容推荐
 func ContentRecommendation() []KeyType {
 	if bytes, err := redis.GetBytes(RedisNameNew, "contentRecommendation"); err == nil && bytes != nil {
@@ -223,8 +241,8 @@ func GetLetterPaging(pageNum int, checkedLetter string) (letterList []map[string
 
 func GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interface{}, int64) {
 	m := []map[string]interface{}{}
-	sql := `select id,name,letter from seo_words.seo_resource where letter = ? order by id desc`
-	cql := `select count(1) from seo_words.seo_resource where letter = ?`
+	sql := `select id,name,letter from seo_words.seo_resource where letter = ? and state=1 order by id desc`
+	cql := `select count(1) from seo_words.seo_resource where letter = ? and state=1`
 	offset := (pageNum - 1) * pageSize
 	sql += fmt.Sprintf(" limit %v,%v", offset, pageSize)
 	data := public.BaseMysql.SelectBySql(sql, letter)
@@ -245,7 +263,8 @@ func GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interfac
 }
 
 func GetIndustry(industryHref string) []map[string]interface{} {
-	data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a left join  seo_words.seo_industry_class b on a.class_1=b.name order by a.class_1`)
+	//data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a left join  seo_words.seo_industry_class b on a.class_1=b.name order by a.class_1`)
+	data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
 	industryArr := []string{}
 	industryMap := map[string][]map[string]interface{}{}
 	if len(*data) > 0 && data != nil {
@@ -286,14 +305,18 @@ func HotBuyerList(entIsNew bool) []*BuyerList {
 	buyerQuery := fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "name"}}]}},"from": %d,"size": %d}`, start, 200)
 	log.Println("buyerQuery:", buyerQuery)
 	data := elastic.Get("buyer", "buyer", buyerQuery)
-	if len(*data) > 0 {
+	if data != nil && len(*data) > 0 {
 		var buyerList []*BuyerList
 		for _, b := range *data {
 			name := qu.ObjToString(b["name"])
-			buyerList = append(buyerList, &BuyerList{
-				Name: name,
-				Url:  qu.If(entIsNew, fmt.Sprintf("/entpc/unit_portrayal/%s", name), fmt.Sprintf("/swordfish/page_big_pc/unit_portrayal/%s", name)).(string),
-			})
+			buyerId := qu.ObjToString(b["id"])
+			if name != "" && buyerId != "" {
+				idEncode := encrypt.EncodeArticleId2ByCheck(buyerId)
+				buyerList = append(buyerList, &BuyerList{
+					Name: name,
+					Url:  qu.If(entIsNew, fmt.Sprintf("/entpc/unit_portrayal_id/%s", idEncode), fmt.Sprintf("/swordfish/page_big_pc/unit_portrayal_id/%s", idEncode)).(string),
+				})
+			}
 		}
 		return buyerList
 	}
@@ -370,10 +393,10 @@ func HotKey() []string {
 		return rData
 	}
 	num := 7
-	count := public.BaseMysql.CountBySql(`select count(1) from seo_words.seo_resource;`)
+	count := public.BaseMysql.CountBySql(`select count(1) from seo_words.seo_resource where state=1;`)
 	rand.Seed(time.Now().UnixNano())
 	randNum := rand.Intn(int(count) - num)
-	data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource limit ?,?`, randNum, num)
+	data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource where state=1 limit ?,?`, randNum, num)
 	arr := []string{}
 	for _, v := range *data {
 		arr = append(arr, qu.ObjToString(v["name"]))
@@ -401,7 +424,7 @@ func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]in
 		_, total, _ := so.GetBidSearchList(true)
 		data.Count = total
 	*/
-	_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 10, "")
+	_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "拟建,招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 10, "")
 	if lists != nil {
 		for _, v1 := range *lists {
 			v1["_id"] = encrypt.CommonEncodeArticle("content", v1["_id"].(string))

+ 14 - 3
src/jfw/front/entsearch.go

@@ -19,8 +19,8 @@ import (
 
 type Entsearch struct {
 	*xweb.Action
-	bidsearchforentindex  xweb.Mapper `xweb:"/jylab/bidsearchforent/index.html"`
-	pcSearchZbqyAjax      xweb.Mapper `xweb:"/jylab/pcSearchZbqyAjax"`
+	//bidsearchforentindex  xweb.Mapper `xweb:"/jylab/bidsearchforent/index.html"`-- 此功能已取消
+	//pcSearchZbqyAjax      xweb.Mapper `xweb:"/jylab/pcSearchZbqyAjax"`-- 此功能已取消
 	recList               xweb.Mapper `xweb:"/jylab/bidsearchforent/recList"`
 	entSearchIndex        xweb.Mapper `xweb:"/jylab/entSearch/index.html"`
 	pushSearchIndex       xweb.Mapper `xweb:"/jylab/purSearch/index.html"`
@@ -37,6 +37,16 @@ func (e *Entsearch) EntSearchIndex() error {
 	if len(shareid) == 0 {
 		shareid = "10"
 	}
+	e.T["isLogin"] = 0
+	if userId, _ := e.GetSession("userId").(string); userId != "" {
+		userInfo := jy.GetVipState(e.Session(), *config.Middleground, userId)
+		e.T["isVip"] = userInfo.VipState > 0
+		e.T["isMember"] = userInfo.BigMember > 0
+		e.T["isEntniche"] = userInfo.EntMember > 0
+		e.T["isEntnicheNew"] = userInfo.IsNewEnt
+		e.T["isEntService"] = userInfo.EntService
+		e.T["isLogin"] = 1
+	}
 	e.T["shareid"] = se.EncodeString(shareid)
 	e.T["searchvalue"] = e.GetString("searchvalue")
 	e.T["logid"] = config.Seoconfig["jyzbqyss"].(string)
@@ -80,6 +90,7 @@ func (e *Entsearch) PurScopebusniessIndex() error {
 	return e.Render("/pc/purScopebusniess.html", &e.T)
 }
 
+// 此功能已失效
 func (e *Entsearch) Bidsearchforentindex() error {
 	defer util.Catch()
 	var shareid = e.GetString("id")
@@ -182,7 +193,7 @@ func getSearchResult(searchvalue, area string, minprice, maxprice float64, curre
 	return count, totalPage, list
 }
 
-// 异步请求方法
+// 异步请求方法   //此功能已失效
 func (e *Entsearch) PcSearchZbqyAjax() error {
 	defer util.Catch()
 	userid := util.ObjToString(e.GetSession("userId"))

+ 49 - 43
src/jfw/front/front.go

@@ -150,12 +150,16 @@ type Front struct {
 	getAdByCode xweb.Mapper `xweb:"/front/getAdByCode"`
 }
 
-var sewx encrypt.SimpleEncrypt //微信的加密方法
-var mongodb = public.MQFW
-var urlMap map[string]interface{}
-
-var se = encrypt.SE //移到tools中
-var isIosReg = regexp.MustCompile("\\(i[^;]+;( U;)? CPU.+Mac OS X")
+var (
+	sewx                     encrypt.SimpleEncrypt //微信的加密方法
+	mongodb                  = public.MQFW
+	urlMap                   map[string]interface{}
+	se                       = encrypt.SE //移到tools中
+	isIosReg                 = regexp.MustCompile("\\(i[^;]+;( U;)? CPU.+Mac OS X")
+	redisLimitation          = "limitation"
+	detailRedisByPayTimeOut  = 7200
+	detailRedisByFreeTimeOut = 7200
+)
 
 func init() {
 	sewx = encrypt.SimpleEncrypt{Key: "topnet"}
@@ -163,27 +167,28 @@ func init() {
 	xweb.AddAction(&Short{})
 	xweb.AddAction(&OrgStructure{})
 	urlMap = config.Sysconfig["redirect"].(map[string]interface{})
+	detailRedisByPayTimeOut = util.If(util.IntAll(config.Sysconfig["detailRedisByPayTimeOut"]) > 0, util.IntAll(config.Sysconfig["detailRedisByPayTimeOut"]), detailRedisByPayTimeOut).(int)
+	detailRedisByFreeTimeOut = util.If(util.IntAll(config.Sysconfig["detailRedisByFreeTimeOut"]) > 0, util.IntAll(config.Sysconfig["detailRedisByFreeTimeOut"]), detailRedisByFreeTimeOut).(int)
 }
 
-//前端页面加载
+// 前端页面加载
 func (this *Front) ReloadTo(href string) {
 	this.T["transfer"] = fmt.Sprintf("%s/%s", config.Sysconfig["webdomain"].(string), href)
 	this.Render("/pc/reloadTo.html", &this.T)
 }
 
-//获取打赏标语
+// 获取打赏标语
 func (this *Front) RewardText() {
 	rewardText, _ := getRewardText()
 	this.Write(rewardText)
 	return
 }
 
-//
 func (f *Front) Hp() error {
 	return f.Redirect("/")
 }
 
-//二维码图片
+// 二维码图片
 func (f *Front) Qr() error {
 	w := f.ResponseWriter
 	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
@@ -196,7 +201,7 @@ func (f *Front) Qr() error {
 	return err
 }
 
-//二维码图片
+// 二维码图片
 func (f *Front) Hpshare() error {
 	w := f.ResponseWriter
 	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
@@ -237,7 +242,6 @@ func (p *Front) PayIndex() error {
 	return p.Render("/weixin/pay.html", &p.T)
 }
 
-//
 func (f *Front) RecInof() error {
 	var msg = ""
 	var flag = true
@@ -360,7 +364,7 @@ func (f *Front) RecInof() error {
 	return nil
 }
 
-//更新取到的权重最低的字段到bidding表
+// 更新取到的权重最低的字段到bidding表
 func updateLastWrongField(id, result string) {
 	if result == "" {
 		return
@@ -372,7 +376,7 @@ func updateLastWrongField(id, result string) {
 	})
 }
 
-//轮询查登录状态
+// 轮询查登录状态
 func (f *Front) AjaxPolling() {
 	reqType, _ := f.GetInteger("reqType")
 	if reqType == 1 {
@@ -419,7 +423,7 @@ func (f *Front) AjaxPolling() {
 	}
 }
 
-//广告服务
+// 广告服务
 func (f *Front) Advservices() error {
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
@@ -430,12 +434,12 @@ func (f *Front) Advservices() error {
 	return f.Render("/pc/advservices.html", &f.T)
 }
 
-//移动端专题推广
+// 移动端专题推广
 func (f *Front) Mobtopics() error {
 	return f.Render("/active/mobtopics.html")
 }
 
-//移动端专题推广
+// 移动端专题推广
 func (f *Front) Extension(page string) error {
 	//今日头条和百度推广用的同一个页面,如以后有变动,需拆分成两个。
 	if page != "tengxun" {
@@ -444,13 +448,14 @@ func (f *Front) Extension(page string) error {
 	return f.Render("/active/ext-" + page + ".html")
 }
 
-//SEM推广
+// SEM推广
 func (f *Front) Topics() error {
 	f.T["logid"] = config.Seoconfig["jySEMtgy"].(string)
-	userId, _ := f.GetSession("userId").(string)
+	//userId, _ := f.GetSession("userId").(string)
 	f.DisableHttpCache()
 	//底部最新招标数据  3*6 条信息
-	news := PCS_list("", 18, userId) //Newbids("")[0].([]interface{})
+	//news := PCS_list("", 18, userId) //Newbids("")[0].([]interface{})
+	news := NewBidddingsForSEO("SEO", 3, 6)
 	listAll := [][]map[string]interface{}{}
 	i := 1
 	list := []map[string]interface{}{}
@@ -460,12 +465,18 @@ func (f *Front) Topics() error {
 			if data["publishtime"] == nil && data["time"] != nil {
 				continue
 			}
+			if util.ObjToString(data["_id"]) == "" {
+				continue
+			}
+			t := time.Unix(util.Int64All(data["publishtime"]), 0)
+			data["timetemp"] = fmt.Sprint(util.Int64All(data["publishtime"]))
+			data["_id"] = encrypt.EncodeArticleId2ByCheck(util.ObjToString(data["_id"]))
 			if (now-util.Int64All(data["publishtime"]))/60 < 60 {
 				data["printTime"] = fmt.Sprintf("%d分钟前", (now-util.Int64All(data["publishtime"]))/60)
 			} else if (now-util.Int64All(data["publishtime"]))/(60*60) < 24 {
 				data["printTime"] = fmt.Sprintf("%d小时前", (now-util.Int64All(data["publishtime"]))/(60*60))
 			} else {
-				data["printTime"] = data["time"]
+				data["printTime"] = util.TimeDiff(t)
 			}
 			data["index"] = i
 			i++
@@ -485,7 +496,6 @@ func (f *Front) Topics() error {
 	return f.Render("/pc/landingpage.html", &f.T)
 }
 
-//
 func (f *Front) Notin() error {
 	refer := "/"
 	tmp := f.Header("Referer")
@@ -507,7 +517,6 @@ func (f *Front) Notin() error {
 	return f.Render("/pc/notin.html", &f.T)
 }
 
-//
 func (f *Front) Followinfo() error {
 	var pid = f.GetString("pid")
 	var kid = f.GetString("kid")
@@ -592,7 +601,6 @@ func (f *Front) Followinfo() error {
 	return nil
 }
 
-//
 func (f *Front) Login(key string) error {
 	shareid := se.DecodeString(key)
 	openid := redis.GetStr("sso", "p_usershare_"+shareid)
@@ -615,7 +623,7 @@ func (f *Front) Login(key string) error {
 	return nil
 }
 
-//用户是否登录
+// 用户是否登录
 func (f *Front) HasSign() error {
 	sessVal := f.Session().GetMultiple()
 	if userId, _ := sessVal["mgoUserId"].(string); userId != "" {
@@ -690,7 +698,7 @@ func (f *Front) GetLoginNum(prestr string) error {
 	return nil
 }
 
-//一键报告
+// 一键报告
 func (m *Front) Onekey() error {
 	defer util.Catch()
 	fkid := encrypt.DecodeArticleId2ByCheck(m.GetString("fkid"))[0]
@@ -756,7 +764,6 @@ func (m *Front) Onekey() error {
 	return nil
 }
 
-//
 func (m *Front) Encrypt() error {
 	defer util.Catch()
 	id := m.GetString("id")
@@ -779,12 +786,11 @@ func (m *Front) Encrypt() error {
 	return nil
 }
 
-//
 func (m *Front) Wxerr() error {
 	return m.Render("/_err.html")
 }
 
-//查找用户并创建session
+// 查找用户并创建session
 func FindUserAndCreateSess(openid string, sess *httpsession.Session, typ string, flag, isSwitchToBestIdentity bool) (bool, *map[string]interface{}, map[string]interface{}) {
 	return CreateSession(map[string]interface{}{
 		"s_m_openid": openid,
@@ -833,6 +839,7 @@ func CreateSession(q map[string]interface{}, sess *httpsession.Session, typ stri
 		"result":      "ok",
 		"s_nickname":  s_nickname,
 		"s_headimage": sessionVal["s_avatar"],
+		"phone":       sessionVal["phone"],
 	}
 	if openid, _ := (*person)["s_m_openid"].(string); openid != "" {
 		infoData["openid"] = se.EncodeString(openid)
@@ -848,7 +855,7 @@ func CreateSession(q map[string]interface{}, sess *httpsession.Session, typ stri
 
 var bindUrl = "/front/account/phone/bind?mode=mergeBind"
 
-//微信跳转创建session
+// 微信跳转创建session
 func (m *Front) Sess(ostr string) error {
 	defer util.Catch()
 	if strings.Contains(ostr, "&") {
@@ -966,7 +973,7 @@ func (m *Front) Sess(ostr string) error {
 	return nil
 }
 
-//删除模板缓存
+// 删除模板缓存
 func (d *Front) Delc(url string) {
 	defer util.Catch()
 	d.App.TemplateMgr.CacheDelete(strings.Replace(url, "GG", "/", 1))
@@ -977,12 +984,12 @@ func (m *Front) Viewdemo() {
 	m.Redirect("/swordfish/guide/-1")
 }
 
-//剑鱼标讯用户协议
+// 剑鱼标讯用户协议
 func (m *Front) Wxprotocol() error {
 	return m.Render("/weixin/wxprotocol.html")
 }
 
-//推送列表
+// 推送列表
 func (m *Front) WxpushListInfo(_id string) error {
 	return m.Redirect("/swordfish/historypush")
 }
@@ -1062,7 +1069,7 @@ func (m *Front) Isrecord(name string) {
 	}
 }
 
-//招标订阅向导
+// 招标订阅向导
 func (f *Front) TSGuide() error {
 	defer util.Catch()
 	userid := util.ObjToString(f.GetSession("userId"))
@@ -1165,12 +1172,12 @@ func isInTSguide(userid string) bool {
 	return false
 }
 
-//查看原文中转
+// 查看原文中转
 func (f *Front) Transfer() error {
 	return f.Redirect(f.GetString("url"))
 }
 
-//关于我们
+// 关于我们
 func (f *Front) Aboutus() error {
 	code := f.GetString("code")
 	if mobileReg.MatchString(f.UserAgent()) {
@@ -1188,7 +1195,7 @@ func (f *Front) Aboutus() error {
 	return f.SetBody(content)
 }
 
-//商务合作
+// 商务合作
 func (f *Front) Busicooperation() error {
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
@@ -1218,7 +1225,7 @@ func (f *Front) Gethotkey() error {
 	return nil
 }
 
-//redis存储用户搜索关键词 企业 项目信息
+// redis存储用户搜索关键词 企业 项目信息
 func (f *Front) Rediskw() error {
 	skw := f.GetString("skw")
 	num := f.GetString("num")
@@ -1285,7 +1292,7 @@ func (f *Front) DownloadJyApp() error {
 	return f.Redirect(getDownloadUri(code, source, domain+apkurl))
 }
 
-//获取app下载地址,不通code对应不通渠道的app包
+// 获取app下载地址,不通code对应不通渠道的app包
 func getDownloadUri(code, source, download string) string {
 	jyapp := config.Sysconfig["jyapp"].(map[string]interface{})
 	channelMap := jyapp["channelDir"].(map[string]interface{})
@@ -1377,7 +1384,7 @@ func (f *Front) LimitSearchText() {
 	f.Write("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">" + fmt.Sprintf(public.Lst.Msg, status, public.Lst.Count, public.Lst.TimeOut, public.Lst.TotalPage))
 }
 
-//设置js css 版本号,修改以后记得同步更新seo.json中的值
+// 设置js css 版本号,修改以后记得同步更新seo.json中的值
 func (f *Front) SetSeoVersion() {
 	//!@111qqq@! md5=51a3b7b4ed3cf140
 	if f.GetString("p") != "51a3b7b4ed3cf140" {
@@ -1505,7 +1512,6 @@ func (f *Front) YmResult() error {
 
 }
 
-//
 func (f *Front) JylabShareTimeline() {
 	userid := util.ObjToString(f.GetSession("userId"))
 	if userid == "" {
@@ -1531,7 +1537,8 @@ func (f *Front) JylabShareTimeline() {
 	}
 }
 
-/**
+/*
+*
 成功分享后 更改分享相关信息
 
 shareType - 分享类型 1-详情页 2-推送列表 3-实验室
@@ -1616,7 +1623,6 @@ func encodeURIComponent(str string) string {
 	return r
 }
 
-//
 func (f *Front) GetAdByCode() {
 	m := map[string]interface{}{}
 	if ad_name := f.GetString("ad_name"); ad_name != "" {

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

@@ -1,6 +1,7 @@
 package front
 
 import (
+	"app.yhyue.com/moapp/jypkg/public"
 	"fmt"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
@@ -9,8 +10,6 @@ import (
 	"regexp"
 	"strings"
 
-	"app.yhyue.com/moapp/jypkg/public"
-
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 
 	//"strings"
@@ -215,7 +214,8 @@ func (this *CommonRouter) doPcBigPage(pageSign, types string) error {
 	//page := pageSign
 	userid, _ := this.GetSession("userId").(string)
 	//没有登录跳转登录页面(采购单位画像除外)
-	if !strings.Contains(pageSign, "unit_portrayal") && userid == "" {
+	if !strings.Contains(pageSign, "unit_portrayal") &&
+		!strings.Contains(pageSign, "ent_portrait") && userid == "" {
 		return this.Redirect("/notin/page")
 	}
 	return this.Render(fmt.Sprintf("/frontRouter/pc/page_big_pc/sess/index.html"))

+ 25 - 27
src/jfw/front/login.go

@@ -1,7 +1,6 @@
 package front
 
 import (
-	"app.yhyue.com/moapp/jybase/redis"
 	"fmt"
 	"jy/src/jfw/config"
 	jutil "jy/src/jfw/jyutil"
@@ -10,6 +9,8 @@ import (
 	"strings"
 	"time"
 
+	"app.yhyue.com/moapp/jybase/redis"
+
 	"app.yhyue.com/moapp/jypkg/public"
 
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
@@ -18,10 +19,10 @@ import (
 
 	. "app.yhyue.com/moapp/jybase/mongodb"
 
+	"app.yhyue.com/moapp/jybase/dchest/captcha"
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
-	"app.yhyue.com/moapp/jybase/dchest/captcha"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 )
 
@@ -92,12 +93,19 @@ func (l *Login) Login() error {
 			} else if strings.TrimSpace(password) == "" {
 				return -2, false
 			}
-			user, ok := mongodb.FindOneByField("user", map[string]interface{}{
+			// user, ok := mongodb.FindOneByField("user", map[string]interface{}{
+			// 	"i_appid": 2,
+			// 	"s_phone": phone,
+			// }, `{"s_password":1}`)
+			user, ok := mongodb.Find("user", map[string]interface{}{
 				"i_appid": 2,
-				"s_phone": phone,
-			}, `{"s_password":1}`)
+				"$or": []map[string]interface{}{
+					{"s_phone": phone},
+					{"s_m_phone": phone},
+				},
+			}, `{"s_phone":-1}`, `{"_id":1,"s_password":1}`, false, 0, 1)
 			if ok && user != nil && len(*user) > 0 {
-				if qutil.ObjToString((*user)["s_password"]) == qutil.GetMd5String(password) {
+				if qutil.ObjToString((*user)[0]["s_password"]) == qutil.GetMd5String(password) {
 					ok, _, userInfo := afterLogin(phone, l.Session())
 					if ok {
 						result["userInfo"] = userInfo
@@ -172,31 +180,21 @@ func (l *Login) Login() error {
 					if source != "" {
 						data["s_tracksource"] = source
 					}
+					//获取base_user_id
+					if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
+						Appid: "10000",
+						Phone: phone,
+					}); resp != nil && resp.Data.Id > 0 {
+						data["base_user_id"] = resp.Data.Id
+					} else {
+						log.Println(phone, "调用usercenter失败")
+						return -4, false
+					}
 					_id := mongodb.Save("user", data)
 					if _id != "" {
-						func(phone, userid string) {
-							//用户中台存储  开始
-							formdata := map[string]interface{}{
-								"appid": "10000",
-								"phone": phone,
-							}
-							if s_company != "" {
-								formdata["company"] = s_company
-							}
-							// ck, _ := l.GetCookie("SESSIONID")
-
-							// usercenter.AddBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), userid, formdata, ck)
-							if ok := jy.AddUser(mongodb, userid, pb.UserAddReq{
-								Appid: "10000",
-								Phone: phone,
-							}, *config.Middleground); !ok {
-								log.Println("usercenter add error", userid, phone)
-							}
-
-							//用户中台存储  结束
-						}(phone, _id)
 						jy.ClearPhoneIdentSession(l.Session())
 						ok, _, userInfo := afterLogin(phone, l.Session())
+						userInfo["isNewUser"] = true
 						nsqPath, _ := config.Sysconfig["nsq"].(string)
 						nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
 						er := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jypc_phone_register, _id, jy.Jyweb_node2)

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

@@ -21,7 +21,6 @@ import (
 	"app.yhyue.com/moapp/jypkg/public"
 
 	util "app.yhyue.com/moapp/jybase/common"
-	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
 
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
@@ -187,25 +186,19 @@ func (this *OrgStructure) AutoLogon() error {
 			if source != "" {
 				data["s_tracksource"] = source
 			}
-			if id := mongodb.Save("user", data); id != "" {
-				// ck, _ := this.GetCookie("SESSIONID")
-				// usercenter.AddBaseUser(mongodb, util.ObjToString(config.Sysconfig["userCenterApi"]), id, map[string]interface{}{
-				// 	"phone":    phone,
-				// 	"appid":    "10000",
-				// 	"nickname": name,
-				// 	"openid":   openId,
-				// 	"unionid":  unionId,
-				// }, ck)
-				if ok := jy.AddUser(mongodb, id, pb.UserAddReq{
-					Appid:    "10000",
-					Phone:    phone,
-					Nickname: name,
-					SOpenid:  openId,
-					Unionid:  unionId,
-				}, *config.Middleground); !ok {
-					log.Println("usercenter add error", id, phone)
+			if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
+				Appid:    "10000",
+				Phone:    phone,
+				Nickname: name,
+				SOpenid:  openId,
+				Unionid:  unionId,
+			}); resp != nil && resp.Data.Id > 0 {
+				data["base_user_id"] = resp.Data.Id
+				if id := mongodb.Save("user", data); id != "" {
+					rb = true
 				}
-				rb = true
+			} else {
+				log.Println(phone, unionId, "调用usercenter失败")
 			}
 		}
 	}

+ 83 - 13
src/jfw/front/pcIndex.go

@@ -120,12 +120,14 @@ func (m *PcIndex) NewSordfish(flag string) error {
 			m.T["hotSubject"] = HotSubjectMatter()
 			//实用内容推荐
 			m.T["recommend"] = ContentRecommendation()
+			m.T["jycmsLink"] = GetJycmsAreaLink()
 			//推荐标讯专区
 			m.T["recommendBeacon"] = RecommendationBeacon()
 			//热门采购单位
 			m.T["hotBuyers"] = HotBuyerList(entIsNew)
 			m.T["hasLogin"] = util.ObjToString(m.GetSession("userId")) != ""
 			m.T["includedInfo"] = GetIncludedInfo()
+			m.T["hotWinner"] = GetWinnerInfo()
 			m.T["newbids"] = NewIndexbids(m.Session(), m.Request)
 			m.T["hotkey"] = hotKeyArr
 			return m.Render("/pc/index.html", &m.T)
@@ -133,6 +135,44 @@ func (m *PcIndex) NewSordfish(flag string) error {
 	}
 }
 
+// GetJycmsAreaLink 获取资讯站地区首页地址
+func GetJycmsAreaLink() []map[string]interface{} {
+	redisKey := "IndexJycmsAreaLink"
+	if cache, err := redis.GetBytes("limitation", redisKey); err == nil && cache != nil && len(*cache) > 0 {
+		var rData []map[string]interface{}
+		_ = json.Unmarshal(*cache, &rData)
+		if len(rData) > 0 {
+			return rData
+		}
+	}
+
+	res := public.BaseMysql.Query("SELECT area,alias FROM global_common_data.code_area WHERE `code` LIKE '%%0000' AND alias IS NOT NULL")
+	if res == nil || len(*res) == 0 {
+		return nil
+	}
+	rData := make([]map[string]interface{}, 0, len(*res))
+	//TODO:因需求需要把内蒙古和河南位置对换
+	var ha, nmg int
+	for i, m := range *res {
+		alias, name := util.ObjToString(m["alias"]), util.ObjToString(m["area"])
+		tmp := map[string]interface{}{
+			"url":  fmt.Sprintf("/jycms/a_%s.html", alias),
+			"name": fmt.Sprintf("%s招标网", name),
+		}
+		if alias == "ha" {
+			ha = i
+		} else if alias == "nmg" {
+			nmg = i
+		}
+		rData = append(rData, tmp)
+	}
+	rData[nmg], rData[ha] = rData[ha], rData[nmg]
+	if len(rData) > 0 {
+		redis.Put("limitation", redisKey, rData, 60*60*24)
+	}
+	return rData
+}
+
 // 剑鱼标讯pc首页-统计
 func (m *PcIndex) NewSordfishC() error {
 	var shareid = m.GetString("id")
@@ -288,9 +328,10 @@ func GetInfoNum() (one map[string]interface{}) {
 // 标签查询
 func (f *PcIndex) SearchResult(at, name string) error {
 	defer util.Catch()
-	if at == "stype" && name == "NJ" {
-		return f.Redirect("/jylab/supsearch/proposedProject.html")
-	}
+	//NJ 已改成 NJXM  地址:/list/stype/NJXM.html
+	//if at == "stype" && name == "NJ" {
+	//	return f.Redirect("/jylab/supsearch/proposedProject.html")
+	//}
 	userId := util.ObjToString(f.GetSession("userId"))
 	var no = 5
 	var area = ""
@@ -314,6 +355,7 @@ func (f *PcIndex) SearchResult(at, name string) error {
 		shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jybqy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
 	}
 	f.T["logid"] = config.Seoconfig["jybqy"].(string)
+	f.T["seo_title"], f.T["seo_keywords"], f.T["seo_description"] = "", "", ""
 	if at == "area" {
 		areamp, _ := config.Seoconfig["area"].(map[string]interface{})
 		if areamp != nil {
@@ -325,6 +367,9 @@ func (f *PcIndex) SearchResult(at, name string) error {
 				seodescription = areamp1["DESCRIPTION"].(string)
 			}
 		}
+		f.T["seo_title"] = fmt.Sprintf("%s免费招标信息_%s采购服务平台_%s中标公告-剑鱼标讯", area, area, area)
+		f.T["seo_keywords"] = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", area, area, area, area, area)
+		f.T["seo_description"] = fmt.Sprintf("剑鱼标讯%s专栏,提供%s免费招标信息、%s招标公告、%s中标公告和%s招标采购等内容,以及%s招标信息搜索查询、订阅推送和数据定制化服务,每天实时更新%s的招标信息,随时随地免费查看。", area, area, area, area, area, area, area)
 	} else if at == "stype" {
 		stypemp, _ := config.Seoconfig["stype"].(map[string]interface{})
 		if stypemp != nil {
@@ -358,6 +403,9 @@ func (f *PcIndex) SearchResult(at, name string) error {
 				seodescription = citymp1["DESCRIPTION"].(string)
 			}
 		}
+		f.T["seo_title"] = fmt.Sprintf("%s免费招标信息_%s采购服务平台_%s中标公告-剑鱼标讯", city, city, city)
+		f.T["seo_keywords"] = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", city, city, city, city, city)
+		f.T["seo_description"] = fmt.Sprintf("剑鱼标讯%s专栏,提供%s免费招标信息、%s招标公告、%s中标公告和%s招标采购等内容,以及%s招标信息搜索查询、订阅推送和数据定制化服务,每天实时更新%s的招标信息,随时随地免费查看。", city, city, city, city, city, city, city)
 	} else if at == "keywords" {
 		keywordsArr, _ := config.Seoconfig["keywordsArr"].([]interface{})
 		if len(keywordsArr) > 0 {
@@ -381,16 +429,37 @@ func (f *PcIndex) SearchResult(at, name string) error {
 				}
 			}
 		}
+		f.T["seo_title"] = fmt.Sprintf("%s免费招标信息网__%s采购服务平台_%s中标公告-剑鱼标讯", keywords, keywords, keywords)
+		f.T["seo_keywords"] = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", keywords, keywords, keywords, keywords, keywords)
+		f.T["seo_description"] = fmt.Sprintf("剑鱼标讯%s专栏,提供%s免费招标信息、%s招标公告、%s中标公告和%s招标采购等内容,以及%s招标信息搜索查询、订阅推送和数据定制化服务,每天实时更新%s的招标信息,随时随地免费查看。", keywords, keywords, keywords, keywords, keywords, keywords, keywords)
+	}
+
+	if f.T["seo_title"] == "" {
+		f.T["seo_title"] = util.If(stype == "", fmt.Sprintf("剑鱼标讯官网_%s招标信息", seotitle), fmt.Sprintf("剑鱼标讯官网_%s", seotitle))
+	}
+	if f.T["seo_keywords"] == "" {
+		if area == "" {
+			if industry == "" {
+				f.T["seo_keywords"] = seokeywords
+			} else {
+				f.T["seo_keywords"] = fmt.Sprintf("%s", industry)
+			}
+		} else {
+			f.T["seo_keywords"] = fmt.Sprintf("%s招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", seokeywords, seokeywords, seokeywords, seokeywords, seokeywords)
+		}
 	}
-	if stype == "" && userId == "" {
+	if f.T["seo_description"] == "" {
+		if area == "" {
+			if industry == "" {
+				f.T["seo_description"] = seodescription
+			} else {
+				f.T["seo_description"] = fmt.Sprintf("剑鱼标讯提供%s全行业招标信息搜索查询、订阅推送和数据定制化服务,每天实时更新%s相关的招标信息,随时随地免费查看。", industry, industry)
+			}
+		} else {
+			f.T["seo_description"] = fmt.Sprintf("剑鱼标讯%s专栏,提供全行业最新的%s招标信息、%s招标公告、%s中标公告和%s招标采购等内容,强大的搜索查询功能,支持多条件筛选,让招投标更轻松。", seodescription, seodescription, seodescription, seodescription, seodescription)
+		}
 	}
-	f.T["seoarea"] = area
-	f.T["seostype"] = stype
-	f.T["seotitle"] = seotitle
-	f.T["seokeywords"] = seokeywords
-	f.T["seodption"] = seodescription
-	f.T["seocity"] = city
-	f.T["keywords"] = keywords
+
 	if area == "全国" {
 		return f.Redirect("/swordfish/searchinfolist.html")
 	}
@@ -417,10 +486,11 @@ func (f *PcIndex) SearchResult(at, name string) error {
 			query1 += `{"term":{"city":"` + city + `"}}`
 		}
 		query1 += `],"should": [],"minimum_should_match": 0}}}`
+		//p353包含采购意向与拟建
 		//获取到昨天数据
 		if stype == "" && userId == "" {
 			// stype = "招标预告,招标公告,招标结果,招标信用信息"
-			stype = "招标,询价,竞谈,变更,单一,竞价,邀标,成交,中标,废标,流标,结果变更,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果"
+			stype = "拟建,招标,询价,竞谈,变更,单一,竞价,邀标,成交,中标,废标,流标,结果变更,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果"
 		}
 
 		var datas *[]map[string]interface{}
@@ -504,7 +574,7 @@ func getstypeMap() []map[string][]map[string]interface{} {
 		}
 	}
 	m2 := []map[string][]map[string]interface{}{} //结构整理 返给前端
-	stype_1reg := []string{"招标公告", "招标结果", "招标信用信息", "招标预告"}
+	stype_1reg := []string{"招标公告", "招标结果", "招标信用信息", "招标预告", "拟建项目"}
 	hotlabstypSort := config.Seoconfig["hotlabstypSort"].([]interface{})
 	notice := util.ObjArrToStringArr(hotlabstypSort[0].([]interface{}))
 	result := util.ObjArrToStringArr(hotlabstypSort[1].([]interface{}))

+ 10 - 17
src/jfw/front/pchelper.go

@@ -141,24 +141,17 @@ func (l *PcHelper) Login() error {
 						if jy.IsEmail(email) {
 							data["s_email"] = email
 						}
+						if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
+							Appid: "10000",
+							Phone: phone,
+						}); resp != nil && resp.Data.Id > 0 {
+							data["base_user_id"] = resp.Data.Id
+						} else {
+							log.Println(phone, "调用usercenter失败")
+							return -1
+						}
 						_id := mongodb.Save("user", data)
 						if _id != "" {
-							//用户中台存储  开始
-							func(phone, userId string) {
-								// formdata := map[string]interface{}{
-								// 	"appid": "10000",
-								// 	"phone": phone,
-								// }
-								//ck, _ := l.GetCookie("SESSIONID")
-								//usercenter.AddBaseUser(mongodb, util.ObjToString(config.Sysconfig["userCenterApi"]), userId, formdata, ck)
-								if ok := jy.AddUser(mongodb, userId, pb.UserAddReq{
-									Appid: "10000",
-									Phone: phone,
-								}, *config.Middleground); !ok {
-									log.Println("usercenter add error", userId, phone)
-								}
-							}(phone, _id)
-							//用户中台存储  结束
 							jy.ClearPhoneIdentSession(l.Session())
 							reToken = getUToken(mac, phone)
 							reOpenId = phone
@@ -171,7 +164,7 @@ func (l *PcHelper) Login() error {
 							updataMap["s_phone"] = phone
 						}
 						if len(updataMap) > 0 {
-                            jyutil.Compatible.Update( BsonIdToSId((*datas)[0]["_id"]), map[string]interface{}{
+							jyutil.Compatible.Update(BsonIdToSId((*datas)[0]["_id"]), map[string]interface{}{
 								"$set":   updataMap,
 								"$unset": map[string]interface{}{"s_m_phone": ""},
 							})

+ 5 - 0
src/jfw/front/searchOptimize.go

@@ -185,6 +185,11 @@ func (so *SearchOptimize) SearchParamsHandle() {
 	if so.PageNum <= 0 {
 		so.PageNum = 1
 	}
+	userCount := util.If(so.IsPay, bidsearch.SearchMaxPageCount_PAYED, bidsearch.SearchMaxPageCount_PC).(int)
+	if so.PageNum > userCount/so.PageSize {
+		so.PageNum = -1
+		so.PageSize = -1
+	}
 	//行业格式化
 	if so.Industry != "" {
 		so.Industry = strings.TrimSpace(so.Industry)

+ 253 - 177
src/jfw/front/shorturl.go

@@ -86,12 +86,12 @@ func (s *Short) Article(stype, id string) error {
 	userId, _ := s.GetSession("userId").(string)
 	//PC端未登录用户程序走此逻辑  WX端走原来逻辑
 	if !mobileReg.MatchString(s.Header("User-Agent")) && (stype == "content" || stype == "indexcontent") && userId == "" {
-		if seoAgentReg.MatchString(s.UserAgent()) {
-			sids := encrypt.CommonDecodeArticle(stype, id)
-			return s.NologinCommon("", stype, id, sids[0])
-		} else {
-			return s.Redirect("/notin/page")
-		}
+		//if seoAgentReg.MatchString(s.UserAgent()) {
+		sids := encrypt.CommonDecodeArticle(stype, id)
+		return s.NologinCommon("", stype, id, sids[0])
+		//} else {
+		//	return s.Redirect("/notin/page")
+		//}
 	}
 	return s.LoginCommon(userId, stype, id)
 }
@@ -202,7 +202,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 			return nil
 		}
 		catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", userId, stype, sid)
-		if res := redis.Get("newother", catchKey); res == nil || res == "" {
+		if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
 			industry := s.GetString("industry")
 			var shareid = s.GetString("id")
 			if len(shareid) == 0 {
@@ -265,7 +265,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 				obj["description"] = DescriptionHandle(stype, obj)
 				s.T["obj"] = obj
 				content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
-				redis.Put("newother", catchKey, string(content), 60*20)
+				redis.Put(redisLimitation, catchKey, string(content), 60*20)
 				return s.SetBody(content)
 			}
 		} else {
@@ -296,6 +296,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		isEntniche    bool = userPower.EntnicheStatus > 0                                                 //商机管理
 		privatedata   bool = userPower.PrivateGD                                                          //广东移动DICT 用户
 		isEntService  bool = userPower.Data.Ent.PowerSource > 0 && userPower.Data.Entniche.IsEntPower > 0 //商机管理服务
+		newCanRead         = false
 	)
 	if res != nil && len(*res) > 0 {
 		if isVip && util.Int64All((*res)["l_vip_starttime"]) < util.Int64All(config.Sysconfig["contextOldVipLimit"]) {
@@ -319,6 +320,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 	s.T["isEntniche"] = isEntniche
 	s.T["isEntnicheNew"] = isEntnicheNew
 	s.T["isEntService"] = isEntService
+
 	if bm {
 		//判断有没有取关,取关的话,跳转到关于剑鱼标讯页面
 		if ssOpenid != nil && ssOpenid != "" {
@@ -344,6 +346,18 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 			shareopenid, sid = SwiDef(sid_openid)
 		}
 
+		if stype == "advancedProject" {
+			//判断此用户是否有打开的权限
+			newUserId := s.GetSession("base_user_id")
+			pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
+			//访问次数加1
+			if pushData == nil {
+				newCanRead = false
+			} else {
+				public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
+				newCanRead = true
+			}
+		}
 		s.T["keywords"] = kds
 		if shareopenid != "" {
 			s.T["shareopenid"] = shareopenid
@@ -360,7 +374,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		s.T["nickname"] = mynickname
 		s.T["avatar"] = myavatar
 		s.T["signature"] = wx.SignJSSDK(s.Site() + s.Url())
-		obj := wxvisitD(sid, userId, myopenid, stype, (isVip && isOldVip) || isMember || isEntniche)
+		obj := wxvisitD(sid, userId, myopenid, stype, (isVip && isOldVip) || isMember || isEntniche || newCanRead)
 		canRead := false
 		if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
 			((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
@@ -369,26 +383,12 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		} else {
 			canRead = SeeDetailLimit(obj, userId, sid)
 		}
-		if stype == "advancedProject" {
-			newCanRead := false
-			//判断此用户是否有打开的权限
-			newUserId := s.GetSession("base_user_id")
-			pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
-			//访问次数加1
-			if pushData == nil {
-				newCanRead = false
-			} else {
-				public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
-				newCanRead = true
-			}
-			if newCanRead || canRead {
-				obj = wxvisitD(sid, userId, myopenid, stype, true)
-				canRead = true
-			}
+		if newCanRead {
+			canRead = newCanRead
 			s.T["canRead"] = canRead
 		}
 		if len(obj) > 0 {
-			if canRead {
+			if canRead || util.ObjToString(obj["subtype"]) == "拟建" {
 				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, true)
 				//免费用户正文手机号替换
 				if obj["site"] == "剑鱼信息发布平台" && !isMember {
@@ -431,6 +431,11 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 						obj["entIds"] = winnerIdArr
 					}
 				}
+				if !canRead { //登录拟建&采购不展示遮罩 只打码
+					//canRead = true
+					//打码显示引导
+					otherFilter(obj, userId != "")
+				}
 				s.T["advertcode"] = s.GetString("advertcode")
 			} else {
 				obj = map[string]interface{}{
@@ -467,137 +472,159 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		}
 		sid := sids[0]
 		//免费用户浏览三级页判断留资与浏览次数
-		indust := s.GetString("industry")
+		//indust := s.GetString("industry")
 		if userId != "" && stype == "indexcontent" { //已登录用户直接跳转至正常三级页
 			return s.Redirect(fmt.Sprintf("/article/content/%s.html", encrypt.CommonEncodeArticle("content", sid)))
 		}
-		industry := s.GetString("industry")
-		var shareid = s.GetString("id")
-		if len(shareid) == 0 {
-			shareid = "10"
+		if stype == "advancedProject" {
+			//判断此用户是否有打开的权限
+			newUserId := s.GetSession("base_user_id")
+			pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
+			//访问次数加1
+			if pushData == nil {
+				newCanRead = false
+			} else {
+				public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
+				newCanRead = true
+			}
 		}
-		s.T["logid"] = config.Seoconfig["jysskzy"].(string)
-		s.T["shareid"] = se.EncodeString(shareid)
-		s.T["keywords"] = s.GetString("kds")
-		s.DisableHttpCache()
-		po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche)
-		if obj != nil && len(obj) > 0 {
-			var node bool
-			if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
-				((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
-				stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
-				node = true
+		var detailKey = func() string {
+			if (isVip && isOldVip) || isMember || isEntniche || newCanRead || stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" {
+				return "pay" //可以看全部
+			} else if isVip && !isOldVip {
+				return "new_vip_pay" //新版超级订阅不能看 采购意向
+			} else if SeeDetailLimit(nil, userId, sid) {
+				return "saleLeads_free" //未留资 三篇非采购意向信息;留资后同pay
 			} else {
-				_, _, _, objc := pcVRT(sid, indust, stype, isVip || isMember || isEntniche)
-				node = SeeDetailLimit(objc, userId, sid)
+				return "free" //已经免费查看三篇招标信息,且未留资。任何信息都不能看 有遮罩
 			}
-
-			if obj["publishtime"] != nil {
-				obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
+		}()
+		catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", detailKey, stype, sid)
+		log.Println(catchKey, "-缓存-", userId)
+		if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
+			redisTimeOut := util.If((isVip && isOldVip) || isMember || isEntniche || newCanRead, detailRedisByPayTimeOut, detailRedisByFreeTimeOut).(int)
+			industry := s.GetString("industry")
+			var shareid = s.GetString("id")
+			if len(shareid) == 0 {
+				shareid = "10"
 			}
-			s.T["canRead"] = node
-			if stype == "advancedProject" {
-				canRead := false
-				//判断此用户是否有打开的权限
-				newUserId := s.GetSession("base_user_id")
-				pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
-				//访问次数加1
-				if pushData == nil {
-					canRead = false
+			s.T["logid"] = config.Seoconfig["jysskzy"].(string)
+			s.T["shareid"] = se.EncodeString(shareid)
+			s.T["keywords"] = s.GetString("kds")
+			s.DisableHttpCache()
+			po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche || newCanRead)
+			if obj != nil && len(obj) > 0 {
+				var node bool
+				if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
+					((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
+					stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
+					node = true
 				} else {
-					public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
-					canRead = true
-				}
-				if canRead || node {
-					_, _, _, obj = pcVRT(sid, indust, stype, true)
-					canRead = true
-					node = canRead
+					//_, _, _, objc := pcVRT(sid, indust, stype, isVip || isMember || isEntniche)
+					node = SeeDetailLimit(obj, userId, sid)
 				}
-				s.T["canRead"] = canRead
-			}
-			if node {
-				if len(po) > 0 {
-					s.T["projectOther"] = po
+
+				if obj["publishtime"] != nil {
+					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
 				}
-				if len(bo) > 0 {
-					s.T["buyerOther"] = bo
+				s.T["canRead"] = node
+				if newCanRead {
+					s.T["canRead"] = newCanRead
 				}
-				if len(wo) > 0 {
-					s.T["winnerOther"] = wo
-				}
-				//判断时间 //如果是seo页面超过时间访问的进入首页
-				comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
-				if stype == "indexcontent" {
-					if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
-						return s.Redirect("/")
+				if node || util.ObjToString(obj["subtype"]) == "拟建" {
+					if len(po) > 0 {
+						s.T["projectOther"] = po
 					}
-				}
-				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
-				//免费用户正文手机号替换
-				if obj["site"] == "剑鱼信息发布平台" && !isMember {
-					//采购电话中标单位电话置空
-					if util.InterfaceToStr(obj["buyertel"]) != "" {
-						obj["buyertel"] = "freeView"
+					if len(bo) > 0 {
+						s.T["buyerOther"] = bo
 					}
-					if util.InterfaceToStr(obj["winnertel"]) != "" {
-						obj["winnertel"] = "freeView"
+					if len(wo) > 0 {
+						s.T["winnerOther"] = wo
 					}
-					//正文电话 手机号 邮箱处理
-					if detail, _ := obj["detail"].(string); detail != "" {
-						//手机号
-						re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
-						detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
-						code := util.InterfaceToStr(obj["projectcode"])
-						if code != "" {
-							detail1 = strings.ReplaceAll(detail1, code, "*********")
+					//判断时间 //如果是seo页面超过时间访问的进入首页
+					comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
+					if stype == "indexcontent" {
+						if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
+							return s.Redirect("/")
 						}
-						//座机
-						re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
-						detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
-						re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
-						detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
-						//邮箱
-						re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
-						detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
-						obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
 					}
-				}
-				if obj["projectname"] != nil {
-					s.SetSession("projectname", obj["projectname"])
-				}
+					FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
+					//免费用户正文手机号替换
+					if obj["site"] == "剑鱼信息发布平台" && !isMember {
+						//采购电话中标单位电话置空
+						if util.InterfaceToStr(obj["buyertel"]) != "" {
+							obj["buyertel"] = "freeView"
+						}
+						if util.InterfaceToStr(obj["winnertel"]) != "" {
+							obj["winnertel"] = "freeView"
+						}
+						//正文电话 手机号 邮箱处理
+						if detail, _ := obj["detail"].(string); detail != "" {
+							//手机号
+							re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
+							detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
+							code := util.InterfaceToStr(obj["projectcode"])
+							if code != "" {
+								detail1 = strings.ReplaceAll(detail1, code, "*********")
+							}
+							//座机
+							re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
+							detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
+							re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
+							detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
+							//邮箱
+							re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
+							detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
+							obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
+						}
+					}
+					if obj["projectname"] != nil {
+						s.SetSession("projectname", obj["projectname"])
+					}
 
-				if obj["entidlist"] != nil { //大会员中标企业跳转至画像
-					s_winner := util.ObjToString(obj["s_winner"])
-					idObjs, _ := obj["entidlist"].([]interface{})
-					winnerIdArr := []string{}
-					for _, v := range strings.Split(s_winner, ",") {
-						if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
-							continue
+					if obj["entidlist"] != nil { //大会员中标企业跳转至画像
+						s_winner := util.ObjToString(obj["s_winner"])
+						idObjs, _ := obj["entidlist"].([]interface{})
+						winnerIdArr := []string{}
+						for _, v := range strings.Split(s_winner, ",") {
+							if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
+								continue
+							}
+							winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
+							obj["entIds"] = winnerIdArr
 						}
-						winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
-						obj["entIds"] = winnerIdArr
+					}
+					if !node {
+						//打码遮罩
+						//s.T["canRead"] = true
+						otherFilter(obj, userId != "")
+					}
+				} else {
+					obj = map[string]interface{}{
+						"title":    obj["title"],
+						"_id":      obj["_id"],
+						"subtype":  obj["subtype"],
+						"stypeadd": obj["stypeadd"],
 					}
 				}
-			} else {
-				obj = map[string]interface{}{
-					"title":    obj["title"],
-					"_id":      obj["_id"],
-					"subtype":  obj["subtype"],
-					"stypeadd": obj["stypeadd"],
+
+				obj["urlpath"] = s.Uri()
+				obj["industry"] = industry
+				if ssOpenid != nil {
+					obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
 				}
-			}
+				obj["keywords"] = KeyWordHandle(obj)
+				obj["description"] = DescriptionHandle(stype, obj)
+				s.T["obj"] = obj
+				s.T["url"] = s.Uri()
 
-			obj["urlpath"] = s.Uri()
-			obj["industry"] = industry
-			if ssOpenid != nil {
-				obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
+				content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
+				redis.Put(redisLimitation, catchKey, string(content), redisTimeOut)
+				return s.SetBody(content)
+				//return s.Render("/pc/biddetail_rec.html", &s.T)
 			}
-			obj["keywords"] = KeyWordHandle(obj)
-			obj["description"] = DescriptionHandle(stype, obj)
-			s.T["obj"] = obj
-			s.T["url"] = s.Uri()
-			return s.Render("/pc/biddetail_rec.html", &s.T)
-
+		} else {
+			return s.SetBody([]byte(res.(string)))
 		}
 	}
 	return nil
@@ -661,7 +688,7 @@ func SeeDetailLimit(obj map[string]interface{}, userId, sid string) bool {
 			return true
 		}
 
-		if seeRes := redis.Get("other", watchKey); seeRes != nil && seeRes != "" {
+		if seeRes := redis.Get(redisLimitation, watchKey); seeRes != nil && seeRes != "" {
 			if resVal, _ := seeRes.(string); resVal != "" {
 				sidss := strings.Split(resVal, "_")
 				canRead := config.Sysconfig["canReadNotice"]
@@ -669,7 +696,7 @@ func SeeDetailLimit(obj map[string]interface{}, userId, sid string) bool {
 					sidss = append(sidss, sid)
 					arrs := RemoveDuplicatesAndEmpty(sidss)
 					newVal := strings.Join(arrs, "_")
-					redis.Put("other", watchKey, newVal, jy.GetExpire())
+					redis.Put(redisLimitation, watchKey, newVal, jy.GetExpire())
 					return true
 				} else {
 					for _, v := range sidss {
@@ -681,7 +708,7 @@ func SeeDetailLimit(obj map[string]interface{}, userId, sid string) bool {
 				}
 			}
 		} else {
-			redis.Put("other", watchKey, sid, jy.GetExpire())
+			redis.Put(redisLimitation, watchKey, sid, jy.GetExpire())
 			return true
 		}
 	}
@@ -783,8 +810,8 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 	if b && from_userid != "" && se.Decode4Hex(from_userid) != "" && se.Decode4Hex(from_userid) != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
 		article_id := encrypt.CommonDecodeArticle(stype, id)[0]
 		key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, from_userid, userId)
-		if redis.Incr("other", key) == 1 {
-			redis.SetExpire("other", key, 60*60*24)
+		if redis.Incr(redisLimitation, key) == 1 {
+			redis.SetExpire(redisLimitation, key, 60*60*24)
 			err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(string), config.Sysconfig["nsq_topic"].(string), jy.Jyweb_article_open, se.Decode4Hex(from_userid), jy.Jywx_node1)
 			if err != nil {
 				log.Println("nsq队列写入失败-->", jy.Jyweb_article_open, se.Decode4Hex(from_userid))
@@ -796,7 +823,7 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 // disWord 为空时处理
 func disWordNil(disWord, userId string) string {
 	var from_userid string
-	redisDis := redis.GetStr("other", "DIS_"+disWord[1:])
+	redisDis := redis.GetStr(redisLimitation, "DIS_"+disWord[1:])
 	if redisDis != "" {
 		suffix := disWord[len(disWord)-3:]
 		//公告三级页处理
@@ -979,10 +1006,26 @@ func Filter(obj map[string]interface{}) map[string]interface{} {
 	//	}
 	//}
 	//
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
 	for dk, dv := range detailNeedMosaic {
 		if !dv.(bool) {
 			continue
 		}
+		if obj["package"] != nil {
+			pk := util.ObjToMap(obj["package"])
+			for _, pv := range *pk {
+				if pv != nil {
+					if page := util.ObjToMap(pv); page != nil {
+						if (*page)[dk] != nil {
+							(*page)[dk] = mosaicText
+						}
+						delete(*page, "text")
+					}
+				}
+			}
+		}
 		//if util.ObjToString(obj[dk]) != "" {
 		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
 		//}
@@ -1013,6 +1056,65 @@ func Filter(obj map[string]interface{}) map[string]interface{} {
 	return obj
 }
 
+// 拟建采购意向用户进行数据过滤 name 配置文件
+func otherFilter(obj map[string]interface{}, isLogin bool) map[string]interface{} {
+	txt := util.If(isLogin, "解锁会员查看", "登陆后解锁会员查看").(string)
+	detail := fmt.Sprint(obj["detail"])
+	mosaicText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	detailText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	var (
+		projectinfo map[string]interface{}
+	)
+
+	var otherMosaic map[string]interface{}
+	if obj["subtype"] == "拟建" {
+		otherMosaic, _ = config.Sysconfig["planBuildMosaic"].(map[string]interface{})
+		projectinfo, _ = obj["projectinfo"].(map[string]interface{}) //1.项目信息打码处理
+	} else if obj["subtype"] == "采购意向" {
+		otherMosaic, _ = config.Sysconfig["purchaseMosaic"].(map[string]interface{})
+		procurementlist, _ := obj["procurementlist"].([]interface{})
+		for _, vs := range procurementlist { //1.采购意向清单数据集打码处理
+			vsMap, _ := vs.(map[string]interface{})
+			for _, vsq := range vsMap {
+				if vs1, ok := vsq.(string); ok && vs1 != "" {
+					detail = strings.ReplaceAll(detail, util.InterfaceToStr(vsq), detailText)
+				}
+			}
+		}
+		delete(obj, "procurementlist")
+	}
+
+	for dk, dv := range otherMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		if vs, ok := projectinfo[dk]; ok && vs != nil && vs != "" {
+			detail = strings.ReplaceAll(detail, util.InterfaceToStr(vs), detailText)
+			projectinfo[dk] = mosaicText
+		}
+		if vs, ok := obj[dk]; ok && vs != nil && vs != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
+			}
+		}
+		obj[dk] = mosaicText
+	}
+	if obj["subtype"] == "拟建" {
+		for k := range projectinfo {
+			if _, ok := otherMosaic[k]; !ok {
+				delete(projectinfo, k)
+			}
+		}
+		obj["projectinfo"] = projectinfo
+	}
+	obj["detail"] = detail
+	return obj
+}
+
 // 未登录用户进行数据过滤 name 配置文件
 func SearchFilter(obj map[string]interface{}) map[string]interface{} {
 	//detail := fmt.Sprint(obj["detail"])
@@ -1085,7 +1187,7 @@ func (s *Short) NologinArticle(stype, id string) error {
 func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 	tg := &Tags{}
 	catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s", stype, sid)
-	if res := redis.Get("newother", catchKey); res == nil || res == "" {
+	if res := redis.Get(redisLimitation, catchKey); true || res == nil || res == "" {
 		industry := s.GetString("industry")
 		var shareid = s.GetString("id")
 		if len(shareid) == 0 {
@@ -1094,10 +1196,12 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 		s.T["logid"] = config.Seoconfig["jysskzy"].(string)
 		s.T["shareid"] = se.EncodeString(shareid)
 		//s.T["keywords"] = s.GetString("kds")
-
 		s.DisableHttpCache()
 		po, bo, wo, obj := pcVRT(sid, industry, stype, false)
 		if obj != nil && len(obj) > 0 {
+			if obj["subtype"] == "采购意向" { //未登录不能访问采购意向
+				return s.Redirect("/notin/page", 302)
+			}
 			if len(po) > 0 {
 				s.T["projectOther"] = po
 			}
@@ -1117,7 +1221,11 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 				obj["projectnameTitle"] = obj["projectname"]
 				obj["projectcodeTitle"] = obj["projectcode"]
 				log.Println(time.Now().UnixNano())
-				obj = Filter(obj)
+				if obj["subtype"] == "拟建" {
+					otherFilter(obj, false)
+				} else {
+					obj = Filter(obj)
+				}
 				//obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
 			}
 			obj["agency"] = ""
@@ -1132,42 +1240,10 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 			s.T["industryInfoList"] = tg.GetConsult()
 			s.T["hotLabelList"] = tg.GetHotLabel(30)
 			s.T["simpleTemplateData"] = map[string]interface{}{
-				"obj": map[string]interface{}{
-					"subtype":         obj["subtype"],
-					"purchasing":      obj["purchasing"],
-					"package":         obj["package"],
-					"fwtscode":        obj["fwtscode"],
-					"fwtsname":        obj["fwtsname"],
-					"s_winner":        obj["s_winner"],
-					"projectname":     obj["projectname"],
-					"title":           obj["title"],
-					"area":            obj["area"],
-					"city":            obj["city"],
-					"agency":          obj["agency"],
-					"buyer":           obj["buyer"],
-					"buyerperson":     obj["buyerperson"],
-					"buyertel":        obj["buyertel"],
-					"winnertel":       obj["winnertel"],
-					"winner_enttel":   obj["winner_enttel"],
-					"bidamount":       obj["bidamount"],
-					"winner":          obj["winner"],
-					"budget":          obj["budget"],
-					"_id":             obj["_id"],
-					"projectinfo":     obj["projectinfo"],
-					"href":            obj["href"],
-					"winnerMap":       obj["winnerMap"],
-					"entId":           obj["entId"],
-					"publishtime":     obj["publishtime"],
-					"industry":        obj["industry"],
-					"s_subscopeclass": obj["s_subscopeclass"],
-					"areaadd":         obj["areaadd"],
-					"stypeadd":        obj["stypeadd"],
-					"indadd":          obj["indadd"],
-					"type":            obj["type"],
-				},
+				"obj": obj,
 			}
 			content, _ := s.Render4Cache("/pc/tags/detail.html", &s.T)
-			redis.Put("newother", catchKey, string(content), 60*2)
+			redis.Put(redisLimitation, catchKey, string(content), 60*2)
 			return s.SetBody(content)
 		}
 	} else {

+ 115 - 68
src/jfw/front/supsearch.go

@@ -31,12 +31,12 @@ import (
 
 type Pcsearch struct {
 	*xweb.Action
-	pcSearchIndex   xweb.Mapper `xweb:"/jylab/(supsearch|medical|bi)/index.html"` //搜索首页
-	getNewBids      xweb.Mapper `xweb:"/jylab/supsearch/getNewBids"`              //最新招标信息
-	getstatus       xweb.Mapper `xweb:"/jylab/supsearch/getstatus"`               //实验室开启状态
-	proposedProject xweb.Mapper `xweb:"/jylab/supsearch/proposedProject.html"`    //拟建项目
-	qr              xweb.Mapper `xweb:"/jylab/supsearch/qr/(.*)"`                 //生成进入实验室的二维码
-	changePro       xweb.Mapper `xweb:"/jylab/changePro"`                         //修改提示信息状态
+	pcSearchIndex xweb.Mapper `xweb:"/jylab/(supsearch|medical|bi)/index.html"` //搜索首页
+	getNewBids    xweb.Mapper `xweb:"/jylab/supsearch/getNewBids"`              //最新招标信息
+	getstatus     xweb.Mapper `xweb:"/jylab/supsearch/getstatus"`               //实验室开启状态
+	//proposedProject xweb.Mapper `xweb:"/jylab/supsearch/proposedProject.html"`    //拟建项目-- 此功能已取消 影响es 检索功能
+	qr        xweb.Mapper `xweb:"/jylab/supsearch/qr/(.*)"` //生成进入实验室的二维码
+	changePro xweb.Mapper `xweb:"/jylab/changePro"`         //修改提示信息状态
 }
 
 var industrylist map[string][]string
@@ -101,7 +101,6 @@ func PCS_task() {
 			}
 		}
 	}
-
 }
 
 // 返回内存中列表也的数据,只获取首页,其他页面访问量暂时不多
@@ -135,6 +134,7 @@ func (p *Pcsearch) ChangePro() {
 	}
 }
 
+// 此功能已失效
 func (p *Pcsearch) ProposedProject() error {
 	defer util.Catch()
 	var shareid = p.GetString("id")
@@ -344,11 +344,21 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	//--end--
 	userId, _ := p.GetSession("userId").(string)
 	phone, _ := p.GetSession("phone").(string)
+	//p353包含采购意向与拟建
 	noLoginBl := false
 	if userId == "" {
-		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
+		//未登录用户访问全部信息类型 需要过滤掉 拟建
+		if strings.Contains(subtype, "采购意向") {
+			var ss []string
+			for _, v := range strings.Split(subtype, ",") {
+				if v != "采购意向" {
+					ss = append(ss, v)
+				}
+			}
+			subtype = strings.Join(ss, ",")
+		}
 		if subtype == "" {
-			subtype = "招标预告,招标公告,招标结果,招标信用信息"
+			subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
 			noLoginBl = true
 		}
 	}
@@ -565,74 +575,111 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	return p.Render("/pc/supsearch.html", &p.T)
 }
 
-// Newbids  最新招标信息
+// Newbids  最新招标信息 --已失效
 func Newbids(p, userId string) []map[string]interface{} {
-	//fmt.Println("11111", redis.Get("newother", "index_list"))
-	nologin := ""
-	count := 500
-	pagenum := 10
-	limit := 50
-	if userId == "" {
-		nologin = "_nologin"
-		count = bidsearch.SearchMaxPageCount_NOLOGIN
-		pagenum = 20
-		limit = 250
-	}
-	indexOk, _ := redis.Exists("newother", "index_list"+p+nologin)
+	return nil
+	////fmt.Println("11111", redis.Get("newother", "index_list"))
+	//nologin := ""
+	//count := 500
+	//pagenum := 10
+	//limit := 50
+	//if userId == "" {
+	//    nologin = "_nologin"
+	//    count = bidsearch.SearchMaxPageCount_NOLOGIN
+	//    pagenum = 20
+	//    limit = 250
+	//}
+	//indexOk, _ := redis.Exists("newother", "index_list"+p+nologin)
+	//pages := []map[string]interface{}{}
+	//if indexOk {
+	//    pages = util.ObjArrToMapArr(redis.Get("newother", "index_list"+p+nologin).([]interface{}))
+	//}
+	//if len(pages) == 0 {
+	//    var list *[]map[string]interface{}
+	//    subtype := ""
+	//    bidField := ""
+	//    // 判断是不是医疗行业
+	//    if p == "medical" {
+	//        bidField = "0101"
+	//    } else {
+	//        if len(p) > 0 {
+	//            subtype = "拟建"
+	//        }
+	//        //未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
+	//        if subtype == "" {
+	//            subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
+	//        }
+	//    }
+	//    //查询置顶信息
+	//    var ss []map[string]interface{}
+	//    ls := top500(subtype, bidField, userId)
+	//    if ls != nil && len(*ls) > 0 {
+	//        ss = append(ss, *ls...)
+	//    }
+	//    //pages = append(pages, ls)
+	//    if ls == nil || len(*ls) < count {
+	//        intns := make([]int, 0)
+	//        for i := 0; i < pagenum; i++ {
+	//            if len(intns) == 0 {
+	//                intns = append(intns, rand.Intn(1000))
+	//            } else {
+	//                for {
+	//                    v := rand.Intn(intns[(i-1)] + 1000)
+	//                    if v-intns[(i-1)] > limit {
+	//                        intns = append(intns, v)
+	//                        break
+	//                    }
+	//                }
+	//            }
+	//        }
+	//        for i := 0; i < pagenum; i++ {
+	//            _, list = getLastNewsData("", "", "", "", subtype, "", "", "", "", "", "", "", "Y", intns[i], true, false, "", bidField, limit)
+	//            if list != nil && len(*list) > 0 {
+	//                ss = append(ss, *list...)
+	//            }
+	//        }
+	//    }
+	//    data := duplicateRemoval(ss)
+	//    if len(data) > 0 {
+	//        pages = data
+	//        redis.Put("newother", "index_list"+p+nologin, pages, 60*60*24)
+	//        pages = util.ObjArrToMapArr(redis.Get("newother", "index_list"+p+nologin).([]interface{}))
+	//    }
+	//}
+	//return pages
+}
+
+// Newbids  最新招标信息
+func NewBidddingsForSEO(p string, pageNum, limit int) []map[string]interface{} {
+	indexOk, _ := redis.Exists("newother", "index_list_"+p)
 	pages := []map[string]interface{}{}
 	if indexOk {
-		pages = util.ObjArrToMapArr(redis.Get("newother", "index_list"+p+nologin).([]interface{}))
-	}
-	if len(pages) == 0 {
-		var list *[]map[string]interface{}
-		subtype := ""
-		bidField := ""
-		// 判断是不是医疗行业
-		if p == "medical" {
-			bidField = "0101"
-		} else {
-			if len(p) > 0 {
-				subtype = "拟建"
-			}
-			//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
-			if subtype == "" {
-				subtype = "招标预告,招标公告,招标结果,招标信用信息"
-			}
-		}
-		//查询置顶信息
+		pages = util.ObjArrToMapArr(redis.Get("newother", "index_list_"+p).([]interface{}))
+	} else {
 		var ss []map[string]interface{}
-		ls := top500(subtype, bidField, userId)
-		if ls != nil && len(*ls) > 0 {
-			ss = append(ss, *ls...)
-		}
-		//pages = append(pages, ls)
-		if ls == nil || len(*ls) < count {
-			intns := make([]int, 0)
-			for i := 0; i < pagenum; i++ {
-				if len(intns) == 0 {
-					intns = append(intns, rand.Intn(1000))
-				} else {
-					for {
-						v := rand.Intn(intns[(i-1)] + 1000)
-						if v-intns[(i-1)] > limit {
-							intns = append(intns, v)
-							break
-						}
+		intns := make([]int, 0)
+		for i := 0; i < pageNum; i++ {
+			if len(intns) == 0 {
+				intns = append(intns, rand.Intn(30))
+			} else {
+				for {
+					v := rand.Intn(intns[(i-1)] + 50)
+					if v-intns[(i-1)] > limit {
+						intns = append(intns, v)
+						break
 					}
 				}
 			}
-			for i := 0; i < pagenum; i++ {
-				_, list = getLastNewsData("", "", "", "", subtype, "", "", "", "", "", "", "", "Y", intns[i], true, false, "", bidField, limit)
-				if list != nil && len(*list) > 0 {
-					ss = append(ss, *list...)
-				}
+		}
+		for i := 0; i < pageNum; i++ {
+			list := elastic.GetPage(INDEX, TYPE, "", `{"publishtime":-1}`, bidField, intns[i], limit)
+			if list != nil && len(*list) > 0 {
+				ss = append(ss, *list...)
 			}
 		}
-		data := duplicateRemoval(ss)
-		if len(data) > 0 {
-			pages = data
-			redis.Put("newother", "index_list"+p+nologin, pages, 60*60*24)
-			pages = util.ObjArrToMapArr(redis.Get("newother", "index_list"+p+nologin).([]interface{}))
+		if len(ss) > 0 {
+			pages = ss
+			redis.Put("newother", "index_list_"+p, ss, 60*60*24)
 		}
 	}
 	return pages

+ 85 - 31
src/jfw/front/swordfish.go

@@ -113,6 +113,22 @@ func (m *Front) PcAjaxReq() {
 	if selectType == "" {
 		selectType = "title,content"
 	}
+	if userId == "" {
+		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
+		if strings.Contains(subtype, "采购意向") {
+			var ss []string
+			for _, v := range strings.Split(subtype, ",") {
+				if v != "采购意向" {
+					ss = append(ss, v)
+				}
+			}
+			subtype = strings.Join(ss, ",")
+		}
+		if subtype == "" {
+			subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
+		}
+
+	}
 	industry := strings.TrimSpace(m.GetString("industry"))
 	minprice := m.GetString("minprice")               //最低价格
 	maxprice := m.GetString("maxprice")               //最高价格
@@ -142,12 +158,7 @@ func (m *Front) PcAjaxReq() {
 		notkey = m.GetString("notkey")
 		city = m.GetString("city")
 	}
-	if userId == "" {
-		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
-		if subtype == "" {
-			subtype = "招标预告,招标公告,招标结果,招标信用信息"
-		}
-	}
+
 	// p329  非反爬白名单用户不放开  需要处理通用词
 	onList, _ := jyutil.IsOnTheWhitelist(m.Session())
 	searchValueString := m.GetString("searchvalue")
@@ -177,9 +188,13 @@ func (m *Front) PcAjaxReq() {
 		if isLimit == 1 {
 			searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
 			so := NewSearchOptimize(userId, phone, area, city, subtype, toptype, publishtime, strings.Join(queryItems, ","), fmt.Sprintf("%s-%s", minprice, maxprice), industry, buyerclass, hasBuyerTel, hasWinnerTel, fileExists, s_word, additionalWords, notkey, "PC", territorialization, currentPage, pageSize, searchGroup, searchMode, wordsMode, *userInfo, searchTypeSwitch, m.Request)
-			m.SetSession("selectType", so.SelectType)
-			heightKeys = so.HeightKeys
-			count, total, list = so.GetBidSearchList(false)
+			if so.PageNum < 0 && so.PageSize < 0 {
+				log.Printf("查询参数超出范围,有可能是异常请求; 用户id:%s;用户手机号:%s \n", userId, phone)
+			} else {
+				m.SetSession("selectType", so.SelectType)
+				heightKeys = so.HeightKeys
+				count, total, list = so.GetBidSearchList(false)
+			}
 		}
 	} else {
 		searchTypeSwitch, _ := config.Sysconfig["searchTypeSwitch"].(bool)
@@ -187,7 +202,6 @@ func (m *Front) PcAjaxReq() {
 		list, count, total = so.GetBidSearchListByCache()
 
 	}
-	log.Println("userId:+++", userId)
 	if userId == "" {
 		for _, v := range list {
 			*v = SearchFilter(*v)
@@ -284,7 +298,7 @@ func (m *Front) PcAjaxReq_Bak() {
 	if userId == "" {
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
 		if subtype == "" {
-			subtype = "招标预告,招标公告,招标结果,招标信用信息"
+			subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
 		}
 	}
 	m.SetSession("selectType", selectType)
@@ -705,13 +719,12 @@ func ObjData(isPayUser bool, sid, content string, lent int) (t bool, obj map[str
 		t = true
 		if !isPayUser && (content != "indexcontent") && (util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向") {
 			if lent == 0 {
-				delete(obj, "detail")
-				delete(obj, "projectinfo")
+				//delete(obj, "detail")
+				//delete(obj, "projectinfo")
 				goto env
 			}
 			for k, _ := range obj {
-				if k != "title" && k != "area" && k != "subtype" && k != "toptype" && k != "publishtime" && k != "budget" && k != "bidamount" && k != "site" && k != "spidercode" && k != "recommended_service" &&
-					//"owner":1,"total_investment":1,"projectaddr":1,"projectperiod":1,"approvedept":1,"approvecontent":1,"approvecode":1,"approvenumber":1,"approvetime":1,"approvestatus":1,"project_scale":1
+				if k != "title" && k != "area" && k != "detail" && k != "projecttype" && k != "approvecity" && k != "procurementlist" && k != "projectinfo" && k != "subtype" && k != "toptype" && k != "publishtime" && k != "budget" && k != "bidamount" && k != "site" && k != "spidercode" && k != "recommended_service" &&
 					k != "owner" && k != "total_investment" && k != "projectaddr" && k != "projectperiod" && k != "approvedept" && k != "approvecontent" && k != "approvecode" && k != "approvenumber" && k != "approvetime" && k != "approvestatus" && k != "project_scale" && k != "projectname" {
 					delete(obj, k)
 				}
@@ -796,42 +809,83 @@ func pcVRT(sid, industry, content string, isPayUser bool) (po, bo, wo []map[stri
 			objdata = obj
 			queryStr := ""
 			commonQuery := func(mustquery string) *[]map[string]interface{} {
-				return nil //elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
+				//付费用户可查看 详情页关联信息
+				if !isPayUser || content == "bdcontent" || content == "advancedProject" {
+					return nil //elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
+				}
+				return elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
 			}
 			//同一个项目的其他招标信息
 			projectName, _ := obj["projectname"].(string)
 			projectCode, _ := obj["projectcode"].(string)
 			if projectName != "" || projectCode != "" {
-				if projectName != "" && projectCode != "" {
-					projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
-					projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
-					queryStr = `{"$or":[{"TERM_projectname":"` + projectName + `"},{"TERM_projectcode":"` + projectCode + `"}]}`
-				} else if projectName != "" && projectCode == "" {
-					projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
-					queryStr = `{"TERM_projectname":"` + projectName + `"}`
-				} else if projectName == "" && projectCode != "" {
-					projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
-					queryStr = `{"TERM_projectcode":"` + projectCode + `"}`
+				projectNameCode := fmt.Sprintf("projectNameCode_%s_%s_%s", projectName, projectCode, util.If(isPayUser, "pay", "free"))
+				projectOther = EntAssociated(projectNameCode)
+				if projectOther == nil {
+					if projectName != "" && projectCode != "" {
+						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
+						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
+						queryStr = `{"$or":[{"TERM_projectname":"` + projectName + `"},{"TERM_projectcode":"` + projectCode + `"}]}`
+					} else if projectName != "" && projectCode == "" {
+						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
+						queryStr = `{"TERM_projectname":"` + projectName + `"}`
+					} else if projectName == "" && projectCode != "" {
+						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
+						queryStr = `{"TERM_projectcode":"` + projectCode + `"}`
+					}
+					projectOther = bidDataConvert(sid, commonQuery(queryStr))
+					if projectOther != nil && len(projectOther) > 0 {
+						if bytes, err := json.Marshal(projectOther); err == nil && len(bytes) > 0 {
+							_ = redis.PutBytes(RedisNameNew, projectNameCode, &bytes, 24*60*60)
+						}
+					}
 				}
-				projectOther = bidDataConvert(sid, commonQuery(queryStr))
 			}
 			//同一个业主最近的其他招标信息
 			buyer, _ := obj["buyer"].(string) //采购单位
 			if buyer != "" {
-				queryStr = `{"TERM_buyer":"` + buyer + `"}`
-				buyerOther = bidDataConvert(sid, commonQuery(queryStr))
+				buyerNameOther := fmt.Sprintf("buyerNameOther_%s_%s", buyer, util.If(isPayUser, "pay", "free"))
+				buyerOther = EntAssociated(buyerNameOther)
+				if buyerOther == nil {
+					queryStr = `{"TERM_buyer":"` + buyer + `"}`
+					buyerOther = bidDataConvert(sid, commonQuery(queryStr))
+					if buyerOther != nil && len(buyerOther) > 0 {
+						if bytes, err := json.Marshal(buyerOther); err == nil && len(bytes) > 0 {
+							_ = redis.PutBytes(RedisNameNew, buyerNameOther, &bytes, 24*60*60)
+						}
+					}
+				}
 			}
 			//同一中标人最近中标的其他信息
 			winner, _ := obj["winner"].(string) //中标人
 			if winner != "" {
-				queryStr = `{"TERM_s_winner":"` + winner + `"}`
-				winnerOther = bidDataConvert(sid, commonQuery(queryStr))
+				winnerNameOther := fmt.Sprintf("winnerNameOther_%s_%s", winner, util.If(isPayUser, "pay", "free"))
+				winnerOther = EntAssociated(winnerNameOther)
+				if winnerOther == nil {
+					queryStr = `{"TERM_s_winner":"` + winner + `"}`
+					winnerOther = bidDataConvert(sid, commonQuery(queryStr))
+					if winnerOther != nil && len(winnerOther) > 0 {
+						if bytes, err := json.Marshal(winnerOther); err == nil && len(bytes) > 0 {
+							_ = redis.PutBytes(RedisNameNew, winnerNameOther, &bytes, 24*60*60)
+						}
+					}
+				}
 			}
 		}
 	}
 	return projectOther, buyerOther, winnerOther, objdata
 }
 
+func EntAssociated(key string) []map[string]interface{} {
+	if bytes, err := redis.GetBytes(RedisNameNew, key); err == nil && bytes != nil {
+		var rData []map[string]interface{}
+		if err1 := json.Unmarshal(*bytes, &rData); err1 == nil {
+			return rData
+		}
+	}
+	return nil
+}
+
 // 获取权重最低的字段
 func getLowestField(subtype string) string {
 	fields := util.ObjToMap(config.Sysconfig["recoveryField"])

+ 137 - 86
src/jfw/front/tags.go

@@ -1,6 +1,7 @@
 package front
 
 import (
+	"context"
 	"fmt"
 	"jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
@@ -24,6 +25,8 @@ import (
 	"app.yhyue.com/moapp/jypkg/public"
 )
 
+const cacheTime = 60 * 60 * 8
+
 // 剑鱼标签页
 type Tags struct {
 	*xweb.Action
@@ -34,8 +37,32 @@ type Tags struct {
 var LetterArr = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
 var bidField = `"_id","site","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname","detail"`
 
+var seoBidField = `"_id","title","publishtime","subtype","area","href","bidamount","budget","s_subscopeclass","projectname"`
+
+type reqLimit struct {
+	doPool   chan struct{}
+	waitPool chan struct{}
+}
+
+var reqLimitInit *reqLimit
+
 func init() {
 	xweb.AddAction(&Tags{})
+	do := qu.IntAll(config.Sysconfig["executionNum"])
+	wait := qu.IntAll(config.Sysconfig["awaitNum"])
+	//创建执行池 等待池
+	doPool := make(chan struct{}, do)
+	for i := 0; i < do; i++ {
+		doPool <- struct{}{}
+	}
+	waitPool := make(chan struct{}, wait)
+	for i := 0; i < wait; i++ {
+		waitPool <- struct{}{}
+	}
+	reqLimitInit = &reqLimit{
+		doPool:   doPool,
+		waitPool: waitPool,
+	}
 }
 
 /*
@@ -161,6 +188,7 @@ func (this *Tags) Index(types, name string) {
 		}
 	//行业_地区_信息类型
 	case "industry":
+		//areaHref = fmt.Sprintf("/tags/industry/all_%s_all.html", "%v")
 		if len(info) > 3 {
 			checkedKeywords, checkedIndustry, checkedIndustry_2 = this.GetInsturyKeywords(info[3])
 			crumbsNav2 = map[string]interface{}{
@@ -176,6 +204,8 @@ func (this *Tags) Index(types, name string) {
 			haveList = false
 			areaHref = fmt.Sprintf("/tags/industry/%s_%s_all.html", info[0], "%v")
 			industryHref = fmt.Sprintf("/tags/industry/%s_%s_all_%s.html", "%v", checkedArea, "%v")
+			//行业标签获取
+			this.T["industryList"] = this.GetIndustry(industryHref) //需要根据地区获取不同的标的物
 		}
 		crumbsNav1 = map[string]interface{}{
 			"name": fmt.Sprintf("招标行业分类"),
@@ -185,8 +215,6 @@ func (this *Tags) Index(types, name string) {
 	//地区标签获取
 	this.T["areaList"] = this.GetArea(areaHref)
 
-	//行业标签获取
-	this.T["industryList"] = this.GetIndustry(industryHref)
 	//标的物标签获取
 
 	//字母表获取
@@ -230,7 +258,7 @@ func (this *Tags) Index(types, name string) {
 		"infoType": fmt.Sprintf(stypeHref, "all"),
 	}
 	//TDK
-	this.T["tdk"] = this.GetTDK(haveList, types, checkedKeywords, pageNum, checkedLetter, qu.ObjToString(this.T["area"])+checkedKeywords+infotypeStr, qu.ObjToString(this.T["area"])+checkedKeywords+infotypeStr, checkedKeywords)
+	this.T["tdk"] = this.GetTDK(haveList, types, checkedKeywords, pageNum, checkedLetter, qu.ObjToString(this.T["area"])+checkedKeywords, qu.ObjToString(this.T["area"])+checkedKeywords+infotypeStr, checkedKeywords, filterInfoType)
 	if haveList {
 		//信息类型
 		isLimit := false
@@ -310,13 +338,13 @@ func (this *Tags) GetSEOArea() (provinceArr, cityArr, districtArr []string, name
 	codeArr = map[int64][]int64{}   //code 及 pcode的从属关系
 	data := []map[string]interface{}{}
 	rediskey := fmt.Sprintf("pcseo_area")
-	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		data = qu.ObjArrToMapArr(l)
 	} else {
 		list := public.BaseMysql.SelectBySql(`select name,code,level,pcode from seo_words.seo_area order by code`)
 		//获取组合成必要参数
 		if list != nil && len(*list) > 0 {
-			redis.Put("other", rediskey, *list, 2*60*60)
+			redis.Put("seoCache", rediskey, *list, cacheTime)
 			data = *list
 		}
 	}
@@ -384,10 +412,10 @@ func (this *Tags) GetkeysMap() []map[string][]map[string]interface{} {
 
 func (this *Tags) GetIndustry(industryHref string) interface{} {
 	rediskey := fmt.Sprintf("pcindex_getIndustry_%s", industryHref)
-	if l := redis.Get("other", rediskey); l != nil {
+	if l := redis.Get("seoCache", rediskey); l != nil {
 		return l
 	} else {
-		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a left join  seo_words.seo_industry_class b on a.class_1=b.name order by a.class_1`)
+		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
 		industryArr := []string{}
 		industryMap := map[string][]map[string]interface{}{}
 		if len(*data) > 0 && data != nil {
@@ -413,10 +441,9 @@ func (this *Tags) GetIndustry(industryHref string) interface{} {
 				v: industryMap[v],
 			})
 		}
-		redis.Put("other", rediskey, m, 2*60)
+		redis.Put("seoCache", rediskey, m, cacheTime)
 		return m
 	}
-	return nil
 }
 
 // 判断字符串是否再数组str内
@@ -432,10 +459,10 @@ func IsInArr(arr []string, s string) bool {
 // 获取最新招标信息
 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 {
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		list = qu.ObjArrToMapArr(l)
 	} else {
-		_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 50, "")
+		_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "拟建,招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 50, "")
 		if lists != nil && len(*lists) > 10 {
 			*lists = (*lists)[0:10]
 			for _, v := range *lists {
@@ -452,7 +479,7 @@ func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
 				}
 			}
 			list = *lists
-			redis.Put("other", rediskey, list, 2*60*60)
+			redis.Put("seoCache", rediskey, list, cacheTime)
 		}
 	}
 	return list
@@ -461,11 +488,11 @@ func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
 // 获取信息类型相关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 {
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		list = qu.ObjArrToMapArr(l)
 	} else {
 		m := []map[string]interface{}{}
-		data := public.BaseMysql.SelectBySql(`select id,name,pid from seo_words.seo_stype where name !="拟建项目" order by id`)
+		data := public.BaseMysql.SelectBySql(`select id,name,pid from seo_words.seo_stype where name !="拟建项目" and name != "采购意向" and pid=0 order by id`)
 		codeMap := map[int64][]int64{}
 		level1 := []int64{}
 		nameToCode := map[string]int64{}
@@ -498,7 +525,7 @@ func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 			}
 		}
 		list = m
-		redis.Put("other", rediskey, list, 2*60)
+		redis.Put("seoCache", rediskey, list, cacheTime)
 	}
 	return list
 }
@@ -506,7 +533,7 @@ func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 // 剑鱼博客
 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 {
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		list = qu.ObjArrToMapArr(l)
 	} else {
 
@@ -521,7 +548,7 @@ func (this *Tags) GetConsult() (list []map[string]interface{}) {
 				v["url"] = fmt.Sprintf("/jyblog/%s.html", qu.ObjToString(v["_id"]))
 			}
 			list = *rs
-			redis.Put("other", rediskey, list, 2*60*60)
+			redis.Put("seoCache", rediskey, list, cacheTime)
 		}
 	}
 	return list
@@ -529,8 +556,8 @@ func (this *Tags) GetConsult() (list []map[string]interface{}) {
 
 func (this *Tags) GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interface{}, int64) {
 	m := []map[string]interface{}{}
-	sql := `select id,name,letter from seo_words.seo_resource where letter = ? order by id desc`
-	cql := `select count(1) from seo_words.seo_resource where letter = ?`
+	sql := `select id,name,letter from seo_words.seo_resource where letter = ? and state=1 order by id desc`
+	cql := `select count(1) from seo_words.seo_resource where letter = ? and state=1 `
 	offset := (pageNum - 1) * pageSize
 	sql += fmt.Sprintf(" limit %v,%v", offset, pageSize)
 	data := public.BaseMysql.SelectBySql(sql, letter)
@@ -552,12 +579,12 @@ func (this *Tags) GetLetterMap(pageSize, pageNum int64, letter string) ([]map[st
 
 func (this *Tags) GetHotLabel(length int64) []map[string]interface{} {
 	rediskey := fmt.Sprintf("pcseo_getHotLabel_%v", length)
-	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
 		return qu.ObjArrToMapArr(l)
 	} else {
 		m := []map[string]interface{}{}
-		sql := `select id,name,letter from seo_words.seo_resource`
-		cql := `select count(1) from seo_words.seo_resource `
+		sql := `select id,name,letter from seo_words.seo_resource where state=1`
+		cql := `select count(1) from seo_words.seo_resource where state=1`
 		count := public.BaseMysql.CountBySql(cql)
 		rand.Seed(time.Now().UnixNano())
 		offset := rand.Intn(int(count / length))
@@ -575,7 +602,7 @@ func (this *Tags) GetHotLabel(length int64) []map[string]interface{} {
 				})
 			}
 		}
-		redis.Put("other", rediskey, m, 60)
+		redis.Put("seoCache", rediskey, m, cacheTime)
 		return m
 	}
 	return nil
@@ -597,80 +624,83 @@ func GetBiddingPlatformType() (nameToCode map[string]int64, codeToName map[int64
 	return
 }
 
+// -2 等待池已满
+// -1 超时
+// 1:可以执行查询
+func (r *reqLimit) Limit(ctx context.Context) int {
+	ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
+	defer cancel()
+	select {
+	case <-r.waitPool:
+		defer func() {
+			r.waitPool <- struct{}{}
+		}()
+		select {
+		case <-r.doPool:
+			return 1
+		case <-ctx.Done(): //超时
+			return -1
+		}
+	default:
+		return -2
+	}
+}
+
+func (r *reqLimit) Release() {
+	r.doPool <- struct{}{}
+}
+
+// GetBidding
+// 金额限制在"1000"~"100000000";需求因es压力过大,只返回60%的数据
 func (this *Tags) GetBidding(industry, area, city, stype, keyword string, request *http.Request, responseWriter http.ResponseWriter, session *httpsession.Session) ([]map[string]interface{}, int64, bool) {
 	rediskey := fmt.Sprintf("pcseo_getbidding_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
 	rediskeyCount := fmt.Sprintf("pcseo_getbidding_count_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
 
-	if l, ok := redis.Get("other", rediskey).([]interface{}); ok && l != nil {
-		count := redis.GetInt("other", rediskeyCount)
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil {
+		count := redis.GetInt("seoCache", rediskeyCount)
 		return qu.ObjArrToMapArr(l), int64(count), false
 	} else {
 		if area != "" || stype != "" || industry != "" || city != "" || keyword != "" {
+			if flag := reqLimitInit.Limit(context.Background()); flag == 1 {
+				defer reqLimitInit.Release()
+			} else {
+				if flag == -2 {
+					log.Println("等待队列已满")
+				} else if flag == -1 {
+					log.Println("等待超时")
+				}
+				return nil, 0, true
+			}
+
 			if public.Lst.IsLimited(request, responseWriter, session, false) == 1 { //没有被限制
 				defer public.Lst.Limit()
 			} else {
 				return nil, 0, true
 			}
-			//
-			query1 := `{"query": {"bool": {"must":[`
-			query_start := `{"query": {"bool": {"must":[`
-			if area != "" {
-				query1 += `{"term":{"area":"` + area + `"}}`
-			}
-			if stype != "" {
-				if query1 != query_start {
-					query1 += ","
-				}
-				stype = getstype(stype)
-				query1 += `{"terms":{"subtype":[`
-				for k, v := range strings.Split(stype, ",") {
-					if k > 0 {
-						query1 += `,`
-					}
-					query1 += `"` + v + `"`
-				}
-				query1 += `]}}`
-			}
-			if industry != "" {
-				if query1 != query_start {
-					query1 += ","
-				}
-				query1 += `{"term":{"s_subscopeclass":"` + industry + `"}}`
-			}
-			if city != "" {
-				if query1 != query_start {
-					query1 += ","
-				}
-				query1 += `{"term":{"city":"` + city + `"}}`
-			}
-			if keyword != "" {
-				if query1 != query_start {
-					query1 += ","
-				}
-				query1 += `{ "bool": {"must": [ { "multi_match": { "query": "` + keyword + `","type": "phrase", "fields": [ "title","detail" ]}}]}}`
-			}
-			query1 += `],"should": [],"minimum_should_match": 0}}}`
-			log.Println("~~~query1:", query1)
-			query := getLastNewsQuery(area, "", stype, industry, city)
+			now := time.Now()
+			starttime := fmt.Sprint(time.Date(now.Year()-1, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+			endtime := fmt.Sprint(now.Unix())
 			var datas *[]map[string]interface{}
 			var startPage int
+			var count int64
 			currentPage := 5
-			limitcount := qu.IntAllDef(config.Seoconfig["tagsLimitCount"], 50)
-			count := elastic.Count(INDEX, TYPE, query1)
+			limitCount := qu.IntAllDef(config.Seoconfig["tagsLimitCount"], 50)
 			if keyword == "" {
-				r := rand.New(rand.NewSource(time.Now().UnixNano()))
-				startPage = r.Intn(currentPage * limitcount)
+				query := bidsearch.GetSearchQuery("", industry, "0.1", "1000", "", "", "", "", bidsearch.GetBidSearchQuery(area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, "", ""), "", false, seoBidField)
+				count = elastic.Count(INDEX, TYPE, query)
+				if count == 0 {
+					return nil, 0, false
+				}
+				startPage = rand.New(rand.NewSource(time.Now().UnixNano())).Intn(currentPage * limitCount)
 				count1 := qu.IntAll(count)
 				if count1 < startPage || startPage < 0 {
 					startPage = 0
 				}
-				datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, bidField, startPage, limitcount)
+				datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, seoBidField, startPage, limitCount)
 			} else {
-				log.Println(keyword, area, city, industry)
-				_, _, datas = bidsearch.GetPcBidSearchData(keyword, area, city, "", stype, industry, "", "", "", "", "", "", "", 0, true, []string{"title", "detail"}, bidField, "", false, false, "", limitcount, "")
-
-				if datas != nil && len(*datas) > limitcount {
-					*datas = (*datas)[0:limitcount]
+				count, _, datas = bidsearch.GetPcBidSearchData(keyword, area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, industry, "0.1", "1000", "", "", "", "", "", 0, true, []string{"title", "detail", "purchasing"}, seoBidField, "", false, false, "", limitCount, "")
+				if datas != nil && len(*datas) > limitCount {
+					*datas = (*datas)[0:limitCount]
 				}
 			}
 			if datas != nil && len(*datas) > 0 {
@@ -690,8 +720,8 @@ func (this *Tags) GetBidding(industry, area, city, stype, keyword string, reques
 					industry = strings.Split(industry, "_")[0]
 				}
 				public.BidListConvert(industry, datas)
-				redis.Put("other", rediskey, datas, 2*60)
-				redis.Put("other", rediskeyCount, count, 2*60)
+				redis.Put("seoCache", rediskey, datas, cacheTime)      //生产环境配置4G单独redis,超出4G自动清除
+				redis.Put("seoCache", rediskeyCount, count, cacheTime) //生产环境配置4G单独redis,超出4G自动清除
 				return *datas, count, false
 			}
 		}
@@ -726,9 +756,11 @@ func (this *Tags) GetInsturyKeywords(idstr string) (name, class_1, class_2 strin
 }
 
 // 获取信息类型 【全部是虚假的全部、实则是不包含拟建和采购意向的全部】
+// p353包含采购意向与拟建
 func (this *Tags) GetInfoType(idstr string) (string, string) {
 	if idstr == "all" {
-		return "招标,邀标,询价,竞谈,单一,竞价,变更,中标,成交,废标,流标,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果", ""
+		return "拟建,招标,邀标,询价,竞谈,单一,竞价,变更,中标,成交,废标,流标,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果", ""
+		//return "", ""
 	}
 	id, _ := strconv.Atoi(idstr)
 	data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_stype where id =?`, id)
@@ -762,7 +794,7 @@ func (this *Tags) GetLetterPaging(pageNum int, checkedLetter string) (letterList
 
 // 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{} {
+func (this *Tags) GetTDK(isDetails bool, stype string, keywords string, pagenum int, letter string, industryWord string, areaWord, letterWord, infoType string) map[string]interface{} {
 	title, keywordsContent, descriptionContent := "", "", ""
 	if !isDetails {
 		//汇总页
@@ -790,13 +822,32 @@ func (this *Tags) GetTDK(isDetails bool, stype string, keywords string, pagenum
 			keywordsContent = fmt.Sprintf("%s,%s招标,%s采购", areaWord, areaWord, areaWord)
 			descriptionContent = fmt.Sprintf("提供%s全部招标采购信息,登录后可以免费查看,涵盖%s拟建项目、采购意向、招标公告,中标结果等招投标信息。%s为您提供专业全面的招投标服务!", areaWord, areaWord, areaWord)
 		} else if stype == "industry" {
-			title = fmt.Sprintf("%s招标采购-%s招标信息-中标公告-剑鱼标讯", industryWord, industryWord)
-			keywordsContent = fmt.Sprintf("%s招标,%s采购,%s中标,%s招标采购信息", industryWord, industryWord, industryWord, industryWord)
-			descriptionContent = fmt.Sprintf("剑鱼标讯是%s招标采购的优质信息平台,免费提供全国%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,选择优质%s招标信息网站,就用剑鱼标讯。", industryWord, industryWord, industryWord, industryWord)
+			if infoType == "招标预告" {
+				title = fmt.Sprintf("%s免费招标预告_%s采购信息预告-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标预告,%s招投标预告,%s采购预告", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息预告专栏,免费提供%s招标采购预告信息,寻找优质免费%s招标预告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标公告" {
+				title = fmt.Sprintf("%s免费招标公告_%s采购信息公告-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标公告,%s招投标公告,%s采购公告", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息公告专栏,免费提供%s招标采购公告信息,寻找优质免费%s招标公告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标结果" {
+				title = fmt.Sprintf("%s免费招标结果_%s采购信息结果-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标结果,%s招投标结果,%s采购结果", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标结果专栏,免费提供%s招标采购结果内容,寻找优质免费%s招标结果信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标信用信息" {
+				title = fmt.Sprintf("%s招标采购信用信息查询网-剑鱼标讯", industryWord)
+				keywordsContent = fmt.Sprintf("%s招标信用,%s投标信用,%s采购信用查询", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息查询专栏,免费提供%s招标信息查询内容,寻找优质免费%s招标信用查询网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else {
+				title = fmt.Sprintf("%s免费招标信息_%s采购服务平台-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", industryWord, industryWord, industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord, industryWord, industryWord)
+			}
+
 		} else if stype == "letter" {
-			title = fmt.Sprintf("%s招标采购-%s招标信息-中标公告-剑鱼标讯", letterWord, letterWord)
-			keywordsContent = fmt.Sprintf("%s招标,%s采购,%s中标,%s招标采购信息", letterWord, letterWord, letterWord, letterWord)
-			descriptionContent = fmt.Sprintf("剑鱼标讯是%s招标采购的优质信息平台,免费提供全国%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,选择优质%s招标信息网站,就用剑鱼标讯。", letterWord, letterWord, letterWord, letterWord)
+			title = fmt.Sprintf("%s免费招标信息_%s采购平台-剑鱼标讯", letterWord, letterWord)
+			keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", letterWord, letterWord, letterWord, letterWord, letterWord)
+			descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供全国%s招标采购信息、招标公告、中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", letterWord, letterWord, letterWord, letterWord, letterWord)
 		}
 	}
 	return map[string]interface{}{

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

@@ -28,6 +28,8 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/datasmt"),
 	regexp.MustCompile("^/jyapp/big/page/unit_portrayal"),
 	regexp.MustCompile("^/jyapp/big/page/free_high_set"),
+	regexp.MustCompile("^/jyapp/big/page/ent_portrait$"),
+	regexp.MustCompile("^/jyapp/big/page/ent_portrait_change$"),
 }
 
 type loginFilter struct {

+ 53 - 44
src/jfw/modules/app/src/app/front/login.go

@@ -56,6 +56,7 @@ type Login struct {
 	afterPageLoadToCheck xweb.Mapper `xweb:"/jyapp/free/afterPageLoadToCheck"` //检测
 	channelSign          xweb.Mapper `xweb:"/jyapp/free/channelSign"`          //渠道统计
 	savePushIdMsg        xweb.Mapper `xweb:"/jyapp/free/savePushIdMsg"`        //推送id记录
+	setPwd               xweb.Mapper `xweb:"/jyapp/free/setPwd"`               //修改密码
 }
 
 var (
@@ -114,11 +115,15 @@ func (l *Login) Login() error {
 				return -1
 			}
 			query := map[string]interface{}{
-				"i_appid":    2,
-				"s_phone":    phone,
+				"i_appid": 2,
+				"$or": []map[string]interface{}{
+					{"s_phone": phone},
+					{"s_m_phone": phone},
+				},
 				"s_password": qutil.GetMd5String(password),
 			}
-			user, ok := mongodb.FindOne("user", query)
+			// user, ok := mongodb.FindOne("user", query)
+			user, ok := mongodb.Find("user", query, `{"s_phone":-1}`, `{"_id":1,"s_password":1}`, false, 0, 1)
 			//登录成功
 			if ok && user != nil && len(*user) > 0 {
 				rid := l.GetString("rid")
@@ -126,7 +131,7 @@ func (l *Login) Login() error {
 				channel := l.GetString("channel")
 				deviceId := l.GetString("deviceId")
 				phoneType := l.GetString("phoneType")
-				returnSign = afterLogin(*user, l.Session(), rid, oid, phoneType, channel, deviceId, false, l.ResponseWriter)
+				returnSign = afterLogin((*user)[0], l.Session(), rid, oid, phoneType, channel, deviceId, false, l.ResponseWriter)
 				return 1
 			}
 			return -1 //用户名或密码不正确
@@ -213,24 +218,18 @@ func (l *Login) Login() error {
 						data["s_email"] = email
 					}
 					data["s_regsource"] = isAndroidOrIOS(l.Header("User-Agent"))
+
+					if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
+						Appid: "10000",
+						Phone: phone,
+					}); resp != nil && resp.Data.Id > 0 {
+						data["base_user_id"] = resp.Data.Id
+					} else {
+						log.Println(phone, "调用usercenter失败")
+						return -4
+					}
 					_id := mongodb.Save("user", data)
 					if _id != "" {
-						//用户中台同步
-						func(userid string) {
-							// formdata := map[string]interface{}{
-							// 	"appid": "10000",
-							// 	"phone": phone,
-							// }
-							// ck, _ := l.GetCookie("SESSIONID")
-							// usercenter.AddBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), userid, formdata, ck)
-
-							if ok := jy.AddUser(mongodb, userid, pb.UserAddReq{
-								Appid: "10000",
-								Phone: phone,
-							}, *config.Middleground); !ok {
-								log.Println("usercenter add error", userid, phone)
-							}
-						}(_id)
 						jy.ClearPhoneIdentSession(l.Session())
 						returnSign = afterLogin(data, l.Session(), rid, oid, phoneType, channel, deviceId, true, l.ResponseWriter)
 						addr, _ := config.Sysconfig["nsq"].(string)
@@ -258,6 +257,22 @@ func (l *Login) Login() error {
 						return 1
 					}
 				} else {
+					//以s_m_phone登录的 需要把s_m_phone转化为s_phone
+					updataMap := map[string]interface{}{}
+					if user["s_m_phone"] != nil {
+						updataMap["s_phone"] = phone
+					}
+					//注册邮箱
+					email := l.GetString("email")
+					if jy.IsEmail(email) {
+						updataMap["s_email"] = email
+					}
+					if len(updataMap) > 0 {
+						mongodb.UpdateById("user", BsonIdToSId(user["_id"]), map[string]interface{}{
+							"$set":   updataMap,
+							"$unset": map[string]interface{}{"s_m_phone": ""},
+						})
+					}
 					jy.ClearPhoneIdentSession(l.Session())
 					returnSign = afterLogin(user, l.Session(), rid, oid, phoneType, channel, deviceId, false, l.ResponseWriter)
 					return 1
@@ -623,8 +638,6 @@ func (l *Login) WxLogin() {
 			})
 			func(userid string) {
 				// //用户中台同步
-				// ck, _ := l.GetCookie("SESSIONID")
-				// usercenter.UpdateBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), BsonIdToSId((*user)["_id"]), ck)
 				if uinfo := jy.GetInfoForBaseUser(mongodb, userid); uinfo != nil {
 					jy.UpdateUser(mongodb, userid, *uinfo, *config.Middleground)
 				}
@@ -664,29 +677,21 @@ func (l *Login) WxLogin() {
 				newUser["s_email"] = email
 			}
 			newUser["s_regsource"] = isAndroidOrIOS(l.Header("User-Agent")) //用户注册终端 ios 安卓 pc
+			nickname := qutil.ObjToString(qutil.If(u.Nickname == "", newUser["s_jyname"], u.Nickname))
+			if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
+				Appid:    "10000",
+				Nickname: nickname,
+				Headimg:  u.HeadImageUrl,
+				AOpenid:  u.OpenId,
+				Unionid:  u.UnionId,
+			}); resp != nil && resp.Data.Id > 0 {
+				newUser["base_user_id"] = resp.Data.Id
+			} else {
+				log.Println(u.UnionId, "调用usercenter失败")
+				return 0
+			}
+
 			if _id := mongodb.Save("user", newUser); _id != "" {
-				//用户中台同步
-				func(userid string) {
-					// formdata := map[string]interface{}{
-					// 	"appid":    "10000",
-					// 	"nickname": qutil.If(u.Nickname == "", newUser["s_jyname"], u.Nickname),
-					// 	"headimg":  u.HeadImageUrl,
-					// 	"a_openid": u.OpenId,
-					// 	"unionid":  u.UnionId,
-					// }
-					// ck, _ := l.GetCookie("SESSIONID")
-					// usercenter.AddBaseUser(mongodb, qutil.ObjToString(config.Sysconfig["userCenterApi"]), userid, formdata, ck)
-					nickname := qutil.ObjToString(qutil.If(u.Nickname == "", newUser["s_jyname"], u.Nickname))
-					if ok := jy.AddUser(mongodb, userid, pb.UserAddReq{
-						Appid:    "10000",
-						Nickname: nickname,
-						Headimg:  u.HeadImageUrl,
-						AOpenid:  u.OpenId,
-						Unionid:  u.UnionId,
-					}, *config.Middleground); !ok {
-						log.Println("usercenter add error", userid)
-					}
-				}(_id)
 				returnSign = afterLogin(newUser, l.Session(), rid, oid, phoneType, channel, deviceId, true, l.ResponseWriter)
 				if disWord != "" {
 					redisDis := redis.GetStr("other", "DIS_"+disWord[1:])
@@ -944,6 +949,10 @@ func (l *Login) Brand() {
 	})
 }
 
+func (l *Login) SetPwd() {
+	l.Render("/me/setpwd.html")
+}
+
 /**********************************************************************
 ***********************************************************************
 ***********************************************************************/

+ 90 - 93
src/jfw/modules/app/src/app/front/shorturl.go

@@ -74,8 +74,7 @@ func (s *Short) Article(stype, id string) error {
 	disWord := s.GetString("disWord")
 	userPower := jy.GetBigVipUserBaseMsg(s.Session(), *config.Middleground)
 	var (
-		belongUserId, email string
-
+		belongUserId, email                                                string
 		isEntnicheNew, isOldVip, isVip, isMember, isEntniche, isEntService bool
 	)
 	//userId = "637dcf3ff143ed326e9e1589"
@@ -86,13 +85,15 @@ func (s *Short) Article(stype, id string) error {
 		if b {
 			return s.Redirect("/jyapp/free/mob/err")
 		}
-		isEntnicheNew = userPower.EntIsNew                                                          //新版超级订阅
-		isOldVip = false                                                                            //新购超级订阅不能查看拟建项目详情页
-		isVip = userPower.VipStatus > 0                                                             //超级订阅
-		isMember = userPower.Status > 0                                                             //大会员
-		isEntniche = userPower.EntnicheStatus > 0                                                   //商机管理
-		email = userPower.Email                                                                     //用户邮箱
-		isEntService = userPower.Data.Ent.PowerSource > 0 && userPower.Data.Entniche.IsEntPower > 0 //商机管理服务
+		isEntnicheNew = userPower.EntIsNew        //新版超级订阅
+		isOldVip = false                          //新购超级订阅不能查看拟建项目详情页
+		isVip = userPower.VipStatus > 0           //超级订阅
+		isMember = userPower.Status > 0           //大会员
+		isEntniche = userPower.EntnicheStatus > 0 //商机管理
+		email = userPower.Email
+		if userPower.Data != nil && userPower.Data.Ent != nil && userPower.Data.Entniche != nil {
+			isEntService = userPower.Data.Ent.PowerSource > 0 && userPower.Data.Entniche.IsEntPower > 0 //商机管理服务
+		} //用户邮箱
 		_, isOldVip, _, _, _ = UserPermission(userId)
 		entId := util.IntAll(s.GetSession("entId"))
 		if entId > 0 && userPower.EntInfo[entId] != nil {
@@ -127,6 +128,9 @@ func (s *Short) Article(stype, id string) error {
 	var canRead bool
 	obj = wxvisitD(sid, userId, (isVip && isOldVip) || isEntniche || isMember)
 	if len(obj) > 0 {
+		if userId == "" && util.ObjToString(obj["subtype"]) == "采购意向" {
+			return s.Redirect("/jyapp/free/login")
+		}
 		if userId != "" {
 			if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
 				((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) { //新超级订阅非采购意向”和“拟建项目”
@@ -187,11 +191,7 @@ func (s *Short) Article(stype, id string) error {
 			}
 			s.T["canRead"] = canRead
 		}
-		if userId == "" {
-			canRead = true
-			s.T["canRead"] = canRead
-		}
-		if canRead {
+		if canRead || userId == "" || util.ObjToString(obj["subtype"]) == "拟建" {
 			if belongUserId != "" && belongUserId != userId && util.ObjToString(obj["subtype"]) != "拟建" && userId != "" { //分享开打的
 				article_id := encrypt.CommonDecodeArticle(stype, id)[0]
 				key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, belongUserId, userId)
@@ -268,9 +268,13 @@ func (s *Short) Article(stype, id string) error {
 					obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
 				}
 			}
-			if userId == "" {
+			if !canRead && util.ObjToString(obj["subtype"]) == "拟建" { //登录拟建&采购不展示遮罩 只打码
+				otherFilter(obj, userId != "")
+				//s.T["canRead"] = true
+			} else if userId == "" {
 				obj = Filter(obj)
 				obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
+				s.T["canRead"] = true
 			}
 			if obj["l_publishtime"] != nil {
 				obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["l_publishtime"]), 0).Format(date.Date_Short_Layout)
@@ -307,66 +311,6 @@ func (s *Short) Article(stype, id string) error {
 	return s.Redirect("/jyapp/free/mob/err")
 }
 
-func NoLoginArticle(stype, sid string) map[string]interface{} {
-	obj := make(map[string]interface{})
-	catchKey := fmt.Sprintf("jypcdetail_nologin_app_%s_%s", stype, sid)
-	//if res := redis.Get("other", catchKey); res != nil && res != "" {
-	//	if data := util.ObjToMap(res); data != nil {
-	//		obj = *data
-	//		return obj
-	//	}
-	//}
-	obj = wxvisitD(sid, "", false)
-	if len(obj) > 0 {
-		if obj["entidlist"] != nil { //大会员中标企业跳转至画像
-			entIdArr, winnerMap := []string{}, map[string]interface{}{}
-			eidList, _ := obj["entidlist"].([]interface{})
-			swinnerArr := strings.Split(util.ObjToString(obj["s_winner"]), ",")
-			//先查询entlist 如果长度和s_winner不一致 根据企业名称查询id
-			if len(eidList) != len(swinnerArr) {
-				for _, v := range swinnerArr {
-					winnerMap[v] = ""
-					//临时更改为企业名称查询企业id
-					rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"should":[{"term":{"company_name":"%s"}},{"term":{"hname":"%s"}}],"minimum_should_match":1}},"_source":["name","_id","capital","company_phone"],"size":1}`, v, v))
-					if rData != nil && len(*rData) == 1 {
-						if entId := util.ObjToString((*rData)[0]["_id"]); entId != "" {
-							entIdArr = append(entIdArr, encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"])))
-							winnerMap[v] = encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"]))
-						}
-					}
-				}
-			} else {
-				for k, v := range eidList {
-					vstr := util.ObjToString(v)
-					if vstr == "-" {
-						continue
-					}
-					winnerMap[swinnerArr[k]] = encrypt.EncodeArticleId2ByCheck(vstr)
-				}
-			}
-			obj["entId"] = entIdArr
-			obj["winnerMap"] = winnerMap
-		}
-		//判断是否公开联系人信息
-		if util.Int64All(obj["buyerhint"]) == 2 {
-			obj["buyerperson"] = ""
-			obj["buyertel"] = ""
-		}
-		if obj["l_publishtime"] != nil {
-			obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["l_publishtime"]), 0).Format(date.Date_Short_Layout)
-		}
-		obj["winnerTitle"] = obj["winner"]
-		obj["buyerTitle"] = obj["buyer"]
-		obj["projectnameTitle"] = obj["projectname"]
-		obj["projectcodeTitle"] = obj["projectcode"]
-		obj["keywords"] = KeyWordHandle(obj)
-		obj["description"] = DescriptionHandle("nologin", obj)
-		obj = Filter(obj)
-		redis.Put("other", catchKey, obj, 60*2)
-	}
-	return obj
-}
-
 // 未登录用户进行数据过滤
 func Filter(obj map[string]interface{}) map[string]interface{} {
 	detail := fmt.Sprint(obj["detail"])
@@ -374,28 +318,23 @@ func Filter(obj map[string]interface{}) map[string]interface{} {
 	mosaicText := fmt.Sprintf(`<span style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
 	detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
 	detailNeedMosaic, _ := config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-	//for k, _ := range obj {
-	//	if ok, _ := detailNeedMosaic[k].(bool); ok {
-	//		if util.ObjToString(obj[k]) != "" {
-	//			detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), detailText)
-	//		}
-	//		//中标企业信息
-	//		if k == "winnerMap" && obj[k] != nil {
-	//			winnerNewMap := map[string]interface{}{}
-	//			winnerMap := util.ObjToMap(obj[k])
-	//			for _, wv := range *winnerMap {
-	//				winnerNewMap[mosaicText] = wv
-	//			}
-	//			obj[k] = winnerNewMap
-	//		} else {
-	//			obj[k] = mosaicText
-	//		}
-	//	}
-	//}
 	for dk, dv := range detailNeedMosaic {
 		if !dv.(bool) {
 			continue
 		}
+		if obj["package"] != nil {
+			pk := util.ObjToMap(obj["package"])
+			for _, pv := range *pk {
+				if pv != nil {
+					if page := util.ObjToMap(pv); page != nil {
+						if (*page)[dk] != nil {
+							(*page)[dk] = mosaicText
+						}
+						delete(*page, "text")
+					}
+				}
+			}
+		}
 		//if util.ObjToString(obj[dk]) != "" {
 		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
 		//}
@@ -426,6 +365,64 @@ func Filter(obj map[string]interface{}) map[string]interface{} {
 	return obj
 }
 
+// 拟建采购意向用户进行数据过滤 name 配置文件
+func otherFilter(obj map[string]interface{}, isLogin bool) map[string]interface{} {
+	txt := util.If(isLogin, "解锁会员查看", "登陆后解锁会员查看").(string)
+	detail := fmt.Sprint(obj["detail"])
+	mosaicText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	detailText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	var (
+		projectinfo map[string]interface{}
+	)
+	var otherMosaic map[string]interface{}
+	if obj["subtype"] == "拟建" {
+		otherMosaic, _ = config.Sysconfig["planBuildMosaic"].(map[string]interface{})
+		projectinfo, _ = obj["projectinfo"].(map[string]interface{}) //1.项目信息打码处理
+	} else if obj["subtype"] == "采购意向" {
+		otherMosaic, _ = config.Sysconfig["purchaseMosaic"].(map[string]interface{})
+		procurementlist, _ := obj["procurementlist"].([]interface{})
+		for _, vs := range procurementlist { //1.采购意向清单数据集打码处理
+			vsMap, _ := vs.(map[string]interface{})
+			for _, vsq := range vsMap {
+				if vs1, ok := vsq.(string); ok && vs1 != "" {
+					detail = strings.ReplaceAll(detail, util.InterfaceToStr(vsq), detailText)
+				}
+			}
+		}
+		delete(obj, "procurementlist")
+	}
+
+	for dk, dv := range otherMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		if vs, ok := projectinfo[dk]; ok && vs != nil && vs != "" {
+			detail = strings.ReplaceAll(detail, util.InterfaceToStr(vs), detailText)
+			projectinfo[dk] = mosaicText
+		}
+		if vs, ok := obj[dk]; ok && vs != nil && vs != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
+			}
+		}
+		obj[dk] = mosaicText
+	}
+	if obj["subtype"] == "拟建" {
+		for k := range projectinfo {
+			if _, ok := otherMosaic[k]; !ok {
+				delete(projectinfo, k)
+			}
+		}
+		obj["projectinfo"] = projectinfo
+	}
+	obj["detail"] = detail
+	return obj
+}
+
 func ReplaceStringByRegex(str, rule, replace string) (string, error) {
 	reg, err := regexp.Compile(rule)
 	if reg == nil || err != nil {

+ 1 - 1
src/jfw/modules/app/src/app/front/swordfish.go

@@ -525,7 +525,7 @@ func wxvisitD(sid, userId string, isPayUser bool) (objdata map[string]interface{
 		if ok && obj != nil && len(obj) >= 3 {
 			if !isPayUser && (util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向") {
 				for k, _ := range obj {
-					if k != "title" && k != "area" && k != "subtype" && k != "toptype" && k != "publishtime" && k != "budget" && k != "bidamount" && k != "site" && k != "spidercode" && k != "recommended_service" &&
+					if k != "title" && k != "area" && k != "subtype" && k != "detail" && k != "procurementlist" && k != "toptype" && k != "publishtime" && k != "budget" && k != "bidamount" && k != "site" && k != "spidercode" && k != "recommended_service" && k != "projectinfo" &&
 						k != "owner" && k != "total_investment" && k != "projectaddr" && k != "projectperiod" && k != "approvedept" && k != "approvecontent" && k != "approvecode" && k != "approvenumber" && k != "approvetime" && k != "approvestatus" && k != "project_scale" && k != "projectname" {
 						delete(obj, k)
 					}

+ 2 - 1
src/jfw/modules/app/src/app/tag/msg.go

@@ -3,10 +3,11 @@ package tag
 import (
 	"html/template"
 	"jy/src/jfw/modules/app/src/jfw/config"
-	util "app.yhyue.com/moapp/jybase/common"
 	"strconv"
 	"strings"
 	"time"
+
+	util "app.yhyue.com/moapp/jybase/common"
 )
 
 // Msg 从json配置文件中读取值

+ 21 - 1
src/jfw/modules/app/src/config.json

@@ -231,5 +231,25 @@
   "detail_element": [
     "table",
     "div"
-  ]
+  ],
+  "purchaseMosaic":{
+    "projectname": true,
+    "bidamount": true,
+    "budget": true,
+    "item": true,
+    "projectscope": true,
+    "reserved_amount": true,
+    "totalprice": true,
+    "expurasingtime": true
+  },
+  "planBuildMosaic": {
+    "approvecode": true,
+    "approvedept": true,
+    "approvestatus": true,
+    "approvetime": true,
+    "approvenumber": true,
+    "approvecontent": true,
+    "projecttype": true,
+    "approvecity": true
+  }
 }

+ 2 - 2
src/jfw/modules/app/src/phoneFilter.json

@@ -11,5 +11,5 @@
 		"^/swordfish/frontPage/(.*)",
 		"^/jyapp/frontPage/(.*)",
 		"^//jyapp/errLogs/Receive$"
-	]
-}
+  ]
+}

+ 4 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/ent_portrait.css

@@ -517,3 +517,7 @@
 .win-analyse .high-link > span {
     margin-right: .08rem;
 }
+.win-analyse .default {
+    color: #999;
+}
+

+ 47 - 13
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js

@@ -141,7 +141,11 @@ var vNode = {
       isSC: 0, //0未收藏 1收藏
       idx: [],
       list: [],
-      entParams: {}
+      entParams: {},
+      // 用户是否登录
+      isLogin: false,
+      // 是否是免费用户
+      isFree: false
     }
   },
   created: function () {
@@ -158,6 +162,8 @@ var vNode = {
     this.entInfo.id = eId
     this.entInfo.name = ''
     this.restore = this.reStoreState()
+    // 判断用户是否登录
+    this.getUserSimpleInfo()
     this.getPowerInfo()
     if (!this.restore) {
       // 获取企业基本信息
@@ -268,6 +274,9 @@ var vNode = {
         return item
       })
       return !isShow
+    },
+    isFreeOrNotLogin () {
+      return !this.isLogin || this.isFree
     }
   },
   methods: {
@@ -401,6 +410,9 @@ var vNode = {
     },
     // 获取画像信息
     getEntPortrait: function (callback) {
+      if(!this.isLogin || this.isFree) {
+        return
+      }
       var storageSet = JSON.parse(sessionStorage.getItem('winner_high_set'))
       var _this = this
       var data = {
@@ -456,7 +468,7 @@ var vNode = {
               }
             }
           } else {
-            _this.$toast(res.error_msg)
+            // _this.$toast(res.error_msg)
             _this.show.yearData = false
             _this.show.monthData = false
             _this.show.areaData = false
@@ -660,7 +672,7 @@ var vNode = {
     getEntBaseInfo: function () {
       var _this = this
       let urls = ''
-      if (_this.powerInfo.memberStatus <= 0 || _this.svip) {
+      if (_this.powerInfo.memberStatus <= 0 || _this.svip || _this.isFree || !_this.isLogin) {
         urls = '/bigmember/portrait/subVipPortrait/entDetail'
       } else {
         urls = '/bigmember/portrait/ent/detail'
@@ -724,6 +736,10 @@ var vNode = {
     },
     changeFollowState: function () {
       var _this = this
+      if(!this.isLogin) {
+        window.location.href = "/jyapp/free/login?to=back";
+        return
+      }
       if (this.entInfo.follow) {
         this.$dialog.confirm({
           title: '提示信息',
@@ -779,15 +795,8 @@ var vNode = {
                 // 获取企业情报历史记录-12
                 _this.conf._12 = true
               }
-              // follow的权限:4.12.13只要有一个就可以
-              if (res.data.memberStatus > 0 && (power.indexOf(4) != -1 || power.indexOf(12) != -1 || power.indexOf(13) != -1)) {
-                _this.getEntFollowState()
-              } else {
-                _this.entInfo.followSearchFinish = true
-                _this.entInfo.entExist = false
-                // _this.getEntVisits()
-                _this.portrait = 'winnerVip'
-              }
+              // 所有身份均可关注(除未登录)
+              // _this.getEntFollowState()
               _this.singleTab = false
             }
 
@@ -799,7 +808,7 @@ var vNode = {
               }
             }
             _this.conf.isMember = res.data.memberStatus
-            _this.conf.arr = res.data.power
+            _this.conf.arr = res.data.power || []
             _this.conf.vipStatus = res.data.vipStatus
             // 新版超级订阅用户获取访问量
             if (res.data.viper && (_this.conf.isMember <= 0 || res.data.power.indexOf(4) == -1)) {
@@ -811,6 +820,7 @@ var vNode = {
           }
           //免费用户体验权限
           if (res.data.isFree) {
+            _this.isFree = true
             if (res.data.freeEntPort == 0) {
               _this.canFreeExp = true
             } else {
@@ -848,6 +858,23 @@ var vNode = {
         }
       })
     },
+    // 判断当前用户是登录
+    getUserSimpleInfo() {
+      const _this = this
+      $.ajax({
+        type: 'POST',
+        url: '/jypay/user/getSimpleData',
+        success: function (res) {
+          if(res && res.userId) {
+            _this.isLogin = true
+            // 所有身份均可关注(除未登录)
+            _this.getEntFollowState()
+          }
+        },error:function (e) {
+          _this.isLogin = false
+        }
+      })
+    },
     // 修改企业关注状态
     changeFollowStateRequest: function () {
       var _this = this
@@ -1399,6 +1426,9 @@ var vNode = {
     },
     // 高级分析设置
     goHighSet () {
+      if(!this.isLogin) {
+        return
+      }
       sessionStorage.setItem('is-click-set', 1)
       location.href = './free_high_set?header=中标信息高级分析设置&eid=' + utils.getParam('eId')
       // var url = this.getProjectNewsUrl()
@@ -1424,6 +1454,10 @@ var vNode = {
     goOpenVip: function () {
       // location.href = "/jyapp/vipsubscribe/vipsubscribe_new"
       location.href = '/jy_mobile/common/order/create/svip?type=buy'
+    },
+    // 跳转登录页
+    goLogin: function () {
+      window.location.href = "/jyapp/free/login?to=back";
     }
   }
 }

+ 24 - 4
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -148,6 +148,9 @@ var vNode = {
     }
   },
   computed: {
+    isFreeOrNotLogin () {
+      return !this.isLogin || this.userInfo.isFree
+    },
     allNot: function () {
       var show_1 = this.isShow.showDynamic;
       var show_2 = this.isShow.showYearData;
@@ -190,7 +193,7 @@ var vNode = {
       // 免费用户是否查看过该画像
       var freeTrial = info.isFree && info.freeBuyerPort < 0 && this.freeTrial
       // 免费用户无体验次数的、超级订阅用户无剩余次数的、没有大会员浏览权限的 显示遮罩
-      return !isFreeAuth && !isVipAuth && !isMember && !freeTrial && !vipTrial
+      return (!isFreeAuth && !isVipAuth && !isMember && !freeTrial && !vipTrial) || !this.userInfo.isLogin
     },
     // 展示免费用户体验
     getfreeBuyerPort: function () {
@@ -256,7 +259,9 @@ var vNode = {
   },
   created () {
     this.getUserSimpleInfo()
-    this.getPowerInfo()
+    setTimeout(() => {
+      this.getPowerInfo()
+    }, 1000)
     setTimeout(() => {
       this.getIsSc()
     }, 1000)
@@ -386,9 +391,13 @@ var vNode = {
             if (res.data.power.indexOf(5) === -1) {
               _this.getBuried(userType)
             }
+            if( _this.userInfo.isLogin) {
+              _this.getNewMsg(); // 中标动态
+              _this.getChartData(); // 企业画像
+            }
             _this.getUsage(); // 超级订阅用户剩余次数
-            _this.getNewMsg(); // 中标动态
-            _this.getChartData(); // 企业画像
+            // _this.getNewMsg(); // 中标动态
+            // _this.getChartData(); // 企业画像
           } else {
             _this.userInfo.isLogin = false
           }
@@ -711,6 +720,7 @@ var vNode = {
         buyer: decodeURIComponent(utils.getParam('entName'))
       }
       var isMember = this.bigStatus > 0 && this.power.indexOf(5) > -1
+      that.chartLoading = true;
       $.ajax({
         type: 'POST',
         url: isMember ? '/bigmember/portrait/buyer/getData' : '/bigmember/subVipPortrait/buyer/getData',
@@ -733,10 +743,13 @@ var vNode = {
                 that.chartLoading = false;
               }
             }
+          } else {
+            that.chartLoading = false;
           }
           that.getUsage(); // 超级订阅用户剩余次数
         },
         error: function (err) {
+          that.chartLoading = false;
           console.log(err)
           // setTimeout(function() {
           //   that.getChartData()
@@ -747,6 +760,7 @@ var vNode = {
     // 分段获取画像数据
     getSectionChartData: function (type) {
       var that = this;
+      that.chartLoading = true;
       $.ajax({
         type: 'POST',
         url: '/bigmember/portrait/buyer/getData',
@@ -775,9 +789,12 @@ var vNode = {
                 that.chartLoading = false;
               }
             }
+          } else {
+            that.chartLoading = false;
           }
         },
         error: function (err) {
+          that.chartLoading = false;
           console.log(err)
         }
       })
@@ -1715,6 +1732,9 @@ var vNode = {
       return maxIndex
     },
     goHighSet: function () {
+      if(!this.userInfo.isLogin) {
+        return
+      }
       sessionStorage.setItem('is-click-set', 1)
       location.href = './free_high_set?header=采购单位高级分析设置&entName=' + decodeURIComponent(utils.getParam('entName'))
     },

+ 3 - 3
src/jfw/modules/app/src/web/staticres/jyapp/css/wxinfocontent.css

@@ -297,6 +297,7 @@ body .loading_ p span {
 .toolbar .tool_bottom {
     display: flex;
     margin-top: 13px;
+    margin-bottom:16px;
     align-items: center;
     justify-content: space-between;
 }
@@ -676,7 +677,6 @@ pre {
 .onlyone img {
     width: 100%;
 }
-
 .adv-appcontent-bottom::after {
     content: "广告";
     position: absolute;
@@ -692,7 +692,7 @@ pre {
     line-height: 12px;
 }
 
-.adv-appcontent-bottom {
+.adv-appcontent-bottom{
     width: 100%;
     margin: auto;
     text-align: center;
@@ -701,7 +701,7 @@ pre {
     position: relative;
 }
 
-.adv-appcontent-bottom img {
+.adv-appcontent-bottom img{
     width: 100%;
 }
 

BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/focontent/ad_bigmember.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/focontent/ad_bigmember2.png


+ 6 - 1
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -1498,7 +1498,12 @@ function loginSuccess (result, loginType) {
       url: '/entbase/ent/mySelectent?t=' + new Date().getTime()
     })
   }
-
+  // 当前为新用户(即注册)--跳转设置密码页
+   if(result.userInfo && result.userInfo.isNewUser) {
+     var href ="/jyapp/free/setPwd";
+     window.location.href = href;
+     return
+   }
 
   if (loginType === 'is-wx') {
     // 检查是否绑定手机号

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

@@ -2,7 +2,7 @@
 .login_main{
   margin: 12px 12px 0 12px;
   padding: .34rem 0 .68rem;
-  background: #fff;
+  /*background: #fff;*/
   box-shadow: 0px 2px 8px rgba(54, 147, 179, 0.051);
   border-radius: 8px;
 }
@@ -14,7 +14,7 @@
 
 .login div.pass {
   width: 100%;
-  background: #fff;
+  /*background: #fff;*/
   position: relative;
   border-bottom: 1px solid #E6E6E6;
   height: 1rem;
@@ -31,6 +31,9 @@
 	z-index: 2;
 	background-color: transparent;
 }
+.login div.onePass {
+    display:none;
+}
 .login div.onePass input{
 	padding-right: 80px;
 }
@@ -43,7 +46,11 @@
 }
 
 .login .forget {
-  margin-top: 18px;
+  margin-top: 12px;
+  text-align: center;
+  font-size: 14px;
+    color: #9B9CA3;
+    line-height:20px;
 }
 .login .btn{
   margin-top: 24px;
@@ -52,13 +59,16 @@
 .login .forget a {
   color: #2ABED1;
   font-size: 14px;
-  float: left;
 }
 
-.login .forget a.register {
-  float: right;
+.login .forget .forget-password{
+    display: none;
 }
 
+/*.login .forget a.register {*/
+/*  float: right;*/
+/*}*/
+
 .login .wx {
   text-align: center;
   margin-top:20px;
@@ -157,9 +167,9 @@
 .header-tab-active{
 	color: #2CB7CA;
 }
-.login .code{
-	display: none;
-}
+/*.login .code{*/
+/*	display: none;*/
+/*}*/
 .login>.code>span{
 	text-align: right;
 	width: 2rem;
@@ -223,4 +233,15 @@
 }
 .jyapp-icon-zuojiantou-x:after{
 	top:38px;
-}
+}
+/*重置input默认样式*/
+/*input:-webkit-autofill{*/
+/*    -webkit-box-shadow: 0 0 0px 1000px transparent inset;*/
+/*    transition:  background-color 5000s ease-in-out 0s !important;*/
+/*}*/
+/*input:-internal-autofill-previewed,*/
+/*input:-internal-autofill-selected {*/
+/*    background-color: #f5ffff !important;*/
+/*    !*transition:  background-color 5000s ease-in-out 0s !important;*!*/
+/*}*/
+

+ 52 - 7
src/jfw/modules/app/src/web/staticres/jyapp/wxtsguide/main.js

@@ -51,7 +51,11 @@ var Guide = {
 			}else{
 				indexTemp = 0;
 			}
-			html += '<li style="'+thisStyle+'">'+i+'</li>';
+      if(this.selectIndustrys && this.selectIndustrys.length >0 && this.selectIndustrys.indexOf(i) > -1) {
+        html += '<li style="'+thisStyle+'" class="active">'+i+'</li>';
+      } else {
+        html += '<li style="'+thisStyle+'">'+i+'</li>';
+      }
 		}
 		$(".step-1>div").css("padding","0px "+thisMarginLeft+"px");
 		$("#industry").html(html);
@@ -69,6 +73,7 @@ var Guide = {
 		        localStorage.removeItem("tsGuide_keywords");
 		        localStorage.removeItem("tsGuide_preview");
 		        localStorage.removeItem("tsGuide_step");
+            localStorage.removeItem("tsGuide_area");
 		    }
 			//Android客户端没有使用
 //			if (!mySysIsIos()){
@@ -118,10 +123,21 @@ var Guide = {
 			}else{
 				$(".relRecom").hide();
 			}
-			$(".step-1").hide();
-			this.setInputEmpty();
-			$(".com-top-one .nextStep").attr("disabled",$("#haskeywords li").length == 0);
-			$(".step-2").show();
+      this.setInputEmpty();
+      $(".com-top-one .nextStep").attr("disabled",$("#haskeywords li").length == 0);
+      $(".step-1").hide();
+      $(".step-2").show();
+      $(".relRecom,.com-top-one").hide();
+      // 获取已配置过的关键词
+      getHadKeywords(index, function(keys) {
+        if(keys.length > 0) {
+          $("body").removeClass("step-3-body");
+          $(".relRecom,.com-top-one").hide();
+          $(".com-top-two-b,.com-top-two").show();
+        } else {
+          $(".relRecom,.com-top-one").show();
+        }
+      })
 		}else if(index == 2){
 			$("body").removeClass("step-3-body");
 			$(".relRecom,.com-top-one").hide();
@@ -171,7 +187,6 @@ var Guide = {
 			$(".com-top-one").show();
 			$("body").removeClass("step-3-body");
 		}else if(index == 4){
-			this.removeLast();
 			this.saveLSkeywords(true);
 			$(".step-3").hide();
 			$(".com-top-two-b").show();
@@ -418,6 +433,7 @@ var Guide = {
 			$(".step-3").show();
 		}
 		localStorage.tsGuide_status = "0";
+    getHadKeywords(localStorage.tsGuide_step)
 	},
 	saveLSinputvalue: function(value,comStartFlag){
 		value = $.trim(value);
@@ -839,6 +855,35 @@ var JYAlert = function(T,comStartFlag){
 		$("#myModal").modal("show");
 	}
 }
+// 获取已经设置过的关键词
+function getHadKeywords(step, callback){
+  $.ajax({
+    url: "/publicapply/free/subscribe",
+    type: "post",
+    success: function(res){
+      if(res.error_code === 0 && res.data){
+        var keysArr = res.data.keys ?  res.data.keys : []
+        var keys = []
+        keysArr.forEach(function(e) {
+          keys = keys.concat(e.key)
+        })
+        callback && callback(keys)
+        if (keys.length > 0) {
+          Guide.saveLSkeywords(false)
+          if(step === 1) {
+            Guide.nextStep(2)
+          }
+          $("#haskeywords li").remove();
+          for( var i=0; i< keys.length; i++) {
+            Guide.appendHaskeywords(keys[i])
+          }
+        }
+      }
+    },
+    error: function(){
+    }
+  });
+}
 //
 $(function(){
   Guide.clearHistoryPushDataCache()
@@ -863,12 +908,12 @@ $(function(){
 	if(!isiOS){
 		$("#adjustment").height($(window).height() / 2);
 	}
-	Guide.initStep_1();
 	if(localStorage && localStorage.tsGuide_step){
 		Guide.backInit();
 	}else{
 		$(".step-1").show();
 	}
+  Guide.initStep_1();
 	$("#input-keyword-1").blur(function(){
 		var thisValue = $.trim($(this).val());
 		if(thisValue != ""){

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

@@ -20,6 +20,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_pro_follow_detail.css?v={{Msg "seo" "version"}}'/>
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
     <!--E-当前页面的css资源-->
 </head>
 <body>
@@ -223,7 +225,7 @@
           </div>
           <div class="view-result-tip">
             <span>想知道谁最有可能参标吗?</span>
-            <span @click="location.href='/jyapp/big/page/analysis_search'" style="text-decoration: underline;">点这里查看分析结果</span>
+            <span @click="location.href='/jyapp/big/page/analysis_result'" style="text-decoration: underline;">点这里查看分析结果</span>
           </div>
           <van-form :readonly="editBtnStatus.status == 1" @submit="onSubmit">
             <van-field
@@ -370,6 +372,9 @@
                 <van-button class="c-btns" @click="sendMail">确认</van-button>
             </div>
         </van-dialog>
+        <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+          <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+        </van-popup>
     </div>
     <!--S-Vue-->
 </div>
@@ -389,6 +394,7 @@
     var localEmail =  {{.T.email}} || sessionStorage.getItem('reportEmail') || ''
 </script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/js/forward.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/big-member/js/page_client_follow_detail.js?v={{Msg "seo" "version"}}'></script>
 
 </body>

+ 6 - 0
src/jfw/modules/app/src/web/templates/big-member/page_client_follow_list.html

@@ -17,6 +17,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/big-member/css/page_client_follow_list.css' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
     <!--E-当前页面的css资源-->
 </head>
 <body>
@@ -89,6 +91,9 @@
                     <div class="j-button-manycancel" @click="manycancel()">批量取消关注30天无更新的项目</div>
                 </div>
             </div>
+            <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+              <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+            </van-popup>
         </div>
     </div>
     <!--S-Vue-->
@@ -111,6 +116,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 {{include "/big-member/commonjs.html"}}
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/big-member/js/page_client_follow_list.js?v={{Msg "seo" "version"}}'></script>
 <!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/demo.js?v={{Msg "seo" "version"}}'></script> -->
 

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

@@ -50,6 +50,7 @@
     }
 
     .vip_openDialog {
+        position: relative;
         padding: 0 0 0.64rem;
         width: 6.06rem;
         /* height: 6.88rem; */
@@ -57,6 +58,11 @@
         background-size: 100% 100%;
         box-sizing: border-box;
     }
+    .no-login-tip{
+        position:absolute;
+        width:100%;
+        text-align: center;
+    }
 
     .free-give {
         padding: 0.24rem 0.32rem;
@@ -235,9 +241,9 @@
       <span class="j-icon icon-company"></span>
       <span class="ent-title">${ entInfo.name }</span>
       <span style="margin-right: .32rem;" class="j-icon" :class="!!entInfo.follow ? 'icon-favorite' : 'icon-add-favorite'"
-            @click="changeFollowState" v-if="entInfo.followSearchFinish && entInfo.entExist"></span>
-      <van-loading v-if="!entInfo.followSearchFinish" size="24px"></van-loading>
-      <forwardshare :params="entParams" :show-text="false"></forwardshare>
+            @click="changeFollowState" v-if="!isLogin || (entInfo.followSearchFinish && entInfo.entExist)"></span>
+      <van-loading v-if="isLogin && !entInfo.followSearchFinish" size="24px"></van-loading>
+      <forwardshare :params="entParams" :show-text="false" v-if="isLogin" ></forwardshare>
     </div>
     <van-tabs
             class="ent-tabs-container"
@@ -362,7 +368,7 @@
           <div class="vip_component"
                style="height:11.04rem;background:url('/common-module/collection/image/bg/vip_bg_9.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
             <vip-component @tabactive="tabActive" :power="conf" type="item_9" :can-free-exp="canFreeExp"
-                           :entvisit="entvisit" :newvip="isVip"
+                           :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                            imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_9.png?v={{Msg "seo" "version"}}'></vip-component>
           </div>
         </div>
@@ -378,17 +384,18 @@
         <!-- 高级分析 -->
         <div class="win-analyse" ref="setRef">
           <span class="win-bid-title">中标分析</span>
-          <div class="high-link" @click="goHighSet">
+          <div class="high-link" :class="isLogin ? '' : 'default'" @click="goHighSet">
             <span>高级分析设置</span>
             <van-icon name="arrow"></van-icon>
           </div>
         </div>
         <!-- 免费用户采购单位全景分析提示 -->
-        <div v-if="canFreeExp" style="margin-top: .24rem; " class="free-give">
-          <div class="go-text"> 免费赠送1次【企业中标分析】权益体验机会!</div>
-          <div class="go-btn" @click="goGiveAnalysis">去解锁</div>
-        </div>
-        <div class="bg-white tab-card">
+<!--        <div v-if="canFreeExp && isLogin" style="margin-top: .24rem; " class="free-give">-->
+<!--          <div class="go-text"> 免费赠送1次【企业中标分析】权益体验机会!</div>-->
+<!--          <div class="go-btn" @click="goGiveAnalysis">去解锁</div>-->
+<!--        </div>-->
+        <!-- 中标信息统计结果-->
+        <div class="bg-white tab-card" v-if="!isFreeOrNotLogin">
           <div class="tab-card-title" style="padding: 0.16rem .32rem .12rem;">中标信息统计结果</div>
           <div class="card-row zb-info">
             <div class="card-column">
@@ -421,6 +428,18 @@
                 : '至今'}</span>
           </div>
         </div>
+        <!-- 中标信息统计结果--未登录-->
+        <div class="bg-white tab-card charts"  style="margin-bottom: 10px;" v-if="isFreeOrNotLogin">
+            <div class="tab-card-title">中标信息统计结果</div>
+            <div class="vip_component" v-if="getStatus && hideDt"
+                 style="height:5.8rem;background:url('/common-module/collection/image/bg/qy-zbtj-bg.png?v={{Msg "seo" "version"}}') 40% 0 no-repeat;background-size:110% 100%;"
+            key="dt">
+            <vip-component @tabactive="tabActive" :power="conf" type="item_10" :can-free-exp="canFreeExp"
+                           :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
+                           imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/qy-zbtj.png?v={{Msg "seo" "version"}}'>
+            </vip-component>
+        </div>
+        </div>
         <div class="jy-empty" v-show="allNot && !getStatus">
           <div class="jy-empty-img"></div>
           <p class="jy-empty-text">对不起,没有匹配到相关信息, <br>修改时间范围或换个搜索词试试吧</p>
@@ -429,7 +448,7 @@
              style="height:9.16rem;background:url('/common-module/collection/image/bg/vip_bg_1.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%"
              key="dt">
           <vip-component @tabactive="tabActive" :power="conf" type="item_1" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_1.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -494,7 +513,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:11.12rem;background:url('/common-module/collection/image/bg/vip_bg_2.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_2" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_2.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -511,7 +530,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:10.8rem;background:url('/common-module/collection/image/bg/vip_bg_3.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_3" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_3.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -527,7 +546,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:10.56rem;background:url('/common-module/collection/image/bg/vip_bg_4.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_4" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_4.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -544,7 +563,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:11.24rem;background:url('/common-module/collection/image/bg/vip_bg_5.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_5" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_5.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -559,7 +578,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:11.92rem;background:url('/common-module/collection/image/bg/vip_bg_6.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_6" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_6.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>
@@ -627,7 +646,7 @@
         <div class="vip_component" v-if="getStatus"
              style="height:10.8rem;background:url('/common-module/collection/image/bg/vip_bg_7.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
           <vip-component @tabactive="tabActive" type="item_7" :power="conf" :can-free-exp="canFreeExp"
-                         :entvisit="entvisit" :newvip="isVip"
+                         :entvisit="entvisit" :newvip="isVip" :islogin="isLogin"
                          imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_7.png?v={{Msg "seo" "version"}}'>
           </vip-component>
         </div>

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

@@ -29,9 +29,9 @@
         background-size: 100% 100%;
         box-sizing: border-box;
     }
-    .bigVip_com{
-        display: none;
-    }
+    /*.bigVip_com{*/
+    /*    display: none;*/
+    /*}*/
 </style>
 <body>
 <div class="j-container">
@@ -42,7 +42,7 @@
             <p class="empty-text">暂无企业情报历史记录</p>
         </div>
         <div class="vip_component bigVip_com" v-if="!getStatus" style="height:100%;background:url('/common-module/collection/image/bg/vip_bg_8.png') no-repeat;background-size:100% 100%">
-            <vip-component type="item_8" :power="conf" :vipststus="vipststus" :entvisit="entvisit" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_8.png'></vip-component>
+            <vip-component type="item_8" :power="conf" :vipststus="vipststus" :entvisit="entvisit" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/bg/vip_ex_8.png' :islogin="isLogin"></vip-component>
         </div>
         <ul class="ent-change-list" v-else key="changeList">
             <li class="ent-change-item" v-for="(item,index) in changeList" :key="item.changeTime">
@@ -100,8 +100,8 @@ var vNode = {
             isMember: 0
         },
         isVip: false,
-        vipststus: 0
-
+        vipststus: 0,
+        isLogin: false
     },
     created: function () {
         var eId = utils.getParam('eId')
@@ -110,13 +110,14 @@ var vNode = {
             this.eId = eId
         }
         this.getUserInfo()
+        this.getUserSimpleInfo()
         this.getEntVisits()
         this.getEntHistory()
     },
     computed: {
         getStatus: function () {
             // 超级订阅用户没有企业情报监控权限,显示购买页
-            return this.conf._12
+            return this.conf._12 && this.isLogin
         }
     },
     methods: {
@@ -133,7 +134,7 @@ var vNode = {
                     }
                     if (res.data && $.isArray(res.data.power)) {
                         // 根据power判断权限,企业画像包含权限(12)
-                        var power = res.data.power
+                        var power = res.data.power || []
                         // 判断是否是超级订阅会员、老用户还是新用户
                         if (res.data.viper) {
                             $('.bigVip_com').css({'display':'flex'})
@@ -154,6 +155,21 @@ var vNode = {
                 }
             })
         },
+          // 判断当前用户是登录
+          getUserSimpleInfo() {
+            const _this = this
+            $.ajax({
+              type: 'POST',
+              url: '/jypay/user/getSimpleData',
+              success: function (res) {
+                if(res && res.userId) {
+                  _this.isLogin = true
+                }
+              },error:function (e) {
+                _this.isLogin = false
+              }
+            })
+          },
         // 企业画像访问量查询
         getEntVisits: function() {
             let _this = this

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

@@ -20,6 +20,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_pro_follow_detail.css?v={{Msg "seo" "version"}}'/>
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
     <!--E-当前页面的css资源-->
 </head>
 <body>
@@ -222,7 +224,7 @@
           </div>
           <div class="view-result-tip">
             <span>想知道谁最有可能参标吗?</span>
-            <span @click="location.href='/jyapp/big/page/analysis_search'" style="text-decoration: underline;">点这里查看分析结果</span>
+            <span @click="location.href='/jyapp/big/page/analysis_result'" style="text-decoration: underline;">点这里查看分析结果</span>
           </div>
           <van-form :readonly="editBtnStatus.status == 1" @submit="onSubmit">
             <van-field
@@ -369,6 +371,9 @@
                 <van-button class="c-btns" @click="sendMail">确认</van-button>
             </div>
         </van-dialog>
+        <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+          <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+        </van-popup>
     </div>
     <!--S-Vue-->
 </div>
@@ -384,6 +389,7 @@
 {{include "/big-member/commonjs.html"}}
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/js/forward.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
 <!-- <script src="https://cdn.bootcss.com/vConsole/3.3.4/vconsole.min.js"></script>
 <script> new VConsole(); </script> -->
 <script>
@@ -466,7 +472,8 @@
         delimiters: ['${', '}'],
         el: '#v-pro',
         components: {
-          forwardshare: vmForward
+          forwardshare: vmForward,
+          bidStatusNode: bidStatusNode
         },
         data: {
             powerInfo: {
@@ -552,7 +559,10 @@
               status: 0
             },
             rownum: 1,
-            proParams: {}
+            proParams: {},
+            showBidStatus: false,
+            popupHeight: 'height: 8.8rem',
+            projectCellInfo: {}
         },
         created() {
             this.isOpening()
@@ -637,6 +647,23 @@
             // params.channelPerson = legal_person || ''
           },
 
+          setHeight: function (data) {
+            if(data === 2) {
+              this.popupHeight = 'height: 10.92rem'
+            } else {
+              this.popupHeight = 'height: 8.8rem'
+            }
+          },
+          // 更新投标状态成功
+          saveSuccess: function () {
+            this.showBidStatus = false
+            this.getBidContent()
+          },
+          // 取消更新投标状态
+          cancelUpdate: function () {
+            this.showBidStatus = false
+          },
+
           /**
            * 获取模糊渠道名称列表
            * @param str
@@ -963,6 +990,7 @@
               }
             }
             const _this = this
+            _this.projectCellInfo.sid = this.sid
             const type = weicanbiao ? 'in' : 'out';
             const url = '/jyapi/jybx/core/participate/'+ type + '/info'
             const params = {
@@ -983,7 +1011,8 @@
                     _this.getCanBiaoInfo()
                     if (type === 'in') {
                       _this.getHaveActionHistory()
-                      _this.$toast('已参标,请前往我的参标项目列表查看')
+                      _this.showBidStatus = true
+                      // _this.$toast('已参标,请前往我的参标项目列表查看')
                     }
                     // 更新收藏列表
                     const updateCBStatus = {

+ 31 - 2
src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_list.html

@@ -17,6 +17,8 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_pro_follow_list.css' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
     <!--E-当前页面的css资源-->
 </head>
 <body>
@@ -87,6 +89,9 @@
                     <div class="j-button-manycancel" @click="manycancel()">批量取消关注30天无更新的项目</div>
                 </div>
             </div>
+            <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+              <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+            </van-popup>
         </div>
     </div>
     <!--S-Vue-->
@@ -107,6 +112,7 @@
 <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
 {{include "/big-member/commonjs.html"}}
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
 <!--E-当前页面的资源-->
 <!--小于100行同css,减少请求数-->
 <script>
@@ -117,6 +123,9 @@
     var vNode = {
         delimiters: ['${', '}'],
         el: '#v-node',
+        components: {
+          bidStatusNode: bidStatusNode
+        },
         data: {
             sessStorageKey:'$data-pro_follow_list',
             scrollTop:0,//页面滚动高度
@@ -131,7 +140,10 @@
             bi: {
                 addedIds: []
             },
-            isFree:false
+            isFree:false,
+            showBidStatus: false,
+            popupHeight: 'height: 8.8rem',
+            projectCellInfo: {}
         },
         computed: {
             biEnv: function () {
@@ -193,6 +205,21 @@
                     }
                 })
             },
+            setHeight: function (data) {
+              if(data === 2) {
+                this.popupHeight = 'height: 10.92rem'
+              } else {
+                this.popupHeight = 'height: 8.8rem'
+              }
+            },
+            // 更新投标状态成功
+            saveSuccess: function () {
+              this.showBidStatus = false
+            },
+            // 取消更新投标状态
+            cancelUpdate: function () {
+              this.showBidStatus = false
+            },
             manycancel:function() {
                 this.$dialog.confirm({
                     className:'caredialog',
@@ -475,12 +502,14 @@
                     contentType: 'application/json',
                     data: JSON.stringify(params),
                     success: function (res) {
+                        _this.projectCellInfo = item
                         if (res.error_code === 0 && res.data) {
-                            _this.$toast('已参标,请前往我的参标项目列表查看。')
+                            // _this.$toast('已参标,请前往我的参标项目列表查看。')
                             _this.$set(item, 'isCB', {
                                 id: item.sid,
                                 value: true
                             })
+                            _this.showBidStatus = true
                         } else {
                           _this.$toast(res.error_msg)
                         }

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

@@ -227,6 +227,24 @@
     .vip_openDialog{
         margin-top:.3rem;
     }
+    .win-analyse .default {
+        color: #999;
+    }
+    .example-export{
+        position: absolute;
+        top:0;
+        right:.28rem;
+        color:#999;
+        margin-top:.3rem;
+        font-size:.28rem;
+        line-height:.4rem;
+        /*vertical-align: middle;*/
+    }
+    .example-export .j-icon{
+        width:.32rem;
+        height:.32rem;
+        vertical-align: text-bottom;
+    }
 
   </style>
 </head>
@@ -262,10 +280,10 @@
           </van-sticky>
         </div>
         <!-- 免费用户采购单位全景分析提示 -->
-        <div v-if="getfreeBuyerPort && isLogin" class="free-give">
-          <div class="go-text"> 免费赠送1次【采购单位全景分析】权益体验机会!</div>
-          <div class="go-btn" @click="goGiveAnalysis">去解锁</div>
-        </div>
+<!--        <div v-if="getfreeBuyerPort && isLogin" class="free-give">-->
+<!--          <div class="go-text"> 免费赠送1次【采购单位全景分析】权益体验机会!</div>-->
+<!--          <div class="go-btn" @click="goGiveAnalysis">去解锁</div>-->
+<!--        </div>-->
         <!-- 采购单位通讯录 -->
         <div v-if="getStatus">
           <div class="vip_component"
@@ -283,12 +301,12 @@
         <!-- 高级分析 -->
         <div class="win-analyse" ref="setRefs">
           <span class="win-bid-title">采购单位分析</span>
-          <div class="high-link" @click="goHighSet" v-if="isLogin">
+          <div class="high-link" :class="{default: !userInfo.isLogin}" @click="goHighSet">
             <span>高级分析设置</span>
             <van-icon name="arrow"></van-icon>
           </div>
         </div>
-        <div class="buyer-statistic">
+        <div class="buyer-statistic" v-if="!isFreeOrNotLogin">
           <div class="statistic-title">统计信息</div>
           <div class="buyer-info">
             <div class="bi-item">
@@ -319,7 +337,7 @@
           <p class="jy-empty-text">对不起,没有匹配到相关信息, <br>修改时间范围或换个搜索词试试吧</p>
         </div>
         <!-- 招标动态 -->
-        <div class="dynamic" v-if="isShow.showDynamic">
+        <div class="dynamic" v-if="isShow.showDynamic && !isFreeOrNotLogin">
           <!--                <div class="d_title">招标动态</div>-->
           <div class="selected-export-box">
             <div class="selected-export">
@@ -408,7 +426,7 @@
           <!--                </div>-->
         </div>
         <!-- 数据部分 -->
-        <div>
+        <div v-if="!isFreeOrNotLogin">
           <!-- 年度项目统计 -->
           <div class="years" v-if="isShow.showYearData">
             <div class="chart_title">年度项目统计</div>
@@ -616,26 +634,42 @@
         </div>
         <!-- 遮罩部分 -->
         <div v-if="getStatus">
+<!--            招标动态-->
+          <div class="vip_component" style="height:8.8rem;background:#fff url('/common-module/collection/image/buyer/cg-zbdt-bg.jpg?v={{Msg "seo" "version"}}') no-repeat center 50px;background-size:100% 100%;position:relative;">
+            <p class="example-title">招标动态</p>
+            <div class="example-export">
+                <span>
+                  <i class="j-icon base-icon icon-download-999"></i>
+                  <em style="color:#999;">数据导出</em>
+                </span>
+            </div>
+             <buyer-example style="margin-top:1rem;"  :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_14" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/cg-zbdt.png?v={{Msg "seo" "version"}}'></buyer-example>
+          </div>
+<!--            统计信息-->
+         <div class="vip_component" style="height:7.56rem;background:#fff url('/common-module/collection/image/buyer/cg-tjxx-bg.png?v={{Msg "seo" "version"}}') no-repeat center 50px;background-size:100% 100%">
+            <p class="example-title">统计信息</p>
+            <buyer-example  :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_13" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/cg-tjxx.png?v={{Msg "seo" "version"}}'></buyer-example>
+         </div>
           <!-- 历史项目联系人 -->
-          <!-- <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/01-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
-                <p class="example-title">历史项目联系方式</p>
-                <buyer-example :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_1" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/01.png?v={{Msg "seo" "version"}}'></buyer-example>
-              </div> -->
+<!--           <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/01-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">-->
+<!--                <p class="example-title">历史项目联系方式</p>-->
+<!--                <buyer-example :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_1" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/01.png?v={{Msg "seo" "version"}}'></buyer-example>-->
+<!--              </div>-->
           <!-- 合作企业注册资本分布 -->
-          <!-- <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/09-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
+          <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/09-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
                 <p class="example-title">合作企业注册资本分布</p>
                 <buyer-example :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_9" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/09.png?v={{Msg "seo" "version"}}'></buyer-example>
-              </div> -->
+          </div>
           <!-- 合作企业年龄分布 -->
-          <!-- <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/10-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
+           <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/10-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
                 <p class="example-title">合作企业年龄分布</p>
                 <buyer-example :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_10" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/10.png?v={{Msg "seo" "version"}}'></buyer-example>
-              </div> -->
+           </div>
           <!-- 合作企业注册地分布 -->
-          <!-- <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/11-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
-                <p class="example-title">合作企业注册地分布</p>
+          <div class="vip_component" style="height:10.8rem;background:url('/common-module/collection/image/buyer/11-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">
+<!--                <p class="example-title">合作企业注册地分布</p>-->
                 <buyer-example :useage="usageInfo" :userinfo="userInfo" :status="bigStatus" :power="power" type="item_11" imgurl='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/buyer/11.png?v={{Msg "seo" "version"}}'></buyer-example>
-              </div> -->
+          </div>
           <!-- 年度项目统计 -->
           <div class="vip_component"
             style="height:10.8rem;background:url('/common-module/collection/image/buyer/02-bg.png?v={{Msg "seo" "version"}}') no-repeat;background-size:100% 100%">

+ 8 - 2
src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html

@@ -11,6 +11,7 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
 </head>
 <style>
   .list-mian{
@@ -130,7 +131,7 @@
             <div class="j-main">
               <div class="emptycom">
                 <div class="emptyimg">
-                  <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/img-empty.png?v={{Msg "seo" "version"}}' alt="">
+                  <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/image/jy-back.png?v={{Msg "seo" "version"}}' alt="">
                 </div>
                 <div class="emptytext">
                   暂无数据
@@ -144,14 +145,18 @@
         <div class="j-main">
           <div class="emptycom">
             <div class="emptyimg">
-              <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/image/img-empty.png?v={{Msg "seo" "version"}}' alt="">
+              <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/image/jy-back.png?v={{Msg "seo" "version"}}' alt="">
             </div>
             <div class="emptytext">
               您还没有收藏标讯
             </div>
+            <div class="empty-btn" @click="location.href='/jy_mobile/search/middle/bidding'">前往收藏</div>
           </div>
         </div>
       </div>
+      <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+        <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+      </van-popup>
     </div>
   </div>
   <!--S-当前页面的资源-->
@@ -166,6 +171,7 @@
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/root-mobile.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/phone-mobile.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
 </body>

+ 80 - 40
src/jfw/modules/app/src/web/templates/me/login.html

@@ -2,6 +2,7 @@
 <html lang="zh">
 <head>
 	{{include "/common/meta.html"}}
+    <meta name="description" content="登录剑鱼标讯,免费查看全国招标采购项目详情。">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
 <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}"/>
@@ -10,7 +11,7 @@
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/ad/css/index.css?v={{Msg "seo" "version"}}"/>
 	<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js" type="text/javascript" charset="utf-8"></script>
 	{{include "/common/js.html"}}
-	<title>登录</title>
+	<title>登录  -  剑鱼标讯</title>
 </head>
 <style type="text/css">
   body{
@@ -131,8 +132,8 @@
   </div>
   <div class="login_main">
     <span class="header-tab">
-      <a class="header-tab-active">密码登录</a>
-      <a>验证码登录</a>
+      <a class="header-tab-active">验证码登录/注册</a>
+      <a>码登录</a>
       <i></i>
     </span>
     <div class="login">
@@ -153,10 +154,11 @@
         <img class="closeQc" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/cancel.png?v={{Msg "seo" "version"}}"/>
         <span id="sendIdentCode">获取验证码</span>
       </div>
-      <button type="button" id="btn" class="disabled btn" />登录</button>
+      <button type="button" id="btn" class="disabled btn" />登录 / 注册</button>
       <div class="forget">
-        <a href="javascript:void(0)">忘记密码?</a>
-        <a href="javascript:void(0)" class="register">立即注册</a>
+        <a class="forget-password" href="javascript:void(0)">忘记密码?</a>
+<!--        <a href="javascript:void(0)" class="register">立即注册</a>-->
+          <span class="tip">未注册用户验证通过后自动注册</span>
         <div class="clearfix"></div>
       </div>
     </div>
@@ -187,6 +189,9 @@
   </div>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/ad/js/index.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
+    <!--S 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/fotter.js?v={{Msg "seo" "version" }}'></script>
+    <!--E 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
   <script>
     var Activedatastring = `register`
     var ActivedataType = `jy-app-${Activedatastring}-login`
@@ -196,10 +201,31 @@
     * 获取后台广告方法
     *  getActiveInfo: function (active_codes_map,isAppsion)
     * @param {Array|String} active_codes_map 广告id标识符--数组集合["jy-wx-course-pay-success"]
-    * @param {String} isAppsion 请求环境、app、weixin、pc
+    * @parRam {String} isAppsion 请求环境、app、weixin、pc
     */
     getActive.getActiveInfo(Activedata,'Applink')
   </script>
+    <script type="text/javascript">
+      // var platform = utils.isWeiXinBrowser ? 'wx' : 'app'
+      // 注册埋点
+      function trackClick (c_type) {
+        if (!c_type) return
+        try {
+          clab_tracker.track('c_register', {
+            c_platform: 'app',
+            c_type: c_type,
+            date: new Date()
+          })
+        } catch (error) {
+          console.dir(error)
+        }
+      }
+      // 埋点
+      window.onload = function () {
+        // 埋点
+        trackClick('注册行为-打开登录/注册页面')
+      }
+    </script>
 	<script type="text/javascript">
 		var wait = 60;
     var inment_H5 = true
@@ -258,10 +284,10 @@
 				if($(this).index() == 0){
 					window.location.href = "/jyapp/free/forgetPwd";
 				}else{
-          var href ="/jyapp/free/register";
-          if (disWord!=null){
-          sessionStorage.setItem("disWord_reg",disWord)
-          }
+                  var href ="/jyapp/free/register";
+                  if (disWord!=null){
+                    sessionStorage.setItem("disWord_reg",disWord)
+                  }
 					window.location.href = href;
 				}
 			});
@@ -269,14 +295,20 @@
 			$(".header-tab>a").on("tap",function(){
 				$(".header-tab>a").removeClass("header-tab-active");
 				$(this).addClass("header-tab-active");
-				if($(this).index() == 0){
+				if($(this).index() == 1){
 					$(".login .onePass").show();
 					$(".login .code").css("display","none");
-					$(".header-tab>i").css("left",left_1);
+					$(".header-tab>i").css("left",left_2);
+                  $('.forget-password').show()
+                  $('.forget .tip').hide()
+                  $('#btn').text('登录')
 				}else{
 					$(".login .onePass").hide();
 					$(".login .code").css("display","table");
-					$(".header-tab>i").css("left",left_2);
+					$(".header-tab>i").css("left",left_1);
+					$('.forget-password').hide()
+                    $('.forget .tip').show()
+                   $('#btn').text('登录 / 注册')
 				}
 				changeBtnStatus();
 			});
@@ -300,6 +332,7 @@
 					return
 				}
         if ($('#sendIdentCode').html() !== '获取验证码') return
+              trackClick('注册行为-获取验证码')
 				var thisClass = this;
 				$.post("/jyapp/free/login",{reqType:"sendIdentCode",phone: phone,token: getCipherText(phone)},function(r){
 					if(r.status==-1){
@@ -398,31 +431,32 @@
 					},2000)
 				} else {
 					var phone = $.trim($("#tel").val());
-					if($(".header-tab>a.header-tab-active").index() == 0){
-            var params = {}
-            if (utils.$envs.inApp) {
-              params = {
-                reqType:"phoneLogin",
-                phone:phone,
-                password:$(".onePass input").val(),
-                rid:JyObj.getPushRid(),
-                oid:getOtherPushId(),
-                phoneType:getPhoneType(),
-                channel:getChannel(),
-                deviceId:getDeviceId()
-              }
-            } else {
-              params = {
-                reqType:"phoneLogin",
-                phone:phone,
-                password:$(".onePass input").val(),
-                rid:'',
-                oid:'',
-                phoneType:'',
-                channel:'',
-                deviceId:''
-              }
-            }
+					if($(".header-tab>a.header-tab-active").index() == 1){
+                    var params = {}
+                    if (utils.$envs.inApp) {
+                      params = {
+                        reqType:"phoneLogin",
+                        phone:phone,
+                        password:$(".onePass input").val(),
+                        rid:JyObj.getPushRid(),
+                        oid:getOtherPushId(),
+                        phoneType:getPhoneType(),
+                        channel:getChannel(),
+                        deviceId:getDeviceId()
+                      }
+                    } else {
+                      params = {
+                        reqType:"phoneLogin",
+                        phone:phone,
+                        password:$(".onePass input").val(),
+                        rid:'',
+                        oid:'',
+                        phoneType:'',
+                        channel:'',
+                        deviceId:''
+                      }
+                    }
+                    // 账号密码登录
 						$.post("/jyapp/free/login",params,function(r){
 							if(r.status==1){
 								if(localStorage){
@@ -435,6 +469,9 @@
 							}
 						});
 					}else{
+                      trackClick('注册行为-登录/注册')
+					  // 验证码登录/注册
+                      // {reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord}
 						$.post("/jyapp/free/login",{reqType:"identCodeLogin",phone:phone,identCode:$("#identCode").val(),rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId(),disWord:disWord},function(r){
 							if(r.status==1){
 								if(localStorage){
@@ -442,6 +479,8 @@
 								}
 								$('.rules').hide()
 								loginSuccess(r);
+							}else if (r.status==-4){
+								showTip("系统错误,请重试",1000);
 							}else{
 								showTip("验证码错误",1000);
 							}
@@ -487,6 +526,7 @@
 		function changeBtnStatus(){
 			var password = $(".onePass input").val();
 			var phone = $.trim($("#tel").val());
+			var identCode = $.trim($("#identCode").val())
 			if(phone.length >= 11){
 				dcsOne = true;
 				if(wait == 60){
@@ -497,7 +537,7 @@
 	     		$("#sendIdentCode").css("color","#888888")
 			}
 			if($.trim(phone).length > 0 && (Verification.isPhone(phone) || CreatePhone.isPhone(phone))){
-				if($(".header-tab>a.header-tab-active").index() == 0){
+				if($(".header-tab>a.header-tab-active").index() == 1){
 					if($.trim(password).length > 0 && password.length >= 6){
 						$("#btn").removeClass("disabled");
 					}else{

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

@@ -3,6 +3,7 @@
 
 	<head>
 		{{include "/common/meta.html"}}
+        <meta name="description" content="注册剑鱼标讯,免费查看全国招标采购项目详情。">
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
 <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/reset.css?v={{Msg "seo" "version"}}" />
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/css/register.css?v={{Msg "seo" "version"}}" />
@@ -10,7 +11,7 @@
 		<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js" type="text/javascript"></script>
 		{{include "/common/js.html"}}
 
-		<title>注册</title>
+		<title>立即注册  -  剑鱼标讯</title>
 	</head>
 	<style>
     .register_body{

+ 60 - 63
src/jfw/modules/app/src/web/templates/me/setpwd.html

@@ -15,14 +15,53 @@
 
 		<title>设置密码</title>
 	</head>
-
+    <style>
+        body {
+            background: url(/jyapp/me/images/bg_banner.png) no-repeat;
+        }
+        #header.regpass{
+            background: url(/jyapp/me/images/register_logo.png?v=51430) no-repeat;
+            background-size: 100%;
+        }
+        #header .cancel {
+            position: absolute;
+            top: 0.84rem;
+            left: 0.24rem;
+            width: 0.48rem;
+            height: 0.48rem;
+            padding-left: 0;
+        }
+        #header .cancel>img{
+            width:100%;
+            height:100%;
+        }
+        .btn{
+            margin-top: 24px;
+        }
+        .default-btn{
+            border-radius: 8px;
+            border: 1px solid rgba(0, 0, 0, 0.05);
+            background: transparent;
+            color: rgba(23, 24, 38, .65) !important;
+        }
+        .tip-row{
+            color: #9B9CA3;
+            text-align: center;
+            font-size: 12px;
+            line-height: 18px;
+            margin-top:12px;
+        }
+       [type='password']{
+            background: transparent;
+        }
+    </style>
 	<body>
 
 		<div id="header" class="reg regpass">
-			<a href="javascript:;" class="cancle" style="padding: 15px;display: inline-block;">
-				<span class="jyapp-icon jyapp-icon-zuojiantou" style="font-size:0.4rem;"></span>
+			<a href="javascript:;" class="cancel">
+                <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/images/back.png?v={{Msg "seo" "version"}}" alt="" />
+<!--				<span class="jyapp-icon jyapp-icon-zuojiantou" style="font-size:0.4rem;"></span>-->
 			</a>
-			<h2>欢迎加入剑鱼标讯</h2>
 		</div>
 
 		<div class="takeIn">
@@ -39,6 +78,8 @@
 				<div class="tran-line-bottom"></div>
 			</div>
 			<center><button type="button" name="btn" id="btn" class="disabled btn">完成</button></center>
+            <button type="button" name="btn" id="noSet" class="default-btn btn">暂不设置</button>
+            <p class="tip-row">您可前往【我的-设置-账号与安全】<br>设置或修改密码</p>
 		</div>
     <!--S 加载荟聚SDK初始化及剑鱼自定义埋点注入 -->
     <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/header.js?v={{Msg "seo" "version"}}'></script>
@@ -104,7 +145,7 @@
 					},100);
 					commonMethod();
 				});
-				$(".closeQc").on("tap",function(){
+				$(".closeQc").on(isIos?"tap":"click",function(){
 					if($(this).prev().val().length>0){
 						$(this).prev().val("").focus();
 						$(this).hide();
@@ -138,79 +179,35 @@
 					}
           $(this).addClass("disabled");
           let params = {
-            reqType:"save",
             password:$(".onePass input").val(),
-            rid:JyObj.getPushRid(),
-            oid:getOtherPushId(),
-            phoneType:getPhoneType(),
-            channel:getChannel(),
-            deviceId:getDeviceId(),
-            s_entname:entname,
-            disWord:disWord
-          }
-          if (platform.inH5) {
-            params = {
-              reqType:"save",
-              password:$(".onePass input").val(),
-              rid:'',
-              oid:'',
-              phoneType:'',
-              channel:'',
-              deviceId:'',
-              s_entname:entname,
-              disWord:disWord
-            }
           }
           // 埋点
-          trackClick('注册行为-点击完成设置密码')
+          trackClick('注册行为-设置密码-确定')
           $.ajax({
-    				url: "/jyapp/free/register",
+    				url: "/publicapply/password/update",
     				type: "post",
-    				data: params,
+                    contentType: 'application/json',
+    				data: JSON.stringify(params),
     				dataType: "json",
     				success: function(r){
   						var url = null;
-  						if(r.status=="timeout"){
-  							url = "/jyapp/free/register";
-  							EasyAlert.show("页面超时,请重新进入");
-  						}else if(r.status=="userExists"){
-  							url = "/jyapp/free/register";
-  							EasyAlert.show("手机号已被注册");
-  						}else if(r.status=="saveError"){
-  							EasyAlert.show("数据提交失败");
-  						}else if(r.status=="y"){
-  							loginSuccess(r);
-  						}
-  						if(url != null){
-  							setTimeout(function() {
-  								window.location.href = url;
-  							}, 1000);
+  						if (r.data){
+                          checkNeedGoNewUserSettingPage()
+  						} else {
+                          EasyAlert.show("保存失败");
   						}
     				},
     				error: function(){
     					$(this).removeClass("disabled");
     				}
     			});
-					//$.post("/jyapp/free/register",{reqType:"save",password:$(".onePass input").val(),rid:JyObj.getPushRid(),oid:getOtherPushId(),phoneType:getPhoneType(),channel:getChannel(),deviceId:getDeviceId()},function(r){
-					//	var url = null;
-					//	if(r.status=="timeout"){
-					//		url = "/jyapp/free/register";
-					//		EasyAlert.show("页面超时,请重新进入");
-					//	}else if(r.status=="userExists"){
-					//		url = "/jyapp/free/register";
-					//		EasyAlert.show("手机号已被注册");
-					//	}else if(r.status=="saveError"){
-					//		EasyAlert.show("数据提交失败");
-					//	}else if(r.status=="y"){
-					//		loginSuccess(r);
-					//	}
-					//	if(url != null){
-					//		setTimeout(function() {
-					//			window.location.href = url;
-					//		}, 1000);
-					//	}
-					//});
 				})
+              // 暂不设置--跳转兴趣爱好设置页面
+              $("#noSet").on("tap", function () {
+                // 埋点
+                trackClick('注册行为-设置密码-暂不订阅')
+                checkNeedGoNewUserSettingPage()
+              })
 			})
 			function commonMethod(){
 				if($.trim($(".onePass input").val()).length >= 6 && $.trim($(".againPass input").val()).length >= 6){

+ 153 - 68
src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html

@@ -4,19 +4,23 @@
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
     <meta name="keywords" content="{{.T.obj.keywords}}">
     <meta name="description" content="{{.T.obj.description}}">
-    <title>公告信息</title>
+    <title>{{.T.obj.title}} - 剑鱼标讯</title>
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/alertPopShow.css?v={{Msg "seo" "version"}}" rel="stylesheet">
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/bootstrap.min.css?v={{Msg "seo" "version"}}" rel="stylesheet">
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" rel="stylesheet">
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/common.css?v={{Msg "seo" "version"}}" rel="stylesheet">
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/wxswordfish/style.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+    <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/public.css?v={{Msg "seo" "version"}}" />
+    <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/j-icons.css?v={{Msg "seo" "version"}}" />
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/share.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/wxinfocontent.css?v={{Msg "seo" "version"}}1"/>
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/nps-common/css/nps.css?v={{Msg "seo" "version"}}'/>
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
     <link rel="stylesheet" href="//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css">
     <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/mainSearch/css/third-party-verify-mobile.css?v={{Msg "seo" "version"}}'/>
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
     <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/fastclick.min.js"></script>
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/jquery.cookie.js?v={{Msg "seo" "version"}}"></script>
@@ -27,6 +31,9 @@
 
     {{include "/common/js.html"}}
     <style>
+      html > body {
+        background: #fff;
+      }
       .unitbtn{
         margin-left: .28rem;
         font-size: 0.26rem;
@@ -57,6 +64,9 @@
       .custom-dialog{
         z-index: 100001!important;
       }
+      .popup-bid-update, .popupTime{
+        z-index: 100001!important;
+      }
       .custom-dialog .van-dialog__header{
         font-size: 18px;
         color: #161826;
@@ -193,6 +203,14 @@
         color: #FF3A20;
         margin-bottom: -19px;
       }
+      .big-ad-img {
+          display: none;
+      }
+      .big-ad-img img{
+          width:100%;
+          cursor: pointer;
+          display:none
+      }
     </style>
 </head>
 <body>
@@ -229,56 +247,56 @@
         <span class="app-back jyapp-icon jyapp-icon-zuojiantou share-back"></span>
         <span class="header-title">公告信息</span>
         <span class="header-share" id="share">
-		<img class="share-gift" src="/jyapp/images/jianyubi.png">
-		<p class="share-gift" style="font-size: 10px; line-height: 12px">分享有礼</p>
-    <div class="overlay">
-      <div class="share-sheet">
-        <div class="title">
-          <h4>分享有礼</h4>
-          <img src="/jyapp/images/img/close.png" alt="" class="close">
-        </div>
-        <!-- <div class="description">
-          <img src="/jyapp/images/hongbao.png" alt="">
-          <p>分享剑鱼标讯产品给好友,购买成功您得佣金</p>
-          <a href="/page_partner/partner/partner.html?flag=1">了解详情</a>
-        </div> -->
-        <div class="description">
-          <img src="/jyapp/images/jianyubi.png" alt="">
-          <p>分享招标信息及文档,好友访问立得剑鱼币</p>
-          <a href="/page_points_mobile/share">了解详情</a>
-        </div>
-        <div class="sheet-option">
-          <ul class="shareType">
-            <li id="weixin " class="Software">
-              <img src="/jyapp/images/img/weixin.png" alt="">
-              <span>微信</span>
-            </li>
-            <li id="pengyouquan" class="Software">
-              <img src="/jyapp/images/img/pengyouquan.png" alt="">
-              <span>朋友圈</span>
-            </li>
-            <li id="qq"  class="Software">
-              <img src="/jyapp/images/img/qq.png" alt="">
-              <span>QQ</span>
-            </li>
-            <!-- <li id="kouling">
-              <img src="/jyapp/images/img/kouling.png" alt="">
-              <span>口令分享</span>
-            </li>
-            <li id="lianjie">
-              <img src="/jyapp/images/img/lianjie.png" alt="">
-              <span>链接分享</span>
-            </li>
-            <li id="tupian1">
-              <img src="/jyapp/images/img/tupian.png" alt="">
-              <span>图片分享</span>
-            </li> -->
-          </ul>
+            <img class="share-gift" src="/jyapp/images/jianyubi.png">
+            <p class="share-gift" style="font-size: 10px; line-height: 12px">分享有礼</p>
+            <div class="overlay">
+              <div class="share-sheet">
+                <div class="title">
+                  <h4>分享有礼</h4>
+                  <img src="/jyapp/images/img/close.png" alt="" class="close">
+                </div>
+                <!-- <div class="description">
+                  <img src="/jyapp/images/hongbao.png" alt="">
+                  <p>分享剑鱼标讯产品给好友,购买成功您得佣金</p>
+                  <a href="/page_partner/partner/partner.html?flag=1">了解详情</a>
+                </div> -->
+                <div class="description">
+                  <img src="/jyapp/images/jianyubi.png" alt="">
+                  <p>分享招标信息及文档,好友访问立得剑鱼币</p>
+                  <a href="/page_points_mobile/share">了解详情</a>
+                </div>
+                <div class="sheet-option">
+                  <ul class="shareType">
+                    <li id="weixin " class="Software">
+                      <img src="/jyapp/images/img/weixin.png" alt="">
+                      <span>微信</span>
+                    </li>
+                    <li id="pengyouquan" class="Software">
+                      <img src="/jyapp/images/img/pengyouquan.png" alt="">
+                      <span>朋友圈</span>
+                    </li>
+                    <li id="qq"  class="Software">
+                      <img src="/jyapp/images/img/qq.png" alt="">
+                      <span>QQ</span>
+                    </li>
+                    <!-- <li id="kouling">
+                      <img src="/jyapp/images/img/kouling.png" alt="">
+                      <span>口令分享</span>
+                    </li>
+                    <li id="lianjie">
+                      <img src="/jyapp/images/img/lianjie.png" alt="">
+                      <span>链接分享</span>
+                    </li>
+                    <li id="tupian1">
+                      <img src="/jyapp/images/img/tupian.png" alt="">
+                      <span>图片分享</span>
+                    </li> -->
+                  </ul>
+                </div>
+              </div>
         </div>
-      </div>
-    </div>
             <!-- 分享 end -->
-	</span>
+	    </span>
     </div>
     <div class="app-layout-content-b">
         <div class="mask"></div>
@@ -445,10 +463,10 @@
                             // }
 
                             // 金额标签处理
-                            if(typeof(moneyTag.budget) != "undefined" && moneyTag.budget != null && moneyTag.budget != "" && userId){
+                            if(typeof(moneyTag.budget) != "undefined" && moneyTag.budget != null && moneyTag.budget != "" && userId && isNaN(moneyTag.budget) == false){
                                 moneyTag.content = MoneyUnit.test(moneyTag.budget);
                             }
-                            if(typeof(moneyTag.bidamount) != "undefined" && moneyTag.bidamount != null && moneyTag.bidamount != ""  && userId){
+                            if(typeof(moneyTag.bidamount) != "undefined" && moneyTag.bidamount != null && moneyTag.bidamount != ""  && userId &&  isNaN(moneyTag.bidamount) == false){
                                 moneyTag.content = MoneyUnit.test(moneyTag.bidamount);
                             }
                             if(moneyTag.content){
@@ -479,7 +497,7 @@
                               <span class="icon weishoucang"></span>
                               <span class="icon-text">收藏</span>
                           </div>
-                          {{if or .T.obj.projectname .T.obj.projectcode}}<div class="follow" style="top:1px !important;display: none">{{if .T.obj.followFlag}}<i class="glyphicon yiguanzhu"></i>已关注{{else}}<i class="glyphicon weiguanzhu"></i>关注项目{{end}}</div><!--<a href="/swordfish/share/-1" style="text-decoration: none;color:#24C0D7;"><span class="follow"><i class="glyphicon weiguanzhu"></i></span>关注项目</a>-->{{end}}
+                          {{if or .T.obj.projectname .T.obj.projectcode}}<div class="follow" style="top:1px !important;">{{if .T.obj.followFlag}}<i class="glyphicon yiguanzhu"></i>已关注{{else}}<i class="glyphicon weiguanzhu"></i>关注项目{{end}}</div><!--<a href="/swordfish/share/-1" style="text-decoration: none;color:#24C0D7;"><span class="follow"><i class="glyphicon weiguanzhu"></i></span>关注项目</a>-->{{end}}
                           <div class="forward-share">
                             <forwardshare :params="params"></forwardshare>
                           </div>
@@ -497,6 +515,11 @@
                         <img style="display: none;margin-left: .16rem;" class="canbiao" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/canbiao.png?v={{Msg "seo" "version"}}" alt="">
                         <span style="display: none;" class="isCB canbiao">终止参标</span>
                       </div>
+                      <van-popup class="popup-bid-update" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+                        <div class="j-container">
+                          <bid-status-node :show-bid-status="showBidStatus" @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+                        </div>
+                      </van-popup>
                     </div>
                 {{else}}
                     <!--非付费用户-->
@@ -546,10 +569,10 @@
                                 budget: {{.T.obj.budget}}
                             }
                             // 金额标签处理
-                            if(typeof(moneyTag.budget) != "undefined" && moneyTag.budget != null && moneyTag.budget != "" && userId){
+                            if(typeof(moneyTag.budget) != "undefined" && moneyTag.budget != null && moneyTag.budget != "" && userId  && isNaN(moneyTag.budget) == false){
                                 moneyTag.content = MoneyUnit.test(moneyTag.budget);
                             }
-                            if(typeof(moneyTag.bidamount) != "undefined" && moneyTag.bidamount != null && moneyTag.bidamount != "" && userId){
+                            if(typeof(moneyTag.bidamount) != "undefined" && moneyTag.bidamount != null && moneyTag.bidamount != "" && userId  && isNaN(moneyTag.bidamount) == false){
                                 moneyTag.content = MoneyUnit.test(moneyTag.bidamount);
                             }
                             if(moneyTag.content){
@@ -565,22 +588,23 @@
                     <!-- 标签列表 -->
                     <div class="collec_list"></div>
                     <div class="tool_bottom">
+                        <script>
+                          var l_publishtime = {{.T.obj.publishtimeShorDate}};
+                          if(l_publishtime != "" && l_publishtime!=null){
+                            document.write("<span class='timebefore'>"+l_publishtime+"</span>");
+                          }
+                        </script>
                         <div class="right-container">
                             <div class="collec_star">
                                 <span class="icon weishoucang"></span>
                                 <span class="icon-text">收藏</span>
                             </div>
-                            {{if or .T.obj.projectname .T.obj.projectcode}}<span class="follow" style="display: none">{{if .T.obj.followFlag}}<i class="glyphicon yiguanzhu"></i>已关注{{else}}<i class="glyphicon weiguanzhu"></i>关注项目{{end}}</span><!--<a href="/swordfish/share/-1" style="text-decoration: none;color:#24C0D7;"><span class="follow"><i class="glyphicon weiguanzhu"></i></span>关注项目</a>-->{{end}}
+                            {{if or .T.obj.projectname .T.obj.projectcode}}<span class="follow">{{if .T.obj.followFlag}}<i class="glyphicon yiguanzhu"></i>已关注{{else}}<i class="glyphicon weiguanzhu"></i>关注项目{{end}}</span><!--<a href="/swordfish/share/-1" style="text-decoration: none;color:#24C0D7;"><span class="follow"><i class="glyphicon weiguanzhu"></i></span>关注项目</a>-->{{end}}
                             <div class="forward-share">
                               <forwardShare :params="params"></forwardShare>
                             </div>
                         </div>
-                        <script>
-                            var l_publishtime = {{.T.obj.publishtimeShorDate}};
-                            if(l_publishtime != "" && l_publishtime!=null){
-                                    document.write("<span class='timebefore'>"+l_publishtime+"</span>");
-                            }
-                        </script>
+
                     </div>
                     <div class="refer_stand">
                       <div class="r-s-left">
@@ -592,6 +616,11 @@
                         <img class="canbiao" style="display: none;" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/canbiao.png?v={{Msg "seo" "version"}}" alt="">
                         <span class="isCB"></span>
                       </div>
+                      <van-popup class="popup-bid-update" :style="popupHeight" v-model="showBidStatus" round position="bottom">
+                        <div class="j-container">
+                          <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
+                        </div>
+                      </van-popup>
                     </div>
                 {{end}}
                 <div class="forecast" style="display: none">
@@ -600,6 +629,13 @@
                 </div>
             </div>
         </div>
+        <!--    免费用户或未登录-->
+        <div class="big-ad-img free-btn-reword">
+            <!--        拟建项目显示-->
+            <img class="nj-ad" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember2.png"/>
+            <!--        采购意向显示-->
+            <img class="cgyx-ad" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember.png"/>
+        </div>
         <div class="newuser hidden">
             <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/wx/newuser.png?v={{Msg "seo" "version"}}"/>
         </div>
@@ -975,6 +1011,7 @@
 <script src='/common-module/mainSearch/js/advanced-project-table-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='/common-module/nps-common/js/nps.js?v={{Msg "seo" "version"}}'></script>
 <script src='/common-module/forward-share/js/forward.js?v={{Msg "seo" "version"}}'></script>
+<script src='/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
 <!-- <script src="https://cdn.bootcss.com/vConsole/3.3.4/vconsole.min.js"></script>
 <script> new VConsole(); </script> -->
 <script>
@@ -1037,7 +1074,7 @@
     // 未登录展示登录模块
     if(!userId) {
       $('.noLoginShow').show()
-      $('.share-gift').hide()
+      // $('.share-gift').hide()
       $('.bid-dec-in').hide()
       $('.bigvip_drain').hide()
       $('.abs').hide()
@@ -1255,6 +1292,7 @@
                 hasServiceArr = res.data.power ? res.data.power : []
                 isFollow()
                 checkShowDialog()
+                showTopAd()
                 var isVip = {{.T.isVip}}
                 //是大会员
                 var bigWinnerTel = checkFreeView({{.T.obj.winnertel}});
@@ -1391,11 +1429,14 @@
         // 显示隐藏
         if (!canRead) {
             // $(".prebuilt").remove()
-            $('#tab2').hide() // 摘要tab1+正文tab2
-            $(".tab-ct").hide() // 正文信息
-            $(".abs").hide() // 阅读原文和意见反馈
-            $(".atta-list").hide() // 附件列表
-            $(".mask-zz").removeClass("hidden");
+            if(subtype != '拟建') {
+              $('#tab2').hide() // 摘要tab1+正文tab2
+              $(".tab-ct").hide() // 正文信息
+              $(".abs").hide() // 阅读原文和意见反馈
+              $(".atta-list").hide() // 附件列表
+              $(".mask-zz").removeClass("hidden");
+            }
+
         } else {
             $(".prebuilt").css('height', 'unset')
             if(userId) {
@@ -1405,6 +1446,13 @@
             }
         }
     }
+  // 是否展示详情上方的广告位
+  function showTopAd () {
+    if(!canRead && userId && subtype == '拟建') {
+      $('.big-ad-img').show()
+      $('.nj-ad').show()
+    }
+  }
     function appAutoLogin(){
       // 去登录
         const url = `/jyapp/article/content/${id}.html`
@@ -1628,6 +1676,35 @@
     //     }
     //   })
     // }
+    // 参标展示更新投标状态弹窗
+    var showUpdateBid = new Vue({
+      el: '.refer_stand',
+      components: {
+        bidStatusNode: bidStatusNode
+      },
+      data: {
+        showBidStatus: false,
+        popupHeight: 'height: 8.8rem;z-index:100001!important',
+        projectCellInfo: {}
+      },
+      methods: {
+        setHeight: function (data) {
+          if(data === 2) {
+            this.popupHeight = 'height: 10.92rem;z-index:100001!important'
+          } else {
+            this.popupHeight = 'height: 8.8rem;z-index:100001!important'
+          }
+        },
+        // 更新投标状态成功
+        saveSuccess: function () {
+          this.showBidStatus = false
+        },
+        // 取消更新投标状态
+        cancelUpdate: function () {
+          this.showBidStatus = false
+        },
+      }
+    })
 
     // 点击参标
     $('.refer_stand .r-s-right').on('click', function(e) {
@@ -1646,6 +1723,7 @@
       const params = {
         bidIds: id
       }
+      showUpdateBid.projectCellInfo.sid = id
       const outParams = {
         projectIds: canBiaoInfo.projectId
       }
@@ -1659,7 +1737,8 @@
             if(res.data) {
               getCanBiaoInfo()
               if (type === 'in') {
-                EasyAlert.show('已参标,请前往我的参标项目列表查看')
+                showUpdateBid.showBidStatus = true
+                // EasyAlert.show('已参标,请前往我的参标项目列表查看')
               }
               // 更新收藏列表
               const updateCBStatus = {
@@ -2333,6 +2412,12 @@
           },100)
       });
       $(".header-share").click(function(){
+         if(!userId){
+           $('.overlay').hide()
+           const url = `/jyapp/article/content/${id}.html`
+           autoLogin(url)
+           return
+         }
           $(".depthread-share").hide();
           $("#sharelist").toggleClass("hide");
       });

+ 9 - 0
src/jfw/modules/app/src/web/templates/weixin/wxtsguide.html

@@ -368,6 +368,11 @@ if(localStorage && localStorage.tsGuide_status == "1"){
 				showPopForArea: false
 			}
 		},
+        created: function () {
+          if(localStorage && localStorage.tsGuide_area) {
+             this.selectArea =  localStorage.tsGuide_area
+          }
+        },
 		methods: {
 			togglePopForArea (status) {
 				this.showPopForArea = status
@@ -387,6 +392,10 @@ if(localStorage && localStorage.tsGuide_status == "1"){
 				} else {
 					this.selectArea = selectArea
 				}
+				// 存储所选地区(h5页面刷新页面,需要重新获取地区用以请求接口)
+                if(localStorage) {
+                  localStorage.tsGuide_area = this.selectArea
+                }
 				this.togglePopForArea(false)
 			},
 		}

+ 16 - 1
src/jfw/modules/bigmember/src/entity/marketAnalysis/commonSearch.go

@@ -2,6 +2,8 @@ package marketAnalysis
 
 import (
 	qutil "app.yhyue.com/moapp/jybase/common"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	mgo "app.yhyue.com/moapp/jybase/mongodb"
 	"fmt"
 	"strings"
 )
@@ -46,7 +48,20 @@ func (mae *MarketAnalysisEntity) GetCommonQuerySql() string {
 	}
 	//中标企业
 	if mae.FormatParam.Winner != "" {
-		musts = append(musts, fmt.Sprintf(`{"term":{"s_winner":"%s"}}`, mae.FormatParam.Winner))
+		var winnerId string
+		if mgo.IsObjectIdHex(mae.FormatParam.Winner) {
+			winnerId = mae.FormatParam.Winner
+		} else {
+			rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query": {"bool": {"must": [{"term": {"company_name": "%s"}}]}},"_source":["_id"],"size": 1}`, mae.FormatParam.Winner))
+			if rData != nil && len(*rData) > 0 {
+				winnerId = qutil.InterfaceToStr((*rData)[0]["_id"])
+			}
+		}
+		if winnerId != "" {
+			musts = append(musts, fmt.Sprintf(`{"term":{"entidlist":"%s"}}`, winnerId))
+		} else {
+			musts = append(musts, fmt.Sprintf(`{"term":{"s_winner":"%s"}}`, mae.FormatParam.Winner))
+		}
 	}
 	//采购单位
 	if mae.FormatParam.Buyer != "" {

+ 31 - 3
src/jfw/modules/bigmember/src/entity/portrait.go

@@ -1,12 +1,14 @@
 package entity
 
 import (
+	"app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"errors"
 	"fmt"
 	"jy/src/jfw/modules/bigmember/src/config"
 	"jy/src/jfw/modules/bigmember/src/db"
 	"log"
+	"math/rand"
 	"strings"
 	"time"
 
@@ -112,15 +114,41 @@ func CreatePortraitManagerForContacts(session *httpsession.Session, entType int6
 	return &Portrait{uid, session}, nil
 }
 
+func NoLoginAssociatedInfo(entId string) []map[string]interface{} {
+	var (
+		winnerData []map[string]interface{}
+	)
+	entinfo, ok := db.Mgo_Ent.FindOneByField("qyxy_std", map[string]interface{}{"_id": entId}, map[string]interface{}{
+		"company_area": 1, //城市
+	})
+	if ok && entinfo != nil && len(*entinfo) > 0 {
+		randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
+		from := randGen.Intn(100)
+		//关联中标企业
+		r := es.Get("qyxy", "qyxy", fmt.Sprintf(`{"query": {"bool": {"must": [{"query_string": {"default_field": "company_area","query": "%s*"}}]}},"_source": ["_id","company_name"],"from": %d,"size": 30}`, qutil.InterfaceToStr((*entinfo)["company_area"]), from))
+		if r != nil {
+			winnerData = *r
+		}
+
+		for _, v := range winnerData {
+			v["_id"] = encrypt.EncodeArticleId2ByCheck(qutil.InterfaceToStr(v["_id"]))
+			v["name"] = qutil.InterfaceToStr(v["company_name"])
+			delete(v, "company_name")
+		}
+	}
+	return winnerData
+}
+
 // CreateSubVipPortraitManager 超级订阅权限校验
 // int -1无权限 1免费权限 2超级订阅次数&采购单位流量包 3使用体验
 func CreateSubVipPortraitManager(userid string, pageFlag, searchValue string, isWinner bool, session *httpsession.Session) (*Portrait, int, error, bool) {
 	if userid == "" {
+		if pageFlag == "entDetail" { //未登录用户获取基本信息 与基础分析信息
+			return &Portrait{userid, session}, 1, nil, true
+		}
 		return nil, -1, errors.New("未登录"), true
 	}
-	if pageFlag == "" {
-		return nil, -1, errors.New("未知请求"), true
-	}
+
 	if pageFlag != "entDetail" { //需要权限校验的接口
 		bigMsg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
 		if bigMsg.VipStatus <= 0 || bigMsg.Vip_BuySet.Upgrade != 1 { //免费用户留资体验

+ 3 - 2
src/jfw/modules/bigmember/src/entity/portraitBuyerSearch.go

@@ -16,11 +16,11 @@ import (
 
 const (
 	buyer_query_address    = `{"query":{"bool":{"must":[{"term":{"buyer_name":"%s"}}]}},"size":1,"_source":["city","province","buyerclass"]}`
-	buyerPortraitSearchSql = `{"query":{"bool":{"must":[%s]}},"aggs":{"year_bidamount":{"range":{"field":"jgtime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}}}},"fail_count":{"filter":{"bool":{"must":[{"term":{"bidstatus":"流标"}}]}}},"winner_count":{"cardinality":{"field":"entidlist"}},"bidamount_count":{"sum":{"field":"bidamount"}},"moneyRange":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"moneyRangeValue":{"range":{"field":"bidamount","ranges":[%s]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"bidtypeData":{"filter":{"bool":{"must":{"terms":{"bidtype":["招标","邀标","询价","单一","竞价","竞谈"]}}}},"aggs":{"bidtype_group":{"terms":{"field":"bidtype"},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}}}},"bidamount_count":{"sum":{"field":"bidamount"}}}},"topScopeclassData":{"terms":{"field":"topscopeclass","size":12,"order":[{"bidamount_count":"desc"}]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"top_scopeclass_rate_time_avg":` + YearRate + `}},"allScopeclassData":` + YearRate + `,"topAgencyData":{"terms":{"field":"agency","size":10,"order":[{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}}}},"topWinner":{"terms":{"field":"entidlist","order":[{"count_bidamount":"desc"},{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}},"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"firstWinner":{"terms":{"field":"first_cooperation"}},"allWinnerList":{"terms":{"field":"entidlist","size":10000},"aggs":{"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":` + BaseRate + `}}},"size":0}`
+	buyerPortraitSearchSql = `{"query":{"bool":{"must":[%s]}},"aggs":{"year_bidamount":{"range":{"field":"jgtime","ranges":[%s]},"aggs":{"count":{"sum":{"field":"bidamount"}}}},"fail_count":{"filter":{"bool":{"must":[{"term":{"bidstatus":"流标"}}]}}},"winner_count":{"cardinality":{"field":"entidlist"}},"bidamount_count":{"sum":{"field":"bidamount"}},"moneyRange":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"moneyRangeValue":{"range":{"field":"bidamount","ranges":[%s]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"bidtypeData":{"filter":{"bool":{"must":{"terms":{"bidtype":["招标","邀标","询价","单一","竞价","竞谈"]}}}},"aggs":{"bidtype_group":{"terms":{"field":"bidtype"},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}}}},"bidamount_count":{"sum":{"field":"bidamount"}}}},"topScopeclassData":{"terms":{"field":"topscopeclass","size":12,"order":[{"bidamount_count":"desc"}]},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"top_scopeclass_rate_time_avg":` + YearRate + `}},"allScopeclassData":` + YearRate + `,"topAgencyData":{"terms":{"field":"agency","size":10,"order":[{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}}}},"topWinner":{"terms":{"field":"entidlist","size":50,"order":[{"count_bidamount":"desc"},{"_count":"desc"},{"last_with_time":"desc"}]},"aggs":{"last_with_time":{"max":{"field":"jgtime"}},"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":{"filter":{"bool":{"must":{"range":{"project_rate":{"gte":0,"lte":0.6}}}}},"aggs":{"bidamount_count":{"sum":{"field":"bidamount"}},"budget_count":{"sum":{"field":"budget"}}}}}},"firstWinner":{"terms":{"field":"first_cooperation","size":50}},"allWinnerList":{"terms":{"field":"entidlist","size":10000},"aggs":{"count_bidamount":{"sum":{"field":"bidamount"}},"avg_data":` + BaseRate + `}}},"size":0}`
 	queryTermByIdSql       = `{"terms":{"_id":[%s]}}`
 
 	queryMustSql                = `{"query":{"bool":{"must":[%s]}}}`
-	buyerWithEntThreadSearchNum = 50
+	buyerWithEntThreadSearchNum = 50 * 4
 	buyerWithEntPortraitSqlPage = `{"query":{"bool":{"must":[%s]}},"_source":["_id","company_area","capital","establish_date","tag_business"],"from":%d,"size":%d}`
 )
 
@@ -579,6 +579,7 @@ func GetWithEntPortraitData(listDataItf interface{}, province string, bidamountO
 
 	tBegin := time.Now()
 	doSearchSql := fmt.Sprintf(queryTermByIdSql, `"`+strings.Join(winnerIdList, `","`)+`"`)
+
 	searchNum := elastic.Count("qyxy", "qyxy", fmt.Sprintf(queryMustSql, doSearchSql))
 	if searchNum == 0 {
 		return nil, 0, errors.New("中标企业数量为空")

+ 46 - 40
src/jfw/modules/bigmember/src/filter/sessionfilter.go

@@ -1,57 +1,63 @@
 package filter
 
 import (
-    "jy/src/jfw/modules/bigmember/src/config"
-    "jy/src/jfw/modules/bigmember/src/db"
-    "net/http"
-    "regexp"
+	"jy/src/jfw/modules/bigmember/src/config"
+	"jy/src/jfw/modules/bigmember/src/db"
+	"net/http"
+	"regexp"
+	"strings"
 
-    . "app.yhyue.com/moapp/jybase/api"
-    util "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	. "app.yhyue.com/moapp/jybase/api"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
 
-//登录限制
+// 登录限制
 type sessionfilter struct {
-    App *xweb.App
+	App *xweb.App
 }
 
-//需要权限判断的地址
+// 需要权限判断的地址
 var needReg = regexp.MustCompile("^/bigmember/(potential|forecast|decision|analysis|subscribe)/.+$") //画像接口中判断权限
 
 func init() {
-    jy.InitBigVipService(db.Mysql)
+	jy.InitBigVipService(db.Mysql)
 }
 
 func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
-    session := l.App.SessionManager.Session(req, w)
-    getSession := session.GetMultiple()
-    if getSession["userId"] != nil && getSession["mgoUserId"] == nil && util.Int64All(getSession["positionType"]) == 0 {
-        session.Set("mgoUserId", getSession["userId"])
-    }
-    match := needReg.FindStringSubmatch(req.URL.Path)
-    if len(match) == 0 {
-        return true
-    }
-    //免费用户搜索词订阅接口开放
-    if req.URL.Path == "/bigmember/subscribe/freeUser/searchSubscribe" || req.URL.Path == "/bigmember/subscribe/freeUser/subscribeSearch" {
-        return true
-    }
-    userId, ok := getSession["userId"].(string)
-    if !ok || userId == "" {
-        R.ServeJson(w, req, &Result{Error_code_1004, Error_msg_1004, nil})
-        return false
-    }
-    //投标决策分析前置接口开放
-    if req.URL.Path == "/bigmember/decision/freeDecInfo" || req.URL.Path == "/bigmember/analysis/projectName" || req.URL.Path == "/bigmember/analysis/projectInfo" || req.URL.Path == "/bigmember/project/getPdfDetail" {
-        return true
-    }
-    bigMeg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
-    if !bigMeg.CheckBigVipBackPower(match[1]) {
-        R.ServeJson(w, req, &Result{Error_code_1004, Error_msg_1004, nil})
-        return false
-    }
-    return true
+	session := l.App.SessionManager.Session(req, w)
+	getSession := session.GetMultiple()
+	if getSession["userId"] != nil && getSession["mgoUserId"] == nil && util.Int64All(getSession["positionType"]) == 0 {
+		session.Set("mgoUserId", getSession["userId"])
+	}
+	match := needReg.FindStringSubmatch(req.URL.Path)
+	if len(match) == 0 {
+		return true
+	}
+	//免费用户搜索词订阅接口开放
+	if req.URL.Path == "/bigmember/subscribe/freeUser/searchSubscribe" || req.URL.Path == "/bigmember/subscribe/freeUser/subscribeSearch" {
+		return true
+	}
+	userId, ok := getSession["userId"].(string)
+	if !ok || userId == "" {
+		R.ServeJson(w, req, &Result{Error_code_1004, Error_msg_1004, nil})
+		return false
+	}
+	//投标决策分析前置接口开放
+	if strings.Contains(req.URL.Path, "/bigmember/decision/freeDecInfo") || strings.Contains(req.URL.Path, "/bigmember/analysis/projectName") ||
+		strings.Contains(req.URL.Path, "/bigmember/analysis/projectInfo") || strings.Contains(req.URL.Path, "/bigmember/project/getPdfDetail") {
+		return true
+	}
+	//企业画像部分免费功能接口开放
+	if strings.Contains(req.URL.Path, "/bigmember/portrait/subVipPortrait/entDetail") { //超级订阅页面基本信息接口
+		return true
+	}
+	bigMeg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
+	if !bigMeg.CheckBigVipBackPower(match[1]) {
+		R.ServeJson(w, req, &Result{Error_code_1004, Error_msg_1004, nil})
+		return false
+	}
+	return true
 }

+ 4 - 4
src/jfw/modules/bigmember/src/go.mod

@@ -3,9 +3,9 @@ module jy/src/jfw/modules/bigmember/src
 go 1.19
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb
+	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064
+	app.yhyue.com/moapp/jypkg v0.0.0-20230710012638-0d2f7219700e
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/donnie4w/go-logger v0.0.0-20230316073421-36a48f87a69a
 	github.com/gogf/gf/v2 v2.4.2
@@ -125,7 +125,7 @@ require (
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
 	google.golang.org/grpc v1.56.1 // indirect
-	google.golang.org/protobuf v1.30.0 // indirect
+	google.golang.org/protobuf v1.31.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
@@ -134,7 +134,7 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602 // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e // indirect
 	k8s.io/api v0.26.3 // indirect
 	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
 	k8s.io/client-go v0.26.3 // indirect

+ 8 - 8
src/jfw/modules/bigmember/src/go.sum

@@ -5,12 +5,12 @@ app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:J
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb h1:fT7FIKElKjkRHTmDxXPeNr5LWe2RmyJU+5aod1nptek=
-app.yhyue.com/moapp/jybase v0.0.0-20230614085041-f8f20842d5cb/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf h1:/Tk5haITmGc5c3/y6VxyycIy/LBWO7aYlxTiHKxmzv0=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064 h1:iHqmyjzumVbeWeN1f4l+cpuRBizCO/VZvOUyGD5b/EM=
-app.yhyue.com/moapp/jypkg v0.0.0-20230627060822-53aa53e4d064/go.mod h1:JBkMSnaOQbfV80laTPwjzjfP6nLXOQpJBaNUdvKV2tw=
+app.yhyue.com/moapp/jypkg v0.0.0-20230710012638-0d2f7219700e h1:phO8+opFgz3p1XebtdLepM1u8q/TE/EgLYjP4Ebt/jU=
+app.yhyue.com/moapp/jypkg v0.0.0-20230710012638-0d2f7219700e/go.mod h1:wbDWBpLODtGhkQw4dCShvmRr6G8CazuW8kWq42paQOM=
 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=
@@ -1358,8 +1358,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
-google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
+google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
@@ -1420,8 +1420,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602 h1:lZ0XCzRDSOBaoJczQudZ3KZhRs4zm5sjboDpwuYZUVM=
-jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230626055559-2b719f6c6602/go.mod h1:Jjhym3U0MFdSgeafHPm758NefCPZpekg2sWPh6Gy6Jk=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e h1:1O11hFuKvLD3Ls+9wxssUpMV3fG9qD4EfeeAy92dsWY=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e/go.mod h1:wBxeFODhYtGenkxXJGThN/VrFaxPvvHMxzpS09pxApM=
 k8s.io/api v0.22.9/go.mod h1:rcjO/FPOuvc3x7nQWx29UcDrFJMx82RxDob71ntNH4A=
 k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU=
 k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE=

+ 38 - 0
src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go

@@ -34,6 +34,7 @@ type EntPortrait struct {
 	buyerMiniPortrait xweb.Mapper `xweb:"/portrait/buyer/miniData"`        //三级页展示采购单位基础画像信息
 	portraitContacts  xweb.Mapper `xweb:"/portrait/contacts"`              // 画像通讯录接口
 
+	noLoginAssociatedInfo xweb.Mapper `xweb:"/portrait/winner/noLoginAssociatedInfo"` //未登录用户画像详情页、关联标讯动态&关联中标企业
 }
 
 // EntDetail 企业基本信息
@@ -411,6 +412,14 @@ func (this *EntPortrait) BuyerPortrait() {
 			return nil, err
 		}
 		entName := this.GetString("buyer")
+		//id转中文
+		if len(entName) > 0 && len([]rune(entName)) == len(entName) {
+			//获取中文名字
+			entName = getBuyerNameById(util.DecodeId(entName))
+		}
+		if entName == "" {
+			return nil, fmt.Errorf("参数异常")
+		}
 		flag := this.GetString("flag") //分段请求标识
 		rData, err := cepm.BuyerPortraitData(&entity.PortraitScreen{
 			Ent:        entName,
@@ -426,6 +435,7 @@ func (this *EntPortrait) BuyerPortrait() {
 		if err != nil {
 			return nil, err
 		}
+		rData["name"] = entName
 		return rData, nil
 	}()
 	if errMsg != nil {
@@ -501,6 +511,34 @@ func (this *EntPortrait) PortraitContacts() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
+func (this *EntPortrait) NoLoginAssociatedInfo() {
+	rData := func() interface{} {
+		entId := util.DecodeId(this.GetString("entId"))
+		if entId == "" {
+			return nil
+		}
+		// 未登录用户关联中标企业
+		data := entity.NoLoginAssociatedInfo(entId)
+		var cepm *entity.Portrait
+		rData, _, _ := cepm.GetWinnerNewMsg(&entity.PortraitProjectScreen{
+			Screen: &entity.PortraitScreen{
+				Ent:        entId,
+				Match:      this.GetString("match"),
+				ExactMatch: this.GetString("exactMatch") == "1",
+				MatchRange: this.GetString("matchRange"),
+				Area:       this.GetString("area"),
+				ScopeClass: this.GetString("scopeClass"),
+				TimeRange:  this.GetString("timeRange"),
+				HasPower:   true,
+			},
+			PageNum:  1,
+			PageSize: 10,
+		})
+		return map[string]interface{}{"hostWinner": data, "newWinner": rData}
+	}()
+	this.ServeJson(NewResult(rData, nil))
+}
+
 // formatContact 格式化混淆联系人电话
 func formatContact(contactList []map[string]interface{}) (confusing []map[string]interface{}, total int) {
 	total = len(contactList)

+ 54 - 4
src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go

@@ -1,6 +1,8 @@
 package portrait
 
 import (
+	"app.yhyue.com/moapp/jybase/redis"
+	"encoding/json"
 	"errors"
 	"fmt"
 	"jy/src/jfw/modules/bigmember/src/config"
@@ -70,10 +72,13 @@ func (this *SubVipPortrait) SubVipWinnerNewMsg() {
 		if entId == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
-		cepm, power, err, _ := entity.CreateSubVipPortraitManager(userId, "entNewMsg", entId, true, this.Session())
+		cepm, power, err, free := entity.CreateSubVipPortraitManager(userId, "entNewMsg", entId, true, this.Session())
 		if err != nil {
 			return nil, err
 		}
+		if free {
+			return nil, errors.New("无查看权益")
+		}
 		if power <= 1 {
 			return nil, errors.New("非法请求")
 		}
@@ -189,10 +194,13 @@ func (this *SubVipPortrait) SubVipPortrait() {
 		if entId == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
-		cepm, power, err, _ := entity.CreateSubVipPortraitManager(userId, "entPortrait", entId, true, this.Session())
+		cepm, power, err, free := entity.CreateSubVipPortraitManager(userId, "entPortrait", entId, true, this.Session())
 		if err != nil {
 			return nil, err
 		}
+		if free {
+			return nil, fmt.Errorf("无查看权益")
+		}
 		rData, err := cepm.WinnerPortraitData(&entity.PortraitScreen{
 			Ent:        entId,
 			Match:      this.GetString("match"),
@@ -332,12 +340,18 @@ func (this *SubVipPortrait) BuyerNewMsg() {
 		if buyer == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
+		if userId == "" {
+			return nil, fmt.Errorf("未登录")
+		}
 		pageNum, _ := this.GetInteger("pageNum")
 		pageSize, _ := this.GetInteger("pageSize")
-		cepm, power, err, _ := entity.CreateSubVipPortraitManagerForOpen(userId, "buyerPortrait", buyer, false, this.Session())
+		cepm, power, err, free := entity.CreateSubVipPortraitManagerForOpen(userId, "buyerPortrait", buyer, false, this.Session())
 		if err != nil {
 			return nil, err
 		}
+		if free {
+			return nil, fmt.Errorf("无查看权益")
+		}
 		//免费用户仅可查看三条记录
 		rData, total, err := cepm.GetBuyerNewMsg(&entity.PortraitProjectScreen{
 			Screen: &entity.PortraitScreen{
@@ -448,14 +462,40 @@ func (this *SubVipPortrait) BuyerPortrait() {
 	userId := qutil.ObjToString(this.GetSession("userId"))
 	rData, errMsg := func() (interface{}, error) {
 		buyerName := this.GetString("buyer")
+		//id转中文
+		if len(buyerName) > 0 && len([]rune(buyerName)) == len(buyerName) {
+			//获取中文名字
+			buyerName = getBuyerNameById(util.DecodeId(buyerName))
+		}
 		if buyerName == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
+
 		cepm, power, err, isFree := entity.CreateSubVipPortraitManagerForOpen(userId, "buyerPortrait", buyerName, false, this.Session())
 		cepm.Session = this.Session()
 		if err != nil {
 			return nil, err
 		}
+		redisKey := fmt.Sprintf("buyerPortraitKey_%s", buyerName)
+		if userId == "" || isFree {
+			if bytes, err := redis.GetBytes("other", redisKey); err == nil && bytes != nil {
+				rData := make(map[string]interface{})
+				if err = json.Unmarshal(*bytes, &rData); err != nil {
+					log.Printf("[MANAGER-ERR]buyerPortraitKey_  GetData Error %v \n", err)
+					return rData, nil
+				}
+			}
+			q := `{"size": 1,"_source": ["buyerclass","province","city","name"],"query": {"match_phrase": {"name": "%s"}}}`
+			data := elastic.Get("buyer", "buyer", fmt.Sprintf(q, buyerName))
+			if data != nil && len(*data) > 0 {
+				rData := (*data)[0]
+				if bytes, err := json.Marshal(rData); err == nil && bytes != nil {
+					_ = redis.PutBytes("other", redisKey, &bytes, 2*24*60*60)
+				}
+				return rData, nil
+			}
+			return nil, nil
+		}
 		flag := this.GetString("flag") //分段请求标识
 		userLevel := 3
 		if userId != "" {
@@ -478,6 +518,7 @@ func (this *SubVipPortrait) BuyerPortrait() {
 		if power == 3 {
 			rData["onTrial"] = true
 		}
+		rData["name"] = buyerName
 		return rData, nil
 	}()
 	if errMsg != nil {
@@ -507,7 +548,7 @@ func getEntListMsg(ids []string) (dMap map[string]map[string]interface{}) {
 // getBuyerListMsg 获取采购单位基本信息
 func getBuyerListMsg(buyerNames []string) (dMap map[string]map[string]interface{}) {
 	dMap = make(map[string]map[string]interface{})
-	rData := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"buyer_name":["%s"]}}]}},"size":%d,"_source":["buyer_name","city","province","buyerclass"]}`, strings.Join(buyerNames, `","`), len(buyerNames)))
+	rData := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"_id":"%s"}}]}},"size":1,"_source":["name"]}`, strings.Join(buyerNames, `","`)))
 	if rData == nil || len(*rData) == 0 {
 		return
 	}
@@ -529,3 +570,12 @@ func getBuyerListMsg(buyerNames []string) (dMap map[string]map[string]interface{
 	}
 	return
 }
+
+func getBuyerNameById(buyerId string) (buyerName string) {
+	r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"_id":["%s"]}}]}},"size":1,"_source":["name"]}`, buyerId))
+	if r == nil || len(*r) == 0 {
+		return
+	}
+	buyerName, _ = (*r)[0]["name"].(string)
+	return
+}

+ 19 - 16
src/jfw/modules/bigmember/src/service/report/marketAnalysis.go

@@ -61,24 +61,27 @@ func (this *MarketAnalysis) ProjectInfo() {
 		}
 		mae := &marketAnalysis.MarketAnalysisEntity{MgoRecordId: rid, BaseParam: bParam, UId: userId, Pid: pid}
 		//参数验证 --:回显字段keysItems、area、industry、buyerclass
-		if bParam.KeysItemsStr == "" || bParam.Area == "" || bParam.Industry == "" || bParam.BuyerClass == "" {
-			//原查询条件
-			maePrimary := &marketAnalysis.MarketAnalysisEntity{MgoRecordId: rid, UId: userId, Pid: pid}
-			if err := maePrimary.GetAnalysisFromMgoDb(); err == nil {
-				if bParam.KeysItemsStr == "" || len([]rune(bParam.KeysItemsStr)) < 3 { //分析内容【字符串】结构和o_member_jy.a_items保持一致
-					mae.BaseParam.KeysItemsStr = maePrimary.BaseParam.KeysItemsStr
-				}
-				if bParam.Area == "" || len([]rune(bParam.Area)) < 3 { //省份【字符串】多个省份用逗号拼接
-					mae.BaseParam.Area = maePrimary.BaseParam.Area
-				}
-				if bParam.Industry == "" || len([]rune(bParam.Industry)) < 3 { //行业【字符串】多个行业用逗号拼接
-					mae.BaseParam.Industry = maePrimary.BaseParam.Industry
-				}
-				if bParam.BuyerClass == "" || len([]rune(bParam.BuyerClass)) < 3 { //采购单位类型【字符串】多个采购单位类型用逗号拼接
-					mae.BaseParam.BuyerClass = maePrimary.BaseParam.BuyerClass
-				}
+
+		//原查询条件
+		maePrimary := &marketAnalysis.MarketAnalysisEntity{MgoRecordId: rid, UId: userId, Pid: pid}
+		if err := maePrimary.GetAnalysisFromMgoDb(); err == nil {
+			if bParam.KeysItemsStr == "" || bParam.KeysItemsStr == "{}" || len([]rune(bParam.KeysItemsStr)) < 2 { //分析内容【字符串】结构和o_member_jy.a_items保持一致
+				mae.BaseParam.KeysItemsStr = maePrimary.BaseParam.KeysItemsStr
+			}
+			if bParam.Area == "" || bParam.Area == "{}" || len([]rune(bParam.Area)) < 2 { //省份【字符串】多个省份用逗号拼接
+				mae.BaseParam.Area = maePrimary.BaseParam.Area
+			}
+			if bParam.Industry == "" || bParam.Industry == "{}" || len([]rune(bParam.Industry)) < 2 { //行业【字符串】多个行业用逗号拼接
+				mae.BaseParam.Industry = maePrimary.BaseParam.Industry
+			}
+			if bParam.BuyerClass == "" || bParam.BuyerClass == "{}" || len([]rune(bParam.BuyerClass)) < 2 { //采购单位类型【字符串】多个采购单位类型用逗号拼接
+				mae.BaseParam.BuyerClass = maePrimary.BaseParam.BuyerClass
+			}
+			if bParam.MatchingMode == "" { //匹配模式
+				mae.BaseParam.MatchingMode = maePrimary.BaseParam.MatchingMode
 			}
 		}
+
 		if err := mae.ForMatData(); err != nil {
 			return nil, err
 		}

+ 18 - 5
src/jfw/modules/bigmember/src/service/use/use.go

@@ -663,6 +663,7 @@ type UserInfo struct {
 	MemberPowerType int64                 `json:"memberPowerType"` ////大会员权益类型 0无 1个人 2企业
 	VipPowerType    int64                 `json:"vipPowerType"`    ////超级订阅权益类型 0无 1个人 2企业
 	VipBefore202209 bool                  `json:"vipBefore202209"` //超级订阅:超前项目权限
+	EntSubscribe    int64                 `json:"entSubscribe"`    // 是否有企业订阅权限;0:否 1:是
 }
 
 // 是否使用过首次使用
@@ -693,19 +694,28 @@ func (u *Use) IsAdd() {
 			FreeFile:        bigPower.FreeFile,
 			FreeHasKey:      bigPower.FreeHasKey,
 			VipBefore202209: bigPower.VipStatus > 0 && bigPower.VipStartDate < config.Config.ContextOldVipLimit, //超级订阅 超前项目权限
+			EntSubscribe:    bigPower.EntSubscribe,
 		}
-		userInfo.EntName = bigPower.Data.Ent.Name
-		userInfo.EntRoleId = int(bigPower.Data.Ent.EntRoleId)
+		var (
+			//Name string
+			IsEntPower, PowerSource int64
+		)
+		if bigPower.Data != nil {
+			userInfo.EntName = bigPower.Data.Ent.Name
+			userInfo.EntRoleId = int(bigPower.Data.Ent.EntRoleId)
+			IsEntPower, PowerSource = bigPower.Data.Entniche.IsEntPower, bigPower.Data.Ent.PowerSource
+		}
+
 		//是否是商机管理有效用户:1、管理员和员工已分配功能
-		userInfo.EntNiche = bigPower.EntnicheStatus == 1 && bigPower.Data.Entniche.IsEntPower > 0
+		userInfo.EntNiche = bigPower.EntnicheStatus == 1 && IsEntPower > 0
 		userInfo.EntIsNew = bigPower.EntIsNew && userInfo.EntNiche
 		//有商机管理服务的用户 就不是商机管理用户
-		if userInfo.IsEntService = bigPower.Data.Ent.PowerSource > 0 && bigPower.Data.Entniche.IsEntPower > 0; userInfo.IsEntService {
+		if userInfo.IsEntService = PowerSource > 0 && IsEntPower > 0; userInfo.IsEntService {
 			userInfo.EntIsNew = false
 			userInfo.EntNiche = false
 		}
 		power := []int{}
-		for k, _ := range bigPower.PowerMap {
+		for k := range bigPower.PowerMap {
 			power = append(power, k)
 		}
 		userInfo.Powers = power
@@ -753,6 +763,9 @@ func (u *Use) IsAdd() {
 		}
 		userInfo.Powers = power
 		userInfo.CustomerService = config.Config.Customers
+		if userInfo.IsFree && userInfo.FreeBuyerPort == 1 { // 免费用户采购单位画像赠送次数临时不予展示 后续需求完善在与修改
+			userInfo.FreeBuyerPort = 0
+		}
 		return Result{Data: userInfo}
 	}()
 	u.ServeJson(r)

+ 13 - 22
src/jfw/modules/publicapply/src/config.json

@@ -20,27 +20,17 @@
     "微信"
   ],
   "defaultEntList": [
-    "744fb1d7cc3561e11c639fcc2ad955c0",
-    "d47dc00fc4453115d4562ab7ce3144c2",
-    "eb1998800775782e1e80e55a325a42ca",
-    "118b315754f688151b1b2b82c2fb7511",
-    "dd049424278d809c5f5ebc1980c254bf",
-    "5e79625afc8952e7123459e9826ed3c1",
-    "372fd29ec10178affd656996ced9480f",
-    "11c4fe5273ab36ee4ee1a5b1a779d543",
-    "66264174942f9e958ee65b98bcd63f1b",
-    "bf2d5bb853e7935d9e8714a34b53cae1",
-    "8945af2c1a25e9138cb64774cf66fa4b",
-    "971ee9b68eb80fc001258d6bd0bbc57a",
-    "8426311c8e40dc50e5583ce686d4d5bc",
-    "434ab2c08bd8b8c84f2946dc9bae3630",
-    "899ba5bb52a17a92bb9b1868fe30cf08",
-    "c882c88dcb108f2445773b0aad030edc",
-    "ddb4a8abeebd2702a64d0aa4e9172e4a",
-    "ea5547e5826dac4253c00901019a31c5",
-    "9ae1bcd5e1c5c24631515a1193073fa5",
-    "4c9a591604f1a3eb74857fc9de35e9ff",
-    "3613232bc702d011232ed57f0027af1c"
+    "f7d9f7d154b23dd9c452f524de7acdbf",
+    "6ff2aa1d5e6a6c204c73f1f6ca81e48c",
+    "f7771fbf5d58d45666c04e6d3b114d2b",
+    "3c6d8861c7fea94b70f26a479eb8fa4e",
+    "247656122264aa9a2a695fdd1582b461",
+    "11d5ad68a5bb0fa8b0888e48284a8495",
+    "379d50aa0a11aac4df87a8fd760f993e",
+    "3f84f8fb2ef64accfa28bce6ca0b752b",
+    "7bef6e00b6fc361ad19fe976e0c4bfdc",
+    "4a4e368b498926aeb42c171c5ebaa5e2"
+
   ],
   "bidSearchOldUserLimit": 1626105600,
   "attachmentRPC": "192.168.3.206:10082",
@@ -60,5 +50,6 @@
     "^[)\\)>》】\\]}}〕,,;;::'\"“”。.\\??、/+=\\_—*&……\\^%$¥@!!`~·(\\(<《【\\[{{〔]+$",
     "^([0-9]{1,3}|[零一二三四五六七八九十]{1,2}|联系人?|电话|地址|编号|采购|政府采购|成交|更正|招标|中标|变更|结果)$",
     "^[的人号时元万公告项目地址电话邮编日期联系招标中结果成交项目项目采购采购项目政府采购公告更正公告]+$"
-  ]
+  ],
+  "entSearchLimit": 100
 }

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

@@ -31,9 +31,10 @@ type config struct {
 		CustomerNumb   int
 		EnterpriseNumb int
 	}
-	ExhibitionLog string
-	TipInfo       map[string]int64
-	FilterReg     []string
+	ExhibitionLog  string
+	TipInfo        map[string]int64
+	FilterReg      []string
+	EntSearchLimit int64
 }
 type BidColl struct {
 	PayUserCollLimit      int    //付费用户收藏数量最大限制

+ 63 - 21
src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go

@@ -70,7 +70,7 @@ var (
 	}
 )
 
-//Check 校验查询参数是否合法
+// Check 校验查询参数是否合法
 func (es *EnterpriseSearch) Check() (*EnterpriseSearch, error) {
 	if es.PageSize == 0 { //默认十条
 		es.PageSize = 10
@@ -118,7 +118,7 @@ func (es *EnterpriseSearch) Check() (*EnterpriseSearch, error) {
 	return es, nil
 }
 
-//判断是否是空查询
+// 判断是否是空查询
 func (es *EnterpriseSearch) isEmptySearch() bool {
 	if es.Match == "" &&
 		es.EntArea == "" &&
@@ -135,9 +135,9 @@ func (es *EnterpriseSearch) isEmptySearch() bool {
 	return false
 }
 
-//GetQuerySql 获取检索语句
-//return  company_name、company_status、legal_person、capital、company_address、id、company_shortname
-//返回字段 企业名称、企业状态、法人、注册资本、地址、企业id、企业简称
+// GetQuerySql 获取检索语句
+// return  company_name、company_status、legal_person、capital、company_address、id、company_shortname
+// 返回字段 企业名称、企业状态、法人、注册资本、地址、企业id、企业简称
 func (es *EnterpriseSearch) GetQuerySql() (string, string) {
 	musts := make([]string, 0, 0)
 	//仅展示公司类型小于等于22的 company_type_int  22
@@ -251,10 +251,20 @@ func (es *EnterpriseSearch) GetQuerySql() (string, string) {
 	return fmt.Sprintf(entQueryCount, strings.Join(musts, ","), ""), fmt.Sprintf(entQuery, strings.Join(musts, ","), "")
 }
 
-//DoQuery 根据EnterpriseSearch参数进行企业相关查询
+// DoQuery 根据EnterpriseSearch参数进行企业相关查询
 func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int64, err error) {
 	if es.isEmptySearch() { //是否是空查询,返回默认企业
 		list = GetEntIndexShow()
+		if list != nil {
+			total = int64(len(*list))
+			start := es.PageNum * es.PageSize
+			end := start + es.PageSize
+			if start+es.PageSize > len(*list) {
+				end = len(*list) - 1
+			}
+			listData := (*list)[start:end]
+			list = &listData
+		}
 		return
 	}
 	countSql, sql := es.GetQuerySql()
@@ -262,26 +272,29 @@ func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int
 	start, limit := es.PageNum*es.PageSize, es.PageSize
 	total = -1
 
-	if !es.IsVip {
-		start, limit = 0, freeSearchNum
-	} else if start == 0 {
-		total = elastic.Count(index, itype, countSql)
-		if total == 0 {
-			return
-		}
+	/*if !es.IsVip {
+	  	start, limit = 0, freeSearchNum
+	  } else if start == 0 {
+	  	total = elastic.Count(index, itype, countSql)
+	  	if total == 0 {
+	  		return
+	  	}
+	  }*/
+	total = elastic.Count(index, itype, countSql)
+	if total == 0 {
+		return
 	}
 	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}`, start, limit)
 	list = elastic.Get(index, itype, sql)
 
 	list = formatData(list)
-
-	if total > searchMaxLimit {
-		total = searchMaxLimit
+	if total > config.Config.EntSearchLimit {
+		total = config.Config.EntSearchLimit
 	}
 	return
 }
 
-////格式化字段,加密id
+// //格式化字段,加密id
 func formatData(list *[]map[string]interface{}) *[]map[string]interface{} {
 	if list != nil {
 		for index, _ := range *list {
@@ -303,7 +316,7 @@ func formatData(list *[]map[string]interface{}) *[]map[string]interface{} {
 	return list
 }
 
-//暂不处理前端处理
+// 暂不处理前端处理
 func getCompanyShortName(entName string) string {
 	if entName == "" {
 		return ""
@@ -313,6 +326,15 @@ func getCompanyShortName(entName string) string {
 	return ""
 }
 
+type entIds struct {
+	Entids struct {
+		Buckets []struct {
+			Key      string `json:"key"`
+			DocCount int    `json:"doc_count"`
+		} `json:"buckets"`
+	} `json:"entids"`
+}
+
 func GetEntIndexShow() (list *[]map[string]interface{}) {
 	bytes, err := redis.GetBytes(entSearchCacheDB, entSearchCacheKey)
 	if err == nil {
@@ -320,8 +342,28 @@ func GetEntIndexShow() (list *[]map[string]interface{}) {
 			return
 		}
 	}
-	sql := fmt.Sprintf(entQuery, fmt.Sprintf(`{"terms":{"_id":["%s"]}}`, strings.Join(config.Config.DefaultEntList, "\",\"")), "")
-	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}`, 0, 50)
+	var thisRow entIds
+	entSql := fmt.Sprintf(`{"query": {"bool": {"must": []}},"aggs": {"entids": {"terms": {"field": "entidlist","size": 100,"exclude": ["-",""]}}},"size": 0}`)
+	entAggs, _, _ := elastic.GetAggs("projectset", "projectset", entSql)
+	if entAggs != nil {
+		for name, object := range entAggs {
+			bArr, err := object.MarshalJSON()
+			if len(bArr) == 0 || err != nil {
+				continue
+			}
+			if name == "entids" {
+				if json.Unmarshal(bArr, &thisRow.Entids) != nil {
+					continue
+				}
+			}
+		}
+	}
+	var ids []string
+	for _, v := range thisRow.Entids.Buckets {
+		ids = append(ids, v.Key)
+	}
+	sql := fmt.Sprintf(entQuery, fmt.Sprintf(`{"terms":{"_id":["%s"]}}`, strings.Join(ids, "\",\"")), "")
+	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}`, 0, 100)
 	listTmp := elastic.Get(index, itype, sql)
 	if listTmp != nil && len(*listTmp) > 0 {
 		list = formatData(listTmp)
@@ -330,7 +372,7 @@ func GetEntIndexShow() (list *[]map[string]interface{}) {
 	return
 }
 
-//formatEstablishTime 格式化成立时间
+// formatEstablishTime 格式化成立时间
 // Year range
 // [start]y-[end]y
 // Timestamp range

+ 1 - 1
src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go

@@ -39,7 +39,7 @@ func (esa *EnterpriseSearchAction) DoEntSearch() {
 			return nil, err
 		}
 		//查询是否是会员
-		if vipData := jy.GetBigVipUserBaseMsg( esa.Session(),*config.Middleground); vipData.Status > 0 || vipData.VipStatus > 0 {
+		if vipData := jy.GetBigVipUserBaseMsg(esa.Session(), *config.Middleground); vipData.Status > 0 || vipData.VipStatus > 0 {
 			entSearch.IsVip = true
 		}
 		//查询

+ 3 - 2
src/jfw/modules/publicapply/src/filter/sessionfilter.go

@@ -12,7 +12,7 @@ import (
 	"app.yhyue.com/moapp/jypkg/identity"
 )
 
-//登录限制
+// 登录限制
 type sessionfilter struct {
 	App *xweb.App
 }
@@ -21,6 +21,7 @@ var reg = regexp.MustCompile("^/publicapply/free/.*")
 var reg_share = regexp.MustCompile("^/publicapply/shareFission/.*")
 var reg_nps = regexp.MustCompile("^/publicapply/nps/.*")
 var regWhiteList = regexp.MustCompile("^/publicapply/userbase/whitelist$")
+var regEntSearch = regexp.MustCompile("^/publicapply/enterpriseSearch/doQuery") //企业搜索接口
 
 func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	session := l.App.SessionManager.Session(req, w)
@@ -31,7 +32,7 @@ func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	if getSession["base_user_id"] != nil && getSession["positionId"] == nil {
 		identity.SwitchToBest(util.Int64All(getSession["base_user_id"]), session, Middleground, &Mgo, false)
 	}
-	if reg.MatchString(req.URL.Path) || reg.MatchString(req.URL.Path) || reg_share.MatchString(req.URL.Path) || reg_nps.MatchString(req.URL.Path) {
+	if regEntSearch.MatchString(req.URL.Path) || reg.MatchString(req.URL.Path) || reg.MatchString(req.URL.Path) || reg_share.MatchString(req.URL.Path) || reg_nps.MatchString(req.URL.Path) {
 		return true
 	}
 	if regWhiteList.MatchString(req.URL.Path) { // 判断用户是不是白名单接口不拦截

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

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

+ 96 - 0
src/jfw/modules/publicapply/src/password/password.go

@@ -0,0 +1,96 @@
+package password
+
+import (
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/modules/publicapply/src/db"
+	"regexp"
+	"strings"
+
+	. "app.yhyue.com/moapp/jybase/api"
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+)
+
+func init() {
+	xweb.AddAction(&Password{})
+}
+
+type Password struct {
+	*xweb.Action
+	check  xweb.Mapper `xweb:"/password/check"`  //校验密码
+	update xweb.Mapper `xweb:"/password/update"` //修改密码
+}
+
+var (
+	passwordReg = regexp.MustCompile(".{6,}")
+)
+
+func (this *Password) Check() {
+	userId, _ := this.GetSession("mgoUserId").(string)
+	defer common.Catch()
+	rData, errMsg := func() (interface{}, error) {
+		if userId == "" {
+			return false, fmt.Errorf(Error_msg_1001)
+		}
+		infoMap := map[string]interface{}{}
+		body := xweb.FilterXSS(string(this.Body()))
+		//接收参数
+		json.Unmarshal([]byte(body), &infoMap)
+
+		password := common.ObjToString(infoMap["password"])
+		if data, ok := db.Mgo.FindById("user", userId, `{"s_password":1}`); ok && data != nil && len(*data) > 0 {
+			if password == "" {
+				if (*data)["s_password"] == nil || common.ObjToString((*data)["s_password"]) == "" {
+					return 2, nil
+				} else {
+					return 3, nil
+				}
+			} else {
+				if common.GetMd5String(password) != common.ObjToString((*data)["s_password"]) {
+					return 0, fmt.Errorf("密码校验失败")
+				} else {
+					return 1, nil
+				}
+			}
+		}
+		return false, fmt.Errorf(Error_msg_1003)
+	}()
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
+func (this *Password) Update() {
+	userId, _ := this.GetSession("mgoUserId").(string)
+	defer common.Catch()
+	rData, errMsg := func() (interface{}, error) {
+		if userId == "" {
+			return false, fmt.Errorf(Error_msg_1001)
+		}
+		infoMap := map[string]interface{}{}
+		if string(this.Body()) == "" {
+			return false, fmt.Errorf(Error_msg_1003)
+		}
+		body := xweb.FilterXSS(string(this.Body()))
+		//接收参数
+		json.Unmarshal([]byte(body), &infoMap)
+		if len(infoMap) == 0 {
+			return false, fmt.Errorf(Error_msg_1002)
+		}
+		//必填项
+		if infoMap["password"] == nil {
+			return false, fmt.Errorf(Error_msg_1002)
+		}
+		password := strings.TrimSpace(common.ObjToString(infoMap["password"]))
+
+		if !passwordReg.MatchString(password) {
+			return false, fmt.Errorf(Error_msg_1003)
+		}
+		ok := db.Mgo.UpdateById("user", userId, map[string]interface{}{
+			"$set": map[string]interface{}{
+				"s_password": common.GetMd5String(password),
+			},
+		})
+		return ok, nil
+	}()
+	this.ServeJson(NewResult(rData, errMsg))
+}

+ 20 - 21
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -776,30 +776,29 @@ func (this *UserAccount) WxUnBind() {
 				"i_ratemode": 2,
 				// "i_newfree":  1, //新免费用户=>新订阅设置页面 20211122
 			}
+			userAddReq := &pb.UserAddReq{
+				Appid:   "10000",
+				Unionid: qutil.ObjToString((*unsetMap)["s_unionid"]),
+				SOpenid: s_m_openid,
+			}
+			if qutil.ObjToString((*unsetMap)["s_nickname"]) != "" {
+				userAddReq.Nickname = qutil.ObjToString((*unsetMap)["s_nickname"])
+			}
+			if qutil.ObjToString((*unsetMap)["s_headimageurl"]) != "" {
+				userAddReq.Headimg = qutil.ObjToString((*unsetMap)["s_headimageurl"])
+			}
+			if qutil.ObjToString((*unsetMap)["a_m_openid"]) != "" {
+				userAddReq.AOpenid = qutil.ObjToString((*unsetMap)["a_m_openid"])
+			}
+			if resp := config.Middleground.UserCenter.UserAdd(*userAddReq); resp != nil && resp.Data.Id > 0 {
+				(*unsetMap)["base_user_id"] = resp.Data.Id
+			} else {
+				log.Println(qutil.ObjToString((*unsetMap)["s_unionid"]), "调用usercenter失败")
+				return nil, DBUPDATE_ERROR
+			}
 			//公众号微信关注移至另一用户中  此时微信公众号用户session问题错乱
 			if saveId := util.MQFW.Save("user", unsetMap); saveId == "" {
 				return nil, DBUPDATE_ERROR
-			} else {
-				//用户中台存储  开始
-				func(phone, userid string) {
-					userAddReq := &pb.UserAddReq{
-						Appid:   "10000",
-						Unionid: qutil.ObjToString((*unsetMap)["s_unionid"]),
-						SOpenid: s_m_openid,
-					}
-					if qutil.ObjToString((*unsetMap)["s_nickname"]) != "" {
-						userAddReq.Nickname = qutil.ObjToString((*unsetMap)["s_nickname"])
-					}
-					if qutil.ObjToString((*unsetMap)["s_headimageurl"]) != "" {
-						userAddReq.Headimg = qutil.ObjToString((*unsetMap)["s_headimageurl"])
-					}
-					if qutil.ObjToString((*unsetMap)["a_m_openid"]) != "" {
-						userAddReq.AOpenid = qutil.ObjToString((*unsetMap)["a_m_openid"])
-					}
-					if ok := jy.AddUser(util.MQFW, userid, *userAddReq, *config.Middleground); !ok {
-						log.Println("usercenter add error", userid, phone)
-					}
-				}(phone, saveId)
 			}
 			flushWxsession = true
 		}

+ 1 - 2
src/main.go

@@ -1,14 +1,13 @@
 package main
 
 import (
+	"app.yhyue.com/moapp/jylog"
 	_ "jy/src/jfw/active"
 	"jy/src/jfw/config"
 	. "jy/src/jfw/config"
 	_ "jy/src/jfw/site"
 
 	"app.yhyue.com/moapp/jybase/fsw"
-	"app.yhyue.com/moapp/jylog"
-
 	// _ "jy/src/jfw/modules/app/src/jfw/course"  线下课程 dev3.5.2 21年2.24 下线
 	_ "jy/src/jfw/filter"
 	"jy/src/jfw/front"

+ 81 - 21
src/seo.json

@@ -1,16 +1,78 @@
 {
     "cdn": "",
     "qfw": {
-        "swordfish": {
-            "description": "剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。提供涵盖拟在建项目、招标预告、招标公告、中标公告、政府采购、企业工商信息等多种信息类型,帮助企业全方位掌握市场动态变化。招投标大数据平台就用剑鱼标讯。",
-            "key": "招标,招标网,招投标,招标信息,招标采购,政府采购,拟在建项目,中标信息,中标公示,大数据,人工智能,剑鱼,剑鱼招标,剑鱼招标订阅,剑鱼标讯",
-            "title": "剑鱼标讯-招标信息查询_全国招标采购信息订阅推送_专业招标大数据服务平台"
-        },
-        "swordfishsl": {
-            "description": "剑鱼标讯搜索功能依据用户输入的招标关键词,快速展现最新最全的行业招标信息搜索结果,招标公告与中标公告,一应俱全。",
-            "key": "招标搜索结果,招标搜索,剑鱼标讯",
-            "title": "_剑鱼标讯,全行业招标信息智能推送领导者!"
+      "index": {
+        "description": "剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。提供涵盖拟在建项目、招标预告、招标公告、中标公告、政府采购、企业工商信息等多种信息类型,帮助企业全方位掌握市场动态变化。招投标大数据平台就用剑鱼标讯。",
+        "key": "招标网站,招标信息查询,剑鱼标讯,招标采购信息,招标大数据平台",
+        "title": "剑鱼标讯官网-招标信息查询_全国招标采购信息订阅推送_专业招标大数据服务平台"
+      },
+      "swordfish": {
+        "description": "行业资讯栏目提供全网最全的招投标新闻资讯、舆情信息、行业动态、采购案例,覆盖建筑工程、弱电安防、能源化工、医疗卫生、信息技术、办公文教、机械设备、水利水电、交通运输、市政设施等",
+        "key": "招投标资讯,招投标新闻舆情,建筑工程资讯,招标采购动态,剑鱼标讯",
+        "title": "剑鱼标讯-招标信息查询_全国招标采购信息订阅推送_专业招标大数据服务平台"
+      },
+      "swordfishsl": {
+        "description": "剑鱼标讯搜索功能依据用户输入的招标关键词,快速展现最新最全的行业招标信息搜索结果,招标公告与中标公告,一应俱全。",
+        "key": "招标搜索结果,招标搜索,剑鱼标讯",
+        "title": "_剑鱼标讯,全行业招标信息智能推送领导者!"
+      },
+      "hyzx": {
+        "xxjs": {
+          "description": "信息技术频道为您提供全国信息技术行业资讯新闻、行业动态、知识、应用、发展趋势、政策法规等内容,查看信息技术应用,信息技术发展趋势等相关内容就上剑鱼标讯。",
+          "key": "信息技术资讯,信息技术知识,信息技术应用,信息技术发展趋势,剑鱼标讯",
+          "title": "信息技术行业资讯 - 剑鱼标讯"
+        },
+        "slsd": {
+          "description": "剑鱼标讯水利水电频道为您提供全国水利水电行业资讯新闻、行业动态、知识、技术、应用、发展趋势、政策法规等内容,查看水利水电技术,水利水电应用等相关内容就上剑鱼标讯。",
+          "key": "水利水电资讯,水利水电知识,水利水电技术,水利水电应用,剑鱼标讯",
+          "title": "水利水电行业资讯 - 剑鱼标讯"
+        },
+        "jzgc": {
+          "description": "建筑工程频道为您提供全国建筑工程行业资讯新闻、行业动态、知识、技术,应用、发展趋势、政策法规等内容,查看建筑工程技术,建筑工程管理等相关内容就上剑鱼标讯。",
+          "key": "建筑工程资讯,建筑工程知识,建筑工程技术,建筑工程管理,剑鱼标讯",
+          "title": "建筑工程行业资讯 - 剑鱼标讯"
+        },
+        "jtys": {
+          "description": "交通运输频道为您提供全国交通运输行业资讯新闻、行业动态、知识,技术、应用、政策法规等内容,查看交通运输动态,交通运输政策等相关内容就上剑鱼标讯。",
+          "key": "交通运输资讯,交通运输知识,交通运输动态,交通运输政策,剑鱼标讯",
+          "title": "交通运输行业资讯 - 剑鱼标讯"
+        },
+        "ylws": {
+          "description": "医疗卫生频道为您提供全国医疗卫生行业资讯新闻、行业动态、知识,技术、应用、政策法规等内容,查看医疗卫生装备,医疗卫生改革信息等相关内容就上剑鱼标讯。",
+          "key": "医疗卫生资讯,医疗卫生知识,医疗卫生装备,医疗卫生改革,剑鱼标讯",
+          "title": "医疗卫生行业资讯 - 剑鱼标讯"
+        },
+        "jxsb": {
+          "description": "机械设备频道为您提供全国机械设备行业资讯新闻、行业动态、知识、技术、应用、政策法规等内容,查看机械设备公司,机械设备维修,机械设备回收等相关内容就上剑鱼标讯。",
+          "key": "机械设备资讯,机械设备知识,机械设备公司,机械设备维修,机械设备回收,剑鱼标讯",
+          "title": "机械设备行业资讯 - 剑鱼标讯"
+        },
+        "rdaf": {
+          "description": "弱电安防频道为您提供全国弱电安防行业资讯新闻、行业动态、知识,技术、应用、政策法规等内容,查看安防知识,安防设备、安防公司动态等相关内容就上剑鱼标讯。",
+          "key": "弱电资讯,弱电知识,弱电施工,安防资讯,安防知识,安防设备,剑鱼标讯",
+          "title": "弱电安防行业资讯 - 剑鱼标讯"
+        },
+        "nyhg": {
+          "description": "能源化工频道为您提供全国能源化工行业资讯新闻、行业动态、知识、技术、应用、政策法规等内容,查看能源管理,化工产品,化工原料等相关内容就上剑鱼标讯。",
+          "key": "能源化工资讯,能源化工知识,能源管理,化工产品,化工原料 ,剑鱼标讯",
+          "title": "能源化工行业资讯 - 剑鱼标讯"
+        },
+        "szss": {
+          "description": "市政设施频道为您提供全国市政设施行业资讯新闻,行业动态、知识、技术、应用、政策法规等内容,查看市政基础设施,市政设施管理条例等相关内容就上剑鱼标讯。",
+          "key": "市政设施资讯,市政设施知识,市政基础设施,市政设施管理条例,剑鱼标讯",
+          "title": "市政设施行业资讯 - 剑鱼标讯"
+        },
+        "bgwj": {
+          "description": "办公文教频道为您提供全国办公文教行业资讯新闻、行业动态、知识、技术、应用、政策法规等内容,查看文教用品,文教资料等相关内容就上剑鱼标讯。",
+          "key": "办公资讯,办公知识,办公软件,文教用品,文教资料,剑鱼标讯",
+          "title": "办公文教行业资讯 - 剑鱼标讯"
         }
+      },
+      "planbuild": {
+        "description": "剑鱼标讯拟建项目专栏,包含国家发改委和各部委提供的尚处于前期立项、审批阶段的招投标项目,各供应商应在立项阶段就开始掌握最新的项目信息,做到早介入,早准备,稳拿单。",
+        "key": "拟建项目,拟在建项目,拟建项目网,拟建项目信息,剑鱼标讯",
+        "title": "剑鱼标讯官网-全国拟建项目信息"
+      }
     },
     "version": "1421",
     "sites": {
@@ -242,10 +304,16 @@
     "stype": {
         "NJXM": {
             "NAME": "拟建",
-            "TITLE": "全国拟建项目",
-            "KEYWORDS": "拟建项目,拟在建项目,拟建项目网,拟建项目信息",
+            "TITLE": "全国拟建项目信息",
+            "KEYWORDS": "拟建项目,拟在建项目,拟建项目网,拟建项目信息,剑鱼标讯",
             "DESCRIPTION": "剑鱼标讯拟建项目专栏,包含国家发改委和各部委提供的尚处于前期立项、审批阶段的招投标项目,各供应商应在立项阶段就开始掌握最新的项目信息,做到早介入,早准备,稳拿单。"
         },
+      "CGYX": {
+        "NAME": "采购意向",
+        "TITLE": "全国采购意向信息",
+        "KEYWORDS": "采购意向,政府采购意向,采购意向公告,采购意向书,剑鱼标讯",
+        "DESCRIPTION": "剑鱼标讯采购意向栏目,提供全国各省各行业政府采购意向、采购意向公告、采购意向书等信息,可以帮助用户轻松查询到想看的采购意向信息,好用又省心。"
+      },
         "ZBYG": {
             "NAME": "招标预告",
             "TITLE": "全国招标预告信息",
@@ -417,8 +485,8 @@
         "ZBCGYX":{
         	"NAME": "采购意向",
             "TITLE": "全国采购意向信息",
-            "KEYWORDS": "公开招标,公开招标信息,公开招标公告,公开招标网",
-            "DESCRIPTION": "剑鱼标讯公开招标栏目,提供国内各行业最新最全的公开招标信息,出色的搜索查询服务,可以让用户更加快速高效的获取想要的信息。"
+            "KEYWORDS": "采购意向,政府采购意向,采购意向公告,采购意向书,剑鱼标讯",
+            "DESCRIPTION": "剑鱼标讯采购意向栏目,提供全国各省各行业政府采购意向、采购意向公告、采购意向书等信息,可以帮助用户轻松查询到想看的采购意向信息,好用又省心。"
         }
     },
     "industry": {
@@ -3520,14 +3588,6 @@
 				"DESCRIPTION": "心电图机",
 				"INDUSTRY": "YLWS"
 			}
-		}, {
-			"RUXIAN": {
-				"NAME": "乳腺",
-				"TITLE": "乳腺",
-				"KEYWORDS": "乳腺",
-				"DESCRIPTION": "乳腺",
-				"INDUSTRY": "YLWS"
-			}
 		}, {
 			"BCHAO": {
 				"NAME": "B超",

+ 2 - 1
src/web/staticres/big-member/js/analysis_filter.js

@@ -434,7 +434,8 @@ var vNode = {
             }
             localStorage.setItem('BIG_ANALYSIS_LIST',JSON.stringify(local))
             if (this.power.indexOf(6) > -1) {
-              location.href = './analysis_result'
+              // location.href = './analysis_result'
+              location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=' + utils.getParam('source')
             } else {
               location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=' + utils.getParam('source')
             }

+ 3 - 0
src/web/staticres/big-member/js/unit_portrayal.js

@@ -148,6 +148,9 @@ var vNode = {
         }
     },
     computed: {
+      isFreeOrNotLogin () {
+        return !this.userInfo.isLogin || this.userInfo.isFree
+      },
         allNot: function() {
             var show_1 = this.isShow.showDynamic;
             var show_2 = this.isShow.showYearData;

+ 15 - 9
src/web/staticres/common-module/ad/js/index.js

@@ -7,29 +7,29 @@
 // url转base64 方法
 // base64 编码
 function getBase64Image(img) {
-  const canvas = document.createElement('canvas')
+  var canvas = document.createElement('canvas')
   canvas.width = img.width
   canvas.height = img.height
-  const ctx = canvas.getContext('2d')
+  var ctx = canvas.getContext('2d')
   ctx.drawImage(img, 0, 0, img.width, img.height)
-  const dataURL = canvas.toDataURL('image/png')
+  var dataURL = canvas.toDataURL('image/png')
   return dataURL
 }
 
 function getImage64Url(url, ref) {
 
   // var that = this
-  const image = document.createElement('img')
+  var image = document.createElement('img')
   image.setAttribute('crossorigin', 'anonymous')
   image.src = url + '?v=' + Math.random() // 处理缓存
   image.crossOrigin = 'anonymous'
   image.onload = function () {
-    const base64 = getBase64Image(image)
+    var base64 = getBase64Image(image)
     console.log(base64);
   }
 }
 
-// const ua = window.navigator.userAgent
+// var ua = window.navigator.userAgent
 // let _isIOS     = -1;
 // function isIOS() {
 //   if (_isIOS === -1) {
@@ -74,6 +74,12 @@ var getActive = {
         // JSON.stringify()
     }).done(function (res) {
       // res.error_code =1
+      // Object.value 兼容处理
+      Object.values = function (obj) {
+        return Object.keys(obj).map(function(e) {
+          return obj[e]
+        })
+      }
       if (res.error_code === 0 && res.data && Object.values(res.data)[0] && Object.values(res.data)[0] !=null && Object.values(res.data)[0][0]) {
         // weixin、pc环境
         var img = new Image()
@@ -100,7 +106,7 @@ var getActive = {
                     scale: 3,
                     imageTimeout: 30000,
                     allowTaint: true, // 允许跨域图片
-                }).then(canvas => {
+                }).then(function(canvas) {
                     var imgUrl = imgsrcArr.base64 || canvas.toDataURL('image/png')
                     console.log(imgUrl)
                     // $(".active-tip-group img").attr('src', imgUrl)
@@ -110,7 +116,7 @@ var getActive = {
                     try {
                       window.JyObj.savePic(imgUrl)
 
-                      setTimeout(() => {
+                      setTimeout(function() {
                           weui.toast('图片已保存,快去扫码识别吧', {
                             duration: 800,
                             className: 'text-overflow100'
@@ -128,7 +134,7 @@ var getActive = {
                 })
             }else {
                 window.JyObj.savePic(window.picImgUrl)
-                setTimeout(() => {
+                setTimeout(function() {
                   weui.toast('图片已保存,快去扫码识别吧', {
                     duration: 800,
                     className: 'text-overflow100'

+ 106 - 0
src/web/staticres/common-module/bidstatus-update/css/bid-status-update.css

@@ -0,0 +1,106 @@
+.bid_component  .van-cell{
+  display: flex;
+  align-items: flex-start;
+  padding: .3rem 0;
+}
+.bid_component  .van-cell .van-field__label{
+  font-size: .3rem;
+}
+.bid_component  .van-cell .van-field__body textarea {
+  min-height: .48rem;
+}
+.bid_component  .van-cell .van-field__control{
+  font-size: .32rem;
+}
+.bid_component  .van-cell--required::before{
+  left: -.16rem;
+}
+.bid_component  .van-field__label {
+  margin-right: .32rem;
+}
+.bid_component .view-result-tip{
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  line-height: .4rem;
+  padding: .2rem .32rem;
+  font-size: .28rem;
+  color: #686868;
+  background: #F1FDFF;
+}
+
+.bid_component .popupTime-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  line-height: 0.6rem;
+  padding: 0.44rem 0.32rem 0.24rem;
+}
+
+.bid_component .popupTime-header .header-title {
+  display: flex;
+  flex-direction: column;
+  position: initial;
+  transform: none;
+  font-size: 0.36rem;
+  color: #171826;
+}
+.bid_component .popupTime-header .header-title .label-tip {
+  font-size: .24rem;
+  color: #5F5E64;
+}
+.bid_component .popupTime-header .header-close {
+  margin-top: .1rem;
+  width: 0.4rem;
+  height: 0.4rem;
+}
+
+.bid_component .popupTime-header .header-close .icon-delete-gray {
+  display: flex;
+  width: 0.4rem;
+  height: 0.4rem;
+}
+
+.bid_component .van-cell::after{
+  border-bottom: 0.5px solid #F2F2F2;
+  left: 0;
+}
+
+.bid_component .van-form{
+  padding: 0 .32rem;
+}
+
+.popupTime{
+  height: 7.68rem;
+}
+.popupTime .popupTime-main{
+  padding: 0 .32rem;
+}
+.popupTime .popupTime-main .bid_ul .bid_select{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 0 16px;
+  height: 1.08rem;
+  color: #171826;
+  font-size: 16px;
+}
+.bid_select>img{
+  width: .48rem;
+  height: .48rem;
+}
+
+.popupTime.popupIsBid .header-title {
+  flex-direction: row;
+}
+
+.cancel_select{
+  font-size: .28rem;
+  color: #2ABED1;
+  margin-left: .32rem;
+}
+
+.popupTime .van-checkbox__icon--checked .van-icon.van-icon-success{
+  background-color: #2ABED1;
+  border-color: #2ABED1;
+}

BIN
src/web/staticres/common-module/bidstatus-update/image/right.png


+ 617 - 0
src/web/staticres/common-module/bidstatus-update/js/bid-status-update.js

@@ -0,0 +1,617 @@
+var bidTemp = `
+  <div class='bid_component j-container'>
+    <div class="popupTime-header j-header">
+        <div class="header-title">
+          <span style="line-height: .56rem">已参标,请更新投标状态</span>
+          <span style="line-height: .36rem;margin-top: .04rem" class="label-tip">可前往“我的参标项目”查看已参标项目</span>
+        </div>
+        <div class="header-close" @click="$emit('cancel-update')">
+            <span class="j-icon base-icon icon-delete-gray"></span>
+        </div>
+    </div>
+    <div class="j-main">
+      <div class="view-result-tip">
+        <span>想知道谁最有可能参标吗?</span>
+        <span @click="linkAnalysis" style="color:#2ABED1">点这里查看分析结果</span>
+      </div>
+      <van-form @submit="onSubmit">
+        <van-field
+          @click="bidTypePopup = true"
+          required
+          readonly
+          is-link
+          v-model="bidParams.bidType"
+          name="bidType"
+          label="投标类型"
+          placeholder="请选择投标类型"
+        ></van-field>
+        <van-field
+          @click="bidProject = true"
+          is-link
+          v-model="bidParams.bidStage"
+          name="bidStage"
+          readonly
+          :rows="rownum"
+          autosize
+          type="textarea"
+          label="投标项目阶段"
+          placeholder="请选择投标项目阶段"
+        ></van-field>
+        <van-field
+          @click="isBidPopup = true"
+          is-link
+          placeholder="请选择是否中标"
+          readonly
+          v-model="bidParams.isWin"
+          name="isWin"
+          :label="showChannel? '渠道是否中标':'是否中标'"
+        ></van-field>
+        <div class="channel_module" v-if="showChannel">
+          <div class="acc-input-group">
+            <van-field type="textarea" autosize :rows="rownum" placeholder="请输入渠道名称" v-model.trim="bidParams.channelName" name="channelName" label="渠道名称"></van-field>
+            <div class="popover-acc-input-group" v-show="showAccEntList">
+              <div class="popover-acc-input-group--item" v-for="(item, index) in accEntList" v-bind:key="index" @click="doSelectEnt(item)">{{item.value}}</div>
+            </div>
+          </div>
+          <van-field type="textarea" autosize :rows="rownum" placeholder="请输入联系人姓名" v-model.trim="bidParams.channelPerson" name="channelPerson" label="联系人"></van-field>
+          <van-field maxlength="11" type="tel" placeholder="请输入联系电话" v-model.trim="bidParams.channelPhone" name="channelPhone" label="联系电话"></van-field>
+          <van-field type="textarea" autosize :rows="rownum" placeholder="请输入中标单位名称" v-model.trim="bidParams.winner" name="winner" label="中标单位"></van-field>
+        </div>
+      </van-form>
+    </div>
+    <div class="j-footer">
+        <div class="j-button-group">
+          <button class="j-button-cancel" @click="$emit('cancel-update')">取消</button>
+          <button round type="primary" :disabled="showDisbaled" class="j-button-confirm submitBtn" @click="onSubmit()">确认</button>
+        </div>
+    </div>
+    <van-popup class="popupTime j-container" v-model="bidTypePopup" round position="bottom">
+          <div class="popupTime-header">
+              <div class="header-title">选择投标类型</div>
+              <div class="header-close" @click="bidTypePopupClose()">
+                  <span class="j-icon base-icon icon-delete-gray"></span>
+              </div>
+          </div>
+          <div class="popupTime-main j-main">
+            <ul class="bid_ul">
+              <li class="bid_select" @click="selectBidType(1)">
+                <span>直接投标</span>
+                <img v-show="copyBidParams.bidType == 1" src="/common-module/bidstatus-update/image/right.png" alt="" />
+              </li>
+              <li class="bid_select" @click="selectBidType(2)">
+                <span>渠道投标</span>
+                <img v-show="copyBidParams.bidType == 2" src="/common-module/bidstatus-update/image/right.png" alt="" />
+              </li>
+            </ul>
+          </div>
+          <div class="j-footer">
+              <div class="j-button-group">
+                  <div class="j-button-confirm" @click="saveStatus('0')">确认</div>
+              </div>
+          </div>
+      </van-popup>
+      <van-popup class="popupTime j-container popupIsBid" v-model="isBidPopup" round position="bottom">
+          <div class="popupTime-header">
+              <div class="header-title">
+                <span>是否中标</span>
+                <span @click="cancelSelect()" class="cancel_select">取消选择</span>
+              </div>
+              <div class="header-close" @click="isBidPopupClose()">
+                  <span class="j-icon base-icon icon-delete-gray"></span>
+              </div>
+          </div>
+          <div class="popupTime-main j-main">
+            <ul class="bid_ul">
+              <li class="bid_select" @click="selectBidStatus(1)">
+                <span>是</span>
+                <img v-if="copyBidParams.isWin === 1" src="/common-module/bidstatus-update/image/right.png" alt="" />
+              </li>
+              <li class="bid_select" @click="selectBidStatus(2)">
+                <span>否</span>
+                <img v-if="copyBidParams.isWin === 2" src="/common-module/bidstatus-update/image/right.png" alt="" />
+              </li>
+            </ul>
+          </div>
+          <div class="j-footer">
+              <div class="j-button-group">
+                  <div class="j-button-confirm" @click="saveStatus('2')">确认</div>
+              </div>
+          </div>
+      </van-popup>
+      <van-popup class="popupTime j-container" v-model="bidProject" round position="bottom">
+        <div class="popupTime-header">
+            <div class="header-title">投标项目阶段</div>
+            <div class="header-close" @click="BidProjectPopupClose()">
+                <span class="j-icon base-icon icon-delete-gray"></span>
+            </div>
+        </div>
+        <div class="popupTime-main j-main">
+          <van-cell-group>
+            <van-cell
+              :class="{'cell_checked': item.checked}"
+              v-for="item in bidStageOptions"
+              :key="item.value"
+              :title="item.label"
+              :label-align="labelAlign"
+              icon-size="16px"
+              @click="onCellClick(item)"
+            >
+              <template #right-icon>
+                <van-checkbox v-model="item.checked" :name="item.value" />
+              </template>
+            </van-cell>
+          </van-cell-group>
+        </div>
+        <div class="j-footer">
+            <div class="j-button-group">
+              <div class="j-button-cancel" @click="cancelBidStage()">重置</div>
+              <div class="j-button-confirm" @click="saveStatus('1')">确认</div>
+            </div>
+        </div>
+    </van-popup>
+  </div>
+`
+
+var bidStatusNode = {
+  name: 'bid_component',
+  template: bidTemp,
+  props: {
+    projectCellInfo: {
+      type: Object,
+      default: {}
+    },
+    showBidStatus: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      cbInfo: {
+        isShowRefer: false,
+        canBiaoInfo: {
+          showStopParticipate: false
+        },
+        setTime: '',
+        countdownTimer: null
+      },
+      bidTypePopup: false,
+      isBidPopup: false,
+      bidProject: false,
+      showBidType: true,
+      showChannel: false,
+      copyBidParams: {
+        bidType: '',
+        bidStage: '',
+        isWin: '',
+        channelName: '',
+        channelPerson: '',
+        channelPhone: '',
+        winner: '',
+        sid: ''
+      },
+      bidParams: {
+        bidType: '',
+        bidStage: '',
+        isWin: '',
+        channelName: '',
+        channelPerson: '',
+        channelPhone: '',
+        winner: '',
+        sid: ''
+      },
+      isWinBid: false,
+      checkedList: [],
+      formSchemaOptions: {
+        bidStage: [],
+        'bidStage-1': [],
+        checkedListMap: {
+          1: [],
+          2: []
+        }
+      },
+      showAccEntList: false,
+      accEntList: [],
+      labelAlign: 'left',
+      editBtnStatus: {
+        show: false,
+        status: 0
+      },
+      rownum: 1,
+      proParams: {},
+      prodetail: {}
+    }
+  },
+  computed: {
+    bidStageOptions: function () {
+      const result = this.formSchemaOptions['bidStage' + (this.copyBidParams.bidType == 1 ? '-1' : '')].map(option => ({
+        checked: this.checkedList.includes(option),
+        value: option,
+        label: option
+      }))
+      return result
+    },
+    showDisbaled: function () {
+      return this.bidParams.bidType === ''
+    }
+  },
+  watch: {
+    projectCellInfo: {
+      handler (newval) {
+        this.resetUpdate()
+        this.getProDetail()
+        this.getBidContent()
+      },
+      immediate: true
+    },
+    showBidStatus: {
+      handler (newval) {
+        this.resetUpdate()
+      },
+      immediate: true
+    }
+  },
+  created: function () {
+    this.getOptionsInfo()
+  },
+  mounted: function() {
+  },
+  methods: {
+    onSubmit: function() {
+      // 在这里处理表单提交逻辑
+      const _this = this
+      this.copyBidParams.bidType = parseInt(this.copyBidParams.bidType)
+      this.copyBidParams.isWin = this.copyBidParams.isWin ? parseInt(this.copyBidParams.isWin) : 0
+      // this.bidParams.winner = this.prodetail.s_winner
+      this.bidParams.sid = this.prodetail.sid
+      const {channelName, channelPerson, channelPhone, winner, sid, bidStage, isWin } = this.bidParams
+      let tranWin = 0
+      if (isWin === '是') {
+        tranWin = 1
+      } else if (isWin === '否') {
+        tranWin = 2
+      } else {
+        tranWin = 0
+      }
+      const ajaxParams = {
+        bidType: parseInt(this.copyBidParams.bidType),
+        bidStage: bidStage ? bidStage.split('、') : [],
+        isWin: tranWin,
+        channelName: channelName,
+        channelPerson: channelPerson,
+        channelPhone: channelPhone,
+        winner: winner,
+        sid: sid
+      }
+      $.ajax({
+        type: 'POST',
+        url: '/jyapi/jybx/core/participate/updateBidStatus',
+        contentType: 'application/json',
+        data: JSON.stringify(ajaxParams),
+        success: function(res) {
+          if(res.error_code === 0) {
+            _this.$toast('保存成功')
+            _this.editBtnStatus.show = true
+            _this.editBtnStatus.status = 1
+            _this.$emit('save-success')
+          } else {
+            _this.$toast(res.error_msg)
+          }
+        }
+      })
+    },
+    // 获取项目详情
+    getProDetail: function () {
+      var _this = this
+      $.ajax({
+          type: 'POST',
+          url: '/bigmember/follow/project/detail',
+          data: {
+              sid: _this.projectCellInfo.sid || _this.projectCellInfo.id || _this.projectCellInfo._id,
+              // fid: _this.fid
+          },
+          success: function (res) {
+              if (res.error_code == 0) {
+                _this.prodetail = res.data
+              } else {
+                _this.$toast(res.error_msg)
+              }
+          },
+          error: function (err) {
+              console.log(err)
+          }
+      })
+    },
+    // 获取选项
+    getOptionsInfo () {
+      const _this = this
+      $.ajax({
+        type: 'POST',
+        url: '/jyapi/jybx/core/participate/setUpInfo',
+        contentType: 'application/json',
+        data: JSON.stringify({
+          sid: _this.sid
+        }),
+        success: function (res) {
+          if (res.error_code === 0) {
+            const data = res.data || {}
+            if (data.bidType) {
+              _this.formSchemaOptions.bidStage = data.bidType.find(v => v.name === '渠道投标').content || []
+              _this.formSchemaOptions['bidStage-1'] = data.bidType.find(v => v.name === '直接投标').content || []
+            }
+          }
+        }
+      })
+    },
+    linkAnalysis () {
+      if (utils.$envs.inApp || utils.$envs.inH5) {
+        location.href = '/jyapp/big/page/analysis_result'
+      } else {
+        location.href = '/big/wx/page/analysis_search?source=wx_analysis_ProjectDetails'
+      }
+    },
+    doQueryAccEntName (str) {
+      // TODO 需添加防抖
+      this.showAccEntList = false
+      this.fetchChannelNameList(str, list => {
+        this.showAccEntList = list.length > 0
+        this.accEntList = list
+      })
+    },
+    // 重置投标阶段变更
+    cancelBidStage () {
+      const resetList = (this.formSchemaOptions.checkedListMap[this.copyBidParams.bidType] || []).map(v => v)
+      this.checkedList = resetList
+    },
+    // 重置投标状态
+    resetUpdate: function () {
+      this.bidParams = {
+        bidType: '',
+        bidStage: '',
+        isWin: '',
+        channelName: '',
+        channelPerson: '',
+        channelPhone: '',
+        winner: '',
+        sid: ''
+      }
+      this.copyBidParams = {
+        bidType: 0,
+        bidStage: '',
+        isWin: '',
+        channelName: '',
+        channelPerson: '',
+        channelPhone: '',
+        winner: '',
+        sid: ''
+      }
+      this.showChannel = false
+    },
+    saveStatus: function (str) {
+      switch (str) {
+        case '0':
+          if(this.bidParams.bidType) {
+            if (!((this.bidParams.bidType.indexOf('直接') !== -1 && parseInt(this.copyBidParams.bidType) === 1) || (this.bidParams.bidType.indexOf('渠道') !== -1 && parseInt(this.copyBidParams.bidType) === 2))) {
+              this.bidParams = {
+                bidType: this.copyBidParams.bidType,
+                bidStage: '',
+                isWin: '',
+                channelName: '',
+                channelPerson: '',
+                channelPhone: '',
+                winner: '',
+                sid: ''
+              }
+              this.copyBidParams = {
+                bidType: this.copyBidParams.bidType,
+                bidStage: '',
+                isWin: '',
+                channelName: '',
+                channelPerson: '',
+                channelPhone: '',
+                winner: '',
+                sid: ''
+              }
+              this.checkedList = []
+            }
+          }
+          this.$emit('set-height', this.copyBidParams.bidType)
+          break;
+        case '1':
+          if (this.checkedList.length > 0) {
+            this.copyBidParams.bidStage = this.checkedList.join('、')
+          } else {
+            this.copyBidParams.bidStage = ''
+          }
+          break
+        default:
+          break;
+      }
+      const { channelName, channelPhone, channelPerson, winner } = this.bidParams || {};
+      this.copyBidParams.channelName = channelName || ''
+      this.copyBidParams.channelPhone = channelPhone || ''
+      this.copyBidParams.channelPerson = channelPerson || ''
+      this.copyBidParams.winner = winner || ''
+
+      Object.assign(this.bidParams, this.copyBidParams)
+      if (this.copyBidParams.bidType == 1) {
+        this.bidParams.bidType = '直接投标'
+        this.showChannel = false
+      } else if (this.copyBidParams.bidType == 2) {
+        this.bidParams.bidType = '渠道投标'
+        this.showChannel = true
+      } else {
+        this.bidParams.bidType = ''
+        this.showChannel = false
+      }
+      // 带出中标单位
+      if (this.bidParams.isWin == 1) {
+        this.bidParams.isWin = '是'
+        const sWin = this.prodetail.projectInfo.s_winner || ''
+        if (sWin && !winner) {
+          this.bidParams.winner = sWin
+        }
+      } else if (this.bidParams.isWin == 2) {
+        this.bidParams.isWin = '否'
+        this.bidParams.winner = ''
+      } else {
+        this.bidParams.isWin = ''
+        this.bidParams.winner = ''
+      }
+      this.bidTypePopupClose()
+      this.BidProjectPopupClose()
+      this.isBidPopupClose()
+    },
+    // 选择是否中标
+    selectBidStatus: function(data) {
+      this.copyBidParams.isWin = data
+    },
+    // 是否中标取消选择
+    cancelSelect () {
+      this.bidParams.isWin = ''
+      this.copyBidParams.isWin = ''
+      this.bidParams.winner = ''
+      this.copyBidParams.winner = ''
+      this.isBidPopupClose()
+    },
+    doSelectEnt (item) {
+      this.setParams(this.bidParams, item)
+      this.setParams(this.copyBidParams, item)
+      this.showAccEntList = false
+    },
+    setParams(params, item) {
+      const { value, company_phone, legal_person } = item || {};
+      params.channelName = value || ''
+      // params.channelPhone = company_phone || ''
+      // params.channelPerson = legal_person || ''
+    },
+    // 选择投标类型
+    selectBidType: function(data) {
+      this.copyBidParams.bidType = data
+      //  checkedList 切换时清空
+      if (data != this.copyBidParams.bidType) {
+        this.checkedList = []
+        this.copyBidParams.isWin = 0
+        this.bidParams.isWin = ''
+      }
+    },
+    // 获取投标状态信息
+    getBidContent: function () {
+      const _this = this
+      const params = {
+        sid: _this.projectCellInfo.sid || _this.projectCellInfo.id || _this.projectCellInfo._id,
+      }
+      $.ajax({
+        type: 'POST',
+        url: '/jyapi/jybx/core/participate/content',
+        contentType: 'application/json',
+        data: JSON.stringify(params),
+        success: function(res) {
+          if(res.error_code === 0 && res.data) {
+            if (Object.keys(res.data).length > 0) {
+              _this.editBtnStatus.show = true
+              _this.editBtnStatus.status = 1
+              const { bidStage, bidType, channelName, channelPerson, channelPhone, isWin, winner} = res.data
+              let getParams = {
+                bidType: '',
+                bidStage: '',
+                isWin: '',
+                channelName: channelName,
+                channelPerson: channelPerson,
+                channelPhone: channelPhone,
+                winner: winner
+              }
+              if (bidStage && bidStage.length > 0) {
+                _this.checkedList = bidStage
+                getParams.bidStage = bidStage.join('、')
+              }
+              if (isWin == 1) {
+                getParams.isWin = '是'
+              } else if(isWin == 2) {
+                getParams.isWin = '否'
+              } else {
+                getParams.isWin = ''
+              }
+              if(bidType == 1) {
+                getParams.bidType = '直接投标'
+                _this.showChannel = false
+                _this.formSchemaOptions.checkedListMap[1] = [].concat(bidStage || [])
+              } else {
+                getParams.bidType = '渠道投标'
+                _this.showChannel = true
+                _this.formSchemaOptions.checkedListMap[2] = [].concat(bidStage || [])
+              }
+              if (res.data) {
+                Object.assign(_this.copyBidParams, res.data)
+              }
+              _this.bidParams = getParams
+            }
+          }
+        }
+      })
+    },
+    // 获取参标状态
+    getCanBiaoInfo: function() {
+      const _this = this
+      const param = {
+        sid: this.sid
+      }
+      $.ajax({
+        type: 'POST',
+        url: '/jyapi/jybx/core/participate/info',
+        contentType: 'application/json',
+        data: JSON.stringify(param),
+        success: function(res) {
+          if(res.error_code == 0) {
+            const data = res.data;
+            if (Object.keys(data).length > 0) {
+              _this.cbInfo.canBiaoInfo = data
+              _this.cbInfo.countdownTimer = setInterval(_this.updateCountdown, 1000);
+              if (data.userName) {
+                const newList = data.userName.split(',').map(item => item.trim()).filter(item => item)
+                const userNameString = newList.length > 1 ? newList.slice(0,1).join(',') + '等' : newList.join(',')
+                data.userName = userNameString
+              }
+            }
+          }
+        }
+      })
+    },
+    onCellClick(data) {
+      if (this.checkedList.includes(data.value)) {
+        this.checkedList = this.checkedList.filter(v => v !== data.value)
+      } else {
+        this.checkedList.push(data.value)
+      }
+    },
+    // 编辑投标状态
+    setBidInfo: function () {
+      if (this.editBtnStatus.status == 1) {
+        this.editBtnStatus.status = 2
+      } else if (this.editBtnStatus.status == 2) {
+        this.editBtnStatus.status = 1
+        this.getBidContent()
+      }
+    },
+    getShareParams () {
+      var params = location.href.indexOf('?') > -1 ? '&fid=' + this.fid + '&sid=' + this.sid : '?fid=' + this.fid + '&sid=' + this.sid
+      this.proParams = {
+        type: '2',
+        id: this.sid,
+        referer: location.href + params
+      }
+    },
+    // 关闭投标类型弹窗
+    bidTypePopupClose: function () {
+      this.bidTypePopup = false
+    },
+    // 关闭是否中标弹窗
+    isBidPopupClose: function () {
+      this.isBidPopup = false
+    },
+    // 关闭投标项目阶段弹窗
+    BidProjectPopupClose: function () {
+      this.bidProject = false
+    },
+  }
+}

+ 1 - 0
src/web/staticres/common-module/big-member/js/client_portrayal.js

@@ -1364,6 +1364,7 @@ var vNode = {
           var normal =['行业','采购规模占比','采购规模', '采购项目数量','平均节支率'];
           var newArr = that.arrTrans(5,arr);
           newArr.unshift(normal)
+          chartOptions.deformPieChart.roseType = false;
           chartOptions.deformPieChart.dataset.source = newArr;
           chartOptions.deformPieChart.tooltip.formatter = function(params){
               var tip = '';

+ 27 - 3
src/web/staticres/common-module/big-member/js/page_client_follow_detail.js

@@ -78,7 +78,8 @@ var vNode = {
     delimiters: ['${', '}'],
     el: '#v-pro',
     components: {
-      forwardshare: vmForward
+      forwardshare: vmForward,
+      bidStatusNode: bidStatusNode
     },
     data: {
         from: '',
@@ -165,7 +166,10 @@ var vNode = {
           status: 0
         },
         rownum: 1,
-        proParams: {}
+        proParams: {},
+        showBidStatus: false,
+        popupHeight: 'height: 8.8rem',
+        projectCellInfo: {}
     },
     computed: {
         bmdetail: function () {
@@ -247,6 +251,24 @@ var vNode = {
             // params.channelPhone = company_phone || ''
             // params.channelPerson = legal_person || ''
           },
+
+          setHeight: function (data) {
+            if(data === 2) {
+              this.popupHeight = 'height: 10.92rem'
+            } else {
+              this.popupHeight = 'height: 8.8rem'
+            }
+          },
+          // 更新投标状态成功
+          saveSuccess: function () {
+            this.showBidStatus = false
+            this.getBidContent()
+          },
+          // 取消更新投标状态
+          cancelUpdate: function () {
+            this.showBidStatus = false
+          },
+
           /**
            * 获取模糊渠道名称列表
            * @param str
@@ -583,6 +605,7 @@ var vNode = {
           }
         }
         const _this = this
+        _this.projectCellInfo.sid = this.sid
         const type = weicanbiao ? 'in' : 'out';
         const url = '/jyapi/jybx/core/participate/'+ type + '/info'
         const params = {
@@ -603,7 +626,8 @@ var vNode = {
                 _this.getCanBiaoInfo()
                 if (type === 'in') {
                   _this.getHaveActionHistory()
-                  _this.$toast('已参标,请前往我的参标项目列表查看')
+                  _this.showBidStatus = true
+                  // _this.$toast('已参标,请前往我的参标项目列表查看')
                 }
                 // 更新收藏列表
                 const updateCBStatus = {

+ 23 - 2
src/web/staticres/common-module/big-member/js/page_client_follow_list.js

@@ -4,6 +4,7 @@ var vNode = {
     el: '#v-node',
     components: {
         areaComponent: areaComponent,
+        bidStatusNode: bidStatusNode
     },
     data: {
         sessStorageKey:'$data-pro_follow_list',
@@ -28,7 +29,10 @@ var vNode = {
         initArea: [],
         carePro: '',
         followMax: 0,
-        listnum: 0
+        listnum: 0,
+        showBidStatus: false,
+        popupHeight: 'height: 8.8rem',
+        projectCellInfo: {}
     },
     created () {
         var recover = this.recover()
@@ -91,6 +95,21 @@ var vNode = {
                 }
             })
         },
+        setHeight: function (data) {
+          if(data === 2) {
+            this.popupHeight = 'height: 10.92rem'
+          } else {
+            this.popupHeight = 'height: 8.8rem'
+          }
+        },
+        // 更新投标状态成功
+        saveSuccess: function () {
+          this.showBidStatus = false
+        },
+        // 取消更新投标状态
+        cancelUpdate: function () {
+          this.showBidStatus = false
+        },
         onSearch: function(val) {
             this.carePro = val
             this.list = this.newList
@@ -392,12 +411,14 @@ var vNode = {
                 contentType: 'application/json',
                 data: JSON.stringify(params),
                 success: function (res) {
+                    _this.projectCellInfo = item
                     if (res.error_code === 0 && res.data) {
-                        _this.$toast('已参标,请前往我的参标项目列表查看。')
+                        // _this.$toast('已参标,请前往我的参标项目列表查看。')
                         _this.$set(item, 'isCB', {
                             id: item.sid,
                             value: true
                         })
+                        _this.showBidStatus = true
                     } else {
                       _this.$toast(res.error_msg)
                     }

+ 41 - 40
src/web/staticres/common-module/chart-module/js/chart-common.js

@@ -13,46 +13,47 @@
  */
 
 
-var chartTemplate =
-`
-  <template>
-      <ve-histogram
-        v-if='type==="ve-histogram"'
-        :id="type"
-        :colors="histogramChart.options.colors"
-        :width="histogramChart.options.width"
-        :height="histogramChart.options.height"
-        :data="chartData"
-        :settings="histogramChart.options.settings"
-        :after-config="histogramChart.options.config"
-        :after-set-option="extend"
-        :extend="histogramChart.defaultOptions"
-        >
-      </ve-histogram>
-      <ve-histogram
-        v-else-if='type==="ve-finehistogram"'
-        :id="type"
-        :height="barLineChart.options.height"
-        :width="barLineChart.options.width ? barLineChart.options.width : null"
-        :colors="barLineChart.options.colors"
-        :data="chartData"
-        :settings="barLineChart.options.settings"
-        :after-config="barLineChart.options.config"
-        :after-set-option="barExtend"
-        :extend="barLineChart.defaultOptions"
-        >
-      </ve-histogram>
-      <div v-else-if='type==="ve-treemap"' class="rect-tree-map-chart" style="height: 100%"></div>
-      <ve-line
-        v-else-if='type==="ve-line"'
-        :data="chartData"
-        :height="lineChart.options.height"
-        :after-config="lineChart.options.config"
-        :extend="lineChart.defaultOption"
-        >
-      </ve-line>
-  </template>
-`
+// var chartTemplate =
+// `
+//   <template>
+//       <ve-histogram
+//         v-if='type==="ve-histogram"'
+//         :id="type"
+//         :colors="histogramChart.options.colors"
+//         :width="histogramChart.options.width"
+//         :height="histogramChart.options.height"
+//         :data="chartData"
+//         :settings="histogramChart.options.settings"
+//         :after-config="histogramChart.options.config"
+//         :after-set-option="extend"
+//         :extend="histogramChart.defaultOptions"
+//         >
+//       </ve-histogram>
+//       <ve-histogram
+//         v-else-if='type==="ve-finehistogram"'
+//         :id="type"
+//         :height="barLineChart.options.height"
+//         :width="barLineChart.options.width ? barLineChart.options.width : null"
+//         :colors="barLineChart.options.colors"
+//         :data="chartData"
+//         :settings="barLineChart.options.settings"
+//         :after-config="barLineChart.options.config"
+//         :after-set-option="barExtend"
+//         :extend="barLineChart.defaultOptions"
+//         >
+//       </ve-histogram>
+//       <div v-else-if='type==="ve-treemap"' class="rect-tree-map-chart" style="height: 100%"></div>
+//       <ve-line
+//         v-else-if='type==="ve-line"'
+//         :data="chartData"
+//         :height="lineChart.options.height"
+//         :after-config="lineChart.options.config"
+//         :extend="lineChart.defaultOption"
+//         >
+//       </ve-line>
+//   </template>
+// `
+var chartTemplate = "\n  <template>\n      <ve-histogram\n        v-if='type===\"ve-histogram\"'\n        :id=\"type\"\n        :colors=\"histogramChart.options.colors\"\n        :width=\"histogramChart.options.width\"\n        :height=\"histogramChart.options.height\"\n        :data=\"chartData\"\n        :settings=\"histogramChart.options.settings\"\n        :after-config=\"histogramChart.options.config\"\n        :after-set-option=\"extend\"\n        :extend=\"histogramChart.defaultOptions\"\n        >\n      </ve-histogram>\n      <ve-histogram\n        v-else-if='type===\"ve-finehistogram\"'\n        :id=\"type\"\n        :height=\"barLineChart.options.height\"\n        :width=\"barLineChart.options.width ? barLineChart.options.width : null\"\n        :colors=\"barLineChart.options.colors\"\n        :data=\"chartData\"\n        :settings=\"barLineChart.options.settings\"\n        :after-config=\"barLineChart.options.config\"\n        :after-set-option=\"barExtend\"\n        :extend=\"barLineChart.defaultOptions\"\n        >\n      </ve-histogram>\n      <div v-else-if='type===\"ve-treemap\"' class=\"rect-tree-map-chart\" style=\"height: 100%\"></div>\n      <ve-line\n        v-else-if='type===\"ve-line\"'\n        :data=\"chartData\"\n        :height=\"lineChart.options.height\"\n        :after-config=\"lineChart.options.config\"\n        :extend=\"lineChart.defaultOption\"\n        >\n      </ve-line>\n  </template>\n";
 var vComponentChart = function (el, chartData, config, type) {
   new Vue({
     delimiters: ['${', '}'],

+ 13 - 2
src/web/staticres/common-module/collection/css/index.css

@@ -920,7 +920,7 @@
 /* 空状态样式 */
 
 .emptycom {
-    margin-top: 3.6rem;
+    /* margin-top: 3.6rem; */
     display: -webkit-box;
     display: -webkit-flex;
     display: flex;
@@ -935,6 +935,7 @@
     -webkit-align-items: center;
     align-items: center;
     width: 100%;
+    height: 100%;
 }
 
 .emptycom .emptyimg {
@@ -955,7 +956,17 @@
     color: #5f5e64;
     line-height: .4rem;
 }
-
+.emptycom .empty-btn{
+  width: 3.3rem;
+  height: .8rem;
+  line-height: .8rem;
+  margin-top: .48rem;
+  background: #2ABED1;
+  color: #fff;
+  font-size: .32rem;
+  border-radius: 4px;
+  text-align: center;
+}
 
 /* vip弹窗样式 */
 .vip_component {

BIN
src/web/staticres/common-module/collection/image/bg/qy-zbtj-bg.png


BIN
src/web/staticres/common-module/collection/image/bg/qy-zbtj.png


BIN
src/web/staticres/common-module/collection/image/buyer/09.png


BIN
src/web/staticres/common-module/collection/image/buyer/10.png


BIN
src/web/staticres/common-module/collection/image/buyer/11.png


BIN
src/web/staticres/common-module/collection/image/buyer/cg-tjxx-bg.png


BIN
src/web/staticres/common-module/collection/image/buyer/cg-tjxx.png


BIN
src/web/staticres/common-module/collection/image/buyer/cg-zbdt-bg.jpg


BIN
src/web/staticres/common-module/collection/image/buyer/cg-zbdt.png


+ 29 - 14
src/web/staticres/common-module/collection/js/buyer-example.js

@@ -148,23 +148,23 @@ var buyerExample = {
         }
           // 合作企业注册资本分布
         case 'item_9': {
-          textMap.headText.top = '通过分析合作企业注册资本、采购项目规模、'
-          textMap.headText.bot = '利润率,全面洞察采购单位合作企业!'
-          textMap.source = 'buyer_portrait_withCapitalData_freeuser'
+          textMap.headText.top = '深入分析采购单位合作企业规模情况,辅助'
+          textMap.headText.bot = '投标决策'
+          textMap.source = 'buyer_portrait_cooperative_ent_capital'
           break
         }
          // 合作企业年龄分布
         case 'item_10': {
-          textMap.headText.top = '通过分析合作企业年龄、数量、规模分布情况,'
-          textMap.headText.bot = '全面洞察采购单位合作企业!'
-          textMap.source = 'buyer_portrait_withEstablishData_freeuser'
+          textMap.headText.top = '洞察采购单位合作企业成立时间,预判企业'
+          textMap.headText.bot = '实力'
+          textMap.source = 'buyer_portrait_cooperative_ent_age'
           break
         }
         // 合作企业注册地分布
         case 'item_11': {
-          textMap.headText.top = '通过分析合作企业的地址、数量、采购规模,'
-          textMap.headText.bot = '了解采购单位营商环境,辅助投标决策!'
-          textMap.source = 'buyer_portrait_withAreaData_freeuser'
+          textMap.headText.top = '获取采购单位合作企业注册地详情,了解业务'
+          textMap.headText.bot = '分布情况'
+          textMap.source = 'buyer_portrait_cooperative_ent_register_area'
           break
         }
         // 重点合作代理机构
@@ -174,6 +174,20 @@ var buyerExample = {
           textMap.source = 'buyer_portrait_topAgencyData_freeuser'
           break
         }
+        // 统计信息
+        case 'item_13': {
+          textMap.headText.top = '精准分析采购单位历史运作项目,'
+          textMap.headText.bot = '采购动态一目了然'
+          textMap.source = 'buyer_portrait_bidInfoDesc'
+          break
+        }
+        // 招标动态
+        case 'item_14': {
+          textMap.headText.top = '查看采购单位最新招标动态,及时跟踪采'
+          textMap.headText.bot = '购需求'
+          textMap.source = 'buyer_portrait_bidInfoList'
+          break
+        }
       }
       return textMap
     },
@@ -183,7 +197,7 @@ var buyerExample = {
       var info = this.userinfo
       var usage = this.useage
       // 【登录查看】:未登录,点击跳转到登录
-      // 【立即解锁】:未体验过采购单位画像的免费用户,点击进行“欢迎体验采购单位全景分析”留资
+      // 【免费体验】:未体验过采购单位画像的免费用户,点击进行“欢迎体验采购单位全景分析”留资
       // 【去开通】:已体验过1次采购单位画像的免费用户,点击进入超级订阅购买页
       // 【前往升级】:超级订阅老版用户+购买了非全国采购单位画像余额为0的超级订阅新版用户,点击进入超级订阅升级页
       // 【联系客服】:购买了全国采购单位画像余额为0的超级订阅新版用户+无采购单位画像权限的大会员客户;点击调起智齿在线客服
@@ -191,7 +205,8 @@ var buyerExample = {
         btnText = '登录查看'
       } else if (info.isFree) {
         if (info.freeBuyerPort === 0) {
-          btnText = '立即解锁'
+          // btnText = '免费体验'
+          btnText = '免费体验'
         } else {
           btnText = '去开通'
         }
@@ -236,7 +251,7 @@ var buyerExample = {
       `
       var isWeixin = utils.isWeiXinBrowser
       if(!isWeixin) {
-        if (this.getTextMap.btnText == '立即解锁') {
+        if (this.getTextMap.btnText == '免费体验') {
           // 留资
           location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=' + source
         } else if (this.getTextMap.btnText == '联系客服') {
@@ -285,7 +300,7 @@ var buyerExample = {
           }
         }
       } else {
-        if (this.getTextMap.btnText == '立即解锁') {
+        if (this.getTextMap.btnText == '免费体验') {
           // 留资
           location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=' + source
         } else if (this.getTextMap.btnText == '联系客服') {
@@ -337,7 +352,7 @@ var buyerExample = {
       console.log(_this.getTextMap.btnText)
       if(_this.getTextMap.btnText == '登录查看'){
         window.location.href = "/jyapp/free/login?to=back";
-      } else if (_this.getTextMap.btnText == '立即解锁') {
+      } else if (_this.getTextMap.btnText == '免费体验') {
         $.ajax({
           type: 'POST',
           url: '/publicapply/drainage/buyerunit',

+ 25 - 12
src/web/staticres/common-module/collection/js/ent_portrait.js

@@ -139,7 +139,11 @@ var vNode = {
       isSC:0, //0未收藏 1收藏
       idx:[],
       list:[],
-      entParams: {}
+      entParams: {},
+      // 用户是否登录
+      isLogin: true,
+      // 是否是免费用户
+      isFree: false
     }
   },
   created: function () {
@@ -276,6 +280,9 @@ var vNode = {
         return item
       })
       return !isShow
+    },
+    isFreeOrNotLogin () {
+      return this.isFree
     }
   },
   methods: {
@@ -408,6 +415,9 @@ var vNode = {
     },
     // 获取画像信息
     getEntPortrait: function (callback) {
+      if (this.isFree) {
+        return
+      }
       var storageSet = JSON.parse(sessionStorage.getItem('winner_high_set'))
       // if (!storageSet) return
       var _this = this
@@ -463,7 +473,7 @@ var vNode = {
               }
             }
           } else {
-            _this.$toast(res.error_msg)
+            // _this.$toast(res.error_msg)
             _this.show.yearData = false
             _this.show.monthData = false
             _this.show.areaData = false
@@ -655,7 +665,7 @@ var vNode = {
     getEntBaseInfo: function () {
       var _this = this
       let urls = ''
-      if (_this.powerInfo.memberStatus <= 0 || _this.svip) {
+      if (_this.powerInfo.memberStatus <= 0 || _this.svip || _this.isFree) {
         urls = '/bigmember/portrait/subVipPortrait/entDetail'
       } else {
         urls = '/bigmember/portrait/ent/detail'
@@ -774,21 +784,24 @@ var vNode = {
                 // 获取企业情报历史记录-12
                 _this.conf._12 = true
               }
-              // follow的权限:4.12.13只要有一个就可以
-              if (res.data.memberStatus > 0 && (power.indexOf(4) != -1 || power.indexOf(12) != -1 || power.indexOf(13) != -1)) {
-                _this.getEntFollowState()
-              } else {
-                _this.entInfo.followSearchFinish = true
-                _this.entInfo.entExist = false
-                _this.getEntVisits()
-                _this.portrait = 'winnerVip'
-              }
+              // // follow的权限:4.12.13只要有一个就可以
+              // if (res.data.memberStatus > 0 && (power.indexOf(4) != -1 || power.indexOf(12) != -1 || power.indexOf(13) != -1)) {
+              //   _this.getEntFollowState()
+              // } else {
+              //   _this.entInfo.followSearchFinish = true
+              //   _this.entInfo.entExist = false
+              //   _this.getEntVisits()
+              //   _this.portrait = 'winnerVip'
+              // }
+              // 所有身份均有权限关注
+              _this.getEntFollowState()
               // 新版超级订阅用户获取访问量
               if (newVip && (res.data.memberStatus <= 0 || res.data.power.indexOf(4) == -1)) {
                 _this.getEntVisits()
               }
 	            //免费用户体验权限
 	            if(res.data.isFree){
+                _this.isFree = true
                 if (res.data.freeEntPort==0) {
                   _this.canFreeExp=true
                 } else {

+ 23 - 2
src/web/staticres/common-module/collection/js/index-wx.js

@@ -7,7 +7,8 @@ var vNode = {
     dateComponent: dateComponent,
     cateComponent: cateComponent,
     phoneComponent: phoneComponent,
-    rootComponent: rootComponent
+    rootComponent: rootComponent,
+    bidStatusNode: bidStatusNode
   },
   data: {
     sessStorageKey: '$data-collection',
@@ -95,6 +96,9 @@ var vNode = {
     condition: true, // 列表星星显示
     personTagactive:0, //个人标签选择按钮下标
     screenShow: false, // 筛选按钮是否显示
+    showBidStatus: false,
+    popupHeight: 'height: 8.8rem',
+    projectCellInfo: {}
   },
   computed: {
     biEnv: function () {
@@ -206,6 +210,21 @@ var vNode = {
         }
       })
     },
+    setHeight: function (data) {
+      if(data === 2) {
+        this.popupHeight = 'height: 10.92rem'
+      } else {
+        this.popupHeight = 'height: 8.8rem'
+      }
+    },
+    // 更新投标状态成功
+    saveSuccess: function () {
+      this.showBidStatus = false
+    },
+    // 取消更新投标状态
+    cancelUpdate: function () {
+      this.showBidStatus = false
+    },
     // 列表跳转
     linkRouter: function(item) {
       try {
@@ -370,12 +389,14 @@ var vNode = {
           contentType: 'application/json',
           data: JSON.stringify(params),
           success: function (res) {
+              _this.projectCellInfo = item
               if (res.error_code === 0 && res.data) {
-                  _this.$toast('已参标,请前往我的参标项目列表查看。')
+                  // _this.$toast('已参标,请前往我的参标项目列表查看。')
                   _this.$set(item, 'isCB', {
                       id: item._id,
                       value: true
                   })
+                  _this.showBidStatus = true
               } else {
                 _this.$toast(res.error_msg)
               }

+ 24 - 3
src/web/staticres/common-module/collection/js/index.js

@@ -10,7 +10,8 @@ var vNode = {
     dateComponent: dateComponent,
     cateComponent: cateComponent,
     phoneComponent: phoneComponent,
-    rootComponent: rootComponent
+    rootComponent: rootComponent,
+    bidStatusNode: bidStatusNode
   },
   data: {
     sessStorageKey: '$data-collection',
@@ -96,7 +97,10 @@ var vNode = {
     condition: true, // 列表星星显示
     personTagactive:0, //个人标签选择按钮下标
     screenShow: false, // 筛选按钮是否显示
-    lid: '' // 获取从三级也跳转的id
+    lid: '', // 获取从三级也跳转的id
+    showBidStatus: false,
+    popupHeight: 'height: 8.8rem',
+    projectCellInfo: {}
   },
   computed: {
     biEnv: function () {
@@ -208,6 +212,21 @@ var vNode = {
         }
       })
     },
+    setHeight: function (data) {
+      if(data === 2) {
+        this.popupHeight = 'height: 10.92rem'
+      } else {
+        this.popupHeight = 'height: 8.8rem'
+      }
+    },
+    // 更新投标状态成功
+    saveSuccess: function () {
+      this.showBidStatus = false
+    },
+    // 取消更新投标状态
+    cancelUpdate: function () {
+      this.showBidStatus = false
+    },
     // 列表跳转
     linkRouter: function(item) {
       try {
@@ -372,8 +391,10 @@ var vNode = {
           contentType: 'application/json',
           data: JSON.stringify(params),
           success: function (res) {
+              _this.projectCellInfo = item
               if (res.error_code === 0 && res.data) {
-                  _this.$toast('已参标,请前往我的参标项目列表查看。')
+                  // _this.$toast('已参标,请前往我的参标项目列表查看。')
+                  _this.showBidStatus = true
                   _this.$set(item, 'isCB', {
                       id: item._id,
                       value: true

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

@@ -13,6 +13,7 @@ var vipDialog = `
   <div class="openBtn">
       <button class="goBtn" @click="goOpen(getTextMap.source)">{{getTextMap.btnText}}</button>
   </div>
+   <p class="no-login-tip" v-if="!islogin">登录后解锁会员查看更多内容</p>
 </div>
 `
 
@@ -65,6 +66,12 @@ var vipComponent = {
       default: function() {
         return false
       }
+    },
+    'islogin': {
+      type: Boolean,
+      default: function() {
+        return false
+      }
     }
   },
   data: function() {
@@ -127,7 +134,8 @@ var vipComponent = {
 
         // (2)【立即解锁】:未体验过企业画像的免费用户,中标分析各模块,点击进行“欢迎体验企业中标分析”留资;
         if (this.canFreeExp) {
-          textMap.btnText = '立即解锁'
+          // textMap.btnText = '立即解锁'
+          textMap.btnText = '免费体验'
         } else {
           if (this.power.vipStatus <= 0) {
             textMap.btnText = '去开通'
@@ -142,6 +150,7 @@ var vipComponent = {
         case 'item_1': {
           textMap.headText.top = '通过实时监控项目的招标、中标、合同等'
           textMap.headText.bot = '信息,全面挖掘更多潜在商机!'
+          textMap.source = 'ent_portrait_winnerNewMsg_freeuser'
           break
         }
           // 年度项目统计
@@ -216,12 +225,26 @@ var vipComponent = {
           textMap.source = 'ent_portrait_contacts'
           break
         }
+        // 统计信息-概况
+        case 'item_10': {
+          textMap.titleText = ''
+          textMap.btnText = this.power.isMember > 0 && this.power.arr.indexOf(4) == -1 ? '联系客服' : '免费体验'
+          textMap.headText.top = '全面透视企业历史中标项目、中标'
+          textMap.headText.bot = '金额、客户数量'
+          textMap.source = 'ent_portrait_bidInfoDesc'
+          break
+        }
         default: {
           textMap.headText.top = '通过实时监控项目的招标、中标、合同等'
           textMap.headText.bot = '信息,全面挖掘更多潜在商机!'
+          textMap.source = 'ent_portrait_new_free'
           break
         }
       }
+      // 未登录
+      if(!this.islogin) {
+        textMap.btnText = '登录查看'
+      }
       return textMap
     },
   },
@@ -260,6 +283,10 @@ var vipComponent = {
           location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=ent_portrait_freeuser'
           break
         }
+        case '登录查看': {
+          location.href = '/jyapp/free/login?to=back'
+          break
+        }
         default: {
           // location.href = '/jyapp/vipsubscribe/vipsubscribe_new'
           location.href = '/jy_mobile/common/order/create/svip?type=buy'

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

@@ -14,14 +14,14 @@ var consultDialog = new Vue({
           vipshow: false
       }
   },
-  created() {
+  created: function () {
   },
-  mounted() {
+  mounted: function () {
     this.getimage()
   },
   methods: {
-      getimage() {
-          let this_ = this
+      getimage: function () {
+          var this_ = this
           $.ajax({
               type: 'POST',
               url: '/bigmember/use/equity',
@@ -30,8 +30,8 @@ var consultDialog = new Vue({
               },
               success: function (res) {
                   if (res.data) {
-                      let customers = res.data.customers
-                      customers.forEach(ele => {
+                      var customers = res.data.customers
+                      customers.forEach(function (ele) {
                           if (ele.vip == false) {
                               this_.img = ele.wxer
 
@@ -45,8 +45,8 @@ var consultDialog = new Vue({
               }
           })
       },
-      getstates() {
-        let this_ = this
+      getstates: function () {
+        var this_ = this
         $.ajax({
             type: 'POST',
             url: '/bigmember/use/isAdd',
@@ -80,7 +80,7 @@ var consultDialog = new Vue({
             }
         })
     },
-    close(val) {
+    close: function (val) {
           this[val] = false
    },   
   }

File diff suppressed because it is too large
+ 1 - 0
src/web/staticres/common-module/js/bundle.min.js


+ 3 - 0
src/web/staticres/common-module/mainSearch/css/j-icons.css

@@ -359,6 +359,9 @@
 .icon-download {
     background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAE/SURBVHgB7ZZNTsMwEIXfWKVIrLhBswQWlJwAirphxw0IJwGOwAlKbwArNiC4QcUqLHMEVkjtwlM7/U/aOpk26qL+JCuONPY8jew3Bjz7DkHIyXsvUIfqy87/SYdJK/yDAAUhdIAL8wnsONK4hRC5AMIxtoBYwLbwAryAnQuouQLOPnuRuXSXesBPvzdhggKkJlWnB2b1FrfPX9fFuitAqmMufWRdz27sCp86pFlDijuueKcA1uiOp4FLxJw9pzHM07UrKdQLTj9+Xkjhbvyb6L5uqTqu0uqMVN7rAb4XkgPd+LoZufYudAjjdjPKVsIcn8YsotaQJLeU6oaZSiylTPLSAlwiyiYXCVglQpJcLCArQpp8Y4xJPdoBzwbkzsDE+1EBy3pDvhlN3K0CiNg+XhcE5J2Q9TMqokhv8OwfQ/kycNLa3JKkAAAAAElFTkSuQmCC");
 }
+.icon-download-999 {
+    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAdhJREFUWEftlT9oFEEUxr83xwVsRGwsTSqLtLEV7W0sLCJBc0hmZkUbtdHG2GiT2BicPyGcSkiKFEFIlcaQ2tbCSi0tBLERPG6ejEwg5M7bvbmDSNhtdoed932/+Wb3DeGYLzpmf9QA2Qm02+0znU5nO25hs9m81mq1fuRsZzaAMeayEOJ9NA0hXCmKYq8GqBOoEziZCRhj5onoohDilZTy48EqB/UB7/10COEOEb1TSu0OSqa0ETnnvgM4C+ATM89prT9EwX8BWGtniGgdwAUAX5RSU6MCPAGwmES+MvNNrfV+PwBr7SUiegvgfOqQT4uiOKjty1GaQKyy1j4jokdJ4RsRtbrd7q/DrbjRaJxi5jaAc3EeMz/XWj8u+zArASSIZSK6n8R/ArhNRFtpfB3AGhGdTuMXWusHZebxfWWAONk59xLA3ST8G8BEn+cVpdS9KuZDA6QkPBEt9DNg5lWttaxqngWQkngN4NYRozdKqflhzLMBYqH3foOZZ/+KEG1KKW8Maz4SQEpiKd6VUg9zzEcGyDU9XDfUXzAOw6MaPQDe+6sAKv3DGUDLUsqdgQk45z4DmMwQr1LSczb0JGCMWRRCxP4/9iuE0HM2/H/fwNiXXSJYJ/AHOebkIY4bPMkAAAAASUVORK5CYII=');
+}
 
 /******** img背景图 **********/
 .j-img {

+ 1 - 1
src/web/staticres/common-module/mainSearch/css/third-party-verify-mobile.css

@@ -1,5 +1,5 @@
 /* layout start */
-.j-container {
+.j-container.popup-layout {
   position: relative;
   display: flex;
   flex-direction: column;

+ 40 - 0
src/web/staticres/common-module/message-tip/css/index.css

@@ -0,0 +1,40 @@
+/* 模态提示框  css*/
+
+.text-overflow100 .weui-toast {
+  margin-left: 0;
+  width: 4.5rem;
+  min-height: .42rem;
+  font-size: 20px;
+  /* -webkit-transform: translateX(-50%);
+          transform: translateX(-50%); */
+    transform: translate(-50%, -30%);
+
+  }
+  .text-overflow100 .weui-icon_toast {
+    margin: 0;
+  }
+
+
+  .j-toast .weui-toast {
+    font-size: 0.3rem;
+    padding: 0.15rem 0.2rem;
+    max-width: 6rem;
+    min-height: 0;
+    width: auto;
+    height: auto;
+    top: 45%;
+    left: 50%;
+    margin-left: 0;
+    transform: translate(-50%, -50%);
+    background-color: rgba(0, 0, 0, 0.72) !important;
+    border-radius: 8px;
+  }
+
+  .j-toast .weui-icon_toast {
+    display: none;
+  }
+
+  .j-toast .weui-toast__content {
+    margin: 0;
+    color: #FFFFFF;
+  }

+ 178 - 0
src/web/staticres/common-module/message-tip/js/index.js

@@ -0,0 +1,178 @@
+/**
+ * 获取动态广告栏属性
+ * @param type
+ * @returns {Object|*}
+ */
+
+// url转base64 方法
+// base64 编码
+function getBase64Image(img) {
+  var canvas = document.createElement('canvas')
+  canvas.width = img.width
+  canvas.height = img.height
+  var ctx = canvas.getContext('2d')
+  ctx.drawImage(img, 0, 0, img.width, img.height)
+  var dataURL = canvas.toDataURL('image/png')
+  return dataURL
+}
+
+function getImage64Url(url, ref) {
+
+  // var that = this
+  var image = document.createElement('img')
+  image.setAttribute('crossorigin', 'anonymous')
+  image.src = url + '?v=' + Math.random() // 处理缓存
+  image.crossOrigin = 'anonymous'
+  image.onload = function () {
+    var base64 = getBase64Image(image)
+    console.log(base64);
+  }
+}
+
+// var ua = window.navigator.userAgent
+// let _isIOS     = -1;
+// function isIOS() {
+//   if (_isIOS === -1) {
+//     _isIOS = /iPhone|iPod|iPad/i.test(ua) ? 1 : 0;
+//   }
+//   return _isIOS === 1;
+// }
+
+
+var getActive = {
+  // 版本号
+  version: '0.0.1',
+  drawBase64Image: function (img) {
+    var canvas = document.createElement('canvas')
+    canvas.width = img.width
+    canvas.height = img.height
+    var ctx = canvas.getContext('2d')
+    ctx.drawImage(img, 0, 0, img.width, img.height)
+    var dataURL = canvas.toDataURL('image/png')
+    return dataURL
+
+  },
+  /**
+   * 获取后台广告方法
+   * @param {Array|String} active_codes_map 广告id标识符--数组集合["jy-wx-course-pay-success"]
+   * @param {String} active_tip_group 展示广告的容器demo节点
+   * @param {String} isAppsion 请求环境、app、weixin、pc
+   * @returns {Object|Array}
+   */
+  getActiveInfo: function (active_codes_map,isAppsion) {
+    // 如果执行环境是app
+    var isAppsionApp = isAppsion === 'App'
+    $.ajax({
+      url: '/publicapply/free/getJyAdList',
+      type: 'POST',
+      dataType: "json",
+      traditional: true,
+      //强制请求头数据格式 'application/json'
+      headers: {'Content-Type': 'application/json'},
+      data:active_codes_map,
+        // JSON.stringify({codes:["jy-wx-course-pay-success","jy-pc-dataPackage-pay-success"] })
+        // JSON.stringify()
+    }).done(function (res) {
+      // res.error_code =1
+      // Object.value 兼容处理
+      Object.values = function (obj) {
+        return Object.keys(obj).map(function(e) {
+          return obj[e]
+        })
+      }
+      if (res.error_code === 0 && res.data && Object.values(res.data)[0] && Object.values(res.data)[0] !=null && Object.values(res.data)[0][0]) {
+        // weixin、pc环境
+        var img = new Image()
+        var imgsrcArr = Object.values(res.data)[0][0]
+        img.src = imgsrcArr.s_pic
+         img.onload= function() {
+          $(".active-tip-group").show()
+        }
+        $(".active-tip-group img").attr('src', imgsrcArr.s_pic + '?v=' + Math.random())
+
+        // 如果是app环境 ,调用原生方法、执行保存
+        // var isAppsionType = isAppsionApp || utils.isIos || utils.isAndroid
+        var that = this
+        var isAppsionType = isAppsionApp
+        if (isAppsionType) {
+
+          // APP 保存图片
+          $('.active-tip-group').off('click').on('click', function () {
+            if(!window.picImgUrl) {
+                html2canvas(document.querySelector('.active-tip-group'), {
+                    // allowTaint: true,
+                    useCORS: true,
+                    backgroundColor: null,
+                    scale: 3,
+                    imageTimeout: 30000,
+                    allowTaint: true, // 允许跨域图片
+                }).then(function(canvas) {
+                    var imgUrl = imgsrcArr.base64 || canvas.toDataURL('image/png')
+                    console.log(imgUrl)
+                    // $(".active-tip-group img").attr('src', imgUrl)
+                    imgUrl = imgUrl.replace('data:image/png;base64,', '')
+                    // console.log(imgUrl)
+                    window.picImgUrl = imgUrl
+                    try {
+                      window.JyObj.savePic(imgUrl)
+
+                      setTimeout(function() {
+                          weui.toast('图片已保存,快去扫码识别吧', {
+                            duration: 800,
+                            className: 'text-overflow100'
+                          })
+                        }, 2300)
+
+                    } catch (e) {
+                      weui.toast('保存失败', {
+                        duration: 800,
+                        className: 'j-toast'
+                      })
+                      console.log(e)
+                      // location.href=imgsrcArr.s_link
+                    }
+                })
+            }else {
+                window.JyObj.savePic(window.picImgUrl)
+                setTimeout(function() {
+                  weui.toast('图片已保存,快去扫码识别吧', {
+                    duration: 800,
+                    className: 'text-overflow100'
+                  })
+                }, 2300)
+            }
+         })
+        } // App打开新窗口等 用 @param {String} isAppsion === 'Applink'
+        else if ((isAppsion === 'Applink') && imgsrcArr.o_extend && imgsrcArr.o_extend.linktype === 'abroad') {
+          $(".active-tip-group").on('click', function () {
+            try {
+              JyObj.openExternalLink(imgsrcArr.s_link, imgsrcArr.o_extend.title || '剑鱼标讯');
+            } catch (e) {
+              console.log(e);
+            }
+          })
+          if (isIOS()) {
+            $('.rules').css('margin-top', '0.28rem')
+          }
+        } else {
+          // weixin、pc环境 直接跳转
+          if (imgsrcArr.s_link) {
+            $(".active-tip-group").on('click', function () {
+              try {
+                location.href=imgsrcArr.s_link
+              } catch (e) {
+                console.log(e);
+              }
+            })
+          }
+        }
+      } else {
+        $('.rules').css('margin-top', '0.8rem')
+        $('.ad_space').hide()
+        $('.login-dig-box').css('left', 'calc(50vw - 181px)')
+      }
+    })
+  }
+}
+
+

File diff suppressed because it is too large
+ 292 - 0
src/web/staticres/common-module/message-tip/js/msgbuoy.js


File diff suppressed because it is too large
+ 126 - 126
src/web/staticres/common-module/pc-dialog/js/leave-info-dialog.js


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