浏览代码

提交代码

wangxiaogang 3 年之前
父节点
当前提交
b6fc047629
共有 100 个文件被更改,包括 3528 次插入2086 次删除
  1. 7 3
      config_formal/app_172.17.148.50/config.json
  2. 1 1
      config_formal/app_172.17.148.50/db.json
  3. 1 1
      config_formal/app_172.17.148.50/time.txt
  4. 7 3
      config_formal/app_i2_172.17.145.180/config.json
  5. 1 1
      config_formal/app_i2_172.17.145.180/db.json
  6. 1 1
      config_formal/app_i2_172.17.145.180/time.txt
  7. 3 3
      config_formal/big_member_1_172.17.145.180/config.json
  8. 1 1
      config_formal/big_member_1_172.17.145.180/db.json
  9. 1 1
      config_formal/big_member_1_172.17.145.180/time.txt
  10. 3 3
      config_formal/bigmember_172.17.145.180/config.json
  11. 1 1
      config_formal/bigmember_172.17.145.180/db.json
  12. 1 1
      config_formal/bigmember_172.17.145.180/time.txt
  13. 1 1
      config_formal/publicapply_172.17.148.50/commonfunctions.json
  14. 1 1
      config_formal/publicapply_172.17.148.50/time.txt
  15. 7 0
      config_formal/publicapply_172.17.4.183/active_report.json
  16. 4 0
      config_formal/publicapply_172.17.4.183/adLeague.json
  17. 3 0
      config_formal/publicapply_172.17.4.183/apploc.json
  18. 11 0
      config_formal/publicapply_172.17.4.183/bidcollection.json
  19. 7 0
      config_formal/publicapply_172.17.4.183/biddingtype.json
  20. 142 0
      config_formal/publicapply_172.17.4.183/bigmembermenu.json
  21. 195 0
      config_formal/publicapply_172.17.4.183/commonfunctions.json
  22. 44 0
      config_formal/publicapply_172.17.4.183/config.json
  23. 79 0
      config_formal/publicapply_172.17.4.183/db.json
  24. 7 0
      config_formal/publicapply_172.17.4.183/shareFission.json
  25. 45 0
      config_formal/publicapply_172.17.4.183/subvip_price.json
  26. 2 0
      config_formal/publicapply_172.17.4.183/time.txt
  27. 2 2
      config_formal/subscribepay_172.17.4.183/time.txt
  28. 2 2
      config_formal/subscribepay_2_172.17.145.180/time.txt
  29. 2 1
      config_formal/sword_172.17.145.167/config.json
  30. 1 1
      config_formal/sword_172.17.145.167/db.json
  31. 1 1
      config_formal/sword_172.17.145.167/time.txt
  32. 2 1
      config_formal/sword_172.17.148.50/config.json
  33. 1 1
      config_formal/sword_172.17.148.50/db.json
  34. 1 1
      config_formal/sword_172.17.148.50/time.txt
  35. 6 2
      config_formal/weixin_172.17.145.167/config.json
  36. 1 1
      config_formal/weixin_172.17.145.167/time.txt
  37. 6 2
      config_formal/weixin_172.17.145.180/config.json
  38. 1 1
      config_formal/weixin_172.17.145.180/time.txt
  39. 2 1
      src/config.json
  40. 1 1
      src/db.json
  41. 22 6
      src/jfw/front/front.go
  42. 7 15
      src/jfw/front/shorturl.go
  43. 371 369
      src/jfw/front/supsearch.go
  44. 914 903
      src/jfw/front/swordfish.go
  45. 8 3
      src/jfw/front/vipsubscribe.go
  46. 1 1
      src/jfw/front/wxkeyset.go
  47. 4 1
      src/jfw/jyutil/jyutil.go
  48. 25 1
      src/jfw/modules/app/src/app/front/front.go
  49. 12 2
      src/jfw/modules/app/src/app/front/login.go
  50. 8 2
      src/jfw/modules/app/src/app/front/swordfish.go
  51. 3 0
      src/jfw/modules/app/src/app/front/vipsubscribe.go
  52. 7 5
      src/jfw/modules/app/src/config.json
  53. 1 1
      src/jfw/modules/app/src/db.json
  54. 11 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/public.css
  55. 21 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_follow.js
  56. 19 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  57. 19 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  58. 14 0
      src/jfw/modules/app/src/web/staticres/jyapp/css/searchindex.css
  59. 181 6
      src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js
  60. 3 1
      src/jfw/modules/app/src/web/staticres/jyapp/me/js/account.js
  61. 10 4
      src/jfw/modules/app/src/web/staticres/jyapp/me/js/mine.js
  62. 29 11
      src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_entSearch.js
  63. 8 5
      src/jfw/modules/app/src/web/templates/big-member/page_ai_add.html
  64. 3 0
      src/jfw/modules/app/src/web/templates/big-member/page_ai_search.html
  65. 25 8
      src/jfw/modules/app/src/web/templates/big-member/page_client_follow_list.html
  66. 30 13
      src/jfw/modules/app/src/web/templates/big-member/page_client_list.html
  67. 12 10
      src/jfw/modules/app/src/web/templates/big-member/page_ent_follow.html
  68. 6 6
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html
  69. 3 1
      src/jfw/modules/app/src/web/templates/big-member/page_free_buyer_project_news.html
  70. 3 1
      src/jfw/modules/app/src/web/templates/big-member/page_free_ent_project_news.html
  71. 25 9
      src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_list.html
  72. 2 2
      src/jfw/modules/app/src/web/templates/big-member/page_report_detail_month.html
  73. 2 2
      src/jfw/modules/app/src/web/templates/big-member/page_report_detail_week.html
  74. 3 2
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  75. 19 22
      src/jfw/modules/app/src/web/templates/followent/set.html
  76. 8 7
      src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html
  77. 11 9
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_entSearch.html
  78. 33 38
      src/jfw/modules/app/src/web/templates/weixin/follow/set.html
  79. 1 0
      src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html
  80. 211 62
      src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html
  81. 4 4
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  82. 2 1
      src/jfw/modules/bigmember/src/config.json
  83. 1 0
      src/jfw/modules/bigmember/src/config/config.go
  84. 1 1
      src/jfw/modules/bigmember/src/db.json
  85. 4 2
      src/jfw/modules/bigmember/src/entity/portrait_screen.go
  86. 4 0
      src/jfw/modules/bigmember/src/filter/sessionfilter.go
  87. 1 1
      src/jfw/modules/bigmember/src/service/analysis/forecastproject.go
  88. 84 36
      src/jfw/modules/bigmember/src/service/analysis/forecastwinner.go
  89. 30 0
      src/jfw/modules/bigmember/src/service/analysis/util.go
  90. 129 0
      src/jfw/modules/bigmember/src/service/subscribe/subscribe.go
  91. 5 3
      src/jfw/modules/bigmember/src/service/use/use.go
  92. 0 1
      src/jfw/modules/bigmember/src/util/rpc.go
  93. 448 431
      src/jfw/modules/common/src/qfw/util/bidsearch/search.go
  94. 12 10
      src/jfw/modules/common/src/qfw/util/jy/bigVipPower.go
  95. 67 0
      src/jfw/modules/common/src/qfw/util/jy/userInfo.go
  96. 1 0
      src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/js/login.js
  97. 19 22
      src/jfw/modules/followent/src/web/templates/weixin/set.html
  98. 1 1
      src/jfw/modules/publicapply/src/userbase/commonfunctions.json
  99. 0 1
      src/jfw/modules/subscribepay/src/main.go
  100. 15 3
      src/jfw/modules/subscribepay/src/service/userAccountInfo.go

+ 7 - 3
config_formal/app_172.17.148.50/config.json

@@ -17,7 +17,7 @@
 	"vipreport":"/subscribepay/report/wxtplmsg?start=%s&end=%s&pushcount=%s",
 	"entnichehistorypush":"/jyapp/entniche/pushlist?selectTime=%s&pi=%s&pn=%s&type=%s",
 	"trackReport":"/page_entniche/business/t-report/detail/%s_%s/%s",
-	"viphomepage":"/jyapp/vipsubscribe/toSubVipSetPage",
+	"viphomepage":"/jyapp/vipsubscribe/toSubVipSetPage?vSwitch=%s",
 	"pushFollowEnt": "/jyapp/big/page/ent_follow",
 	"pushFollowProject": "/jyapp/big/page/pro_follow_list",
 	"pushMember": "/jyapp/big/page/big_subscribe?pushtime=%s",
@@ -25,7 +25,8 @@
 	"pushEntChange": "/jyapp/big/page/ent_follow",
 	"followProjectSet": "/jyapp/big/page/pro_follow_detail?fid=%s&sid=%s",
 	"memberreport":"/bigmember/report/openpushmsg?start=%s&end=%s&pushcount=%s",
-	"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s"
+	"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s",
+	"entnichepush": "/jyapp/entniche/push?time=%s&pi=%s&pn=%s&type=%s"
     },
     "followProject": 10,
     "followentlimit":"10",
@@ -176,5 +177,8 @@
     "maxBindPop":20,
     "bindPopRedis":"merge",
     "phoneFilterFlag":true,
-    "optimalTime":"2021-08-18 14:00:00"
+    "optimalTime":"2021-08-18 14:00:00",
+    "criticality":70,
+    "canReadNotice": 3,
+    "namePrefix":"JY_%s"
 }

+ 1 - 1
config_formal/app_172.17.148.50/db.json

@@ -37,7 +37,7 @@
     },
     "redis": {
     	"main": {
-			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,grayupdate=172.17.145.167:2204"
+			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,grayupdate=172.17.145.167:2204,newother=172.17.145.164:23112"
 		}
     },
     "mysql": {

+ 1 - 1
config_formal/app_172.17.148.50/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-2-24 13:00:00
+2022-3-7 12:00:00

+ 7 - 3
config_formal/app_i2_172.17.145.180/config.json

@@ -17,7 +17,7 @@
 	"vipreport":"/subscribepay/report/wxtplmsg?start=%s&end=%s&pushcount=%s",
 	"entnichehistorypush":"/jyapp/entniche/pushlist?selectTime=%s&pi=%s&pn=%s&type=%s",
 	"trackReport":"/page_entniche/business/t-report/detail/%s_%s/%s",
-	"viphomepage":"/jyapp/vipsubscribe/toSubVipSetPage",
+	"viphomepage":"/jyapp/vipsubscribe/toSubVipSetPage?vSwitch=%s",
 	"pushFollowEnt": "/jyapp/big/page/ent_follow",
 	"pushFollowProject": "/jyapp/big/page/pro_follow_list",
 	"pushMember": "/jyapp/big/page/big_subscribe?pushtime=%s",
@@ -25,7 +25,8 @@
 	"pushEntChange": "/jyapp/big/page/ent_follow",
 	"followProjectSet": "/jyapp/big/page/pro_follow_detail?fid=%s&sid=%s",
 	"memberreport":"/bigmember/report/openpushmsg?start=%s&end=%s&pushcount=%s",
-	"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s"
+	"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s",
+	"entnichepush": "/jyapp/entniche/push?time=%s&pi=%s&pn=%s&type=%s"
     },
     "followProject": 10,
     "followentlimit":"10",
@@ -176,5 +177,8 @@
     "maxBindPop":20,
     "bindPopRedis":"merge",
     "phoneFilterFlag":true,
-    "optimalTime":"2021-08-18 14:00:00"
+    "optimalTime":"2021-08-18 14:00:00",
+    "criticality":70,
+    "canReadNotice": 3,
+    "namePrefix":"JY_%s"
 }

+ 1 - 1
config_formal/app_i2_172.17.145.180/db.json

@@ -37,7 +37,7 @@
     },
     "redis": {
     	"main": {
-			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,grayupdate=172.17.145.167:2204"
+			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,grayupdate=172.17.145.167:2204,newother=172.17.145.164:23112"
 		}
     },
     "mysql": {

+ 1 - 1
config_formal/app_i2_172.17.145.180/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-2-24 13:00:00
+2022-3-7 12:00:00

+ 3 - 3
config_formal/big_member_1_172.17.145.180/config.json

@@ -14,7 +14,7 @@
 	}
     ],
     "portraitPool": 5,
-    "portraitCacheDay": 7,
+    "portraitCacheDay": 1,
     "portraitScreenPool":5,
     "rdProLimit":10,
     "followPushRpc": "127.0.0.1:8900",
@@ -69,6 +69,6 @@
 	  "limit": 3,
 	  "timeOut": 20,
 	  "projectNumLimit": 600000
-	}
-
+	},
+    "forecastTime":86400
 }

+ 1 - 1
config_formal/big_member_1_172.17.145.180/db.json

@@ -42,7 +42,7 @@
     },
     "redis": {
     	"main":{
-			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000"
+			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,newother=172.17.145.164:23112"
 		}
     },
     "mysql": {

+ 1 - 1
config_formal/big_member_1_172.17.145.180/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-1-14 9:00:00
+2022-3-7 12:00:00

+ 3 - 3
config_formal/bigmember_172.17.145.180/config.json

@@ -14,7 +14,7 @@
 	}
     ],
     "portraitPool": 5,
-    "portraitCacheDay": 7,
+    "portraitCacheDay": 1,
     "portraitScreenPool":5,
     "rdProLimit":10,
     "followPushRpc": "127.0.0.1:8900",
@@ -69,6 +69,6 @@
 	  "limit": 3,
 	  "timeOut": 20,
           "projectNumLimit": 600000
-	}
-
+	},
+    "forecastTime":86400
 }

+ 1 - 1
config_formal/bigmember_172.17.145.180/db.json

@@ -42,7 +42,7 @@
     },
     "redis": {
     	"main":{
-			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000"
+			"address": "other=172.17.145.167:2203,push=172.17.145.167:2203,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,newother=172.17.145.164:23112"
 		}
     },
     "mysql": {

+ 1 - 1
config_formal/bigmember_172.17.145.180/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2021-12-30 16:15:12
+2022-3-7 12:00:00

+ 1 - 1
config_formal/publicapply_172.17.148.50/commonfunctions.json

@@ -7,7 +7,7 @@
 			"charge":false,
 			"isbase":true,
 			"pc":{
-				"url":"/jylab/supsearch/index.html?publishtime=thisyear",
+				"url":"/jylab/supsearch/index.html",
 				"img":"/commonFunctions/pc_search.png"
 			}
 		},

+ 1 - 1
config_formal/publicapply_172.17.148.50/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-1-18 9:00:00
+2022-3-7 12:00:00

+ 7 - 0
config_formal/publicapply_172.17.4.183/active_report.json

@@ -0,0 +1,7 @@
+{
+  "yearEndReportEnd": 1644854400,
+  "shareUrl": "https://www.jianyu360.cn/active/yearEndReport?from=share",
+  "replyTitle": "「我的剑鱼标讯2021」年度报告已经生成,请查收",
+  "replyHref": "https://www.jianyu360.cn/active/yearEndReport?from=reply",
+  "userSourceFlag": "21yearEndReport"
+}

+ 4 - 0
config_formal/publicapply_172.17.4.183/adLeague.json

@@ -0,0 +1,4 @@
+{
+	"exposure" :"http://172.17.4.182:880/advertisingExposure",
+	"click" :"http://172.17.4.182:880/advertisingClick"
+}

+ 3 - 0
config_formal/publicapply_172.17.4.183/apploc.json

@@ -0,0 +1,3 @@
+{
+	"colloctime":"24h"
+}

+ 11 - 0
config_formal/publicapply_172.17.4.183/bidcollection.json

@@ -0,0 +1,11 @@
+{
+    "payUserCollLimit":5000,
+    "freeUserCollLimit":100,
+    "pageSize":50,
+    "freePageSize":100,
+    "labelMaxCount":50,
+    "collRedisDb":"other",
+    "isCollRedisTime":259200,
+    "collListRedisTime":7200,
+    "collListRedisMaxCount":100
+}

+ 7 - 0
config_formal/publicapply_172.17.4.183/biddingtype.json

@@ -0,0 +1,7 @@
+{
+	"subtypecoll":"biddingtype",
+	"cwcollotion":"drainage_content_config",
+	"cwlogcoll":"drainage_content_log",
+	"wxdrcoll":"drainage_wxreply_log",
+	"butlogcoll":"drainage_buyerunit_log"
+}

+ 142 - 0
config_formal/publicapply_172.17.4.183/bigmembermenu.json

@@ -0,0 +1,142 @@
+[
+	{
+		"firstlevel":"我的订阅",
+		"secondarylevel":[
+			{
+				"name":"订阅信息",
+				"url":"/swordfish/page_big_pc/big_subscribe",
+				"isusable":true
+			},
+			{
+				"name":"订阅管理",
+				"url":"/swordfish/page_big_pc/set_subscribe/config",
+				"isusable":false
+			}
+		]
+	},
+	{
+		"firstlevel":"我的关注",
+		"secondarylevel":[
+			{
+				"name":"项目关注",
+				"url":"/swordfish/page_big_pc/free/project_progress",
+				"isusable":true
+			},
+			{
+				"name":"企业关注",
+				"url":"/swordfish/page_big_pc/free/ent_follow",
+				"isusable":true
+			},
+			{
+				"name":"客户关注",
+				"url":"/swordfish/page_big_pc/my_client",
+				"isusable":false
+			}
+		]
+	},
+	{
+		"firstlevel":"我的收藏",
+		"secondarylevel":[
+			{
+				"name":"文库收藏",
+				"url":"/swordfish/docs/user/collections",
+				"isusable":true
+			},
+			{
+				"name":"标讯收藏",
+				"url":"/swordfish/frontPage/collection/sess/index",
+				"isusable":true
+			}
+		]
+	},
+	{
+		"firstlevel":"会员服务",
+		"secondarylevel":[
+			{
+				"name":"企业情报监控",
+				"url":"/swordfish/page_big_pc/free/ent_follow",
+				"isusable":true
+			},
+			{
+				"name":"中标企业预测",
+				"url":"/swordfish/page_big_pc/ai_search",
+				"isusable":false
+			},
+			{
+				"name":"投标决策分析",
+				"url":"/swordfish/page_big_pc/analysis_search",
+				"isusable":false
+			},
+			{
+				"name":"潜在项目预测",
+				"url":"/swordfish/page_big_pc/forecast_list",
+				"isusable":false
+			},
+			{
+				"name":"潜在客户挖掘",
+				"url":"/swordfish/page_big_pc/potential_cor_list/c",
+				"isusable":false
+			},
+			{
+				"name":"潜在竞争对手/合作伙伴挖掘",
+				"url":"/swordfish/page_big_pc/potential_rival_list/r",
+				"isusable":false
+			},
+			{
+				"name":"周报",
+				"url":"/swordfish/page_big_pc/bigvip_subreport_week",
+				"isusable":false
+			},
+			{
+				"name":"月报",
+				"url":"/swordfish/page_big_pc/bigvip_subreport_month",
+				"isusable":false
+			},
+			{
+				   "name":"定制化分析报告",
+				   "url":"/swordfish/page_big_pc/desktop/report_analysis",
+				   "isusable":false
+			}
+		]
+	},
+	{
+		"firstlevel":"我的资产",
+		"secondarylevel":[
+			{
+				"name":"数据导出记录",
+				"url":"/front/dataPack/index?type=history",
+				"isusable":true
+			},
+			{
+				"name":"数据流量包",
+				"url":"/front/dataPack/index",
+				"isusable":true
+			},
+			{
+				"name":"剑鱼币",
+				"url":"/swordfish/integral/index",
+				"isusable":true
+			},
+			{
+				"name":"优惠券",
+				"url":"/swordfish/coupon/",
+				"isusable":true
+			},
+			{
+				"name":"我的文库",
+				"url":"/swordfish/docs/user/docs",
+				"isusable":true
+			}
+		]
+	},
+	{
+		"firstlevel":"交易管理",
+		"secondarylevel":[
+			{
+				"name":"我的订单",
+				"url":"/front/swordfish/toMyOrder",
+				"isusable":true
+			}
+		]
+	}
+]

+ 195 - 0
config_formal/publicapply_172.17.4.183/commonfunctions.json

@@ -0,0 +1,195 @@
+{
+	"cfcollotion":"commonfunctions",
+	"total":8,
+	"commonFunctions":[
+		{
+			"name":"招标搜索",
+			"charge":false,
+			"isbase":true,
+			"pc":{
+				"url":"/jylab/supsearch/index.html",
+				"img":"/commonFunctions/pc_search.png"
+			}
+		},
+		{
+			"name":"标讯收藏",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/frontPage/collection/sess/index",
+				"img":"/commonFunctions/pc_collection.png"
+			}
+		},
+		{
+			"name":"项目关注",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/page_big_pc/free/project_progress",
+				"img":"/commonFunctions/pc_follow_project.png"
+			}
+		},
+		{
+			"name":"企业搜索",
+			"charge":false,
+			"isbase":true,
+			"pc":{
+				"url":"/jylab/entSearch/index.html",
+				"img":"/commonFunctions/pc_entsearch.png"
+			}
+		},
+		{
+			"name":"企业情报监控",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/page_big_pc/free/ent_follow",
+				"img":"/commonFunctions/pc_ent_follow.png"
+			}
+		},
+		{
+			"name":"订阅信息",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/page_big_pc/big_subscribe",
+				"img":"/commonFunctions/pc_subscribe_info.png"
+			}
+		},
+		{
+			"name":"订阅管理",
+			"charge":true,
+			"isbase":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/set_subscribe/config",
+				"img":"/commonFunctions/pc_subscribe_manage.png"
+			}
+		},
+		{
+			"name":"数据自助导出",
+			"charge":false,
+			"isbase":true,
+			"pc":{
+				"url":"/front/dataExport/toSieve",
+				"img":"/commonFunctions/pc_dataExport_index.png"
+			}
+		},
+		{
+			"name":"数据导出记录",
+			"charge":false,
+			"isbase":true,
+			"pc":{
+				"url":"/front/dataPack/index?type=history",
+				"img":"/commonFunctions/pc_dataPack_history.png"
+			}
+		},
+		{
+			"name":"数据流量包",
+			"charge":false,
+			"pc":{
+				"url":"/front/dataPack/index",
+				"img":"/commonFunctions/pc_dataPack_me.png"
+			}
+		},
+		{
+			"name":"潜在客户挖掘",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/potential_cor_list/c",
+				"img":"/commonFunctions/pc_potential_c.png"
+			}
+		},
+		{
+			"name":"潜在竞争对手/合作伙伴挖掘",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/potential_rival_list/r",
+				"img":"/commonFunctions/pc_potential_r.png"
+			}
+		},
+		{
+			"name":"中标企业预测",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/ai_search",
+				"img":"/commonFunctions/pc_ai_search.png"
+			}
+		},
+		{
+			"name":"投标决策分析",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/analysis_search",
+				"img":"/commonFunctions/pc_analysis_search.png"
+			}
+		},
+		{
+			"name":"潜在项目预测",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/forecast_list",
+				"img":"/commonFunctions/pc_forecast_list.png"
+			}
+		},
+		{
+			"name":"周报",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/bigvip_subreport_week",
+				"img":"/commonFunctions/pc_subreport_week.png"
+			}
+		},
+		{
+			   "name":"定制化分析报告",
+			   "charge":true,
+			   "pc":{
+			      "url":"/swordfish/page_big_pc/desktop/report_analysis",
+			      "img":"/commonFunctions/analysis_report.png"
+			   }
+		},
+		{
+			"name":"月报",
+			"charge":true,
+			"pc":{
+				"url":"/swordfish/page_big_pc/bigvip_subreport_month",
+				"img":"/commonFunctions/pc_subreport_month.png"
+			}
+		},
+		{
+			"name":"我的订单",
+			"charge":false,
+			"pc":{
+				"url":"/front/swordfish/toMyOrder",
+				"img":"/commonFunctions/pc_myorder.png"
+			}
+		},
+		{
+			"name":"剑鱼币",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/integral/index",
+				"img":"/commonFunctions/pc_integral.png"
+			}
+		},
+		{
+			"name":"文库收藏",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/docs/user/collections",
+				"img":"/commonFunctions/pc_docs_collections.png"
+			}
+		},
+		{
+			"name":"我的文库",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/docs/user/docs",
+				"img":"/commonFunctions/pc_mydocs.png"
+			}
+		},
+		{
+			"name":"优惠券",
+			"charge":false,
+			"pc":{
+				"url":"/swordfish/coupon/",
+				"img":"/commonFunctions/pc_mycoupon.png"
+			}
+		}
+	]
+}

+ 44 - 0
config_formal/publicapply_172.17.4.183/config.json

@@ -0,0 +1,44 @@
+{
+    "webPort": "828",
+    "mail": [
+      {
+		"addr": "smtp.exmail.qq.com",
+		"port": 465,
+		"pwd": "BBscx20140312",
+		"user": "jianyu360@topnet.net.cn"
+	},{
+		"addr": "smtp.exmail.qq.com",
+		"port": 465,
+		"pwd": "Mu^$i21673",
+		"user": "public04@topnet.net.cn"
+	}
+    ],
+    "industry": "行业分类",
+    "defaultEntList": [
+		"8fff68e8c41ba665b8b83a12a1f9941a",
+		"6e0aacae4521d5acf230a3e415a068a6",
+		"1a3e31760f90b3ae536f1ee024ec78a0",
+		"e273f0e21845017b4347277dffebe8e8",
+		"83b700c7e4910410af7eaf9a1a1ba47e",
+		"fda53341919f65141e8b80d3496d9169",
+		"afc86b1f3be2591cd01ac8d768471a6e",
+		"a3b4ff8050cb9c2cae925ca2dc3a8687",
+		"81fbbf994bdb69f924a4ee9d6edb6242",
+		"d12e8987248370fbee76c48515d595de",
+		"36cf2ad63df3bc206db386771bc97f42",
+		"695975f610fcfa1fc5ea3089578cdd69",
+		"3e17b6ea3d362756e7b12611d5532e18",
+		"5ca2e04741cbc85278a5f01c5f3f361e",
+		"50d465e07f14cda1c2dd1c018c8bfe5a",
+		"5f49bbac67d65608d6ade3e174f5b96c",
+		"e79ed44b9cceaf2cf9a8c58a020b268e",
+		"5c821789bbb8fbb52133bbd9cc608384",
+		"9e389197e9ca6ac43fa8579b58c41dcc",
+		"2539dda077fc2bda8e8812c6532e2642",
+		"e99137b2a504c7204dedc9545b170e5f"
+    ],
+    "bidSearchOldUserLimit": 1627920001,
+    "attachmentRPC":"172.17.145.178:10082",
+    "followPushRpc": "172.17.145.180:8900",
+    "file_number": 10
+}

+ 79 - 0
config_formal/publicapply_172.17.4.183/db.json

@@ -0,0 +1,79 @@
+{
+	"mongodb": {
+		"main": {
+			"address": "172.17.4.193:27080,172.17.4.83:27080",
+	 		"size": 120,
+	 		"dbName": "qfw"
+		},
+		"log": {
+			"address": "172.17.145.176:27095",
+	 		"size": 50,
+	 		"dbName": "qfw",
+			"userName": "jianyu",
+			"password": "jylog2020_123"
+		},
+		"bidding": {
+			"address": "172.17.145.163:27083,172.17.4.187:27082",
+	 		"size": 100,
+	 		"dbName": "qfw",
+			"collection": "bidding",
+			"collection_back": "bidding_back",
+			"userName": "JS2Z_Rbid_ProG",
+			"password": "JS2z@S1e3aR5Ch"
+		},
+		"ent": {
+			"address": "172.17.145.163:27083,172.17.4.187:27082",
+	 		"size": 50,
+	 		"dbName": "mixdata",
+			"userName": "JS2Z_Rbid_ProG",
+			"password": "JS2z@S1e3aR5Ch"
+		}
+	},
+	"elasticsearch": {
+		"main": {
+			"address": "http://172.17.148.59:9800,http://172.17.148.61:9800",
+	    	        "size": 30
+		}
+    },
+    "redis": {
+    	"main":{
+			"address": "other=172.17.145.167:2203,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000"
+		}
+    },
+    "mysql": {
+	    "main": {
+	        "dbName":   "jianyu",
+		"address":  "172.17.145.169:3306",
+		"userName": "root",
+		"passWord": "TopMysql@123",
+		"maxOpenConns":300,
+		"maxIdleConns":80
+	    },
+	    "push": {
+	        "dbName": "jianyu",
+		"address": "172.17.4.202:3306",
+		"userName": "root",
+		"passWord": "Topnet123",
+		"maxOpenConns":300,
+		"maxIdleConns":80
+	    },
+	    "memberPush": {
+	        "dbName": "jianyu",
+		"address": "172.17.148.49:3306",
+		"userName": "root",
+		"passWord": "Topnet123",
+		"maxOpenConns":120,
+		"maxIdleConns":80
+		},
+	    "entnichePush": {
+	        "dbName": "jianyu",
+		"address": "172.17.4.202:3306",
+		"userName": "root",
+		"passWord": "Topnet123",
+		"maxOpenConns":300,
+		"maxIdleConns":80
+	    }
+    },
+    "bdcollection":"bdcollection",
+    "bdlabel":"bdlabel"
+}

+ 7 - 0
config_formal/publicapply_172.17.4.183/shareFission.json

@@ -0,0 +1,7 @@
+{
+	"jobNum":10,
+	"workerNum":10,
+	"shareRedis":"other",
+	"webdomain":"https://www.jianyu360.cn/",
+	"saveTime":7
+}

+ 45 - 0
config_formal/publicapply_172.17.4.183/subvip_price.json

@@ -0,0 +1,45 @@
+{
+  "old": {
+    "month": {
+      "oneCity_oneBuyerClass": 580,
+      "oneCity_allBuyerClass": 1800,
+      "oneProvince_oneBuyerClass": 1180,
+      "oneProvince_allBuyerClass": 3800,
+      "allProvince_oneBuyerClass": 11800,
+      "allProvince_allBuyerClass": 38800
+    },
+    "year": {
+      "oneCity_oneBuyerClass": 5800,
+      "oneCity_allBuyerClass": 18000,
+      "oneProvince_oneBuyerClass": 11800,
+      "oneProvince_allBuyerClass": 38000,
+      "allProvince_oneBuyerClass": 118000,
+      "allProvince_allBuyerClass": 388000
+    },
+    "cityPrice": 580,
+    "provincePrice": 1180,
+    "buyerClassPrice": 580,
+    "cityMaxCount": 2,
+    "provinceMaxCount": 9,
+    "buyerClassMaxCount": 3,
+    "monthMaxCount": 10
+  },
+  "new": {
+    "month": {
+      "oneProvince_allBuyerClass": 3800,
+      "allProvince_allBuyerClass": 59900
+    },
+    "quarter": {
+      "oneProvince_allBuyerClass": 9900,
+      "allProvince_allBuyerClass": 149900
+    },
+    "year": {
+      "oneProvince_allBuyerClass": 38000,
+      "allProvince_allBuyerClass": 599900
+    },
+    "provincePrice": 3800,
+    "provinceMaxCount": 15,
+    "monthMaxCount": 10
+  },
+  "discount": 1
+}

+ 2 - 0
config_formal/publicapply_172.17.4.183/time.txt

@@ -0,0 +1,2 @@
+#上次修改时间,比当前修改时间小就行
+2022-3-7 12:00:00

+ 2 - 2
config_formal/subscribepay_172.17.4.183/time.txt

@@ -1,2 +1,2 @@
-#上次修改时间,比当前修改时间小就行
-2022-02-08 00:00:00
+#上次修改时间,比当前修改时间小就行
+2022-3-7 12:00:00

+ 2 - 2
config_formal/subscribepay_2_172.17.145.180/time.txt

@@ -1,2 +1,2 @@
-#上次修改时间,比当前修改时间小就行
-2022-02-08 00:00:00
+#上次修改时间,比当前修改时间小就行
+2022-3-7 12:00:00

+ 2 - 1
config_formal/sword_172.17.145.167/config.json

@@ -56,7 +56,8 @@
 	"memberreport_experience":"/bigmember/report/openpushmsg?t=wx_experience&start=%s&end=%s&pushcount=%s&advertcode=%s",
         "chanpartner":"/weixin/frontPage/partner/sess/partner?p=wxmeun",
 	"datareport":"/datareport/page/order/detail/%s?advertcode=%s",
-	"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun"
+	"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun",
+	"toSubVipSetPage":"/front/vipsubscribe/toSubVipSetPage?advertcode=%s"
     },
     "jy_activeset":{
 		"activitystartcode":"3201000000",

+ 1 - 1
config_formal/sword_172.17.145.167/db.json

@@ -38,7 +38,7 @@
     },
     "redis": {
         "main":{
-            "address": "other=127.0.0.1:2203,push=127.0.0.1:2203,sso=172.17.4.83:1711,session=127.0.0.1:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204"
+            "address": "other=127.0.0.1:2203,push=127.0.0.1:2203,sso=172.17.4.83:1711,session=127.0.0.1:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,newother=172.17.145.164:23112"
 		},
 	 "login": {
 	    "address": "login=10.170.187.34:1716"

+ 1 - 1
config_formal/sword_172.17.145.167/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-2-24 13:00:00
+2022-3-7 12:00:00

+ 2 - 1
config_formal/sword_172.17.148.50/config.json

@@ -56,7 +56,8 @@
 	"memberreport_experience":"/bigmember/report/openpushmsg?t=wx_experience&start=%s&end=%s&pushcount=%s&advertcode=%s",
 	"chanpartner":"/weixin/frontPage/partner/sess/partner?p=wxmeun",
 	"datareport":"/datareport/page/order/detail/%s?advertcode=%s",
-	"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun"
+	"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun",
+	"toSubVipSetPage":"/front/vipsubscribe/toSubVipSetPage?advertcode=%s"
     },
     "jy_activeset":{
 		"activitystartcode":"3201000000",

+ 1 - 1
config_formal/sword_172.17.148.50/db.json

@@ -40,7 +40,7 @@
     },
     "redis": {
         "main":{
-            "address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204"
+            "address": "other=172.17.145.167:2203,push=172.17.145.167:2203,sso=172.17.4.83:1711,session=172.17.145.167:2205,pushcache_1=172.17.4.202:5000,pushcache_2_a=172.17.145.169:5000,pushcache_2_b=172.17.4.83:5000,merge=172.17.145.167:2204,newother=172.17.145.164:23112"
 		},
 	 "login": {
 	    "address": "login=10.170.187.34:1716"

+ 1 - 1
config_formal/sword_172.17.148.50/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2022-2-24 13:00:00
+2022-3-7 12:00:00

+ 6 - 2
config_formal/weixin_172.17.145.167/config.json

@@ -11,7 +11,7 @@
 			"password": "jylog2020_123"
 	},
 	"cassandrasize": 10,
-	"redisServers": "other=172.17.145.167:2203,sso=172.17.4.83:1711,jyop_other=172.17.4.83:1712,push=172.17.145.167:2203,wxtoken=172.17.4.83:1711",
+	"redisServers": "other=172.17.145.167:2203,sso=172.17.4.83:1711,jyop_other=172.17.4.83:1712,push=172.17.145.167:2203,wxtoken=172.17.4.83:1711,newother=172.17.145.164:23112",
 	"redisLogin":"login=10.170.187.34:1716",
 	"weixinport": "8211",
 	"jyop_webrpcport": "172.17.4.185:8023",
@@ -154,5 +154,9 @@
         "EntUrl": ["企业全景分析","多维度帮你分析竞争对手","/big-member/image/wxreply/entportrait.png","https://mp.weixin.qq.com/s/0HguU-yu8eTf96Y8mNsD3A?wxreply=%s"],
         "BuyerUrl": ["采购单位全景分析","快速、全面地了解采购单位","/big-member/image/wxreply/buyportrait.png","https://mp.weixin.qq.com/s/gXpB25K6I8401115pBGV1g?wxreply=%s"],
         "ReportUrl": ["市场分析周报/月报","分析市场规模、增长趋势,评估市场体量","/big-member/image/wxreply/reportmm.png","https://mp.weixin.qq.com/s/rlJenKOvmHvqd9_4811otg?wxreply=%s"]
-    }
+    },
+    "pcQrCode":{
+    		"10":true,"11":true,"12":true,"13":true,"14":true,"17":true,"18":true,"19":true
+    },
+    "namePrefix":"JY_%s"
 }

+ 1 - 1
config_formal/weixin_172.17.145.167/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2021-12-30 16:15:12
+2022-3-7 12:00:00

+ 6 - 2
config_formal/weixin_172.17.145.180/config.json

@@ -11,7 +11,7 @@
 			"password": "jylog2020_123"
 	},
 	"cassandrasize": 10,
-	"redisServers": "other=172.17.145.167:2203,sso=172.17.4.83:1711,jyop_other=172.17.4.83:1712,push=172.17.145.167:2203,wxtoken=172.17.4.83:1711",
+	"redisServers": "other=172.17.145.167:2203,sso=172.17.4.83:1711,jyop_other=172.17.4.83:1712,push=172.17.145.167:2203,wxtoken=172.17.4.83:1711,newother=172.17.145.164:23112",
 	"redisLogin":"login=10.170.187.34:1716",
 	"weixinport": "8211",
 	"jyop_webrpcport": "172.17.4.185:8023",
@@ -154,5 +154,9 @@
         "EntUrl": ["企业全景分析","多维度帮你分析竞争对手","/big-member/image/wxreply/entportrait.png","https://mp.weixin.qq.com/s/0HguU-yu8eTf96Y8mNsD3A?wxreply=%s"],
         "BuyerUrl": ["采购单位全景分析","快速、全面地了解采购单位","/big-member/image/wxreply/buyportrait.png","https://mp.weixin.qq.com/s/gXpB25K6I8401115pBGV1g?wxreply=%s"],
         "ReportUrl": ["市场分析周报/月报","分析市场规模、增长趋势,评估市场体量","/big-member/image/wxreply/reportmm.png","https://mp.weixin.qq.com/s/rlJenKOvmHvqd9_4811otg?wxreply=%s"]
-    }
+    },
+    "pcQrCode":{
+    		"10":true,"11":true,"12":true,"13":true,"14":true,"17":true,"18":true,"19":true
+    },
+    "namePrefix":"JY_%s"
 }

+ 1 - 1
config_formal/weixin_172.17.145.180/time.txt

@@ -1,2 +1,2 @@
 #上次修改时间,比当前修改时间小就行
-2021-12-30 16:15:12
+2022-3-7 12:00:00

+ 2 - 1
src/config.json

@@ -55,7 +55,8 @@
 		"memberreport_experience":"/bigmember/report/openpushmsg?t=wx_experience&start=%s&end=%s&pushcount=%s&advertcode=%s",
 		"chanpartner":"/weixin/frontPage/partner/sess/partner?p=wxmeun",
 		"datareport":"/datareport/page/order/detail/%s?advertcode=%s",
-		"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun"
+		"vipFree7":"/weixin/frontPage/share/sess/index?p=wxmeun",
+		"toSubVipSetPage":"/front/vipsubscribe/toSubVipSetPage?advertcode=%s"
     },
     "jy_activeset": {
         "activitystartcode": "3201000000",

+ 1 - 1
src/db.json

@@ -45,7 +45,7 @@
     },
     "redis": {
     	"main":{
-			"address": "other=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001,pushcache_2_b=192.168.3.206:5002,sso=192.168.3.206:1712,session=192.168.3.206:1712,recovery=192.168.3.206:1712,merge=192.168.3.206:1712"
+			"address": "other=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001,pushcache_2_b=192.168.3.206:5002,sso=192.168.3.206:1712,session=192.168.3.206:1712,recovery=192.168.3.206:1712,merge=192.168.3.206:1712,newother=192.168.3.206:1712"
 		},
 		"login": {
 			"address": "login=192.168.3.206:1712"

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

@@ -604,10 +604,17 @@ func (f *Front) Login(key string) error {
 //用户是否登录
 func (f *Front) HasSign() error {
 	if userId, _ := f.GetSession("userId").(string); userId != "" {
+		//微信昵称>手机号>剑鱼昵称
+		nickname := util.ObjToString(f.GetSession("s_nickname"))
+		phone, _ := f.GetSession("phone").(string)
+		jyname := util.ObjToString(f.GetSession("s_jyname"))
+		if nickname == "" && phone != "" {
+			nickname = string(phone[0:3]) + "****" + string(phone[(len(phone)-4):])
+		}
 		m := map[string]interface{}{
 			"result":      "ok",
-			"s_nickname":  f.GetSession("s_nickname"),
-			"s_headimage": f.GetSession("s_avatar"),
+			"s_nickname":  util.If(nickname != "", nickname, jyname),
+			"s_headimage": f.GetSession("s_headimageurl"),
 			"encryptId":   se.EncodeString(userId),
 		}
 		//是否需要重新登录,企业基础架构给虚拟账号重置密码后,需要重新登录
@@ -679,8 +686,14 @@ func (m *Front) Onekey() error {
 		userId, _ := m.GetSession("userId").(string)
 		if userId != "" {
 			userInfo, _ := mongodb.FindById("user", userId, nil)
-			s_nickname, _ := (*userInfo)["s_nickname"].(string)
-			s_name, _ := (*userInfo)["s_name"].(string)
+			s_nickname := ""
+			if (*userInfo)["s_nickname"] != nil {
+				s_nickname, _ = (*userInfo)["s_nickname"].(string)
+			}
+			s_name := ""
+			if (*userInfo)["s_name"] != nil {
+				s_name, _ = (*userInfo)["s_name"].(string)
+			}
 			s_phone, _ := (*userInfo)["s_phone"].(string)
 			if s_nickname != "" { //昵称
 				data["s_username"] = s_nickname
@@ -789,9 +802,13 @@ func CreateSession(q map[string]interface{}, sess *httpsession.Session, typ stri
 	}
 	sessionVal["platform"] = typ
 	sess.SetMultiple(sessionVal)
+	s_nickname := util.If(sessionVal["s_nickname"] != nil, sessionVal["s_nickname"], sessionVal["phone"])
+	if util.ObjToString(s_nickname) == "" {
+		s_nickname = sessionVal["s_jyname"]
+	}
 	infoData := map[string]interface{}{
 		"result":      "ok",
-		"s_nickname":  sessionVal["s_nickname"],
+		"s_nickname":  s_nickname,
 		"s_headimage": sessionVal["s_avatar"],
 	}
 	if openid, _ := (*person)["s_m_openid"].(string); openid != "" {
@@ -824,7 +841,6 @@ func (m *Front) Sess(ostr string) error {
 		} else {
 			ok, _, _ = FindUserAndCreateSess(openid, m.Session(), "wx", false)
 		}
-		log.Println("ok:", ok)
 		if ok {
 			actionurl := util.ObjToString(urlMap[str[3]])
 			if actionurl != "" {

+ 7 - 15
src/jfw/front/shorturl.go

@@ -244,17 +244,6 @@ func (s *Short) Article(stype, id string) error {
 					}
 				}
 			}
-			if from_userid != "" && se.Decode4Hex(from_userid) != "" && se.Decode4Hex(from_userid) != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
-				article_id := util.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)
-					err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(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))
-					}
-				}
-			}
 			s.T["advertcode"] = s.GetString("advertcode")
 			content, _ := s.Render4Cache("/weixin/wxinfocontent_rec.html", &s.T)
 			return s.SetBody(content)
@@ -321,9 +310,10 @@ func (s *Short) Article(stype, id string) error {
 				if ssOpenid != nil {
 					obj["ucbsId"] = util.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
 				}
-				if obj["winnertel"] == nil && isbid(obj["subtype"]) {
+				if isbid(obj["subtype"]) {
 					obj["winner_enttel"] = getwinnertel(obj["winner"])
 				}
+
 				if !(isVip || isMember || isEntniche) { //非会员不展示电话字段
 					if obj["winnertel"] != nil {
 						obj["winnertel"] = "无权限"
@@ -520,9 +510,10 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 		obj["ucbsId"] = util.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
 	}
 
-	if obj["winnertel"] == nil && isbid(obj["subtype"]) {
+	if isbid(obj["subtype"]) {
 		obj["winner_enttel"] = getwinnertel(obj["winner"])
 	}
+
 	if !isPayUser { //非会员不展示电话字段
 		if obj["winnertel"] != nil {
 			obj["winnertel"] = "无权限"
@@ -552,8 +543,8 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 			}
 		}
 	}
-	//移动端需要处理
-	if b && from_userid != "" && se.Decode4Hex(from_userid) != "" && from_userid != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
+	//移动端需要处理--剑鱼币
+	if b && from_userid != "" && se.Decode4Hex(from_userid) != "" && se.Decode4Hex(from_userid) != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
 		article_id := util.CommonDecodeArticle(stype, id)[0]
 		key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, from_userid, userId)
 		if redis.Incr("other", key) == 1 {
@@ -672,6 +663,7 @@ func isbid(typ interface{}) bool {
 	return false
 }
 
+//中标企业库
 func getwinnertel(company interface{}) string {
 	if company != nil {
 		data, _ := public.Mgo_Ent.FindOne("winner_enterprise", map[string]interface{}{

+ 371 - 369
src/jfw/front/supsearch.go

@@ -1,33 +1,33 @@
 package front
 
 import (
-	"fmt"
-	"jfw/config"
-	"jfw/jylabutil"
-	"jfw/public"
-	"log"
-	"math/rand"
-	"qfw/util"
-	"qfw/util/bidsearch"
-	"qfw/util/jy"
-	"qfw/util/redis"
-	"strconv"
-	"strings"
-	"time"
+    "fmt"
+    "jfw/config"
+    "jfw/jylabutil"
+    "jfw/public"
+    "log"
+    "math/rand"
+    "qfw/util"
+    "qfw/util/bidsearch"
+    "qfw/util/jy"
+    "qfw/util/redis"
+    "strconv"
+    "strings"
+    "time"
 
-	"github.com/SKatiyar/qr"
-	"github.com/go-xweb/xweb"
+    "github.com/SKatiyar/qr"
+    "github.com/go-xweb/xweb"
 )
 
 type Pcsearch struct {
-	*xweb.Action
+    *xweb.Action
 
-	pcSearchIndex   xweb.Mapper `xweb:"/jylab/supsearch/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/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"`                      //修改提示信息状态
 }
 
 //
@@ -38,394 +38,396 @@ var PCS_time int
 
 //
 func init() {
-	xweb.AddAction(&Pcsearch{})
-	industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), mongodb)
-	//清除搜索列表内存缓存 间隔时间
-	PCS_time = util.IntAll(config.Sysconfig["PCS_time"])
-	go func() {
-		time.Sleep(time.Second * 5)
-		PCS_task()
-	}()
-	PCS_index = map[string]interface{}{}
+    xweb.AddAction(&Pcsearch{})
+    industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), mongodb)
+    //清除搜索列表内存缓存 间隔时间
+    PCS_time = util.IntAll(config.Sysconfig["PCS_time"])
+    go func() {
+        time.Sleep(time.Second * 5)
+        PCS_task()
+    }()
+    PCS_index = map[string]interface{}{}
 }
 
 //定时清理搜索列表页 从redis获取存入内存中的数据
 func PCS_task() {
-	//根据配置延迟 PCS_time 小时执行
-	sub := time.Hour * time.Duration(PCS_time)
-	timer := time.NewTimer(sub)
-	log.Println(PCS_time, "小时后执行清除缓存操作")
-	defer timer.Stop()
-	for {
-		select {
-		case <-timer.C:
-			{
-				PCS_index = map[string]interface{}{}
-				timer.Reset(time.Hour * time.Duration(PCS_time))
-			}
-		}
-	}
+    //根据配置延迟 PCS_time 小时执行
+    sub := time.Hour * time.Duration(PCS_time)
+    timer := time.NewTimer(sub)
+    log.Println(PCS_time, "小时后执行清除缓存操作")
+    defer timer.Stop()
+    for {
+        select {
+        case <-timer.C:
+            {
+                PCS_index = map[string]interface{}{}
+                timer.Reset(time.Hour * time.Duration(PCS_time))
+            }
+        }
+    }
 
 }
 
 //返回内存中列表也的数据,只获取首页,其他页面访问量暂时不多
 func PCS_list(page_type string) interface{} {
-	var _page_type = page_type
-	//如果page_type为空,则是获取非拟建数据。
-	if page_type == "" {
-		_page_type = "page_index"
-	}
-	if PCS_index[_page_type] == nil {
-		PCS_index[_page_type] = Newbids(page_type)[0]
-	}
-	return PCS_index[_page_type]
+    var _page_type = page_type
+    //如果page_type为空,则是获取非拟建数据。
+    if page_type == "" {
+        _page_type = "page_index"
+    }
+    if PCS_index[_page_type] == nil {
+        PCS_index[_page_type] = Newbids(page_type)[0]
+    }
+    return PCS_index[_page_type]
 }
 
 //
 func (p *Pcsearch) ChangePro() {
-	defer util.Catch()
-	userid := p.GetSession("userId")
-	if userid != nil {
-		jylabutil.UpdateAuthory(userid.(string), "i_tablepro", 1)
-	}
+    defer util.Catch()
+    userid := p.GetSession("userId")
+    if userid != nil {
+        jylabutil.UpdateAuthory(userid.(string), "i_tablepro", 1)
+    }
 }
 
 //
 func (p *Pcsearch) ProposedProject() error {
-	defer util.Catch()
-	var shareid = p.GetString("id")
-	if len(shareid) == 0 {
-		shareid = "10"
-	}
-	p.T["logid"] = config.Seoconfig["jynjxmy"].(string)
-	b_word, _, s_word := jy.InterceptSearchKW(p.GetString("keywords"), false, true)
-	area := p.GetString("area")               //地区
-	publishtime := p.GetString("publishtime") //发布时间
-	subtype := p.GetString("subtype")         //信息类型
-	if subtype == "" {
-		subtype = "拟建"
-	}
-	var totalPage int64
-	var list *[]map[string]interface{}
-	var status = 1
-	var count int64
-	if len(s_word) > 0 {
-		status = 2
-		count, totalPage, list = bidsearch.GetPcBidSearchData(s_word, area, publishtime, subtype, "", "", "", "", "", "", "", 0, bidsearch.SearchPageSize_PC, true, nil, bidSearch_field_1, "", false)
-		listSize := 0
-		if list != nil {
-			listSize = len(*list)
-		}
-		public.SaveUserSearchLog(p.Request, util.ObjToString(p.GetSession("userId")), count, "pc", "拟建", map[string]interface{}{
-			"search_word":        s_word,
-			"search_area":        area,
-			"search_publishtime": publishtime,
-			"pagenum":            1,
-			"pagesize":           listSize,
-		})
-	} else {
-		p.DisableHttpCache()
-		p.T["list"] = PCS_list("nijian") //Newbids("nijian")[0]
-		totalPage = 10
-		count = 500
-	}
-	if status == 2 {
-		if list != nil {
-			for _, v := range *list {
-				v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
-				stp, _ := v["subtype"].(string)
-				if stp == "" {
-					stp, _ = v["toptype"].(string)
-				}
-				area, _ := v["area"].(string)
-				v["stypeadd"], v["areaadd"], _ = classify(stp, area, "")
-				//正文匹配检索关键词
-				highlight, _ := v["highlight"].(map[string][]string)
-				detail := ""
-				for _, val := range highlight["detail"] {
-					detail += public.ClearHtml.ReplaceAllString(val, "")
-				}
-				v["detail"] = detail
-			}
-		}
-		p.T["list"] = list
-	}
-	p.T["area"] = area
-	p.T["subtype"] = subtype
-	p.T["publishtime"] = publishtime
-	p.T["timeslot"] = p.GetString("timeslot")
-	p.T["totalPage"] = totalPage
-	p.T["count"] = count
-	p.T["keywords"] = b_word
-	p.T["searchvalue"] = s_word
-	p.T["login"] = p.Session().Get("user")
-	p.SetSession("paramkey", b_word)
-	if publishtime == "lately-7" {
-		p.SetSession("parampublishtime", "最近7天")
-	} else if publishtime == "lately-30" {
-		p.SetSession("parampublishtime", "最近30天")
-	} else if publishtime == "thisyear" {
-		p.SetSession("parampublishtime", "去年")
-	} else {
-		p.SetSession("parampublishtime", publishtime)
-	}
-	p.SetSession("paramarea", area)
-	p.T["shareid"] = se.EncodeString(shareid)
-	return p.Render("/pc/proproject.html", &p.T)
+    defer util.Catch()
+    var shareid = p.GetString("id")
+    if len(shareid) == 0 {
+        shareid = "10"
+    }
+    p.T["logid"] = config.Seoconfig["jynjxmy"].(string)
+    b_word, _, s_word := jy.InterceptSearchKW(p.GetString("keywords"), false, true)
+    area := p.GetString("area")               //地区
+    publishtime := p.GetString("publishtime") //发布时间
+    subtype := p.GetString("subtype")         //信息类型
+    if subtype == "" {
+        subtype = "拟建"
+    }
+    var totalPage int64
+    var list *[]map[string]interface{}
+    var status = 1
+    var count int64
+    if len(s_word) > 0 {
+        status = 2
+        count, totalPage, list = bidsearch.GetPcBidSearchData(s_word, area, publishtime, subtype, "", "", "", "", "", "", "", 0, bidsearch.SearchPageSize_PC, true, nil, bidSearch_field_1, "", false)
+        listSize := 0
+        if list != nil {
+            listSize = len(*list)
+        }
+        public.SaveUserSearchLog(p.Request, util.ObjToString(p.GetSession("userId")), count, "pc", "拟建", map[string]interface{}{
+            "search_word":        s_word,
+            "search_area":        area,
+            "search_publishtime": publishtime,
+            "pagenum":            1,
+            "pagesize":           listSize,
+        })
+    } else {
+        p.DisableHttpCache()
+        p.T["list"] = PCS_list("nijian") //Newbids("nijian")[0]
+        totalPage = 10
+        count = 500
+    }
+    if status == 2 {
+        if list != nil {
+            for _, v := range *list {
+                v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
+                stp, _ := v["subtype"].(string)
+                if stp == "" {
+                    stp, _ = v["toptype"].(string)
+                }
+                area, _ := v["area"].(string)
+                v["stypeadd"], v["areaadd"], _ = classify(stp, area, "")
+                //正文匹配检索关键词
+                highlight, _ := v["highlight"].(map[string][]string)
+                detail := ""
+                for _, val := range highlight["detail"] {
+                    detail += public.ClearHtml.ReplaceAllString(val, "")
+                }
+                v["detail"] = detail
+            }
+        }
+        p.T["list"] = list
+    }
+    p.T["area"] = area
+    p.T["subtype"] = subtype
+    p.T["publishtime"] = publishtime
+    p.T["timeslot"] = p.GetString("timeslot")
+    p.T["totalPage"] = totalPage
+    p.T["count"] = count
+    p.T["keywords"] = b_word
+    p.T["searchvalue"] = s_word
+    p.T["login"] = p.Session().Get("user")
+    p.SetSession("paramkey", b_word)
+    if publishtime == "lately-7" {
+        p.SetSession("parampublishtime", "最近7天")
+    } else if publishtime == "lately-30" {
+        p.SetSession("parampublishtime", "最近30天")
+    } else if publishtime == "thisyear" {
+        p.SetSession("parampublishtime", "去年")
+    } else {
+        p.SetSession("parampublishtime", publishtime)
+    }
+    p.SetSession("paramarea", area)
+    p.T["shareid"] = se.EncodeString(shareid)
+    return p.Render("/pc/proproject.html", &p.T)
 }
 
 //
 func (p *Pcsearch) Getstatus() error {
-	defer util.Catch()
-	var supstatus, entstatus, tablepro, dataexportstatus, portraitpower, followent, smartstatus bool
-	if userid := util.ObjToString(p.GetSession("userId")); userid != "" {
-		user, b := mongodb.FindById("user", userid,
-			`{"i_tablepro":1}`)
-		if len(*user) > 0 && b {
-			tablepro = util.Int64All((*user)["i_tablepro"]) == 1
-		}
-	}
-	p.ServeJson(map[string]interface{}{
-		"smartstatus":      smartstatus,
-		"supstatus":        supstatus,
-		"entstatus":        entstatus,
-		"tablepro":         tablepro,
-		"dataexportstatus": dataexportstatus,
-		"portraitpower":    portraitpower,
-		"followent":        followent,
-	})
-	return nil
+    defer util.Catch()
+    var supstatus, entstatus, tablepro, dataexportstatus, portraitpower, followent, smartstatus bool
+    if userid := util.ObjToString(p.GetSession("userId")); userid != "" {
+        user, b := mongodb.FindById("user", userid,
+            `{"i_tablepro":1}`)
+        if len(*user) > 0 && b {
+            tablepro = util.Int64All((*user)["i_tablepro"]) == 1
+        }
+    }
+    p.ServeJson(map[string]interface{}{
+        "smartstatus":      smartstatus,
+        "supstatus":        supstatus,
+        "entstatus":        entstatus,
+        "tablepro":         tablepro,
+        "dataexportstatus": dataexportstatus,
+        "portraitpower":    portraitpower,
+        "followent":        followent,
+    })
+    return nil
 }
 
 //
 func (p *Pcsearch) GetNewBids() error {
-	pagenum, _ := p.GetInteger("pageNumber")
-	pageType := p.GetString("pageType")
+    pagenum, _ := p.GetInteger("pageNumber")
+    pageType := p.GetString("pageType")
 
-	list := util.ObjArrToMapArr(Newbids(pageType)[pagenum-1].([]interface{}))
-	if pageType == "" { //最新招标信息仅第一页条展示表格多字段
-		for k, v := range list {
-			if pagenum == 1 && k < 20 {
-				continue
-			}
-			// delete(v, "areaadd")
-			delete(v, "bidopentime")
-			delete(v, "buyer")
-			// delete(v, "indadd")
-			delete(v, "k")
-			delete(v, "projectcode")
-			delete(v, "projectname")
-			// delete(v, "stypeadd")
-			delete(v, "winner")
-			delete(v, "timetemp")
-			delete(v, "budget")
-			delete(v, "s_subscopeclass")
-			delete(v, "toptype")
-		}
-	}
+    list := util.ObjArrToMapArr(Newbids(pageType)[pagenum-1].([]interface{}))
+    if pageType == "" { //最新招标信息仅第一页条展示表格多字段
+        for k, v := range list {
+            if pagenum == 1 && k < 20 {
+                continue
+            }
+            // delete(v, "areaadd")
+            delete(v, "bidopentime")
+            delete(v, "buyer")
+            // delete(v, "indadd")
+            delete(v, "k")
+            delete(v, "projectcode")
+            delete(v, "projectname")
+            // delete(v, "stypeadd")
+            delete(v, "winner")
+            delete(v, "timetemp")
+            delete(v, "budget")
+            delete(v, "s_subscopeclass")
+            delete(v, "toptype")
+        }
+    }
 
-	p.ServeJson(map[string]interface{}{
-		"list":      list,
-		"count":     500,
-		"totalPage": 10,
-	})
-	return nil
+    p.ServeJson(map[string]interface{}{
+        "list":      list,
+        "count":     500,
+        "totalPage": 10,
+    })
+    return nil
 }
 
 //
 func (p *Pcsearch) PcSearchIndex() error {
-	defer util.Catch()
-	p.T["logid"] = config.Seoconfig["jysslby"].(string)
-	keywords := p.GetString("keywords")
-	industry := strings.TrimSpace(p.GetString("industry")) //选中的行业
-	area := p.GetString("area")                            //地区
-	publishtime := p.GetString("publishtime")              //发布时间
-	timeslot := p.GetString("timeslot")                    //显示选择时间
-	toptype := p.GetString("toptype")                      //信息类型
-	subtype := p.GetString("subtype")                      //信息类型
-	minprice := p.GetString("minprice")                    //最低价格
-	maxprice := p.GetString("maxprice")                    //最高价格
-	if publishtime == "" {
-		publishtime = "thisyear"
-	}
-	userId, _ := p.GetSession("userId").(string)
+    defer util.Catch()
+    p.T["logid"] = config.Seoconfig["jysslby"].(string)
+    keywords := p.GetString("keywords")
+    industry := strings.TrimSpace(p.GetString("industry")) //选中的行业
+    area := p.GetString("area")                            //地区
+    publishtime := p.GetString("publishtime")              //发布时间
+    timeslot := p.GetString("timeslot")                    //显示选择时间
+    toptype := p.GetString("toptype")                      //信息类型
+    subtype := p.GetString("subtype")                      //信息类型
+    minprice := p.GetString("minprice")                    //最低价格
+    maxprice := p.GetString("maxprice")                    //最高价格
 
-	//高级筛选 仅vip用户可查询
-	var hasBuyerTel, hasWinnerTel string = "", "" //是否有采购单位电话、是否有中标单位电话 y:有 n:没有
-	var buyerclass string = ""                    //采购单位类别
-	var notkey string = ""                        //排除词
+    userId, _ := p.GetSession("userId").(string)
 
-	selectType := p.GetString("selectType")
-	if selectType == "" {
-		selectType = "title,content"
-	}
-	isPayedUser, publishtime, queryItems, _, _ := bidsearch.PublicSearch(userId, selectType, publishtime, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]), 0)
-	if isPayedUser {
-		buyerclass = p.GetString("buyerclass")
-		hasBuyerTel, hasWinnerTel = p.GetString("buyertel"), p.GetString("winnertel")
-		notkey = p.GetString("notkey")
-	}
-	//历史导出数据回显
-	if strings.Contains(p.Url(), "?goback") {
-		keywords = util.ObjToString(p.GetSession("Echo_keywords"))
-		publishtime = util.ObjToString(p.GetSession("Echo_publishtime"))
-		area = util.ObjToString(p.GetSession("Echo_area"))
-		subtype = util.ObjToString(p.GetSession("Echo_subtype"))
-		minprice = util.ObjToString(p.GetSession("Echo_minprice"))
-		maxprice = util.ObjToString(p.GetSession("Echo_maxprice"))
-		buyerclass = util.ObjToString(p.GetSession("Echo_buyerclass"))
-		selectType = util.ObjToString(p.GetSession("Echo_selectType"))
-		timeslot = util.ObjToString(p.GetSession("Echo_timeslot"))
-		hasBuyerTel = util.ObjToString(p.GetSession("Echo_hasBuyertel"))
-		hasWinnerTel = util.ObjToString(p.GetSession("Echo_hasWinnertel"))
-		industry = util.ObjToString(p.GetSession("Echo_industry"))
-		notkey = util.ObjToString(p.GetSession("Echo_notkey"))
-	}
+    //高级筛选 仅vip用户可查询
+    var hasBuyerTel, hasWinnerTel string = "", "" //是否有采购单位电话、是否有中标单位电话 y:有 n:没有
+    var buyerclass string = ""                    //采购单位类别
+    var notkey string = ""                        //排除词
 
-	b_word, s_word := "", ""
-	if keywords != "" {
-		b_word, _, s_word = jy.InterceptSearchKW(keywords, false, len(industry) == 0)
-	}
-	var list *[]map[string]interface{}
-	var status = 1
-	var count, totalPage int64
-	secondFlag := ""
-	secondKWS := ""
-	if len(s_word) > 0 || len(industry) > 0 {
-		status = 2
-		secondKWS, _, _, _, secondFlag, count, totalPage, list = bidsearch.SearchData("pc", p.Request, 1, util.ObjToString(p.GetSession("userId")), secondKWS, s_word, area, publishtime, subtype, industry, minprice, maxprice, "", buyerclass, hasBuyerTel, hasWinnerTel, 0, bidsearch.SearchPageSize_PC, true, queryItems, bidSearch_field_1, notkey, isPayedUser)
-	} else {
-		p.DisableHttpCache()
-		p.T["list"] = PCS_list("") //Newbids("")[0]
-		count, totalPage = 500, 10
-	}
-	if status == 2 {
-		secondList, tp, _ := bidsearch.LisetData(1, 0, list, secondFlag, config.Seoconfig, isPayedUser)
-		if tp == 1 {
-			p.T["secondList"] = ""
-			totalPage = 1
-		} else if len(secondList) > 0 {
-			p.T["secondList"] = secondList
-		}
-		if secondKWS != "" {
-			s_word = s_word + "+" + secondKWS
-		}
-		p.T["list"] = list
-		p.T["secondFlag"] = secondFlag
-		p.T["area"] = area
-		p.T["publishtime"] = publishtime
-		p.T["timeslot"] = timeslot
-		p.T["toptype"] = toptype
-		p.T["subtype"] = subtype
-		p.T["searchvalue"] = s_word
-		p.T["selectType"] = selectType
-		p.T["minprice"] = minprice
-		p.T["maxprice"] = maxprice
-		p.T["buyerclass"] = buyerclass
-		p.T["buyertel"] = hasBuyerTel
-		p.T["winnertel"] = hasWinnerTel
-		p.T["notkey"] = notkey
-		p.SetSession("paramkey", b_word)
-		switch publishtime {
-		case "lately-7":
-			p.SetSession("parampublishtime", "最近7天")
-		case "lately-30":
-			p.SetSession("parampublishtime", "最近30天")
-		case "thisyear":
-			p.SetSession("parampublishtime", "去年")
-		default:
-			p.SetSession("parampublishtime", publishtime)
-		}
-		p.SetSession("paramarea", area)
-		if subtype != "" {
-			p.SetSession("paraminfotype", subtype)
-		} else {
-			p.SetSession("paraminfotype", toptype)
-		}
-	}
-	p.T["login"] = p.Session().Get("user")
-	p.T["count"] = count
-	p.T["totalPage"] = totalPage
-	p.T["keywords"] = b_word
-	p.T["industry"] = industry
-	p.T["industrylist"] = industrylist
-	p.T["sortArray"] = sortArray
-	p.T["showVipScreen"] = isPayedUser
-	//
-	if userId != "" {
-		//企业画像 权限
-		p.T["portraitpower"] = jylabutil.IsAuthorized(userId, "i_portraitpower")
-	}
-	return p.Render("/pc/supsearch.html", &p.T)
+    selectType := p.GetString("selectType")
+    if selectType == "" {
+        selectType = "title,content"
+    }
+    isPayedUser, publishtime, queryItems, _, _ := bidsearch.PublicSearch(userId, selectType, publishtime, util.Int64All(config.Sysconfig["bidSearchOldUserLimit"]), 0)
+    if isPayedUser {
+        buyerclass = p.GetString("buyerclass")
+        hasBuyerTel, hasWinnerTel = p.GetString("buyertel"), p.GetString("winnertel")
+        notkey = p.GetString("notkey")
+    }
+    //历史导出数据回显
+    if strings.Contains(p.Url(), "?goback") {
+        keywords = util.ObjToString(p.GetSession("Echo_keywords"))
+        publishtime = util.ObjToString(p.GetSession("Echo_publishtime"))
+        area = util.ObjToString(p.GetSession("Echo_area"))
+        subtype = util.ObjToString(p.GetSession("Echo_subtype"))
+        minprice = util.ObjToString(p.GetSession("Echo_minprice"))
+        maxprice = util.ObjToString(p.GetSession("Echo_maxprice"))
+        buyerclass = util.ObjToString(p.GetSession("Echo_buyerclass"))
+        selectType = util.ObjToString(p.GetSession("Echo_selectType"))
+        timeslot = util.ObjToString(p.GetSession("Echo_timeslot"))
+        hasBuyerTel = util.ObjToString(p.GetSession("Echo_hasBuyertel"))
+        hasWinnerTel = util.ObjToString(p.GetSession("Echo_hasWinnertel"))
+        industry = util.ObjToString(p.GetSession("Echo_industry"))
+        notkey = util.ObjToString(p.GetSession("Echo_notkey"))
+    }
+
+    b_word, s_word := "", ""
+    if keywords != "" {
+        b_word, _, s_word = jy.InterceptSearchKW(keywords, false, len(industry) == 0)
+    }
+    var list *[]map[string]interface{}
+    var status = 1
+    var count, totalPage int64
+    secondFlag := ""
+    secondKWS := ""
+    if len(s_word) > 0 || len(industry) > 0 {
+        status = 2
+        secondKWS, _, _, _, secondFlag, count, totalPage, list = bidsearch.SearchData("pc", p.Request, 1, util.ObjToString(p.GetSession("userId")), secondKWS, s_word, area, publishtime, subtype, industry, minprice, maxprice, "", buyerclass, hasBuyerTel, hasWinnerTel, 0, bidsearch.SearchPageSize_PC, true, queryItems, bidSearch_field_1, notkey, isPayedUser)
+    } else {
+        p.DisableHttpCache()
+        p.T["list"] = PCS_list("") //Newbids("")[0]
+        count, totalPage = 500, 10
+    }
+    if status == 2 {
+        secondList, tp, _ := bidsearch.LisetData(1, 0, list, secondFlag, config.Seoconfig, isPayedUser)
+        if tp == 1 {
+            p.T["secondList"] = ""
+            totalPage = 1
+        } else if len(secondList) > 0 {
+            p.T["secondList"] = secondList
+        }
+        if secondKWS != "" {
+            s_word = s_word + "+" + secondKWS
+        }
+        p.T["list"] = list
+        p.T["secondFlag"] = secondFlag
+        p.T["area"] = area
+        p.T["publishtime"] = publishtime
+        p.T["timeslot"] = timeslot
+        p.T["toptype"] = toptype
+        p.T["subtype"] = subtype
+        p.T["searchvalue"] = s_word
+        p.T["selectType"] = selectType
+        p.T["minprice"] = minprice
+        p.T["maxprice"] = maxprice
+        p.T["buyerclass"] = buyerclass
+        p.T["buyertel"] = hasBuyerTel
+        p.T["winnertel"] = hasWinnerTel
+        p.T["notkey"] = notkey
+        p.SetSession("paramkey", b_word)
+        switch publishtime {
+        case "lately-7":
+            p.SetSession("parampublishtime", "最近7天")
+        case "lately-30":
+            p.SetSession("parampublishtime", "最近30天")
+        case "thisyear":
+            p.SetSession("parampublishtime", "近一年")
+        case "threeyear":
+            p.SetSession("parampublishtime", "近三年")
+        case "fiveyear":
+            p.SetSession("parampublishtime", "近五年")
+        default:
+            p.SetSession("parampublishtime", publishtime)
+        }
+        p.SetSession("paramarea", area)
+        if subtype != "" {
+            p.SetSession("paraminfotype", subtype)
+        } else {
+            p.SetSession("paraminfotype", toptype)
+        }
+    }
+    p.T["login"] = p.Session().Get("user")
+    p.T["count"] = count
+    p.T["totalPage"] = totalPage
+    p.T["keywords"] = b_word
+    p.T["industry"] = industry
+    p.T["industrylist"] = industrylist
+    p.T["sortArray"] = sortArray
+    p.T["showVipScreen"] = isPayedUser
+    //
+    if userId != "" {
+        //企业画像 权限
+        p.T["portraitpower"] = jylabutil.IsAuthorized(userId, "i_portraitpower")
+    }
+    return p.Render("/pc/supsearch.html", &p.T)
 }
 
 //
 func Newbids(p string) []interface{} {
-	pages, _ := redis.Get("other", "index_list"+p).([]interface{})
-	if len(pages) == 0 {
-		var list *[]map[string]interface{}
-		subtype := ""
-		if len(p) > 0 {
-			subtype = "拟建"
-		}
-		intns := make([]int, 0)
-		for i := 0; i < 10; i++ {
-			if len(intns) == 0 {
-				intns = append(intns, rand.Intn(100))
-			} else {
-				for {
-					v := rand.Intn(intns[(i-1)] + 100)
-					if v-intns[(i-1)] >= 30 {
-						intns = append(intns, v)
-						break
-					}
-				}
-			}
-		}
+    pages, _ := redis.Get("other", "index_list"+p).([]interface{})
+    if len(pages) == 0 {
+        var list *[]map[string]interface{}
+        subtype := ""
+        if len(p) > 0 {
+            subtype = "拟建"
+        }
+        intns := make([]int, 0)
+        for i := 0; i < 10; i++ {
+            if len(intns) == 0 {
+                intns = append(intns, rand.Intn(100))
+            } else {
+                for {
+                    v := rand.Intn(intns[(i-1)] + 100)
+                    if v-intns[(i-1)] >= 30 {
+                        intns = append(intns, v)
+                        break
+                    }
+                }
+            }
+        }
 
-		for i := 0; i < 10; i++ {
-			_, list = getLastNewsData("", "", "", subtype, "", "", "", "", "", "", "Y", intns[i], true, false, "")
-			for k, v := range *list {
-				v["k"] = (k + 1) + i*50
-				t := time.Unix(util.Int64All(v["publishtime"]), 0)
-				v["timetemp"] = fmt.Sprint(util.Int64All(v["publishtime"]))
-				v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
-				v["time"] = util.TimeDiff(t)
-				var stp = ""
-				if v["subtype"] != nil {
-					stp, _ = v["subtype"].(string)
-				} else {
-					stp = ""
-				}
-				if stp == "" && v["toptype"] != nil {
-					stp, _ = v["toptype"].(string)
-				}
-				area, _ := v["area"].(string)
-				indtry := util.ObjToString(v["industry"])
-				v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry)
-			}
-			pages = append(pages, list)
-		}
-		redis.Put("other", "index_list"+p, pages, 60*60*24*2)
-		pages, _ = redis.Get("other", "index_list"+p).([]interface{})
-	}
-	return pages
+        for i := 0; i < 10; i++ {
+            _, list = getLastNewsData("", "", "", subtype, "", "", "", "", "", "", "Y", intns[i], true, false, "")
+            for k, v := range *list {
+                v["k"] = (k + 1) + i*50
+                t := time.Unix(util.Int64All(v["publishtime"]), 0)
+                v["timetemp"] = fmt.Sprint(util.Int64All(v["publishtime"]))
+                v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
+                v["time"] = util.TimeDiff(t)
+                var stp = ""
+                if v["subtype"] != nil {
+                    stp, _ = v["subtype"].(string)
+                } else {
+                    stp = ""
+                }
+                if stp == "" && v["toptype"] != nil {
+                    stp, _ = v["toptype"].(string)
+                }
+                area, _ := v["area"].(string)
+                indtry := util.ObjToString(v["industry"])
+                v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry)
+            }
+            pages = append(pages, list)
+        }
+        redis.Put("other", "index_list"+p, pages, 60*60*24*2)
+        pages, _ = redis.Get("other", "index_list"+p).([]interface{})
+    }
+    return pages
 }
 
 //二维码图片
 func (p *Pcsearch) Qr(t string) error {
-	openid := p.GetSession("openid")
-	if openid == nil {
-		return nil
-	}
-	w := p.ResponseWriter
-	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
-	w.Header().Set("Pragma", "no-cache")
-	w.Header().Set("Expires", "0")
-	w.Header().Set("Content-Type", "image/png")
-	data := config.Sysconfig["webdomain"].(string) + "/front/sess/" + sewx.EncodeString(openid.(string)+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",qrToLab") + "__" + t
-	r, _ := qr.Encode(data, qr.M)
-	pngdat := r.PNG()
-	_, err := w.Write(pngdat)
-	return err
+    openid := p.GetSession("openid")
+    if openid == nil {
+        return nil
+    }
+    w := p.ResponseWriter
+    w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
+    w.Header().Set("Pragma", "no-cache")
+    w.Header().Set("Expires", "0")
+    w.Header().Set("Content-Type", "image/png")
+    data := config.Sysconfig["webdomain"].(string) + "/front/sess/" + sewx.EncodeString(openid.(string)+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",qrToLab") + "__" + t
+    r, _ := qr.Encode(data, qr.M)
+    pngdat := r.PNG()
+    _, err := w.Write(pngdat)
+    return err
 }

文件差异内容过多而无法显示
+ 914 - 903
src/jfw/front/swordfish.go


+ 8 - 3
src/jfw/front/vipsubscribe.go

@@ -132,11 +132,16 @@ func (s *Subscribepay) ToSetInfoTypePage() {
 }
 
 //订阅设置
-func (s *Subscribepay) ToSetPage() {
+func (s *Subscribepay) ToSetPage() error {
 	userid := util.ObjToString(s.GetSession("userId"))
 	vipMsg := jy.GetBigVipUserBaseMsg(userid, public.Mysql, public.MQFW)
 	if vipMsg.VipStatus <= 0 && vipMsg.Status <= 0 && isInTSguide(userid) { //仅免费用户跳转向导页面
-		s.Redirect("/front/tenderSubscribe/guide")
+		return s.Redirect("/front/tenderSubscribe/guide")
+	} else if vipMsg.VipStatus <= 0 && !vipMsg.IsUpgrade {
+		if s.GetString("advertcode") != "" {
+			return s.Redirect("/wxkeyset/keyset/index?advertcode=" + s.GetString("advertcode"))
+		}
+		return s.Redirect("/wxkeyset/keyset/index")
 	}
 	nowTime := time.Now().Unix()
 	if nowTime >= liveActiveStartTime && nowTime < liveActiveEndTime {
@@ -152,7 +157,7 @@ func (s *Subscribepay) ToSetPage() {
 	s.T["avatar"] = myavatar
 	s.T["signature"] = wx.SignJSSDK(s.Site() + s.Url())
 	s.T["openid"] = se.EncodeString(myopenid)
-	s.Render("/weixin/vipsubscribe/vip_index_new.html")
+	return s.Render("/weixin/vipsubscribe/vip_index_new.html")
 }
 
 func (s *Subscribepay) ToSetPageOld() {

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

@@ -36,7 +36,7 @@ func (m *Front) WxKeyset(tpl string) error {
 		return m.Redirect("/front/tenderSubscribe/guide")
 	}
 	//到新订阅设置
-	if vipMsg.IsUpgrade {
+	if vipMsg.VipStatus > 0 || vipMsg.IsUpgrade {
 		return m.Redirect("/front/vipsubscribe/toSubVipSetPage")
 	}
 	if tpl == "seniorset" {

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

@@ -77,7 +77,7 @@ func Getopenid(code string) (openid string) {
 
 //
 func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[string]interface{}) {
-	person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"b_merge_remind":1,"i_ispush":1,"i_unlimited":1}`)
+	person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"b_merge_remind":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1}`)
 	sessionVal := make(map[string]interface{})
 	if !ok || person == nil || len(*person) == 0 {
 		return nil, sessionVal
@@ -94,6 +94,9 @@ func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[strin
 			nickName = string(phone[0:3]) + "****" + string(phone[len(phone)-4:])
 		}
 	}
+	if util.ObjToString((*person)["s_jyname"]) != "" {
+		sessionVal["s_jyname"] = util.ObjToString((*person)["s_jyname"])
+	}
 	sessionVal["s_nickname"] = nickName
 	sessionVal["nickname"] = nickName
 	avatar, _ := (*person)["s_headimageurl"].(string)

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

@@ -66,6 +66,7 @@ type Front struct {
 	staticPage xweb.Mapper `xweb:"/jyapp/front/staticPage/(.+)"`
 	//商机管理推送
 	entnichePushList xweb.Mapper `xweb:"/jyapp/entniche/pushlist"`
+	entnichePush     xweb.Mapper `xweb:"/jyapp/entniche/push"`
 	delc             xweb.Mapper `xweb:"/jyapp/free/delcache/(.+)"` //删除模板缓存
 	iosExam          xweb.Mapper `xweb:"/jyapp/free/iosexam"`       //ios审核
 
@@ -644,7 +645,7 @@ func (s *Front) StaticPage(pagename string) error {
 	return s.Render("/staticpage/" + pagename)
 }
 
-//商机管理推送
+//商机管理推送列表 --- 下个版本删除
 func (s *Front) EntnichePushList() error {
 	pi := s.GetString("pi")
 	pn := s.GetString("pn")
@@ -663,6 +664,29 @@ func (s *Front) EntnichePushList() error {
 	//return s.Redirect("/page_entniche/home?f=push&selectTime=" + s.GetString("selectTime"))
 }
 
+//商机管理推送
+func (s *Front) EntnichePush() error {
+	pi := s.GetString("pi")
+	pn := s.GetString("pn")
+	if pi != "" && pn != "" {
+		d_pn_s := strings.Split(util.SE.Decode4HexByCheck(pi), "_")
+		if len(d_pn_s) == 3 && util.ObjToString(d_pn_s[0]) == "entniche" {
+			entId := util.IntAll(d_pn_s[1])
+			entUserId := util.IntAll(d_pn_s[2])
+			entName := util.SE.Decode4HexByCheck(pn)
+			s.SetSession("entId", entId)
+			s.SetSession("entName", entName)
+			s.SetSession("entUserId", entUserId)
+		}
+	}
+	if s.GetString("type") == "nomsgtip" {
+		return s.Redirect("/page_entniche/page/subsetting/sub_entrance.html")
+	} else if s.GetString("type") == "subscribepush" {
+		return s.Redirect("/jyapp/swordfish/historypush?f=push&t=entniche&pushtime=" + s.GetString("time"))
+	}
+	return nil
+}
+
 //删除模板缓存
 func (f *Front) Delc(url string) {
 	f.App.TemplateMgr.CacheDelete(strings.Replace(url, "GG", "/", 1))

+ 12 - 2
src/jfw/modules/app/src/app/front/login.go

@@ -563,6 +563,10 @@ func (l *Login) WxLogin() {
 				upSet["l_a_registedate"] = time.Now().Unix()
 				upSet["o_jy.i_apppush"] = 1
 			}
+			//剑鱼昵称
+			if qutil.ObjToString((*user)["s_nickname"]) == "" && qutil.ObjToString((*user)["s_jyname"]) == "" {
+				upSet["s_jyname"] = jy.GetUserName("newother", config.Sysconfig["namePrefix"].(string))
+			}
 			go mongodb.UpdateById("user", BsonIdToSId((*user)["_id"]), map[string]interface{}{
 				"$set": upSet,
 			})
@@ -592,7 +596,8 @@ func (l *Login) WxLogin() {
 					"i_ratemode":   2,
 					"l_modifydate": time.Now().Unix(),
 				},
-				"s_platform": "app", //用户注册平台 app 微信 pc
+				"s_platform": "app",                                                               //用户注册平台 app 微信 pc
+				"s_jyname":   jy.GetUserName("newother", config.Sysconfig["namePrefix"].(string)), //剑鱼昵称
 			}
 			newUser["s_regsource"] = isAndroidOrIOS(l.Header("User-Agent")) //用户注册终端 ios 安卓 pc
 			if _id := mongodb.Save("user", newUser); _id != "" {
@@ -903,7 +908,7 @@ func createSession(s *httpsession.Session, person map[string]interface{}, loginI
 		default:
 			return false
 		}
-		field := `{"s_m_openid":1,"s_phone":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"s_headimageurl":1,"s_phone":1,"s_nickname":1,"s_appversion":1,"i_unlimited":1}`
+		field := `{"s_m_openid":1,"s_phone":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"s_headimageurl":1,"s_phone":1,"s_nickname":1,"s_appversion":1,"i_unlimited":1,"s_jyname":1}`
 		data, ok := mongodb.FindOneByField("user", query, field)
 		if !ok {
 			return false
@@ -944,6 +949,10 @@ func createSession(s *httpsession.Session, person map[string]interface{}, loginI
 	if qutil.ObjToString(person["s_nickname"]) != "" {
 		s.Set("app_name", person["s_nickname"])
 	}
+	// 剑鱼昵称
+	if qutil.ObjToString(person["s_jyname"]) != "" {
+		s.Set("s_jyname", person["s_jyname"])
+	}
 	//cookie
 	maxAge := int(time.Hour * 72 / time.Second) //3天,单位秒
 	expires := time.Now().Add(72 * time.Hour)
@@ -998,6 +1007,7 @@ func ClearSession(s *httpsession.Session) {
 	s.Del("mailAuthTime")
 	s.Del("phone")
 	s.Del("i_unlimited")
+	s.Del("s_jyname")
 }
 
 //生成签名,返回手机端

+ 8 - 2
src/jfw/modules/app/src/app/front/swordfish.go

@@ -80,8 +80,14 @@ func (m *Front) AjaxReq() error {
 		}
 		data["s_remark"] = value
 		//
-		s_name, _ := (*userInfo)["s_name"].(string)
-		s_nickname, _ := (*userInfo)["s_nickname"].(string)
+		s_name := ""
+		if (*userInfo)["s_name"] != nil {
+			s_name, _ = (*userInfo)["s_name"].(string)
+		}
+		s_nickname := ""
+		if (*userInfo)["s_nickname"] != nil {
+			s_nickname, _ = (*userInfo)["s_nickname"].(string)
+		}
 		s_phone, _ := (*userInfo)["s_phone"].(string)
 		if s_name != "" {
 			data["s_submitname"] = s_name

+ 3 - 0
src/jfw/modules/app/src/app/front/vipsubscribe.go

@@ -111,6 +111,9 @@ func (s *Subscribepay) ToSetPage() {
 	}
 	vSwitch = jy.SwitchService.Get(s.Session(), public.MQFW) //v:vip m:member
 	bigBaseMsg := jy.GetBigVipUserBaseMsg(userid, public.Mysql, public.MQFW)
+	if (vSwitch == "" || vSwitch == "v") && bigBaseMsg.VipStatus <= 0 && !bigBaseMsg.IsUpgrade {
+		s.Redirect("/jyapp/wxkeyset/keyset/index")
+	}
 	//如果没有首次使用
 	if vSwitch == "m" && bigBaseMsg.Status > 0 && !bigBaseMsg.Used {
 		s.Redirect("/jyapp/big/page/init") //跳转至首次初始化页面

+ 7 - 5
src/jfw/modules/app/src/config.json

@@ -17,7 +17,7 @@
 		"vipreport": "/subscribepay/report/wxtplmsg?start=%s&end=%s&pushcount=%s",
 		"entnichehistorypush": "/jyapp/entniche/pushlist?selectTime=%s&pi=%s&pn=%s&type=%s",
 		"trackReport": "/page_entniche/business/t-report/detail/%s_%s/%s",
-		"viphomepage": "/jyapp/vipsubscribe/toSubVipSetPage",
+		"viphomepage": "/jyapp/vipsubscribe/toSubVipSetPage?vSwitch=%s",
 		"pushFollowEnt": "/jyapp/big/page/ent_follow",
 		"pushFollowProject": "/jyapp/big/page/pro_follow_list",
 		"pushMember": "/jyapp/big/page/big_subscribe?pushtime=%s",
@@ -25,7 +25,8 @@
 		"pushEntChange": "/jyapp/big/page/ent_follow",
 		"followProjectSet": "/jyapp/big/page/pro_follow_detail?fid=%s&sid=%s",
 		"memberreport":"/bigmember/report/openpushmsg?start=%s&end=%s&pushcount=%s",
-		"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s"
+		"memberreport_experience":"/bigmember/report/openpushmsg?t=app_experience&start=%s&end=%s&pushcount=%s",
+		"entnichepush": "/jyapp/entniche/push?time=%s&pi=%s&pn=%s&type=%s"
 	},
 	"followProject": 10,
 	"followentlimit": "10",
@@ -110,7 +111,7 @@
 		"shareTimesUpperLimitR": 4000,
 		"shareTimesUpperLimitIrr": 1000
 	},
-	"appPushServiceRpc": "192.168.20.139:5566",
+	"appPushServiceRpc": "192.168.20.114:5566",
 	"afterSavePushId": 60,
 	"mail": [
     {
@@ -146,7 +147,7 @@
 	"termValidity": 3600,
 	"uploadPath": "./web/staticres/jyapp/res/",
 	"appConfig":{
-		"pushGrpcServer":"192.168.20.139:5565",
+		"pushGrpcServer":"192.168.20.114:5565",
 		"pushGrpcHeartBeat":3
 	},
     "redisSessionLockSize":20,
@@ -159,5 +160,6 @@
     "phoneFilterFlag":true,
     "optimalTime":"2021-08-03 12:00:00",
     "criticality":2,
-    "canReadNotice": 3
+    "canReadNotice": 3,
+    "namePrefix":"JY_%s"
 }

+ 1 - 1
src/jfw/modules/app/src/db.json

@@ -37,7 +37,7 @@
     },
     "redis": {
     	"main": {
-			"address": "other=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001,pushcache_2_b=192.168.3.206:5002,sso=192.168.3.206:1712,session=192.168.3.206:1712,merge=192.168.3.206:1712,grayupdate=192.168.3.206:1712"
+			"address": "other=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:5000,pushcache_2_a=192.168.3.206:5001,pushcache_2_b=192.168.3.206:5002,sso=192.168.3.206:1712,session=192.168.3.206:1712,merge=192.168.3.206:1712,grayupdate=192.168.3.206:1712,newother=192.168.3.206:1712"
 		}
     },
     "mysql": {

+ 11 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/public.css

@@ -552,4 +552,14 @@ button[disabled] {
     border-radius: 4px;
     color: #F7F9FA;
     font-size: 0.32rem;
-}
+}
+
+.visited .visited-hd {
+    color: #C0C4CC!important;
+}
+.visited .visited-ft {
+    color: #9B9CA3!important;
+}
+.visited .visited-ft.visited-tag {
+    background-color: #F7F9F9;
+}

+ 21 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_follow.js

@@ -99,6 +99,16 @@ var vNode = {
 
                             // 列表赋值
                             if (res.data.list) {
+                                try {
+                                    res.data.list.forEach(function (item) {
+                                        item.visited = visitedPath.pathVisited(
+                                            new VisitedPathItem(
+                                                '/jyapp/big/page/ent_portrait',
+                                                `eId=${item.s_entId}`
+                                            )
+                                        )
+                                    })
+                                } catch (error) {}
                                 _this.entFollowList = _this.entFollowList.concat(res.data.list)
                             }
 
@@ -140,6 +150,17 @@ var vNode = {
             if (type == 'toEntPortrait' && item) {
                 item.i_apppushunread = 0
             }
+
+            try {
+                item.visited = true
+                visitedPath.pathVisiting(
+                    new VisitedPathItem(
+                        '/jyapp/big/page/ent_portrait',
+                        `eId=${item.s_entId}`
+                    )
+                )
+            } catch (error) {}
+
             var scrollTop = $(this.$refs.jList).scrollTop()
             // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
             if (scrollTop == 0 || this.entFollowList.length === 0) {

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

@@ -610,6 +610,16 @@ var vNode = {
             }
             if (res.data.list && $.isArray(res.data.list)) {
               _this.singleTab = false
+              try {
+                res.data.list.forEach(function (item) {
+                  item.visited = visitedPath.pathVisited(
+                    new VisitedPathItem(
+                      '/article/content/*.html',
+                      `id=${item.id}`
+                    )
+                  )
+                })
+              } catch (error) {}
               _this.topProject.list = res.data.list
               _this.topProject.list.forEach((val)=>{
                 _this.list.push(val.id)
@@ -1296,6 +1306,15 @@ var vNode = {
     },
     // 去公告详情页
     toProjectDetail: function (item) {
+      try {
+        item.visited = true
+        visitedPath.pathVisiting(
+          new VisitedPathItem(
+            '/article/content/*.html',
+            `id=${item.id}`
+          )
+        )
+      } catch (error) {}
       this.savePageState()
       if (item.id) {
         var href = '/jyapp/article/content/' + item.id + '.html'

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

@@ -581,6 +581,16 @@ var vNode = {
                   that.dt.isNext = false
                 }
                 that.dt.list = []
+                try {
+                  res.data.list.forEach(function (item) {
+                    item.visited = visitedPath.pathVisited(
+                      new VisitedPathItem(
+                        '/article/content/*.html',
+                        `id=${item.id}`
+                      )
+                    )
+                  })
+                } catch (error) {}
                 res.data.list.forEach((item) => {
                   if (that.dt.list.length < 3) {
                     that.dt.list.push(item)
@@ -1593,6 +1603,15 @@ var vNode = {
     // 跳转三级页
     goDetail: function (item) {
       if (item.id) {
+        try {
+          item.visited = true
+          visitedPath.pathVisiting(
+            new VisitedPathItem(
+              '/article/content/*.html',
+              `id=${item.id}`
+            )
+          )
+        } catch (error) {}
         var href = '/jyapp/article/content/' + item.id + '.html'
         location.href = href
       } else {

+ 14 - 0
src/jfw/modules/app/src/web/staticres/jyapp/css/searchindex.css

@@ -3637,3 +3637,17 @@ body{
     font-size: 14px;
 }
 /* -E p13 v2.10.4*/
+
+.visited .two-group p,
+.visited td div,
+.visited .visited-hd {
+  color: #C0C4CC!important;
+}
+.visited .list_info .tags > div,
+.visited .detail,
+.visited .visited-ft {
+  color: #9B9CA3!important;
+}
+.visited .visited-ft.visited-tag {
+  background-color: #F7F9F9;
+}

+ 181 - 6
src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js

@@ -2,6 +2,7 @@ var nowClientHeight = document.documentElement.clientHeight || document.body.cli
 var vSwitch = 'f'
 var newUserType = false
 var powerRoot = {}
+var isFreeUser;
 
 // 判断用户权限版本
 function getUserType() {
@@ -35,8 +36,11 @@ function getUserNewType() {
         url: '/bigmember/use/isAdd',
         type: 'POST',
         success: function (res) {
+           if (res.data) {
             powerRoot = res.data
             newUserType = res.data.isUpgrade
+            isFreeUser = res.data.isFree
+           }
         }
     })
 }
@@ -60,7 +64,81 @@ function updateJump2() {
     //     }
     // })
 }
-
+function getDefaultTime () {
+  if (isFreeUser) {
+    return 'thisyear'
+  } else {
+    return 'fiveyear'
+  }
+}
+var vOneKeySubComponent  = new Vue({
+  delimiters: ['${', '}'],
+  el: '#oneKeySubCom',
+  data: {
+    subDialog: false,
+    showAreaPicker: false,
+    sub: {
+      showArea: true,
+      keyWords: '',
+      region: '',
+      remindChecd: false
+    },
+    regionData: [
+      '安徽','澳门','北京','重庆','福建','广东','广西','贵州','甘肃','河北','湖北','黑龙江','海南','河南','湖南','吉林','江苏','江西','辽宁','内蒙古','宁夏',
+      '青海','山西','陕西','上海','山东','四川','天津','台湾','西藏','新疆','香港','云南','浙江'
+    ],
+    freeSubArea: false
+  },
+  computed: {
+    subDisabled: function () {
+      if (this.sub.showArea) {
+        return !this.sub.region
+      } else {
+        return false
+      }
+    }
+  },
+  methods: {
+    onConfirm: function() {
+      // console.log(this.$refs.subAreaPicker.getValues(), '333');
+      var value = this.$refs.subAreaPicker.getValues()
+      this.sub.region = value[0];
+      this.showAreaPicker = false;
+    },
+    // 一键订阅、暂不订阅
+    oneKeySub: function(type) {
+      var _this = this
+      var data = type ? {
+        isNoSubscribe: 'Y', // 一键订阅
+        subsequentPrompt: _this.sub.remindChecd ? 'Y' : 'N',
+        key: _this.sub.keyWords,
+        area: _this.sub.region
+      } : {
+        isNoSubscribe: 'N', // 暂不订阅
+        subsequentPrompt: _this.sub.remindChecd ? 'Y' : 'N'
+      }
+      $.ajax({
+        type:'post',
+        url: '/bigmember/subscribe/freeUser/subscribeSearch',
+        data: data,
+        success: function(r){
+          if (r.data && r.data.status) {
+            if (type) { // 选择的一键订阅
+              _this.subDialog = false
+              _this.successDialog = true
+              _this.$toast('订阅关键词成功')
+            } else { // 选择的暂不订阅
+              _this.subDialog = false
+            }
+          } else {
+            // console.log('一键订阅失败', r.error_code);
+            _this.subDialog = false
+          }
+        }
+      })
+    }
+  }
+})
 $(function () {
     // var vConsole = new VConsole();
     if (mySysIsIos()) {//ios登陆后页面不刷新;导致重复登陆
@@ -196,12 +274,14 @@ function getDefaultRangeForLocal() {
 function showSearchTipForTimeRange() {
     var tempDom = $("#supersearchPage #hasNoData_tiptext>font:eq(0)")
     var tipMap = {
-        'thisyear': '近一年',
+        'fiveyear': '近5年',
+        'threeyear': '近3年',
+        'thisyear': '近1年',
         'lately-7': '近7天',
         'lately-30': '近30天'
     }
     var tempStr = ''
-    var defaultRange = sessionStorage.superSearch_publishtime || SuperSearch.reqParam.publishtime || 'thisyear'
+    var defaultRange = sessionStorage.superSearch_publishtime || SuperSearch.reqParam.publishtime || getDefaultTime()
     if (tipMap[defaultRange]) {
         tempStr = tipMap[defaultRange]
     } else {
@@ -249,7 +329,7 @@ var SuperSearch = {
         "searchvalue": "",
         "subtype": "",
         "scope": "",
-        "publishtime": "thisyear",
+        "publishtime": getDefaultTime(),
         "selectType": getDefaultRangeForLocal(),
         "minprice": "",
         "maxprice": "",
@@ -1048,7 +1128,7 @@ var SuperSearch = {
             "searchvalue": "",
             "subtype": "",
             "scope": "",
-            "publishtime": "thisyear",
+            "publishtime": getDefaultTime(),
             "selectType": getDefaultRangeForLocal(),
             "minprice": "",
             "maxprice": "",
@@ -1166,6 +1246,7 @@ var SuperSearch = {
                         var html = SuperSearch.getHtml(SuperSearch.secondList, SuperSearch.reqParam["pageNum"]);
                         // 每次数据插入,必须重置
                         SuperSearch.appendListHtml(html);
+                        SuperSearch.checkSearchResVisited();
                         SuperSearch.noMoreData();
                         return;
                     }
@@ -1185,6 +1266,7 @@ var SuperSearch = {
                             // 每次数据插入,必须重置
                             //$(".app-layout-content-b").css("overflow-y","unset")
                             SuperSearch.appendListHtml(html);
+                            SuperSearch.checkSearchResVisited();
                             //没有下一页了 || 和pc端保持一致 最多显示500条
                             //console.log(member_status)
                             var count = 10;
@@ -1594,12 +1676,31 @@ var SuperSearch = {
                     }
                     $(".loading_").hide();
                 } else {
+                    // 免费用户是否弹出一键订阅弹框
+                    $.ajax({
+                      type:'get',
+                      url:'/bigmember/subscribe/freeUser/searchSubscribe',
+                      success: function(r){
+                        if (r.data) {
+                          vOneKeySubComponent.sub.showArea = r.data.areaSet
+                          vOneKeySubComponent.freeSubArea = r.data.freeArea
+                          vOneKeySubComponent.sub.keyWords = SuperSearch.s_words
+                          // console.log(SuperSearch.s_words, vOneKeySubComponent, 'SuperSearch.s_words');
+                          if (r.data.prompt) {
+                            vOneKeySubComponent.subDialog = true
+                          } else {
+                            vOneKeySubComponent.subDialog = false
+                          }
+                        }
+                      }
+                    })
                     //统计
 //   					grafana_statistics("APP搜索列表页-中部");
                     SuperSearch.showNull = false;
                     SuperSearch.hasData();
                     SuperSearch.limitFlag = data["limitFlag"]
                     SuperSearch.replayListHtml(SuperSearch.getHtml(data["list"], 1));
+                    SuperSearch.checkSearchResVisited();
                     SuperSearch.show();
                     if (SuperSearch.reqParam.pageNum == '1') {
                         $("#supersearchPage .app-layout-content-b #wrapper").scrollTop(0)
@@ -2060,6 +2161,14 @@ var SuperSearch = {
             if (params.length > 0) {
                 param = "?" + params.join("&");
             }
+            try {
+              visitedPath.pathVisiting(
+                new VisitedPathItem(
+                  '/article/content/*.html',
+                  `id=${sid}`
+                )
+              )
+            } catch (error) {}
             window.location.href = "/jyapp/article/content/" + sid + ".html" + param;
         }
     },
@@ -2345,6 +2454,7 @@ var SuperSearch = {
                     var h = $(this).find("a.bt").attr("s");
                     var sid = $(this).find("a.bt").attr("sid");
                     var industry = $(this).find(".industry").text();
+                    $(this).addClass('visited')
                     if (SuperSearch.checkIsStartFn(event, {sid: sid})) {
                         SuperSearch.myredirect(h, sid, industry);
                     }
@@ -2368,6 +2478,7 @@ var SuperSearch = {
                     var h = $(this).attr("s");
                     var sid = $(this).attr("sid");
                     var industry = $(this).attr("i");
+                    $(this).addClass('visited')
                     SuperSearch.myredirect(h, sid, industry);
                 });
                 $("#supersearchPage #table .data .content").html(TableContent);
@@ -2951,12 +3062,75 @@ var SuperSearch = {
         }
         SuperSearch.showHomeList(homeListHtml);
         $("*[data-onclick]").on('click', function (e) {
-            SuperSearch.HomeToDetails($(this).attr('data-onclick'), e)
+            var id = $(this).attr('data-onclick')
+            SuperSearch.HomeToDetails(id, e)
         })
     },
+    checkNewsVisited: function () {
+      $('.home_data .data_list [data-onclick]').each(function () {
+        var $this = $(this)
+        var id = $this.attr('data-onclick')
+        if (id) {
+          var visited = visitedPath.pathVisited(
+            new VisitedPathItem(
+              '/article/content/*.html',
+              `id=${id}`
+            )
+          )
+
+          if (visited) {
+            $this.addClass('visited')
+          } else {
+            $this.removeClass('visited')
+          }
+        }
+      })
+    },
+    checkSearchResVisited: function () {
+      function check ($this, id) {
+        var visited = visitedPath.pathVisited(
+          new VisitedPathItem(
+            '/article/content/*.html',
+            `id=${id}`
+          )
+        )
+        if (visited) {
+          $this.addClass('visited')
+        } else {
+          $this.removeClass('visited')
+        }
+      }
+      // 列表
+      $('#supersearchPage #list .tslist').each(function () {
+        var $this = $(this)
+        var id = $this.find('a.bt').attr('sid')
+        if (id) {
+          check($this, id)
+        }
+      })
+
+      // 表格
+      $('#table .content tr').each(function () {
+        var $this = $(this)
+        var id = $this.attr('sid')
+        if (id) {
+          check($this, id)
+        }
+      })
+    },
     HomeToDetails: function (id, e) {
         if (SuperSearch.checkIsStartFn(e, {sid: id})) {
+            var $this = $(e.target)
             if (id != "") {
+                $this.addClass('visited')
+                try {
+                  visitedPath.pathVisiting(
+                    new VisitedPathItem(
+                      '/article/content/*.html',
+                      `id=${id}`
+                    )
+                  )
+                } catch (error) {}
                 sessionStorage.setItem('main-list-data-set-time', JSON.stringify(new Date().getTime()))
                 sessionStorage.setItem('main-scroll-top', nowTop())
                 sessionStorage.setItem('main-save-dom', JSON.stringify($("#home_main .data_list").html()))
@@ -2968,6 +3142,7 @@ var SuperSearch = {
         SuperSearch.initHomeTip();
         if (hh != "") {
             $(".home_data .data_list").html(hh);
+            SuperSearch.checkNewsVisited()
         }
     },
     initHomePage: function () {

+ 3 - 1
src/jfw/modules/app/src/web/staticres/jyapp/me/js/account.js

@@ -1,6 +1,7 @@
 var mail = "";
 var phone = "";
 var nickname = "";
+var isWx = false;
 var account = {
     init: function () {
         this.linkClick();
@@ -57,6 +58,7 @@ var account = {
                 phone = r.data.phone;
                 nickname = r.data.nickname;
                 company = r.data.company;
+                isWx = r.data.isWx;
                 if (mail) {
                     $(".emailMsg").text(mail);
                     $(".email_binding").text("已绑定");
@@ -79,7 +81,7 @@ var account = {
                         window.location.href = "/jyapp/account/phone/bind";
                     })
                 }
-                if (nickname) {
+                if (isWx) {
                     $("#nickname").text(nickname);
                     $('.wx_name').text(nickname)
                     $(".wx_binding").text("已绑定");

+ 10 - 4
src/jfw/modules/app/src/web/staticres/jyapp/me/js/mine.js

@@ -64,26 +64,32 @@ var mine = {
             type: 'GET',
             success: function (r) {
                 if (r.data) {
+					//微信昵称>手机号>剑鱼昵称
                     var nickname = r.data.nickname;
                     // 如果模板里取不到用户头像,从接口里取
                     if(!pageUserInfo.headimageurl){
                         $("#head_img").attr("src", r.data.headimageurl)
                     }
+			    	var phone = r.data.phone;
+                    var jyname = r.data.jyname;//剑鱼昵称
                     // 如果有手机号
-                    if (r.data.phone) {
-                        $(".phone").text(fn(r.data.phone));
+                    if (phone) {
+                        $(".phone").text(fn(phone));
                         $(".set_phone").hide();
                         // 如果有微信昵称则大标题显示微信昵称,小标题显示手机号
                         if (nickname) {
                             $('.user_name').text(nickname)
                             $(".userphone").show();
                         } else { // 如果没有微信昵称,则大标题显示手机号,小标题不显示
-                            $('.user_name').text(fn(r.data.phone))
+                            $('.user_name').text(fn(phone))
                             $(".userphone").hide();
                         }
-                    } else {
+                    } else if(nickname) {
                         $(".set_phone").show();
                         $('.user_name').text(nickname)
+                    }else{
+                        $(".set_phone").show();
+                        $('.user_name').text(jyname)
                     }
                     // 超级订阅状态(0-暂不使用vip订阅 1-试用 2-正式 -1-试用到期 -2-正式到期)
                     if (r.data.subscribeVip > 0) {

+ 29 - 11
src/jfw/modules/app/src/web/staticres/jyapp/vipsubscribe/js/vip_entSearch.js

@@ -98,6 +98,17 @@ var vNode = {
                     // 加载状态结束
                     _this.listInfo.loading = false
 
+                    try {
+                      res.forEach(function (item) {
+                        item.visited = visitedPath.pathVisited(
+                          new VisitedPathItem(
+                            '/jyapp/big/page/ent_portrait',
+                            `eId=${item.entId}`
+                          )
+                        )
+                      })
+                    } catch (error) {}
+
                     // 列表赋值
                     _this.entFollowList = _this.entFollowList.concat(res)
                     _this.listInfo.finished = true
@@ -127,17 +138,24 @@ var vNode = {
           }
       },
       leavePage: function (item) {
-        console.log(item)
-          var scrollTop = $(this.$refs.jList).scrollTop()
-          // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
-          if (scrollTop == 0 || this.entFollowList.length === 0) {
-              // do something
-          } else {
-              this.listInfo.scrollTop = $(this.$refs.jList).scrollTop()
-              sessionStorage.setItem(this.sessStorageKey, JSON.stringify(this.$data))
-          }
-          location.href = '/jyapp/big/page/ent_portrait?eId=' + encodeURIComponent(item.entId) + '&svip=1'
-
+        try {
+          item.visited = true
+          visitedPath.pathVisiting(
+            new VisitedPathItem(
+              '/jyapp/big/page/ent_portrait',
+              `eId=${item.entId}`
+            )
+          )
+        } catch (error) {}
+        var scrollTop = $(this.$refs.jList).scrollTop()
+        // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
+        if (scrollTop == 0 || this.entFollowList.length === 0) {
+          // do something
+        } else {
+          this.listInfo.scrollTop = $(this.$refs.jList).scrollTop()
+          sessionStorage.setItem(this.sessStorageKey, JSON.stringify(this.$data))
+        }
+        location.href = '/jyapp/big/page/ent_portrait?eId=' + encodeURIComponent(item.entId) + '&svip=1'
       },
       formatArea: function (item) {
           var s = []

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

@@ -423,6 +423,9 @@
                                         location.href = './ai_result?id=' + res.data.id
                                     }
                                 })
+                            } else if (res.data.status === 3) {
+                              //缓存数据  可直接查看
+                              location.href = './ai_result?id=' + res.data.id
                             } else if(res.data.status === 2) {
                                 that.$toast.loading({
                                     duration: 0,
@@ -762,12 +765,12 @@
                     this.result.cCode = val[1].code;
                 }
                 this.result.code = regionCode
-                this.result.province = this.formatterCity(val[0].name);
+                this.result.province = this.formatterCity(val[0].name).replace('市', '');
                 this.result.city = this.formOnlyCity(val[1].name);
-                if(this.formatterCity(this.result.province) == this.formatterCity(this.result.city)) {
-                    this.result.province = this.result.city;
-                    this.result.city = ''
-                }
+                // if(this.formatterCity(this.result.province) == this.formatterCity(this.result.city)) {
+                //     this.result.province = this.result.city;
+                //     this.result.city = ''
+                // }
             },
             // 关闭地区弹框
             cancelPopup: function() {

+ 3 - 0
src/jfw/modules/app/src/web/templates/big-member/page_ai_search.html

@@ -298,6 +298,9 @@
                                         location.href = './ai_result?id=' + res.data.id
                                     }
                                 })
+                            } else if (res.data.status === 3) {
+                              //缓存数据  可直接查看
+                              location.href = './ai_result?id=' + res.data.id
                             } else if(res.data.status === 2) {
                                 that.$toast.loading({
                                     duration: 0,

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

@@ -10,7 +10,6 @@
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
-    <link rel="preload" as="style" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_client_follow_list.css" />
     <!--E-当前页必定需要预加载的资源-->
 
     <!--S-当前页面的css资源-->
@@ -141,16 +140,16 @@
                     finished-text="没有更多了"
                     @load="getProjectList"
                 >
-                    <div class="followList" v-for="(item,index) in list" :key="index" @click="followView(item.fid,item.sid,item)">
-                        <p class="pro_title">${item.title}</p>
+                    <div class="followList" :class="{ visited: item.visited }" v-for="(item,index) in list" :key="index" @click="followView(item.fid,item.sid,item)">
+                        <p class="pro_title visited-hd">${item.title}</p>
                         <div class="pro_tags">
                             <div class="tag_left">
-                                <span class="tag_text" v-if="item.area!==''&&item.area!==null">${item.area}</span>
-                                <span class="tag_text" v-if="item.buyerclass!==''&&item.buyerclass!==null">${item.buyerclass}</span>
-                                <span class="tag_text" v-if="item.status!==''&&item.status!==null">${item.status}</span>
-                                <span class="tag_text" v-if="item.budget!=='0'&&item.budget!==null">${item.budget}</span>
+                                <span class="tag_text visited-ft" v-if="item.area!==''&&item.area!==null">${item.area}</span>
+                                <span class="tag_text visited-ft" v-if="item.buyerclass!==''&&item.buyerclass!==null">${item.buyerclass}</span>
+                                <span class="tag_text visited-ft" v-if="item.status!==''&&item.status!==null">${item.status}</span>
+                                <span class="tag_text visited-ft" v-if="item.budget!=='0'&&item.budget!==null">${item.budget}</span>
                             </div>
-                            <div class="pro_time">
+                            <div class="pro_time visited-ft">
                                 <span class="j-icon icon-bell" v-if="item.i_remind!==0"></span>
                                 <span class="aftertime">${item.l_createtime}</span>
                                 <div class="squot" v-if="item.i_apppushunread!=0&&item.i_apppushunread!=null"></div>
@@ -184,6 +183,7 @@
 <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/china-map-data.js'></script>
 <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}}/jyapp/big-member/js/demo.js?v={{Msg "seo" "version"}}'></script> -->
 <!--E-当前页面的资源-->
@@ -479,6 +479,14 @@
                                     res.data.List[i].budget = utils.moneyUnit(res.data.List[i].budget)
                                     res.data.List[i].b_thirtydays = ""
                                     res.data.List[i].l_createtime = _this.timeDiff(res.data.List[i].l_createtime)
+                                    try {
+                                        res.data.List[i].visited = visitedPath.pathVisited(
+                                            new VisitedPathItem(
+                                                '/jyapp/big/page/client_follow_detail',
+                                                `sid=${res.data.List[i].sid}`
+                                            )
+                                        )
+                                    } catch (error) {}
                                     if (res.data.List[i].l_lastpushtime){
                                       lastpushtime = res.data.List[i].l_lastpushtime
                                     }
@@ -517,6 +525,15 @@
                 if(item.i_apppushunread){
                     item.i_apppushunread = 0
                 }
+                try {
+                    item.visited = true
+                    visitedPath.pathVisiting(
+                        new VisitedPathItem(
+                            '/jyapp/big/page/client_follow_detail',
+                            `sid=${sid}`
+                        )
+                    )
+                } catch (error) {}
                 var scrollTop = $(this.$refs.jList).scrollTop()
                 // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
                 if (scrollTop == 0) {

+ 30 - 13
src/jfw/modules/app/src/web/templates/big-member/page_client_list.html

@@ -70,17 +70,17 @@
                         finished-text="没有更多了"
                         @load="getProjectList"
                       >
-                      <div class="followList" v-for="(item, index) in list" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
+                      <div class="followList" :class="{ visited: item.visited }" v-for="(item, index) in list" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
                         <p class="pro_title">
                           <span class="j-icon icon-company"></span>
-                          <span class="follow_name">${item.name}</span>
+                          <span class="follow_name visited-hd">${item.name}</span>
                         </p>
                         <div class="pro_tags">
-                          <div class="cor-item-info">
+                          <div class="cor-item-info visited-ft">
                             <div class="cor-item-project">项目数量:${item.pNCount?item.pNCount : '-'}</div>
                             <div class="cor-item-budget">项目总金额:${item.budget?item.budget: '-'}</div>
                           </div>
-                          <div class="cor-item-location">
+                          <div class="cor-item-location visited-ft">
                               <span>所在地:</span>
                               <span class="highlight-text" v-if="item.province">${(item.province || item.wCity) ? item.province + '  ' + item.wCity : '-'}</span>
                               <span class="highlight-text" v-if="!item.province">${(item.wProvince || item.wCity) ? item.wProvince + '  ' + item.wCity : '-'}</span>
@@ -114,17 +114,17 @@
                         finished-text="没有更多了"
                         @load="getProjectList"
                       >
-                      <div class="followList" v-for="(item, index) in havaClaimList" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
-                        <p class="pro_title">
+                      <div class="followList" :class="{ visited: item.visited }" v-for="(item, index) in havaClaimList" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
+                        <p class="pro_title visited-hd">
                           <span class="j-icon icon-company"></span>
                           ${item.name}
                         </p>
                         <div class="pro_tags">
-                          <div class="cor-item-info">
+                          <div class="cor-item-info visited-ft">
                             <div class="cor-item-project">项目数量:${item.pNCount?item.pNCount : '-'}</div>
                             <div class="cor-item-budget">项目总金额:${item.budget?item.budget: '-'}</div>
                           </div>
-                          <div class="cor-item-location">
+                          <div class="cor-item-location visited-ft">
                               <span>所在地:</span>
                               <span class="highlight-text" v-if="item.province">${(item.province || item.wCity) ? item.province + '  ' + item.wCity : '-'}</span>
                               <span class="highlight-text" v-if="!item.province">${(item.wProvince || item.wCity) ? item.wProvince + '  ' + item.wCity : '-'}</span>
@@ -158,17 +158,17 @@
                         finished-text="没有更多了"
                         @load="getProjectList"
                       >
-                      <div class="followList" v-for="(item, index) in noClaimList" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
-                        <p class="pro_title">
+                      <div class="followList" :class="{ visited: item.visited }" v-for="(item, index) in noClaimList" style="padding-left: 16px;" @click="followView(item.fid,item.sid,item)">
+                        <p class="pro_title visited-hd">
                           <span class="j-icon icon-company"></span>
                           ${item.name}
                         </p>
                         <div class="pro_tags">
-                          <div class="cor-item-info">
+                          <div class="cor-item-info visited-ft">
                             <div class="cor-item-project">项目数量:${item.pNCount?item.pNCount : '-'}</div>
                             <div class="cor-item-budget">项目总金额:${item.budget?item.budget: '-'}</div>
                           </div>
-                          <div class="cor-item-location">
+                          <div class="cor-item-location visited-ft">
                               <span>所在地:</span>
                               <span class="highlight-text" v-if="item.province">${(item.province || item.wCity) ? item.province + '  ' + item.wCity : '-'}</span>
                               <span class="highlight-text" v-if="!item.province">${(item.wProvince || item.wCity) ? item.wProvince + '  ' + item.wCity : '-'}</span>
@@ -221,7 +221,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/china-map-data.js'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-city-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>
-<!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/demo.js?v={{Msg "seo" "version"}}'></script> -->
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <!--E-当前页面的资源-->
 <!--小于100行同css,减少请求数-->
 <script>
@@ -509,6 +509,14 @@
                                     res.data.list[i].budget = utils.moneyUnit(res.data.list[i].budget)
                                     res.data.list[i].follow = false
                                     res.data.list[i].claim = false
+                                    try {
+                                        res.data.list[i].visited = visitedPath.pathVisited(
+                                            new VisitedPathItem(
+                                                '/jyapp/big/page/client_portrayal',
+                                                `entName=${res.data.list[i].name}`
+                                            )
+                                        )
+                                    } catch (error) {}
                                     nameArr.push(res.data.list[i].name)
                                 }
                                 _this.list = res.data.list
@@ -541,6 +549,15 @@
                 if(item.i_apppushunread){
                     item.i_apppushunread = 0
                 }
+                try {
+                    item.visited = true
+                    visitedPath.pathVisiting(
+                        new VisitedPathItem(
+                            '/jyapp/big/page/client_portrayal',
+                            `entName=${item.name}`
+                        )
+                    )
+                } catch (error) {}
                 var scrollTop = $(this.$refs.jList).scrollTop()
                 // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
                 if (scrollTop == 0) {

+ 12 - 10
src/jfw/modules/app/src/web/templates/big-member/page_ent_follow.html

@@ -16,7 +16,7 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
-    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/ent_follow.css?v={{Msg "seo" "mod_version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/ent_follow.css?v={{Msg "seo" "version"}}' />
     <!--E-当前页面的css资源-->
 </head>
 <body>
@@ -45,6 +45,7 @@
                             <div
                                 v-for="(item, index) in entFollowList"
                                 class="follow-item"
+                                :class="{ visited: item.visited }"
                                 :immediate-check="false"
                                 @click="leavePage('toEntPortrait', item)"
                                 :key="index">
@@ -53,20 +54,20 @@
                                         <span class="j-icon icon-company"></span>
                                         <span class="dot-red" v-show="item.i_apppushunread == 1"></span>
                                     </span>
-                                    <span class="item-ent-name">${item.s_entname}</span>
+                                    <span class="item-ent-name visited-hd">${item.s_entname}</span>
                                 </div>
                                 <div class="item-bd" v-if="conf.showAllInfo">
-                                    <span class="bd-content">
+                                    <span class="bd-content visited-ft">
                                         <span class="bd-c-label">成立日期</span>
-                                        <span class="bd-c-text">${ item.l_establishdate ? new Date(item.l_establishdate*1000).pattern('yyyy.MM.dd') : '-' }</span>
+                                        <span class="bd-c-text visited-ft">${ item.l_establishdate ? new Date(item.l_establishdate*1000).pattern('yyyy.MM.dd') : '-' }</span>
                                     </span>
-                                    <span class="bd-content">
+                                    <span class="bd-content visited-ft">
                                         <span class="bd-c-label">注册资本</span>
-                                        <span class="bd-c-text">${ item.f_capital ? item.f_capital+'万元' : '-' }</span>
+                                        <span class="bd-c-text visited-ft">${ item.f_capital ? item.f_capital+'万元' : '-' }</span>
                                     </span>
-                                    <span class="bd-content">
-                                        <span class="bd-c-label">员工人数</span>
-                                        <span class="bd-c-text">${ item.s_employeeno ? item.s_employeeno+'人' : '-' }</span>
+                                    <span class="bd-content visited-ft">
+                                        <span class="bd-c-label visited-ft">员工人数</span>
+                                        <span class="bd-c-text visited-ft">${ item.s_employeeno ? item.s_employeeno+'人' : '-' }</span>
                                     </span>
                                 </div>
                                 <div class="item-ft border-line-t" v-if="conf.showAllInfo">
@@ -106,7 +107,8 @@
 <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}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
-<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/ent_follow.js?v={{Msg "seo" "mod_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}}/jyapp/big-member/js/ent_follow.js?v={{Msg "seo" "version"}}'></script>
 
 </body>
 </html>

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

@@ -453,10 +453,10 @@
             </div>
             <div class="tab-card-content">
               <ul class="project-info-list">
-                <li class="project-info-item border-line-b clickable" v-for="(item,index) in topProject.list"
+                <li class="project-info-item border-line-b clickable" :class="{ visited: item.visited }" v-for="(item,index) in topProject.list"
                     @click="toProjectDetail(item)">
                   <div class="head-group">
-                    <p class="i_title">${item.title}</p>
+                    <p class="i_title visited-hd">${item.title}</p>
                     <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
                   </div>
 <!--                  <div class="project-name">${item.title}</div>-->
@@ -596,7 +596,7 @@
               <div class="progress-bar-container" v-show="c.showLabels">
                 <div v-if="c.firstList&&c.firstList.length>0">
                   <div class="c-thead">
-                  <strong class="c-name">企业名称</strong>
+                  <strong class="c-name">客户名称</strong>
                   <span class="c-count">中标数量</span>
                   <span class="c-rate">平均折扣率</span>
                   <span class="c-time">最近合作日期</span>
@@ -640,9 +640,9 @@
         <div class="j-header tab-card-title">项目动态</div>
         <div class="j-main tab-card-content">
           <ul class="project-info-list">
-            <li class="project-info-item border-line-b clickable" v-for="(item,index) in topProject.list"
+            <li class="project-info-item border-line-b clickable" :class="{ visited: item.visited }" v-for="(item,index) in topProject.list"
                 @click="toProjectDetail(item)">
-              <div class="project-name">${item.title}</div>
+              <div class="project-name visited-hd">${item.title}</div>
               <div class="project-info">
                   <span class="tags">
                     <span class="tag tag-success" v-if="item.area">${item.area}</span>
@@ -685,6 +685,7 @@
 </script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/ent_portrait.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/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script>
@@ -701,7 +702,6 @@
         this.$refs.vKeepComponent.ajaxAddKeep(id, type)
       },
       changeKeepStatus (type) {
-
         vueComponent.changeKeepStatus(this.nowOpenBid, type)
       }
     }

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

@@ -245,11 +245,12 @@
                         <div
                             v-for="(item, index) in listState.list"
                             class="project-info-item bg-white border-line-b clickable"
+                            :class="{ visited: item.visited }"
                             :immediate-check="false"
                             @click="goToDetail(item)"
                             :key="item.id">
                             <div class="head-group">
-                              <div class="project-name">${ item.title }</div>
+                              <div class="project-name visited-hd">${ item.title }</div>
                               <span :data-id="item.id" class="icon" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
                             </div>
                             <div class="project-info">
@@ -374,6 +375,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
+<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/big-member/js/buyer_project_news.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>

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

@@ -113,12 +113,13 @@
                         <div
                             v-for="(item, index) in listState.list"
                             class="project-info-item bg-white border-line-b clickable"
+                            :class="{ visited: item.visited }"
                             :immediate-check="false"
                             @click="goToDetail(item)"
                             :key="item.id">
 <!--                            <div class="project-name">${ item.title }</div>-->
                               <div class="head-group">
-                                <div class="project-name">${ item.title }</div>
+                                <div class="project-name visited-hd">${ item.title }</div>
                                 <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
                               </div>
                             <div class="project-info">
@@ -244,6 +245,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/popup-select-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
+<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/big-member/js/ent_project_news.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>

+ 25 - 9
src/jfw/modules/app/src/web/templates/big-member/page_pro_follow_list.html

@@ -10,7 +10,6 @@
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
     <link rel="preload" as="style" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
-    <link rel="preload" as="style" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/page_pro_follow_list.css" />
     <!--E-当前页必定需要预加载的资源-->
 
     <!--S-当前页面的css资源-->
@@ -42,16 +41,16 @@
                     finished-text="没有更多了"
                     @load="getProjectList"
                 >
-                    <div class="followList" v-for="(item,index) in list" :key="index" @click="followView(item.fid,item.sid,item)">
-                        <p class="pro_title">${item.title}</p>
+                    <div class="followList" :class="{ visited: item.visited }" v-for="(item,index) in list" :key="index" @click="followView(item.fid,item.sid,item)">
+                        <p class="pro_title visited-hd">${item.title}</p>
                         <div class="pro_tags">
                             <div class="tag_left">
-                                <span class="tag_text" v-if="item.area!==''&&item.area!==null">${item.area}</span>
-                                <span class="tag_text" v-if="item.buyerclass!==''&&item.buyerclass!==null">${item.buyerclass}</span>
-                                <span class="tag_text" v-if="item.status!==''&&item.status!==null">${item.status}</span>
-                                <span class="tag_text" v-if="item.budget!=='0'&&item.budget!==null">${item.budget}</span>
+                                <span class="tag_text visited-ft" v-if="item.area!==''&&item.area!==null">${item.area}</span>
+                                <span class="tag_text visited-ft" v-if="item.buyerclass!==''&&item.buyerclass!==null">${item.buyerclass}</span>
+                                <span class="tag_text visited-ft" v-if="item.status!==''&&item.status!==null">${item.status}</span>
+                                <span class="tag_text visited-ft" v-if="item.budget!=='0'&&item.budget!==null">${item.budget}</span>
                             </div>
-                            <div class="pro_time">
+                            <div class="pro_time visited-ft">
                                 <span class="j-icon icon-bell" v-if="item.i_remind!==0"></span>
                                 <span class="aftertime">${item.l_createtime}</span>
                                 <div class="squot" v-if="item.i_apppushunread!=0&&item.i_apppushunread!=null"></div>
@@ -84,7 +83,7 @@
 <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
 {{include "/big-member/commonjs.html"}}
-<!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/demo.js?v={{Msg "seo" "version"}}'></script> -->
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <!--E-当前页面的资源-->
 <!--小于100行同css,减少请求数-->
 <script>
@@ -207,6 +206,14 @@
                                     res.data.List[i].budget = utils.moneyUnit(res.data.List[i].budget)
                                     res.data.List[i].b_thirtydays = ""
                                     res.data.List[i].l_createtime = _this.timeDiff(res.data.List[i].l_createtime)
+                                    try {
+                                        res.data.List[i].visited = visitedPath.pathVisited(
+                                            new VisitedPathItem(
+                                                '/jyapp/big/page/client_follow_detail',
+                                                `sid=${res.data.List[i].sid}`
+                                            )
+                                        )
+                                    } catch (error) {}
                                     if (res.data.List[i].l_lastpushtime){
                                       lastpushtime = res.data.List[i].l_lastpushtime
                                     }
@@ -239,6 +246,15 @@
                 if(item.i_apppushunread){
                     item.i_apppushunread = 0
                 }
+                try {
+                    item.visited = true
+                    visitedPath.pathVisiting(
+                        new VisitedPathItem(
+                            '/jyapp/big/page/client_follow_detail',
+                            `sid=${sid}`
+                        )
+                    )
+                } catch (error) {}
                 var scrollTop = $(this.$refs.jList).scrollTop()
                 // 如果滚动高度为0,或者entList长度为0,则不缓存数据(即返回刷新)
                 if (scrollTop == 0) {

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

@@ -96,8 +96,8 @@
             </van-cell-group>
         </div>
         <div class="report_source">
-            <p>数据来源:已为您推送的招标项目信息</p>
-            <p>数据来源:已为您推送的招标项目信息项目预算/项目规模:少量预算金额、中标金额未公开或为空的项目,将通过剑鱼标讯预测模型进行填补,可能会与实际项目预算、项目规模略有差距;</p>
+            <p>数据来源:基于您当前订阅条件所关联的招标项目数据;</p>
+            <p>项目预算/项目规模:少量预算金额、中标金额未公开或为空的项目,在计算项目总预算、总规模时不参与统计;</p>
             <p>项目重复统计:一个招标项目可能同属于多个关键词组,故各关键词组的数据统计之和可能大于整体市场的统计。</p>
         </div>
         <!-- 项目数量 1-->

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

@@ -125,8 +125,8 @@
             </van-cell-group>
         </div>
         <div class="report_source">
-            <p>数据来源:已为您推送的招标项目信息</p>
-            <p>项目预算/项目规模:少量预算金额、中标金额未公开或为空的项目,将通过剑鱼标讯预测模型进行填补,可能会与实际项目预算、项目规模略有差距;</p>
+            <p>数据来源:基于您当前订阅条件所关联的招投标公告数据;</p>
+            <p>项目预算/项目规模:少量预算金额、中标金额未公开或为空的项目,在计算项目总预算、总规模时不参与统计;</p>
             <p>项目重复统计:一个招标项目可能同属于多个关键词组,故各关键词组的数据统计之和可能大于整体市场的统计。</p>
         </div>
         <!-- 本周新增招标项目数量 -->

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

@@ -287,9 +287,9 @@
                     </div>
                 </div>
                 <div class="d_content">
-                    <div class="d_list" v-for="(item,index) in dt.list" @click="goDetail(item)">
+                    <div class="d_list" :class="{ visited: item.visited }" v-for="(item,index) in dt.list" @click="goDetail(item)">
                         <div class="head-group">
-                          <p class="i_title">${item.title}</p>
+                          <p class="i_title visited-hd">${item.title}</p>
                           <span class="icon weishoucang" :class="idx.indexOf(item.id) >-1 ? 'shoucang' : 'weishoucang'" @click.stop="addKeepStatus(item)"></span>
                         </div>
                         <div class="i_info">
@@ -663,6 +663,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/buyer-example.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/history-project.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}11'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>

+ 19 - 22
src/jfw/modules/app/src/web/templates/followent/set.html

@@ -21,6 +21,7 @@ if(sessionStorage){
 <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/local/mobiscroll.min.js"></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/js.html"}}
 <script type="text/javascript">
 	var data = {{.T.data}};
@@ -174,30 +175,26 @@ if(sessionStorage){
 	})
 
 function isVisited(sid){
-	var a_visited = {{.T.a_visited}};
-	if (a_visited!=null){
-		for(var i=0;i<a_visited.length;i++){
-			if(a_visited[i] == sid){
-				return true;
-			}
-		}
-	}
-	return false;
+  var a_visited = {{.T.a_visited}};
+  var visited = visitedPath.pathVisited(
+    new VisitedPathItem(
+      '/article/content/*.html',
+      'id=' + sid
+    )
+  )
+	return visited;
 }
 function beforeRedirect(obj,sid,link,isOld){
-	if($(obj).hasClass("visited")){
-		newredirect("",link,sid);
-		return;
-	}
-	var _id = {{.T._id}}
-	$(obj).addClass("visited");
-	if(typeof(sid) != "undefined" && sid != null && sid != "" && typeof(_id) != "undefined" && _id != null && _id != ""){
-		$.post("/jyapp/followent/notice/visited",{id:_id,sid:sid},function(r){
-			newredirect("",link,sid);
-		});
-	}else{
-		newredirect("",link,sid);
-	}
+  $(obj).addClass("visited");
+  try {
+    visitedPath.pathVisiting(
+      new VisitedPathItem(
+        '/article/content/*.html',
+        'id=' + sid
+      )
+    )
+  } catch (error) {}
+  newredirect("",link,sid);
 }
 </script>
 <style>

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

@@ -91,9 +91,9 @@
               finished-text="没有更多了"
               @load="getList"
             >
-              <div class="collec_li" v-for="(item, index) in listState.list" :key="index" @click="linkRouter(item._id)">
+              <div class="collec_li" :class="{ visited: item.visited }" v-for="(item, index) in listState.list" :key="index" @click="linkRouter(item)">
                 <div class="collec_head">
-                  <div class="collec_title ellipsis-2" v-html="item.title"></div>
+                  <div class="collec_title ellipsis-2 visited-hd" v-html="item.title"></div>
                   <div class="collec_star" @click="collecClick(event,item._id)">
                     <span class="shoucang" v-if="condition"></span>
                     <!-- <span class="weishoucang" v-if="!condition"></span> -->
@@ -101,12 +101,12 @@
                 </div>
                 <div class="collec_action">
                   <ul class="collec_tags">
-                    <li class="tag_active" v-if="item.area&&item.area!==''">${item.area}</li>
-                    <li class="tag_active" v-if="item.buyerclass&&item.buyerclass!==''">${item.buyerclass}</li>
-                    <li class="tag_active" v-if="item.type&&item.type!==''">${item.type}</li>
-                    <li class="tag_active" v-if="item.bidamount&&item.bidamount!==''">${item.bidamount}</li>
+                    <li class="tag_active visited-ft" v-if="item.area&&item.area!==''">${item.area}</li>
+                    <li class="tag_active visited-ft" v-if="item.buyerclass&&item.buyerclass!==''">${item.buyerclass}</li>
+                    <li class="tag_active visited-ft" v-if="item.type&&item.type!==''">${item.type}</li>
+                    <li class="tag_active visited-ft" v-if="item.bidamount&&item.bidamount!==''">${item.bidamount}</li>
                   </ul>
-                  <div class="collec_time">${item.publishtime}</div>
+                  <div class="collec_time visited-ft">${item.publishtime}</div>
                 </div>
               </div>
             </van-list>
@@ -150,6 +150,7 @@
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
   <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/collection/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
 </body>

+ 11 - 9
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_entSearch.html

@@ -111,6 +111,7 @@
                             <div
                                 v-for="(item, index) in entFollowList"
                                 class="follow-item"
+                                :class="{ visited: item.visited }"
                                 :immediate-check="false"
                                 @click="leavePage(item)"
                                 :key="index">
@@ -119,20 +120,20 @@
                                         <span class="j-icon icon-company"></span>
                                         <span class="dot-red" v-show="item.i_apppushunread == 1"></span>
                                     </span>
-                                    <span class="item-ent-name">${item.entName}</span>
+                                    <span class="item-ent-name visited-hd">${item.entName}</span>
                                 </div>
                                 <div class="item-bd">
-                                    <span class="bd-content">
+                                    <span class="bd-content visited-ft">
                                         <span class="bd-c-label">成立日期</span>
-                                        <span class="bd-c-text">${ item.establish_date ? item.establish_date : '-' }</span>
+                                        <span class="bd-c-text visited-ft">${ item.establish_date ? item.establish_date : '-' }</span>
                                     </span>
-                                    <span class="bd-content">
+                                    <span class="bd-content visited-ft">
                                         <span class="bd-c-label">注册资本</span>
-                                        <span class="bd-c-text">${ item.capital ? item.capital+'万元' : '-' }</span>
+                                        <span class="bd-c-text visited-ft">${ item.capital ? item.capital+'万元' : '-' }</span>
                                     </span>
-                                    <span class="bd-content">
-                                        <span class="bd-c-label">员工人数</span>
-                                        <span class="bd-c-text">${ item.employee_no ? item.employee_no+'人' : '-' }</span>
+                                    <span class="bd-content visited-ft">
+                                        <span class="bd-c-label visited-ft">员工人数</span>
+                                        <span class="bd-c-text visited-ft">${ item.employee_no ? item.employee_no+'人' : '-' }</span>
                                     </span>
                                 </div>
                                 <div class="item-ft border-line-t">
@@ -166,7 +167,8 @@
 <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}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
-<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/js/vip_entSearch.js?v={{Msg "seo" "mod_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}}/jyapp/vipsubscribe/js/vip_entSearch.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/baiducc.html"}}
 </body>
 </html>

+ 33 - 38
src/jfw/modules/app/src/web/templates/weixin/follow/set.html

@@ -17,6 +17,7 @@
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.js"></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
 <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <style>
 .setpage .noticehead {
 	top: 21.333vw;
@@ -705,28 +706,25 @@ var storage = window.localStorage;
 var hasNoFollowPopup = null;
 function isVisited(sid){
 	var a_visited = {{.T.a_visited}};
-	if (a_visited!=null){
-		for(var i=0;i<a_visited.length;i++){
-			if(a_visited[i] == sid){
-				return true;
-			}
-		}
-	}
-	return false;
+	var visited = visitedPath.pathVisited(
+    new VisitedPathItem(
+      '/article/content/*.html',
+      'id=' + sid
+    )
+  )
+	return visited;
 }
 function beforeRedirect(obj,sid,link){
-	if($(obj).hasClass("visited")){
-		newredirect("",link,sid);
-		return;
-	}
 	$(obj).addClass("visited");
-	if(typeof(sid) != "undefined" && sid != null && sid != "" && _id != ""){
-		$.post("/jyapp/follow/notice/visited",{id:_id,sid:sid,type:1},function(r){
-			newredirect("",link,sid);
-		});
-	}else{
-		newredirect("",link,sid);
-	}
+  try {
+    visitedPath.pathVisiting(
+      new VisitedPathItem(
+        '/article/content/*.html',
+        'id=' + sid
+      )
+    )
+  } catch (error) {}
+	newredirect("",link,sid);
 }
 
 function pageJump(){
@@ -1492,28 +1490,25 @@ $(function(){
 });
 function isVisited(sid){
 	var a_visited = {{.T.a_visited}};
-	if (a_visited!=null){
-		for(var i=0;i<a_visited.length;i++){
-			if(a_visited[i] == sid){
-				return true;
-			}
-		}
-	}
-	return false;
+	var visited = visitedPath.pathVisited(
+    new VisitedPathItem(
+      '/article/content/*.html',
+      'id=' + sid
+    )
+  )
+	return visited;
 }
 function beforeRedirect(obj,sid,link){
-	if($(obj).hasClass("visited")){
-		newredirect("",link,sid);
-		return;
-	}
 	$(obj).addClass("visited");
-	if(typeof(sid) != "undefined" && sid != null && sid != "" && _id != ""){
-		$.post("/jyapp/follow/notice/visited",{id:_id,sid:sid,type:1},function(r){
-			newredirect("",link,sid);
-		});
-	}else{
-		newredirect("",link,sid);
-	}
+  try {
+    visitedPath.pathVisiting(
+      new VisitedPathItem(
+        '/article/content/*.html',
+        'id=' + sid
+      )
+    )
+  } catch (error) {}
+	newredirect("",link,sid);
 }
 function afterRemindtimeSelect(date){
 	$("#bidopentime>.time").mobiscroll('getInst').option({minDate: date});

+ 1 - 0
src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html

@@ -641,6 +641,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/notice-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/industry-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/ent-search/ent-search-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/searchindex.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/dateFunc.js?v={{Msg "seo" "version"}}'></script>

+ 211 - 62
src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html

@@ -594,66 +594,172 @@
     }
 
     .cor-list-item {
-            display: flex;
-            flex-direction: column;
-            justify-content: space-between;
-            padding: .28rem .32rem;
-        }
-        .cor-list-item:after {
-            left: .32rem;
-        }
-        .cor-item-left {
-            display: flex;
-        }
-        .cor-item-right {
-            display: flex;
-            justify-content: flex-end;
-            align-items: center;
-        }
-        .cor-item-right .j-icon {
-            width: .4rem;
-            height: .4rem;
-        }
-        .cor-item-l-r {
-            margin: 0 .16rem;
-            flex: 1;
-        }
-        .cor-item-title {
-            margin-bottom: .12rem;
-            font-size: .28rem;
-            font-weight: 700;
-            line-height: .4rem;
-            color: #171826;
-        }
-        .cor-item-info,
-        .cor-item-location {
-            display: flex;
-            align-items: center;
-            font-size: .24rem;
-            line-height: .36rem;
-            color: #5F5E64;
-        }
-        .cor-item-location {
-            margin-top: .12rem;
-            font-size: .22rem;
-            color: #5F5E64;
-        }
-        .cor-item-project {
-            margin-right: .48rem;
-        }
-        .cor-item-right .more-action{
-          display: flex;
-          align-items: center;
-        }
-        .cor-item-right .more-action .j-icon{
-          margin-right: .08rem;
-        }
-        .tooltip{
-          margin-left: .32rem;
-        }
-        .keywordpopup{
-          z-index: 2100;
-        }
+        display: flex;
+        flex-direction: column;
+        justify-content: space-between;
+        padding: .28rem .32rem;
+    }
+    .cor-list-item:after {
+        left: .32rem;
+    }
+    .cor-item-left {
+        display: flex;
+    }
+    .cor-item-right {
+        display: flex;
+        justify-content: flex-end;
+        align-items: center;
+    }
+    .cor-item-right .j-icon {
+        width: .4rem;
+        height: .4rem;
+    }
+    .cor-item-l-r {
+        margin: 0 .16rem;
+        flex: 1;
+    }
+    .cor-item-title {
+        margin-bottom: .12rem;
+        font-size: .28rem;
+        font-weight: 700;
+        line-height: .4rem;
+        color: #171826;
+    }
+    .cor-item-info,
+    .cor-item-location {
+        display: flex;
+        align-items: center;
+        font-size: .24rem;
+        line-height: .36rem;
+        color: #5F5E64;
+    }
+    .cor-item-location {
+        margin-top: .12rem;
+        font-size: .22rem;
+        color: #5F5E64;
+    }
+    .cor-item-project {
+        margin-right: .48rem;
+    }
+    .cor-item-right .more-action{
+      display: flex;
+      align-items: center;
+    }
+    .cor-item-right .more-action .j-icon{
+      margin-right: .08rem;
+    }
+    .tooltip{
+      margin-left: .32rem;
+    }
+    .keywordpopup{
+      z-index: 2100;
+    }
+    .onekey-sub-dialog .van-dialog__header{
+      padding-top: 24px;
+      color: #171826;
+      font-size: .36rem;
+    }
+    .onekey-sub-dialog .sub-dialog-message{
+      font-size: .3rem;
+      color: #5F5E64;
+      line-height: .44rem;
+      text-align: justify;
+    }
+    .onekey-sub-dialog .van-cell{
+      margin-top: .32rem;
+      border: 1px solid rgba(0, 0, 0, 0.1);
+      border-radius: 4px;
+      font-size: .3rem;
+    }
+    .onekey-sub-dialog .sub-dialog-checkbox{
+      margin: .48rem 0 .2rem;
+    }
+    .onekey-sub-dialog .van-checkbox__icon--checked .van-icon{
+      color: #fff;
+      background: #2ABED1;
+      border-color: #2ABED1;
+    }
+    .onekey-sub-dialog .sub-dialog-checkbox .van-checkbox__label{
+      font-size: .24rem;
+      color: #9B9CA3;
+    }
+    .van-cell__right-icon{
+      color: #C0C4CC;
+    }
+    .onekey-sub-dialog .van-dialog__content{
+      padding: 0;
+    }
+    .onekey-sub-dialog .sub-dialog-content{
+      padding: 0.16rem 0.6rem
+    }
+    .onekey-sub-dialog .sub-dialog-footer{
+      position: relative;
+      display: flex;
+      overflow: hidden;
+      -webkit-user-select: none;
+      user-select: none;
+    }
+    .onekey-sub-dialog .sub-dialog-footer::after{
+      position: absolute;
+      box-sizing: border-box;
+      content: ' ';
+      pointer-events: none;
+      top: -50%;
+      right: -50%;
+      bottom: -50%;
+      left: -50%;
+      border: 0 solid #ebedf0;
+      -webkit-transform: scale(.5);
+      transform: scale(.5);
+      border-top-width: 1px;
+    }
+    .onekey-sub-dialog .sub-button{
+      position: relative;
+      flex: 1;
+      height: 48px;
+      margin: 0;
+      border: 0;
+      font-size: .36rem;
+      line-height: 26px;
+      background: transparent;
+    }
+    .onekey-sub-dialog .sub-button::before{
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      width: 100%;
+      height: 100%;
+      background-color: #000;
+      border: inherit;
+      border-color: #000;
+      border-radius: inherit;
+      -webkit-transform: translate(-50%,-50%);
+      transform: translate(-50%,-50%);
+      opacity: 0;
+      content: ' ';
+    }
+    .onekey-sub-dialog .sub-button-confirm{
+      color: #2ABED1;
+    }
+    .onekey-sub-dialog .sub-button-confirm:disabled{
+      opacity: 0.5;
+    }
+    .sub-area-picker .van-picker-column__item{
+      width: 100%;
+    }
+    .sub-area-picker .van-picker__cancel,.sub-area-picker .van-picker__confirm{
+      font-size: 16px;
+    }
+    .sub-area-picker .van-picker__confirm{
+      color: #2ABED1;
+    }
+    .sub-area-picker .van-picker__toolbar{
+      height: 54px;
+    }
+    .sub-area-picker .van-picker__title{
+      color: #171826;
+      font-size: 18px;
+    }
 </style>
 
 <!--S-Loading-->
@@ -785,12 +891,12 @@
                                     finished-text=""
                                     @load="onLoad"
                             >
-                                <div class="ent-search-item" v-for="(item, i) in list" :key="i" @click="selectEnt(item)">
+                                <div class="ent-search-item" :class="{ visited: item.visited }" v-for="(item, i) in list" :key="i" @click="selectEnt(item)">
                                     <div class="ent-info-top">
                                         <div class="ent-info-head" :style="{'background-color': item.color}">@@item.abbr@@</div>
                                         <div class="ent-info-keep">
                                             <div class="ent-row">
-                                                <div class="ent-name van-ellipsis">@@item.name@@</div>
+                                                <div class="ent-name van-ellipsis visited-hd">@@item.name@@</div>
                                                 <div class="fill-icon-box" style="display: none">
                                                     <i class="j-icon base-icon icon-no-favorite"></i>
                                                 </div>
@@ -1738,6 +1844,49 @@
     <div id="tempDiv" style="display:none;"></div>
 </div>
 <div class="collection" id="date-picker-other-box"></div>
+<!-- 一键订阅关键词 -->
+<div id="oneKeySubCom">
+  <van-dialog class-name="onekey-sub-dialog" v-model="subDialog" width="303px" title="订阅搜索词" :show-confirm-button="false">
+    <div class="sub-dialog-content">
+      <div class="sub-dialog-message">剑鱼标讯推荐您将搜索词 <span style="color: #2ABED1;">“${sub.keyWords}”</span> 添加到您的订阅中,以保证及时接收项目信息。</div>
+      <van-field
+        v-if="sub.showArea"
+        :border="false"
+        readonly
+        clickable
+        name="picker"
+        :value="sub.region"
+        placeholder="请选择订阅区域"
+        @click="showAreaPicker = true"
+        is-link
+      ></van-field>
+      <div class="sub-dialog-checkbox">
+        <van-checkbox v-model="sub.remindChecd" icon-size="18px">后续不再提醒</van-checkbox>
+      </div>
+    </div>
+    <div class="sub-dialog-footer">
+      <button @click="oneKeySub(false)" type="button" class="sub-button sub-button-cancel van-hairline--right">暂不订阅</button>
+      <button @click="oneKeySub(true)" type="button" class="sub-button sub-button-confirm" :disabled="subDisabled">一键订阅</button>
+    </div>
+  </van-dialog>
+  <van-popup v-model="showAreaPicker" position="bottom" style="border-radius: 16px 16px 0 0;">
+    <van-picker 
+      ref="subAreaPicker"
+      class="sub-area-picker"
+      show-toolbar
+      title="选择订阅区域"
+      cancel-button-text=" "
+      confirm-button-text=" "
+      :columns="regionData"
+    ></van-picker>
+    <div class="jyshxbottom sl-jyshxbottom">
+      <ul class="text-center j-button-group">
+          <li class="jydqreset j-button-cancel" @click="showAreaPicker = false">取消</li>
+          <li class="jydqsure j-button-confirm" @click="onConfirm">确定</li>
+      </ul>
+  </div>
+  </van-popup>
+</div>
 <!--S-底部提示-->
 <div class="resbm hidden" id="resbm">
     <div class="resbm0">

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

@@ -1112,13 +1112,13 @@
                 //是大会员
                 var bigWinnerTel = {{.T.obj.winnertel}};
                 var winner_enttel={{.T.obj.winner_enttel}};
-                var tel_source="来源:招标公告网站";
+                var tel_source="来源:国家企业公示网站";
                 if(bigWinnerTel==null){
                     if(winner_enttel==null){
                         bigWinnerTel=""
                     }else{
                         bigWinnerTel=winner_enttel
-                        tel_source="来源:国家企业公示网站"
+                        tel_source="来源:招标公告网站"
                     }
                 }
                 var bigInfohtml =''
@@ -2050,13 +2050,13 @@
           }
           var winnertel = {{.T.obj.winnertel}};
           var winner_enttel={{.T.obj.winner_enttel}};
-          var tel_source="来源:招标公告网站";
+          var tel_source="来源:国家企业公示网站";
           if(winnertel==null){
               if(winner_enttel==null){
                   winnertel=""
               }else{
                   winnertel=winner_enttel
-                  tel_source="来源:国家企业公示网站"
+                  tel_source="来源:招标公告网站"
               }
           }
 

+ 2 - 1
src/jfw/modules/bigmember/src/config.json

@@ -70,5 +70,6 @@
       "limit": 5,
       "timeOut": 20,
       "projectNumLimit": 8000000
-    }
+    },
+    "forecastTime":86400
 }

+ 1 - 0
src/jfw/modules/bigmember/src/config/config.go

@@ -44,6 +44,7 @@ type config struct {
 		TimeOut         int `json:"timeOut"`         //并发池等待超时时长,单位秒
 		ProjectNumLimit int `json:"projectNumLimit"` //自定义报告限制项目个数
 	} `json:"marketAnalysisPool"` //市场分析
+	ForecastTime int //中标预测结果redis 缓存时间
 }
 
 type customerInfo struct {

+ 1 - 1
src/jfw/modules/bigmember/src/db.json

@@ -42,7 +42,7 @@
     },
     "redis": {
     	"main":{
-			"address": "other=192.168.3.206:1712,session=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:1712,pushcache_2_a=192.168.3.206:1712,pushcache_2_b=192.168.3.206:1712"
+			"address": "other=192.168.3.206:1712,session=192.168.3.206:1712,push=192.168.3.206:1712,pushcache_1=192.168.3.206:1712,pushcache_2_a=192.168.3.206:1712,pushcache_2_b=192.168.3.206:1712,newother=192.168.3.206:1712"
 		}
     },
     "mysql": {

+ 4 - 2
src/jfw/modules/bigmember/src/entity/portrait_screen.go

@@ -268,8 +268,10 @@ func (pwp *PortraitProjectScreen) GetWinnerList() (list []map[string]interface{}
 		}
 
 		if rowData["_id"] != nil {
-			(*newData)[k]["id"] = qutil.CommonEncodeArticle("content", rowData["_id"].(string))
+			(*newData)[k]["id"] = qutil.EncodeArticleId2ByCheck(rowData["_id"].(string))
+			delete((*newData)[k], "_id")
 		}
+
 		title := qutil.ObjToString(rowData["title"])
 		if title == "" {
 			title = qutil.ObjToString(rowData["projectname"])
@@ -374,7 +376,7 @@ func (pwp *PortraitProjectScreen) GetBuyerList() (list []map[string]interface{},
 			lastObj, _ := last.(map[string]interface{})
 			if lastObj != nil {
 				if lastObj["infoid"] != nil {
-					(*newData)[k]["id"] = qutil.CommonEncodeArticle("content", lastObj["infoid"].(string))
+					(*newData)[k]["id"] = qutil.EncodeArticleId2ByCheck(lastObj["infoid"].(string))
 				}
 				title := qutil.ObjToString(qutil.ObjToString(lastObj["title"]))
 				if title == "" {

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

@@ -28,6 +28,10 @@ func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	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 := session.Get("userId").(string)
 	if !ok || userId == "" {
 		R.ServeJson(w, req, &Result{Error_code_1004, Error_msg_1004, nil})

+ 1 - 1
src/jfw/modules/bigmember/src/service/analysis/forecastproject.go

@@ -6,11 +6,11 @@ import (
 	"db"
 	"encoding/json"
 	"fmt"
-	"jfw/modules/common/src/qfw/util/jy"
 	"log"
 	qutil "qfw/util"
 	dfa "qfw/util/dfa"
 	"qfw/util/elastic"
+	"qfw/util/jy"
 
 	//"qfw/util/jy"
 	"sort"

+ 84 - 36
src/jfw/modules/bigmember/src/service/analysis/forecastwinner.go

@@ -1,4 +1,10 @@
 // Package analysis 中标预测分析
+/**
+@author:王山
+@descript:中标企业预测
+@date:2022-02-26
+@modify:中标预测失败不扣除中标预测次数
+**/
 package analysis
 
 import (
@@ -22,7 +28,6 @@ import (
 	"util"
 )
 
-// var forecastWLock = map[string]*sync.Mutex{}
 var redis_forecast_status = "forecast_status_" //预测状态
 var redis_forecast_res = "forecast_res_"       //预测结果数据
 var redis_forecast_date = "forecast_date_"     //预测时间
@@ -83,14 +88,8 @@ func (this *Analysis) FWData() {
 		Error_msg:  "",
 	}
 	if this.Method() == METHOD {
-		// log.Println(this.Request)
 		userId, _ := this.GetSession("userId").(string)
-		// //有正在预测的数据或已预测未查看的数据
-		// OverRegLock.Lock()
-		// defer func() {
-		// 	OverRegLock.Unlock()
-		// 	// <-ForecastChan
-		// }()
+		//有正在预测的数据或已预测未查看的数据
 		success, id := isExistsFIng(userId)
 		status := 0
 		if success {
@@ -136,40 +135,74 @@ func (this *Analysis) FWData() {
 					ai, base64Key, currentCount := AnalysisPower("W", main_userId, getRes.Pname, getRes.Infoid, getRes.ServiceId)
 					// log.Println("ai:", ai)
 					if ai > 0 {
+						log.Println(main_userId, "---ai:", ai)
 						if ai == 2 {
-							UpdatePower(main_userId, getRes.ServiceId) //更新sql库权限次数
+							// 订阅及搜索优化版本dev4.3.4调整为预测成功后才扣次数
+							// UpdatePower(main_userId, getRes.ServiceId) //更新sql库权限次数
+							redis.Put("newother", "jyPredictedDeduction_"+main_userId, base64Key, 3*24*60*60) //是否需要扣除次数 默认存3天
 						}
-						getRes.RedisFKey = redis_forecast_res + userId
-						getRes.Id = util.DecodeId(getRes.Id)
-						if getRes.Infoid != "" {
-							getRes.Infoid = util.DecodeId(getRes.Infoid)
-						}
-						//中标预测数据处理ing
-						if util.JyForecastByRpc(getRes) {
-							//redis 存正在预测标识
-							redis.Put("other", redis_forecast_status+userId, getRes, -1)
-							//预测参数--保存mongodb中
-							f_id := db.Mgo.Save(C_ForecastData, map[string]interface{}{
+
+						//中标预测是否有缓存dev4.3.4-王山(项目名称+地区+城市+采购单位+标的物) 默认缓存保留一天
+						redisKeys := GetRedisBase64Key(getRes.Pname, getRes.Area, getRes.City, getRes.Buyer, getRes.BuyerContent)
+						if forecstId := redis.GetStr("newother", "jyPredicted_"+redisKeys); forecstId != "" {
+							if f_id := db.Mgo.Save(C_ForecastData, map[string]interface{}{
 								"userId":      userId,
 								"createtime":  time.Now().Unix(),
-								"status":      -1, //预测完成待查看
+								"status":      1, //预测完成待查看
 								"requestData": getRes,
+								"cacheId":     forecstId,
 								"upeatetime":  time.Now().Unix(),
-							})
-							if f_id != "" {
-								redis.Put("other", redis_forecast_date+userId, f_id, forecast_time)
+							}); f_id != "" {
+								regMap.Data = map[string]interface{}{
+									"status": 3, //缓存数据
+									"id":     util.EncodeId(forecstId),
+									"pname":  getRes.Pname,
+								}
+							} else {
+								regMap.Data = map[string]interface{}{
+									"status": -4, //缓存数据保存异常
+									"pname":  getRes.Pname,
+								}
 							}
-							status = 2 //rpc 已接受参数 正在预测
 						} else {
-							status = -1
-							s_nickname, _ := this.GetSession("s_nickname").(string)
-							if s_nickname == "" {
-								s_nickname, _ = this.GetSession("app_name").(string)
+							// 项目信息加密key缓存5+分钟 - 预测成功后提供 项目加密key 把结果id存入redis缓存中时间默认一天
+							redis.Put("newother", "jyPredicted_five_"+main_userId, redisKeys, forecast_time+20)
+							getRes.RedisFKey = redis_forecast_res + userId
+							getRes.Id = util.DecodeId(getRes.Id)
+							if getRes.Infoid != "" {
+								getRes.Infoid = util.DecodeId(getRes.Infoid)
+							}
+							//中标预测数据处理ing
+							if util.JyForecastByRpc(getRes) {
+								//redis 存正在预测标识
+								redis.Put("other", redis_forecast_status+userId, getRes, -1)
+								//预测参数--保存mongodb中
+								f_id := db.Mgo.Save(C_ForecastData, map[string]interface{}{
+									"userId":      userId,
+									"createtime":  time.Now().Unix(),
+									"status":      -1, //预测完成待查看
+									"requestData": getRes,
+									"upeatetime":  time.Now().Unix(),
+								})
+								if f_id != "" {
+									redis.Put("other", redis_forecast_date+userId, f_id, forecast_time)
+								}
+								status = 2 //rpc 已接受参数 正在预测
+							} else {
+								status = -1
+								s_nickname, _ := this.GetSession("s_nickname").(string)
+								if s_nickname == "" {
+									s_nickname, _ = this.GetSession("app_name").(string)
+								}
+								go SaveFalseLogAndSendMail(userId, "rpc 接口调用出错", "", s_nickname, *getRes)
+							}
+							//保存中标预测记录
+							go SaveFWHistorys(status, userId, main_userId, base64Key, phone, currentCount, this.Request, getRes, ai)
+							regMap.Data = map[string]interface{}{
+								"status": status,
+								"pname":  getRes.Pname,
 							}
-							go SaveFalseLogAndSendMail(userId, "rpc 接口调用出错", "", s_nickname, *getRes)
 						}
-						//保存中标预测记录
-						go SaveFWHistorys(status, userId, main_userId, base64Key, phone, currentCount, this.Request, getRes, ai)
 					} else {
 						if member_status == 4 {
 							status = -3 //是否是试用用户
@@ -179,12 +212,12 @@ func (this *Analysis) FWData() {
 								status = -21 //子账号权限
 							}
 						}
+						regMap.Data = map[string]interface{}{
+							"status": status,
+							"pname":  getRes.Pname,
+						}
 					}
 				}
-				regMap.Data = map[string]interface{}{
-					"status": status,
-					"pname":  getRes.Pname,
-				}
 			} else {
 				regMap.Error_code = Error_code_1002
 				regMap.Error_msg = Error_msg_1002
@@ -274,6 +307,21 @@ func (this *Analysis) FWStatus() {
 								"id":      util.EncodeId(f_id),
 								"success": true,
 							}
+							// 订阅及搜索优化版本dev4.3.4调整为预测成功后才扣次数
+							go func(userId, f_id string) {
+								main_userId, _, _ := util.MainUserId(userId, "", 0)
+								if ok, _ := redis.Exists("newother", "jyPredictedDeduction_"+main_userId); ok {
+									//扣除次数
+									UpdatePower(main_userId, 15)
+									redis.Del("newother", "jyPredictedDeduction_"+main_userId)
+								}
+								// 预测项目信息  缓存 五分钟
+								redisKeys := redis.GetStr("newother", "jyPredicted_five_"+main_userId)
+								if redisKeys != "" {
+									//缓存默认一天
+									redis.Put("newother", "jyPredicted_"+redisKeys, f_id, qutil.IntAllDef(Config.ForecastTime, 86400))
+								}
+							}(userId, f_id)
 						} else {
 							isFFalse = 1
 							falseMsg = "中标预测二次更新状态出错"

+ 30 - 0
src/jfw/modules/bigmember/src/service/analysis/util.go

@@ -120,6 +120,36 @@ func GetBase64Key(userId, pname, sid string) (signedStr string) {
 	return
 }
 
+//
+func GetRedisBase64Key(pname, area, city, buyer string, buyerContent []string) (signedStr string) {
+	if len(buyerContent) > 0 {
+		sort.Slice(buyerContent, func(i, j int) bool {
+			return buyerContent[i] < buyerContent[j]
+		})
+	}
+	var param = [][]string{
+		[]string{"pname", pname},
+		[]string{"area", area},
+		[]string{"city", city},
+		[]string{"buyer", buyer},
+		[]string{"buyerContent", strings.Join(buyerContent, ",")},
+	}
+	sgt := &SignStr{[]string{}, []string{}}
+	for _, v := range param {
+		sgt.Key = append(sgt.Key, v[0])
+		sgt.Val = append(sgt.Val, v[1])
+	}
+	sgt.Sort()
+	reqStr := sgt.ToString()
+	str := percentEncode(reqStr)
+	h := hmac.New(func() hash.Hash {
+		return sha1.New()
+	}, []byte(secret))
+	io.WriteString(h, str)
+	signedStr = url.QueryEscape(base64.StdEncoding.EncodeToString(h.Sum(nil)))
+	return
+}
+
 var Sp = strings.Replace
 
 func percentEncode(str string) string {

+ 129 - 0
src/jfw/modules/bigmember/src/service/subscribe/subscribe.go

@@ -9,11 +9,14 @@ import (
 	"log"
 	"mongodb"
 	qutil "qfw/util"
+	"qfw/util/redis"
 	"sort"
 	"strings"
 	"time"
 	"util"
 
+	"go.mongodb.org/mongo-driver/bson"
+
 	"github.com/go-xweb/xweb"
 )
 
@@ -29,6 +32,132 @@ type Subscribe struct {
 	getPushView          xweb.Mapper `xweb:"/subscribe/getPushView"`          //推送预览
 	list                 xweb.Mapper `xweb:"/subscribe/push/list"`            //推送列表
 	visit                xweb.Mapper `xweb:"/subscribe/push/visit"`           //推送记录访问接口
+
+	freeUserSubscribe xweb.Mapper `xweb:"/subscribe/freeUser/searchSubscribe"` //免费用户搜索订阅
+	subscribeSearch   xweb.Mapper `xweb:"/subscribe/freeUser/subscribeSearch"` //免费用户订阅搜索词设置
+}
+
+func (s *Subscribe) FreeUserSubscribe() {
+	//isVip, isMember 付费用户 isEntNiche, isEntNicheNew 商机管理用户 iPpStatus 非省份订阅包 promptBool 是否今日已提醒 areaConfig 区域配置
+	var isVip, isMember, isEntNiche, isEntNicheNew, iPpStatus, searchPrompt, promptBool, isAreaConfig bool
+	userId := s.GetSession("userId").(string)
+	if userId == "" {
+		fmt.Println("用户未登录,搜索词不进行校验")
+		s.ServeJson(Result{Data: M{"prompt": false, "areaSet": false, "freeArea": false}})
+		return
+	}
+	t := time.Now()
+	redisKey := fmt.Sprintf("%d_%s_%d_freeSubscription_%s", t.Year(), t.Month(), t.Day(), userId)
+
+	res, _ := db.Mgo.FindById("user", userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"o_jy":1,""l_search_prompt":1}`)
+	isVip = qutil.IntAll((*res)["i_vip_status"]) > 0
+	oJy, _ := (*res)["o_jy"].(map[string]interface{})
+	freeArea := true
+	//校验区域设置
+	if v, ok := oJy["o_area"]; ok && v != nil && len(v.(map[string]interface{})) > 0 {
+		isAreaConfig = true
+	}
+	if !isVip && !isAreaConfig {
+		freeArea = false
+	}
+	isMember = qutil.IntAll((*res)["i_member_status"]) > 0
+	//是否免费用户(免费用户:非省份订阅包、超级订阅、大会员、商机管理用户)
+	if phone, _ := qutil.If(qutil.ObjToString((*res)["s_phone"]) != "", qutil.ObjToString((*res)["s_phone"]), qutil.ObjToString((*res)["s_m_phone"])).(string); phone != "" {
+		isEntNiche = db.Mysql.CountBySql(`SELECT count(1) from entniche_user a INNER JOIN entniche_info b on (a.phone=? and a.power=1 and a.ent_id=b.id and b.status>0)`, phone) > 0
+		isEntNicheNew = db.Mysql.CountBySql(`SELECT count(1) from entniche_user a INNER JOIN entniche_info b on (a.phone=? and a.power=1 and a.ent_id=b.id and b.status>0 and b.isNew > 0)`, phone) > 0
+	}
+	//非省份订阅包
+	if oJy["i_ppstatus"] != nil && qutil.IntAll(oJy["i_ppstatus"]) > 0 {
+		iPpStatus = true
+	}
+	if isVip || isMember || isEntNiche || isEntNicheNew || iPpStatus {
+		goto env
+	}
+	//校验新老用户
+	//if o_jy["i_newfree"] != nil && qutil.IntAll(o_jy["i_newfree"]) > 0 {
+	//	nweOldUser = true
+	//}
+
+	//是否有关键词
+	if oJy["a_key"] != nil && len(oJy["a_key"].([]interface{})) > 0 {
+		goto env
+	}
+	//是否勾选不在提示
+	if v, ok := oJy["l_search_prompt"]; ok && v != nil && v.(bool) {
+		goto env
+	}
+	//今天是否提示过
+	if searchPrompt, _ = redis.Exists("other", redisKey); !searchPrompt {
+		promptBool = true
+		redis.Put("other", redisKey, 1, 24*60*60)
+	}
+env:
+	s.ServeJson(Result{Data: M{"prompt": promptBool, "areaSet": !isAreaConfig, "freeArea": freeArea}})
+
+}
+
+func (s *Subscribe) SubscribeSearch() {
+	isNoSubscribe := s.GetString("isNoSubscribe")
+	area := s.GetString("area")
+	subsequentPrompt := s.GetString("subsequentPrompt")
+	key := s.GetString("key")
+	userId := s.GetSession("userId").(string)
+
+	if userId == "" {
+		s.ServeJson(Result{Data: nil, Error_msg: "未登录"})
+		return
+	}
+	var search_prompt bool
+	if subsequentPrompt == "Y" {
+		search_prompt = true
+	} else if subsequentPrompt == "N" {
+		search_prompt = false
+	}
+
+	//暂不订阅修改
+	if isNoSubscribe == "N" {
+		aa := db.Mgo.UpdateById("user", userId, bson.M{"$set": bson.M{"o_jy.l_search_prompt": search_prompt}})
+		s.ServeJson(Result{Data: M{"status": aa}})
+		return
+	}
+
+	//一键订阅修改
+	res, _ := db.Mgo.FindById("user", userId, `{"o_jy":1,"i_ts_guide":1}`)
+	//获取原有订阅词
+	oJy, _ := (*res)["o_jy"].(map[string]interface{})
+	aKey, _ := oJy["a_key"].([]interface{})
+	if key != "" {
+		keyData := []string{strings.Replace(key, " ", "", -1)}
+		var aKeys = map[string]interface{}{"key": keyData}
+		aKey = append(aKey, aKeys)
+	}
+	var newFree int
+	if v, ok := oJy["i_newfree"]; ok && v != nil {
+		newFree = qutil.IntAll(v)
+	}
+	//更新新订阅词并升级
+	data := make(map[string]interface{})
+	data["o_jy.l_search_prompt"] = search_prompt
+	data["o_jy.i_newfree"] = 1
+	data["o_jy.a_key"] = aKey
+	if area != "" {
+		data["o_jy.o_area"] = map[string]interface{}{
+			area: []string{},
+		}
+		if v, ok := (*res)["i_ts_guide"]; !ok || qutil.IntAll(v) != 1 {
+			data["i_ts_guide"] = 1
+		}
+	}
+	UpData := map[string]interface{}{
+		"$set": data,
+	}
+	status := db.Mgo.UpdateById("user", userId, UpData)
+	if status && newFree == 0 {
+		if !redis.Del("other", "bigmember_power_3_"+userId) {
+			log.Println("redis delete bigmember_power ", userId)
+		}
+	}
+	s.ServeJson(Result{Data: M{"status": status}})
 }
 
 func (s *Subscribe) Key_update() {

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

@@ -617,6 +617,7 @@ func (u *Use) IsAdd() {
 		}
 		//是否是免费用户
 		d["isFree"] = bigPower.VipStatus <= 0 && bigPower.Status <= 0
+
 		d["vipStatus"] = bigPower.VipStatus
 		d["power"] = power
 		d["isUsed"] = bigPower.Used
@@ -637,6 +638,7 @@ func (u *Use) IsAdd() {
 		filePackNum := redis.GetInt(jy.PowerCacheDb, filePackKey)
 		d["fileNum"] = config.Config.FileUploadNum[uk] - redis.GetInt(jy.PowerCacheDb, fmt.Sprintf(jy.VipFileUploadNumKey, userid, fmt.Sprint(time.Now().Month()))) + filePackNum
 		//新用户->新订阅设置页面
+		//dev4.6.4 NewFreeUser:作为常量判断 见:bigVipPower.go-ws
 		if config.Config.NewFreeUser < bigPower.Registedate {
 			d["isUpgrade"] = true
 		}
@@ -652,7 +654,7 @@ func (u *Use) IsAdd() {
 		//获取用户所在企业 : 如有多个企业,仅显示一个企业,显示顺序为:购买商机管理的企业>企业认证的企业>普通 企业,同一类型存在多个时,任意展示一个企业
 		res := db.Mysql.SelectBySql(`SELECT i.name,i.phone,i.status,i.auth_status,u.power FROM entniche_user u LEFT JOIN entniche_info i
 			ON u.ent_id=i.id
-			WHERE u.phone=? 
+			WHERE u.phone=?
 			ORDER BY  i.status DESC,i.auth_status DESC, CASE WHEN i.phone=? THEN 0  ELSE 1 END  ASC`, phone, phone)
 		if res != nil && len(*res) > 0 {
 			entname := qu.ObjToString((*res)[0]["name"])
@@ -969,8 +971,8 @@ func addOldent(userid, entname string) {
 
 //
 func Combo(userid string, member_status int) (combo_name string) {
-	data := db.Mysql.SelectBySql(`SELECT filter FROM dataexport_order WHERE filter LIKE '%"comboId"%' 
-			AND user_id =? AND filter  NOT LIKE  '%"comboId":0%' 
+	data := db.Mysql.SelectBySql(`SELECT filter FROM dataexport_order WHERE filter LIKE '%"comboId"%'
+			AND user_id =? AND filter  NOT LIKE  '%"comboId":0%'
 			AND product_type ="大会员"  AND order_status =1 ORDER BY create_time DESC`, userid)
 	if data != nil && len(*data) > 0 {
 		order := (*data)[0]

+ 0 - 1
src/jfw/modules/bigmember/src/util/rpc.go

@@ -101,6 +101,5 @@ func JyForecastByRpc(getRes *ForecastS) bool {
 			log.Println("Forecast-2-err:", err)
 		}
 	}, func(e interface{}) {})
-	log.Println(ok.Rep)
 	return ok.Rep
 }

+ 448 - 431
src/jfw/modules/common/src/qfw/util/bidsearch/search.go

@@ -1,482 +1,499 @@
 package bidsearch
 
 import (
-	"fmt"
-	"jfw/public"
-	"log"
-	"net/http"
-	"qfw/util"
-	"qfw/util/elastic"
-	"qfw/util/jy"
-	"strconv"
-	"strings"
-	"time"
+    "fmt"
+    "jfw/public"
+    "log"
+    "net/http"
+    "qfw/util"
+    "qfw/util/elastic"
+    "qfw/util/jy"
+    "strconv"
+    "strings"
+    "time"
 )
 
 //pc、微信、app 招标信息搜索
 
 const (
-	INDEX          = "bidding"
-	TYPE           = "bidding"
-	bidSearch_sort = `{"publishtime":-1}`
+    INDEX          = "bidding"
+    TYPE           = "bidding"
+    bidSearch_sort = `{"publishtime":-1}`
 
-	//招标搜索分页--每页显示数量
-	SearchPageSize_APP = 50
-	SearchPageSize_WX  = 50
-	SearchPageSize_PC  = 50
-	//招标搜索分页--最大页数
-	SearchMaxPageNum_APP   = 10
-	SearchMaxPageNum_WX    = 10
-	SearchMaxPageNum_PC    = 10  //免费用户500条记录
-	SearchMaxPageNum_PAYED = 100 //付费用户5000条记录
+    //招标搜索分页--每页显示数量
+    SearchPageSize_APP = 50
+    SearchPageSize_WX  = 50
+    SearchPageSize_PC  = 50
+    //招标搜索分页--最大页数
+    SearchMaxPageNum_APP   = 10
+    SearchMaxPageNum_WX    = 10
+    SearchMaxPageNum_PC    = 10  //免费用户500条记录
+    SearchMaxPageNum_PAYED = 100 //付费用户5000条记录
 
-	bidSearch_field_1 = `"_id","title","publishtime","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass"`
-	bidSearch_field   = bidSearch_field_1 + `,"bidopentime","winner","buyer","projectname","projectcode","projectinfo"`
+    bidSearch_field_1 = `"_id","title","publishtime","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass"`
+    bidSearch_field   = bidSearch_field_1 + `,"bidopentime","winner","buyer","projectname","projectcode","projectinfo"`
 )
 
 //GetWxsearchlistData 移动端招标信息搜索
 func GetWxsearchlistData(keywords, scope, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel string, pageNum, pageSize int, selectTypeArr []string, field, notkey string) (list *[]map[string]interface{}, b_word, a_word, s_word string) {
-	var hightlightContent bool = false //是否高亮正文
-	for _, v := range selectTypeArr {
-		if v == "detail" {
-			hightlightContent = true
-			break
-		}
-	}
-	b_word, a_word, s_word = jy.InterceptSearchKW(keywords, selectTypeArr != nil && len(selectTypeArr) > 1, len(industry) == 0)
-	if len(b_word) == 0 {
-		return list, b_word, a_word, s_word
-	}
-	var findfields string
-	if selectTypeArr == nil || len(selectTypeArr) == 0 {
-		findfields = `"title"`
-	} else {
-		findfields = fmt.Sprintf(`"%s"`, strings.Join(selectTypeArr, "\",\""))
-	}
-	qstr := GetSearchQuery(s_word, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(scope, publishtime, subtype, winner, buyerclass), notkey)
-	if hightlightContent { //全文搜索
-		list = elastic.GetAllByNgram(INDEX, TYPE, qstr, `"detail"`, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, true)
-	} else { //标题搜索
-		list = elastic.GetAllByNgram(INDEX, TYPE, qstr, ``, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, false)
-	}
-	if list != nil {
-		public.BidListConvert(industry, list)
-		for _, v := range *list {
-			v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
-		}
-	}
-	return list, b_word, a_word, s_word
+    var hightlightContent bool = false //是否高亮正文
+    for _, v := range selectTypeArr {
+        if v == "detail" {
+            hightlightContent = true
+            break
+        }
+    }
+    b_word, a_word, s_word = jy.InterceptSearchKW(keywords, selectTypeArr != nil && len(selectTypeArr) > 1, len(industry) == 0)
+    if len(b_word) == 0 {
+        return list, b_word, a_word, s_word
+    }
+    var findfields string
+    if selectTypeArr == nil || len(selectTypeArr) == 0 {
+        findfields = `"title"`
+    } else {
+        findfields = fmt.Sprintf(`"%s"`, strings.Join(selectTypeArr, "\",\""))
+    }
+    qstr := GetSearchQuery(s_word, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(scope, publishtime, subtype, winner, buyerclass), notkey)
+    if hightlightContent { //全文搜索
+        list = elastic.GetAllByNgram(INDEX, TYPE, qstr, `"detail"`, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, true)
+    } else { //标题搜索
+        list = elastic.GetAllByNgram(INDEX, TYPE, qstr, ``, bidSearch_sort, field, (pageNum-1)*pageSize, pageSize, 100, false)
+    }
+    if list != nil {
+        public.BidListConvert(industry, list)
+        for _, v := range *list {
+            v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
+        }
+    }
+    return list, b_word, a_word, s_word
 }
 
 //GetPcBidSearchData pc端招标信息搜索
 func GetPcBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel string, start, pageSize int, isGetCount bool, selectTypeArr []string, field, notkey string, ispayed bool) (count, totalPage int64, list *[]map[string]interface{}) {
-	var findfields string
-	var hightlightContent bool = false //是否高亮正文
-	for _, v := range selectTypeArr {
-		if v == "detail" {
-			hightlightContent = true
-			break
-		}
-	}
-	if selectTypeArr == nil || len(selectTypeArr) == 0 {
-		findfields = `"title"`
-	} else {
-		findfields = fmt.Sprintf(`"%s"`, strings.Join(selectTypeArr, "\",\""))
-	}
-	qstr := GetSearchQuery(searchvalue, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(area, publishtime, subtype, winner, buyerclass), notkey)
-	if isGetCount && qstr != "" && start == 0 {
-		count = elastic.Count(INDEX, TYPE, qstr)
-	}
-	if !isGetCount || count > 0 || start > 0 {
-		var repl *[]map[string]interface{}
-		if hightlightContent {
-			repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, `"detail"`, bidSearch_sort, field, start, pageSize, 115, true)
-		} else {
-			repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, ``, bidSearch_sort, field, start, pageSize, 0, false)
-		}
-		if repl != nil && *repl != nil && len(*repl) > 0 {
-			public.BidListConvert(industry, repl)
-			list = repl
-		}
-	}
-	limitCount := util.If(ispayed, int64(SearchPageSize_PC*SearchMaxPageNum_PAYED), int64(SearchPageSize_PC*SearchMaxPageNum_PC)).(int64)
-	if count > limitCount {
-		count = limitCount
-	}
-	totalPage = (count + int64(SearchPageSize_PC) - 1) / int64(SearchPageSize_PC)
-	return
+    var findfields string
+    var hightlightContent bool = false //是否高亮正文
+    for _, v := range selectTypeArr {
+        if v == "detail" {
+            hightlightContent = true
+            break
+        }
+    }
+    if selectTypeArr == nil || len(selectTypeArr) == 0 {
+        findfields = `"title"`
+    } else {
+        findfields = fmt.Sprintf(`"%s"`, strings.Join(selectTypeArr, "\",\""))
+    }
+    qstr := GetSearchQuery(searchvalue, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(area, publishtime, subtype, winner, buyerclass), notkey)
+    if isGetCount && qstr != "" && start == 0 {
+        count = elastic.Count(INDEX, TYPE, qstr)
+    }
+    if !isGetCount || count > 0 || start > 0 {
+        var repl *[]map[string]interface{}
+        if hightlightContent {
+            repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, `"detail"`, bidSearch_sort, field, start, pageSize, 115, true)
+        } else {
+            repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, ``, bidSearch_sort, field, start, pageSize, 0, false)
+        }
+        if repl != nil && *repl != nil && len(*repl) > 0 {
+            public.BidListConvert(industry, repl)
+            list = repl
+        }
+    }
+    limitCount := util.If(ispayed, int64(SearchPageSize_PC*SearchMaxPageNum_PAYED), int64(SearchPageSize_PC*SearchMaxPageNum_PC)).(int64)
+    if count > limitCount {
+        count = limitCount
+    }
+    totalPage = (count + int64(SearchPageSize_PC) - 1) / int64(SearchPageSize_PC)
+    return
 }
 
 func GetBidSearchQuery(area, publishtime, subtype, winner, buyerclass string) string {
-	query := ``
-	if area != "" {
-		query += `{"terms":{"area":[`
-		for k, v := range strings.Split(area, ",") {
-			if k > 0 {
-				query += `,`
-			}
-			query += `"` + v + `"`
-		}
-		query += `]}}`
-	}
-	if publishtime != "" {
-		if len(query) > 0 {
-			query += ","
-		}
-		starttime, endtime := "", ""
-		now := time.Now()
-		if publishtime == "lately-7" { //最近7天
-			starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
-		} else if publishtime == "lately-30" { //最近30天
-			starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
-		} else if publishtime == "thisyear" { //最近一年
-			starttime = fmt.Sprint(time.Date(now.Year()-1, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
-			endtime = fmt.Sprint(now.Unix())
-		} else {
-			starttime = strings.Split(publishtime, "_")[0]
-			endtime = strings.Split(publishtime, "_")[1]
-			etTime := time.Now()
-			if endtime != "" {
-				et, _ := strconv.ParseInt(endtime, 0, 64)
-				etTime = time.Unix(et, 0)
-			}
-			endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
-		}
-		query += `{"range":{"publishtime":{`
-		if starttime != "" {
-			query += `"gte":` + starttime
-		}
-		if starttime != "" && endtime != "" {
-			query += `,`
-		}
-		if endtime != "" {
-			query += `"lt":` + endtime
-		}
-		query += `}}}`
-	}
-	if subtype != "" {
-		if len(query) > 0 {
-			query += ","
-		}
-		query += `{"terms":{"subtype":[`
-		for k, v := range strings.Split(subtype, ",") {
-			if k > 0 {
-				query += `,`
-			}
-			query += `"` + v + `"`
-		}
-		query += `]}}`
-	}
-	if winner != "" {
-		if len(query) > 0 {
-			query += ","
-		}
-		query += `{"terms":{"s_winner":[`
-		for k, v := range strings.Split(winner, ",") {
-			if k > 0 {
-				query += `,`
-			}
-			query += `"` + v + `"`
-		}
-		query += `]}}`
-	}
-	if buyerclass != "" {
-		if len(query) > 0 {
-			query += ","
-		}
-		query += `{"terms":{"buyerclass":[`
-		for k, v := range strings.Split(buyerclass, ",") {
-			if k > 0 {
-				query += `,`
-			}
-			query += `"` + v + `"`
-		}
-		query += `]}}`
-	}
-	return query
+    query := ``
+    if area != "" {
+        query += `{"terms":{"area":[`
+        for k, v := range strings.Split(area, ",") {
+            if k > 0 {
+                query += `,`
+            }
+            query += `"` + v + `"`
+        }
+        query += `]}}`
+    }
+    if publishtime != "" {
+        if len(query) > 0 {
+            query += ","
+        }
+        starttime, endtime := "", ""
+        now := time.Now()
+        if publishtime == "lately-7" { //最近7天
+            starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-7, 0, 0, 0, 0, time.Local).Unix())
+        } else if publishtime == "lately-30" { //最近30天
+            starttime = fmt.Sprint(time.Date(now.Year(), now.Month(), now.Day()-30, 0, 0, 0, 0, time.Local).Unix())
+        } else if publishtime == "thisyear" { //最近一年
+            starttime = fmt.Sprint(time.Date(now.Year()-1, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+            endtime = fmt.Sprint(now.Unix())
+        } else if publishtime == "threeyear" { //最近三年
+            starttime = fmt.Sprint(time.Date(now.Year()-3, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+            endtime = fmt.Sprint(now.Unix())
+        } else if publishtime == "fiveyear" { //最近五年
+            starttime = fmt.Sprint(time.Date(now.Year()-5, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+            endtime = fmt.Sprint(now.Unix())
+        } else {
+            starttime = strings.Split(publishtime, "_")[0]
+            endtime = strings.Split(publishtime, "_")[1]
+            etTime := time.Now()
+            if endtime != "" {
+                et, _ := strconv.ParseInt(endtime, 0, 64)
+                etTime = time.Unix(et, 0)
+            }
+            endtime = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Unix())
+        }
+        query += `{"range":{"publishtime":{`
+        if starttime != "" {
+            query += `"gte":` + starttime
+        }
+        if starttime != "" && endtime != "" {
+            query += `,`
+        }
+        if endtime != "" {
+            query += `"lt":` + endtime
+        }
+        query += `}}}`
+    }
+    if subtype != "" {
+        if len(query) > 0 {
+            query += ","
+        }
+        query += `{"terms":{"subtype":[`
+        for k, v := range strings.Split(subtype, ",") {
+            if k > 0 {
+                query += `,`
+            }
+            query += `"` + v + `"`
+        }
+        query += `]}}`
+    }
+    if winner != "" {
+        if len(query) > 0 {
+            query += ","
+        }
+        query += `{"terms":{"s_winner":[`
+        for k, v := range strings.Split(winner, ",") {
+            if k > 0 {
+                query += `,`
+            }
+            query += `"` + v + `"`
+        }
+        query += `]}}`
+    }
+    if buyerclass != "" {
+        if len(query) > 0 {
+            query += ","
+        }
+        query += `{"terms":{"buyerclass":[`
+        for k, v := range strings.Split(buyerclass, ",") {
+            if k > 0 {
+                query += `,`
+            }
+            query += `"` + v + `"`
+        }
+        query += `]}}`
+    }
+    return query
 }
 
 func GetSearchQuery(keyword, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, mustquery, notkey string) (qstr string) {
-	multi_match := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
-	query := `{"query":{"bool":{"must":[%s],"must_not":[%s]}}}`
-	query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
-	query_bools_must := `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
-	query_bool_must := `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
-	query_missing := `{"constant_score":{"filter":{"missing":{"field":"%s"}}}}`
-	gte := `"gte": %s`
-	lte := `"lte": %s`
-	musts, must_not := []string{}, []string{}
-	if mustquery != "" {
-		musts = append(musts, mustquery)
-	}
-	if keyword != "" {
-		keyword_multi_match := fmt.Sprintf(multi_match, "%s", findfields)
-		shoulds := []string{}
-		for _, v := range strings.Split(keyword, "+") {
-			shoulds = append(shoulds, fmt.Sprintf(keyword_multi_match, elastic.ReplaceYH(v)))
-		}
-		musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(shoulds, ",")))
-	}
-	if industry != "" {
-		industrys := strings.Split(industry, ",")
-		musts = append(musts, fmt.Sprintf(query_bool_must, `"`+strings.Join(industrys, `","`)+`"`))
-	}
-	if minprice != "" || maxprice != "" {
-		sq := ``
-		if minprice != "" {
-			min, _ := strconv.ParseFloat(minprice, 64)
-			minprice = fmt.Sprintf("%.0f", min*10000)
-			if minprice == "0" {
-				minprice = ""
-			}
-		}
-		if maxprice != "" {
-			max, _ := strconv.ParseFloat(maxprice, 64)
-			maxprice = fmt.Sprintf("%.0f", max*10000)
-			if maxprice == "0" {
-				maxprice = ""
-			}
-		}
-		if minprice != "" {
-			sq += fmt.Sprintf(gte, minprice)
-		}
-		if minprice != "" && maxprice != "" {
-			sq += `,`
-		}
-		if maxprice != "" {
-			sq += fmt.Sprintf(lte, maxprice)
-		}
-		if minprice != "" || maxprice != "" {
-			query_price := fmt.Sprintf(query_bool_should, fmt.Sprintf(query_bools_must, sq, sq))
-			musts = append(musts, query_price)
-		}
-	}
-	if hasBuyerTel != "" {
-		if hasBuyerTel == "y" {
-			must_not = append(must_not, fmt.Sprintf(query_missing, "buyertel"))
-		} else {
-			musts = append(musts, fmt.Sprintf(query_missing, "buyertel"))
-		}
-	}
-	if hasWinnerTel != "" {
-		if hasWinnerTel == "y" {
-			must_not = append(must_not, fmt.Sprintf(query_missing, "winnertel"))
-		} else {
-			musts = append(musts, fmt.Sprintf(query_missing, "winnertel"))
-		}
-	}
-	if notkey = strings.TrimSpace(notkey); notkey != "" {
-		notkey_multi_match := fmt.Sprintf(multi_match, "%s", findfields)
-		notkey_must_not := []string{}
-		for _, v := range strings.Split(notkey, " ") {
-			v = strings.TrimSpace(v)
-			if v == "" {
-				continue
-			}
-			notkey_must_not = append(notkey_must_not, fmt.Sprintf(notkey_multi_match, elastic.ReplaceYH(v)))
-		}
-		must_not = append(must_not, fmt.Sprintf(query_bool_should, strings.Join(notkey_must_not, ",")))
-	}
-	qstr = fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(must_not, ","))
-	log.Println(qstr)
-	return
+    multi_match := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s]}}`
+    query := `{"query":{"bool":{"must":[%s],"must_not":[%s]}}}`
+    query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
+    query_bools_must := `{"bool":{"must":[{"range":{"bidamount":{%s}}}]}},{"bool":{"must":[{"range":{"budget":{%s}}}],"must_not":[{"range":{"bidamount":{"gte":-1}}}]}}`
+    query_bool_must := `{"bool":{"must":[{"terms":{"s_subscopeclass":[%s]}}]}}`
+    query_missing := `{"constant_score":{"filter":{"missing":{"field":"%s"}}}}`
+    gte := `"gte": %s`
+    lte := `"lte": %s`
+    musts, must_not := []string{}, []string{}
+    if mustquery != "" {
+        musts = append(musts, mustquery)
+    }
+    if keyword != "" {
+        keyword_multi_match := fmt.Sprintf(multi_match, "%s", findfields)
+        shoulds := []string{}
+        for _, v := range strings.Split(keyword, "+") {
+            shoulds = append(shoulds, fmt.Sprintf(keyword_multi_match, elastic.ReplaceYH(v)))
+        }
+        musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(shoulds, ",")))
+    }
+    if industry != "" {
+        industrys := strings.Split(industry, ",")
+        musts = append(musts, fmt.Sprintf(query_bool_must, `"`+strings.Join(industrys, `","`)+`"`))
+    }
+    if minprice != "" || maxprice != "" {
+        sq := ``
+        if minprice != "" {
+            min, _ := strconv.ParseFloat(minprice, 64)
+            minprice = fmt.Sprintf("%.0f", min*10000)
+            if minprice == "0" {
+                minprice = ""
+            }
+        }
+        if maxprice != "" {
+            max, _ := strconv.ParseFloat(maxprice, 64)
+            maxprice = fmt.Sprintf("%.0f", max*10000)
+            if maxprice == "0" {
+                maxprice = ""
+            }
+        }
+        if minprice != "" {
+            sq += fmt.Sprintf(gte, minprice)
+        }
+        if minprice != "" && maxprice != "" {
+            sq += `,`
+        }
+        if maxprice != "" {
+            sq += fmt.Sprintf(lte, maxprice)
+        }
+        if minprice != "" || maxprice != "" {
+            query_price := fmt.Sprintf(query_bool_should, fmt.Sprintf(query_bools_must, sq, sq))
+            musts = append(musts, query_price)
+        }
+    }
+    if hasBuyerTel != "" {
+        if hasBuyerTel == "y" {
+            must_not = append(must_not, fmt.Sprintf(query_missing, "buyertel"))
+        } else {
+            musts = append(musts, fmt.Sprintf(query_missing, "buyertel"))
+        }
+    }
+    if hasWinnerTel != "" {
+        if hasWinnerTel == "y" {
+            must_not = append(must_not, fmt.Sprintf(query_missing, "winnertel"))
+        } else {
+            musts = append(musts, fmt.Sprintf(query_missing, "winnertel"))
+        }
+    }
+    if notkey = strings.TrimSpace(notkey); notkey != "" {
+        notkey_multi_match := fmt.Sprintf(multi_match, "%s", findfields)
+        notkey_must_not := []string{}
+        for _, v := range strings.Split(notkey, " ") {
+            v = strings.TrimSpace(v)
+            if v == "" {
+                continue
+            }
+            notkey_must_not = append(notkey_must_not, fmt.Sprintf(notkey_multi_match, elastic.ReplaceYH(v)))
+        }
+        must_not = append(must_not, fmt.Sprintf(query_bool_should, strings.Join(notkey_must_not, ",")))
+    }
+    qstr = fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(must_not, ","))
+    log.Println(qstr)
+    return
 }
 
 func PublicSearch(userId, selectType, publishtime string, bidSearchOldUserLimit int64, currentPage int) (bool, string, []string, int, int) {
-	var start int
-	vipStatus := jy.GetVipState(public.Mysql, public.MQFW, userId)
-	isPayedUser := vipStatus.IsPayedUser()
-	queryItems := vipStatus.GetQueryItems(selectType, bidSearchOldUserLimit)
+    var start int
+    vipStatus := jy.GetVipState(public.Mysql, public.MQFW, userId)
+    isPayedUser := vipStatus.IsPayedUser()
+    queryItems := vipStatus.GetQueryItems(selectType, bidSearchOldUserLimit)
 
-	if isPayedUser {
-		if currentPage > SearchMaxPageNum_PAYED {
-			currentPage = SearchMaxPageNum_PAYED
-		}
-	} else {
-		if currentPage > SearchMaxPageNum_PC {
-			currentPage = SearchMaxPageNum_PC
-		}
-		//时间自定义选择默认是vip 大会员 等权限
-		if len(strings.Split(publishtime, "_")) == 2 {
-			publishtime = ""
-		}
-	}
-	start = (currentPage - 1) * SearchPageSize_PC
+    if publishtime == "" {
+        if isPayedUser {
+            publishtime = "fiveyear"
+        } else {
+            publishtime = "thisyear"
+        }
+    }
 
-	return isPayedUser, publishtime, queryItems, currentPage, start
+    if isPayedUser {
+        if currentPage > SearchMaxPageNum_PAYED {
+            currentPage = SearchMaxPageNum_PAYED
+        }
+    } else {
+        if currentPage > SearchMaxPageNum_PC {
+            currentPage = SearchMaxPageNum_PC
+        }
+        //时间自定义选择默认是vip 大会员 等权限
+        if len(strings.Split(publishtime, "_")) == 2 || publishtime == "threeyear" || publishtime == "fiveyear" {
+            publishtime = ""
+        }
+    }
+    start = (currentPage - 1) * SearchPageSize_PC
+
+    return isPayedUser, publishtime, queryItems, currentPage, start
 }
 
 //所有的再次分词查询 只查标题
 func IntegratedData(platform string, s_word, secondKWS, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, secondFlag, area, publishtime, subtype, buyerclass, notkey string, queryItems []string, list *[]map[string]interface{}) (string, string, string, string, *[]map[string]interface{}) {
-	var pcAjaxFlag string
-	secondSearch := false
-	var secRel *[]map[string]interface{} = list
-	for _, item := range queryItems {
-		if item == "title" {
-			secondSearch = true
-			break
-		}
-	}
-	if secondSearch {
-		secondKWS = jy.HttpEs(s_word, "ik_smart", public.DbConf.Elasticsearch.Main.Address)
-		findfields := `"title"`
-		qstr := GetSearchQuery(secondKWS, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(area, publishtime, subtype, "", buyerclass), notkey)
-		secRel = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, 0, 2*SearchPageSize_PC, 0, false)
-		if secRel != nil && len(*secRel) > 0 {
-			public.BidListConvert(industry, secRel)
-			if platform == "app" || platform == "wx" {
-				for _, v := range *secRel {
-					v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
-				}
-			}
-		}
-		if list != nil {
-			secRel = public.MapArrSortMerge(*list, *secRel, "_id", "publishtime")
-		}
-		secondFlag = "T"
-		pcAjaxFlag = "T"
-		if secondKWS != "" {
-			s_word += "+" + secondKWS
-		}
-	}
-	return s_word, pcAjaxFlag, secondFlag, secondKWS, secRel
+    var pcAjaxFlag string
+    secondSearch := false
+    var secRel *[]map[string]interface{} = list
+    for _, item := range queryItems {
+        if item == "title" {
+            secondSearch = true
+            break
+        }
+    }
+    if secondSearch {
+        secondKWS = jy.HttpEs(s_word, "ik_smart", public.DbConf.Elasticsearch.Main.Address)
+        findfields := `"title"`
+        qstr := GetSearchQuery(secondKWS, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, findfields, GetBidSearchQuery(area, publishtime, subtype, "", buyerclass), notkey)
+        secRel = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, 0, 2*SearchPageSize_PC, 0, false)
+        if secRel != nil && len(*secRel) > 0 {
+            public.BidListConvert(industry, secRel)
+            if platform == "app" || platform == "wx" {
+                for _, v := range *secRel {
+                    v["_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["_id"]))
+                }
+            }
+        }
+        if list != nil {
+            secRel = public.MapArrSortMerge(*list, *secRel, "_id", "publishtime")
+        }
+        secondFlag = "T"
+        pcAjaxFlag = "T"
+        if secondKWS != "" {
+            s_word += "+" + secondKWS
+        }
+    }
+    return s_word, pcAjaxFlag, secondFlag, secondKWS, secRel
 }
 
 func classify(stp, area, industry string, configData map[string]interface{}) (string, string, string) {
-	var areas, _ = configData["area"].(map[string]interface{})
-	var stypes, _ = configData["stype"].(map[string]interface{})
-	var industrys, _ = configData["industry"].(map[string]interface{})
-	var tpadd = ""
-	var areaadd = ""
-	var induadd = ""
-	if area != "" && area != "A" {
-		for k, v := range areas {
-			if area == v.(map[string]interface{})["NAME"] {
-				areaadd = k
-			}
-		}
-	}
-	//
-	if stp != "" {
-		for k, v := range stypes {
-			if stp == v.(map[string]interface{})["NAME"] {
-				tpadd = k
-			}
-		}
-	}
-	//
-	if industry != "" {
-		for k, v := range industrys {
-			if strings.Contains(util.ObjToString(v.(map[string]interface{})["NAME"]), industry) {
-				induadd = k
-			}
-		}
-	}
-	return tpadd, areaadd, induadd
+    var areas, _ = configData["area"].(map[string]interface{})
+    var stypes, _ = configData["stype"].(map[string]interface{})
+    var industrys, _ = configData["industry"].(map[string]interface{})
+    var tpadd = ""
+    var areaadd = ""
+    var induadd = ""
+    if area != "" && area != "A" {
+        for k, v := range areas {
+            if area == v.(map[string]interface{})["NAME"] {
+                areaadd = k
+            }
+        }
+    }
+    //
+    if stp != "" {
+        for k, v := range stypes {
+            if stp == v.(map[string]interface{})["NAME"] {
+                tpadd = k
+            }
+        }
+    }
+    //
+    if industry != "" {
+        for k, v := range industrys {
+            if strings.Contains(util.ObjToString(v.(map[string]interface{})["NAME"]), industry) {
+                induadd = k
+            }
+        }
+    }
+    return tpadd, areaadd, induadd
 }
 
 //list != nil && len(*list) == bidsearch.SearchPageSize_APP && pageNum < util.If(isPayedUser, bidsearch.SearchMaxPageNum_PAYED, bidsearch.SearchMaxPageNum_APP).(int)
 //数据格式化处理
 func LisetData(stype, pageNum int, list *[]map[string]interface{}, secondFlag string, configData map[string]interface{}, isPayedUser bool) ([]map[string]interface{}, int64, bool) {
-	var (
-		secondList  []map[string]interface{}
-		totalPage   int64
-		hasNextPage bool
-	)
-	if list != nil && len(*list) > 0 {
-		if stype != 3 && stype != 4 {
-			for _, v := range *list {
-				if v["_id"] != nil {
-					v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
-				}
-				stp, ok := v["subtype"].(string)
-				if ok && stp == "" {
-					stp = v["toptype"].(string)
-				}
-				area, ok := v["area"].(string)
-				indtry := util.ObjToString(v["industry"])
-				v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry, configData)
-				//正文匹配检索关键词
-				highlight, _ := v["highlight"].(map[string][]string)
-				detail := ""
-				for _, val := range highlight["detail"] {
-					detail += public.ClearHtml.ReplaceAllString(val, "")
-				}
-				v["detail"] = detail
-				v["href"] = util.EncodeArticleId2ByCheck(util.GetRandom(20))
-			}
-		}
-		if secondFlag != "" {
-			if len(*list) > SearchPageSize_PC {
-				secondList = (*list)[SearchPageSize_PC:]
-				if len(secondList) > SearchPageSize_PC {
-					secondList = secondList[:SearchPageSize_PC]
-				}
-				*list = (*list)[:SearchPageSize_PC]
-				totalPage = 2
-			} else {
-				totalPage = 1
-			}
-		}
-	}
+    var (
+        secondList  []map[string]interface{}
+        totalPage   int64
+        hasNextPage bool
+    )
+    if list != nil && len(*list) > 0 {
+        if stype != 3 && stype != 4 {
+            for _, v := range *list {
+                if v["_id"] != nil {
+                    v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
+                }
+                stp, ok := v["subtype"].(string)
+                if ok && stp == "" {
+                    stp = v["toptype"].(string)
+                }
+                area, ok := v["area"].(string)
+                indtry := util.ObjToString(v["industry"])
+                v["stypeadd"], v["areaadd"], v["indadd"] = classify(stp, area, indtry, configData)
+                //正文匹配检索关键词
+                highlight, _ := v["highlight"].(map[string][]string)
+                detail := ""
+                for _, val := range highlight["detail"] {
+                    detail += public.ClearHtml.ReplaceAllString(val, "")
+                }
+                v["detail"] = detail
+                v["href"] = util.EncodeArticleId2ByCheck(util.GetRandom(20))
+            }
+        }
+        if secondFlag != "" {
+            if len(*list) > SearchPageSize_PC {
+                secondList = (*list)[SearchPageSize_PC:]
+                if len(secondList) > SearchPageSize_PC {
+                    secondList = secondList[:SearchPageSize_PC]
+                }
+                *list = (*list)[:SearchPageSize_PC]
+                totalPage = 2
+            } else {
+                totalPage = 1
+            }
+        }
+    }
 
-	if list != nil && len(*list) == SearchPageSize_WX {
-		hasNextPage = true
-	}
-	if isPayedUser && pageNum >= SearchMaxPageNum_PAYED {
-		hasNextPage = false
-	} else if !isPayedUser && pageNum >= SearchMaxPageNum_WX {
-		hasNextPage = false
-	}
-	return secondList, totalPage, hasNextPage
+    if list != nil && len(*list) == SearchPageSize_WX {
+        hasNextPage = true
+    }
+    if isPayedUser && pageNum >= SearchMaxPageNum_PAYED {
+        hasNextPage = false
+    } else if !isPayedUser && pageNum >= SearchMaxPageNum_WX {
+        hasNextPage = false
+    }
+    return secondList, totalPage, hasNextPage
 }
 
 func SearchData(platform string, request *http.Request, currentPage int, userId, secondKWS, s_word, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel string, start, pageSize int, isGetCount bool, queryItems []string, field, notkey string, isPayedUser bool) (second, b_word, a_word, pcAjaxFlag, secondFlag string, count, totalPage int64, list *[]map[string]interface{}) {
-	var searchvalue = s_word
-	number := util.If(platform == "app" || platform == "wx", 1, 0)
-	if platform == "app" || platform == "wx" {
-		list, b_word, a_word, s_word = GetWxsearchlistData(s_word, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel, start, SearchPageSize_APP, queryItems, field, notkey)
-	} else {
-		count, totalPage, list = GetPcBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel, start, pageSize, isGetCount, queryItems, field, notkey, isPayedUser)
-	}
+    var searchvalue = s_word
+    number := util.If(platform == "app" || platform == "wx", 1, 0)
+    if platform == "app" || platform == "wx" {
+        list, b_word, a_word, s_word = GetWxsearchlistData(s_word, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel, start, SearchPageSize_APP, queryItems, field, notkey)
+        if list != nil && len(*list) != 0 {
+            count = int64(len(*list))
+        }
+    } else {
+        count, totalPage, list = GetPcBidSearchData(s_word, area, publishtime, subtype, industry, minprice, maxprice, winner, buyerclass, hasBuyerTel, hasWinnerTel, start, pageSize, isGetCount, queryItems, field, notkey, isPayedUser)
+    }
 
-	if len([]rune(s_word)) > 3 && int(count) < SearchPageSize_PC && start == number {
-		var paramList *[]map[string]interface{} = list
-		s_word, pcAjaxFlag, secondFlag, second, list = IntegratedData(platform, s_word, secondKWS, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, secondFlag, area, publishtime, subtype, buyerclass, notkey, queryItems, paramList)
-	}
+    if len([]rune(s_word)) > 3 && int(count) < SearchPageSize_PC && start == number {
+        var paramList = list
+        s_word, pcAjaxFlag, secondFlag, second, list = IntegratedData(platform, s_word, secondKWS, industry, minprice, maxprice, hasBuyerTel, hasWinnerTel, secondFlag, area, publishtime, subtype, buyerclass, notkey, queryItems, paramList)
+    }
 
-	listSize := 0
-	if list != nil {
-		listSize = len(*list)
-	}
-	public.SaveUserSearchLog(request, userId, -1, platform, "超级搜索", map[string]interface{}{
-		"search_word":        util.If(platform == "app" || platform == "wx", searchvalue, s_word),
-		"search_area":        area,
-		"search_price":       []string{minprice, maxprice},
-		"search_publishtime": publishtime,
-		"search_type":        subtype,
-		"search_industry":    industry,
-		"pagenum":            currentPage,
-		"pagesize":           listSize,
-	})
-	return
+    listSize := 0
+    if list != nil {
+        listSize = len(*list)
+    }
+    public.SaveUserSearchLog(request, userId, -1, platform, "超级搜索", map[string]interface{}{
+        "search_word":        util.If(platform == "app" || platform == "wx", searchvalue, s_word),
+        "search_area":        area,
+        "search_price":       []string{minprice, maxprice},
+        "search_publishtime": publishtime,
+        "search_type":        subtype,
+        "search_industry":    industry,
+        "pagenum":            currentPage,
+        "pagesize":           listSize,
+    })
+    return
 }
 
 func AddHistory(history, searchvalue string) []string {
-	arrs := strings.Split(history, ",")
-	//新增历史记录
-	if history == "" {
-		arrs = make([]string, 0)
-	}
-	for k, v := range arrs {
-		if v == strings.TrimSpace(searchvalue) {
-			arrs = append(arrs[:k], arrs[k+1:]...)
-			break
-		}
-	}
-	arrs = append(arrs, searchvalue)
-	if len(arrs) > 10 {
-		arrs = arrs[1:11]
-	}
-	return arrs
+    arrs := strings.Split(history, ",")
+    //新增历史记录
+    if history == "" {
+        arrs = make([]string, 0)
+    }
+    for k, v := range arrs {
+        if v == strings.TrimSpace(searchvalue) {
+            arrs = append(arrs[:k], arrs[k+1:]...)
+            break
+        }
+    }
+    arrs = append(arrs, searchvalue)
+    if len(arrs) > 10 {
+        arrs = arrs[1:11]
+    }
+    return arrs
 }

+ 12 - 10
src/jfw/modules/common/src/qfw/util/jy/bigVipPower.go

@@ -24,8 +24,8 @@ type BigVipBaseMsg struct {
 	HasTrial  bool         `json:"has_trial"` //是否试用过
 	Customers int          `json:"customers"` //可关注客户数量
 
-	VipStatus      int    `json:"vip_status"` //超级订阅状态
-	Vip_BuySet     BuySet `json:"vip_buyset"` //超级订阅套餐内容
+	VipStatus      int    `json:"vip_status"`      //超级订阅状态
+	Vip_BuySet     BuySet `json:"vip_buyset"`      //超级订阅套餐内容
 	EntnicheStatus int    `json:"entniche_status"` //超级订阅状态
 
 	IsUpgrade   bool  `json:"isUpgrade"`   //是否是免费用户订阅升级用户 默认true
@@ -42,6 +42,7 @@ type BuySet struct {
 var FrontService, BackService map[string][]int
 
 const (
+	IsNewFreeTimeCell       = 1637830020
 	BigmemberServiceTable   = "bigmember_service"
 	BigmemberUserPowerTable = "bigmember_service_user"
 
@@ -133,15 +134,16 @@ func GetBigVipUserBaseMsg(userId string, mysql *mysql.Mysql, mg MongodbSim) *Big
 			}
 		}
 		//免费用户画像和附件下载权限
-		if userPower.Status <= 0 && userPower.VipStatus <= 0 {
-			o_jy := qutil.ObjToMap((*data)["o_jy"])
-			//"i_newfree":    1, //新免费用户=>新订阅设置页面 20211122
-			if qutil.IntAll((*o_jy)["i_newfree"]) > 0 {
-				userPower.IsUpgrade = true
-			}
+		//if userPower.Status <= 0 && userPower.VipStatus <= 0 {
+		o_jy := qutil.ObjToMap((*data)["o_jy"])
+		//"i_newfree":    1, //新免费用户=>新订阅设置页面 20211122
+		//IsNewFreeTimeCell dev3.6.4版本之前发了个紧急版本处理老用户订阅问题,i_newfree字段必须用户选择地区才能生成,不能作为判断是否是新用户得唯一标识,在此版本添加了常量:IsNewFreeTimeCell作为判断标准;--ws
+		if qutil.IntAll((*o_jy)["i_newfree"]) > 0 || IsNewFreeTimeCell < userPower.Registedate {
+			userPower.IsUpgrade = true
 		}
+		//}
 	}
-	entniche:=0
+	entniche := 0
 	res := mysql.SelectBySql(`SELECT i.name,i.phone,i.status,i.auth_status,u.power FROM entniche_user u LEFT JOIN entniche_info i
 			ON u.ent_id=i.id
 			ORDER BY  i.status DESC,i.auth_status DESC, CASE WHEN u.phone=? THEN 0  ELSE 1 END  ASC`, (*data)["s_phone"])
@@ -151,7 +153,7 @@ func GetBigVipUserBaseMsg(userId string, mysql *mysql.Mysql, mg MongodbSim) *Big
 		//已购买企业未过期-商机管理用户
 		for _, v := range *res {
 			if qutil.IntAll(v["status"]) == 1 && qutil.IntAll(v["power"]) == 1 {
-				entniche =1
+				entniche = 1
 				break
 			}
 		}

+ 67 - 0
src/jfw/modules/common/src/qfw/util/jy/userInfo.go

@@ -0,0 +1,67 @@
+/**
+@author:王山
+@descript:获取用户昵称
+@date:2022-02-24
+**/
+package jy
+
+import (
+	"fmt"
+	"log"
+	"qfw/util"
+	"qfw/util/redis"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func GetUserName(redisName, prefix string) (name string) {
+	name = fmt.Sprintf(prefix, getNameMiddle()+strings.ToUpper(util.GetComplexRandom(3, 1, 3)))
+	if ok, err := redis.Exists(redisName, name); ok && err == nil {
+		name = GetUserName(redisName, prefix)
+	} else {
+		if !redis.Put(redisName, name, true, 24*60*60) {
+			log.Println("nickname err")
+		}
+	}
+	return
+}
+
+//年月日
+func getNameMiddle() string {
+	y := strconv.Itoa(time.Now().Year())
+	m := getMonth()
+	d := strconv.Itoa(time.Now().Day())
+	return string([]byte(y)[3:]) + m + d
+}
+
+//月
+func getMonth() string {
+	switch time.Now().Month() {
+	case time.January:
+		return "1"
+	case time.February:
+		return "2"
+	case time.March:
+		return "3"
+	case time.April:
+		return "4"
+	case time.May:
+		return "5"
+	case time.June:
+		return "6"
+	case time.July:
+		return "7"
+	case time.August:
+		return "8"
+	case time.September:
+		return "9"
+	case time.October:
+		return "a"
+	case time.November:
+		return "b"
+	case time.December:
+		return "c"
+	}
+	return "*"
+}

+ 1 - 0
src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/js/login.js

@@ -97,6 +97,7 @@ var getNewShareId = function(num){
 					$("#layerImg").attr("src","/front/share/"+pageshareid);
 					$("#wxCode").attr("src","/front/share/"+pageshareid);
 					$("#keyImg").attr("src","/front/share/"+kopshareid);
+          $('#subkeyImg').attr("src","/front/share/"+pageshareid)
 					if(keysorpname!=undefined&&keysorpname!=""){
 						var ref = document.referrer;
 						if(ref != ""&&ref.indexOf("jianyu360.com")<0||ref.indexOf("qmx.top")<0){

+ 19 - 22
src/jfw/modules/followent/src/web/templates/weixin/set.html

@@ -47,6 +47,7 @@ if(sessionStorage){
 <script src="/jylab/followent/mobiscroll/mobiscroll.min.js"></script>
 <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
 <script src="/jylab/followent/wxswordfish/share.js?v={{Msg "seo" "version"}}"></script>
+<script src="/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}"></script>
 <script src="/jylab/followent/js/jy.js?v={{Msg "seo" "version"}}"></script>
 <script type="text/javascript">
 	var data = {{.T.data}};
@@ -207,30 +208,26 @@ if(sessionStorage){
 	})
 	
 function isVisited(sid){
-	var a_visited = {{.T.a_visited}};
-  if (a_visited!=null){
-  	for(var i=0;i<a_visited.length;i++){
-  		if(a_visited[i] == sid){
-  			return true;
-  		}
-  	}
-  }
-	return false;
+  var a_visited = {{.T.a_visited}};
+  var visited = visitedPath.pathVisited(
+    new VisitedPathItem(
+      '/article/content/*.html',
+      'id=' + sid
+    )
+  )
+	return visited;
 }
 function beforeRedirect(obj,sid,link,isOld){
-	if($(obj).hasClass("visited")){
-		newredirect("",link,sid);
-		return;
-	}
-	var _id = {{.T._id}}
-	$(obj).addClass("visited");
-	if(typeof(sid) != "undefined" && sid != null && sid != "" && typeof(_id) != "undefined" && _id != null && _id != ""){
-		$.post("/jylab/followent/notice/visited",{id:_id,sid:sid},function(r){
-			newredirect("",link,sid);
-		});
-	}else{
-		newredirect("",link,sid);
-	}
+  $(obj).addClass("visited");
+  try {
+    visitedPath.pathVisiting(
+      new VisitedPathItem(
+        '/article/content/*.html',
+        'id=' + sid
+      )
+    )
+  } catch (error) {}
+  newredirect("",link,sid);
 }
 </script>
 </head>

+ 1 - 1
src/jfw/modules/publicapply/src/userbase/commonfunctions.json

@@ -7,7 +7,7 @@
 			"charge":false,
 			"isbase":true,
 			"pc":{
-				"url":"/jylab/supsearch/index.html?publishtime=thisyear",
+				"url":"/jylab/supsearch/index.html",
 				"img":"/commonFunctions/pc_search.png"
 			}
 		},

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

@@ -34,7 +34,6 @@ func main() {
 			log.Println("ListenAndServe: ", err)
 		}
 	}()
-	timetask.SendMailToPayUser("254575779333", "wangkaiyue@topnet.net.cn")
 	go timetask.Run()
 	mux1 := http.NewServeMux()
 	xweb.RunBase(":"+Config.Webport, mux1)

+ 15 - 3
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -88,20 +88,32 @@ func (this *UserAccount) GetAccountInfo() {
 	rData, errMsg := func() (interface{}, error) {
 		userId, _ := this.GetSession("userId").(string)
 		//由于超级订阅vip状态需要查库,无法从session中获取,所以直接所有字段从数据库中获取
-		userMsg, _ := util.MQFW.FindById("user", userId, `{"i_member_status":1,"i_vip_status":1,"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1}`)
+		userMsg, _ := util.MQFW.FindById("user", userId, `{"i_member_status":1,"i_vip_status":1,"s_m_phone":1,"s_phone":1,"s_myemail":1,"s_nickname":1,"s_headimageurl":1,"s_password":1,"s_company":1,"s_unionid":1}`)
 		if userMsg == nil || len(*userMsg) == 0 {
 			return nil, DBQUERY_ERROR
 		}
+		//微信昵称>手机号>剑鱼昵称
+		nickname := qutil.ObjToString((*userMsg)["s_nickname"])
+		phone := qutil.ObjToString(qutil.If((*userMsg)["s_phone"] != nil, (*userMsg)["s_phone"], (*userMsg)["s_m_phone"]))
+		jyname := qutil.ObjToString((*userMsg)["s_jyname"])
+		isWx := false
+		if unionid, ok := (*userMsg)["s_unionid"]; ok {
+			if len(qutil.ObjToString(unionid)) > 11 { //手机号用户s_unionid为手机号
+				isWx = true
+			}
+		}
 		return map[string]interface{}{
 			"userId":       qutil.EncodeArticleId(userId),
 			"email":        qutil.ObjToString((*userMsg)["s_myemail"]),
-			"phone":        qutil.ObjToString(qutil.If((*userMsg)["s_phone"] != nil, (*userMsg)["s_phone"], (*userMsg)["s_m_phone"])),
-			"nickname":     qutil.ObjToString((*userMsg)["s_nickname"]),
+			"phone":        phone,
+			"nickname":     nickname,
+			"jyname":       jyname,
 			"headimageurl": strings.Replace(qutil.ObjToString((*userMsg)["s_headimageurl"]), "http://", "https://", 1),
 			"bigmemberVip": qutil.IntAll((*userMsg)["i_member_status"]),
 			"subscribeVip": qutil.IntAll((*userMsg)["i_vip_status"]),
 			"hasPwd":       qutil.ObjToString((*userMsg)["s_password"]) != "",
 			"company":      qutil.ObjToString((*userMsg)["s_company"]),
+			"isWx":         isWx, //是否是微信账号
 		}, nil
 	}()
 	this.ServeJson(NewResult(rData, errMsg))

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