浏览代码

Merge branch 'master' into feature/v4.8.49

lianbingjie 2 年之前
父节点
当前提交
639ba76435
共有 100 个文件被更改,包括 7137 次插入1013 次删除
  1. 3 1
      src/config.json
  2. 11 3
      src/db.json
  3. 2 2
      src/go.mod
  4. 38 4
      src/go.sum
  5. 95 0
      src/jfw/config/config.go
  6. 91 152
      src/jfw/front/classificationTag.go
  7. 1 0
      src/jfw/front/dataMarket.go
  8. 7 0
      src/jfw/front/front.go
  9. 1 1
      src/jfw/front/login.go
  10. 14 3
      src/jfw/front/pcIndex.go
  11. 38 30
      src/jfw/front/shorturl.go
  12. 331 330
      src/jfw/front/structedData.go
  13. 1 1
      src/jfw/front/swordfish.go
  14. 1 0
      src/jfw/jyutil/classroomiInfo.go
  15. 2 0
      src/jfw/modules/app/src/app/filter/loginfilter.go
  16. 10 1
      src/jfw/modules/app/src/app/front/front.go
  17. 148 147
      src/jfw/modules/app/src/app/front/search.go
  18. 4 3
      src/jfw/modules/app/src/app/front/shorturl.go
  19. 341 0
      src/jfw/modules/app/src/app/front/tags.go
  20. 867 0
      src/jfw/modules/app/src/app/jyutil/tags.go
  21. 235 136
      src/jfw/modules/app/src/app/jyutil/util.go
  22. 2 2
      src/jfw/modules/app/src/app/tag/tag.go
  23. 1 1
      src/jfw/modules/app/src/config.yaml
  24. 14 6
      src/jfw/modules/app/src/db.json
  25. 3 3
      src/jfw/modules/app/src/go.mod
  26. 6 6
      src/jfw/modules/app/src/go.sum
  27. 2785 101
      src/jfw/modules/app/src/seo.json
  28. 19 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/j-icons.css
  29. 1 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/public.css
  30. 5 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  31. 1 0
      src/jfw/modules/app/src/web/staticres/jyapp/css/wxinfocontent.css
  32. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_01.jpg
  33. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_02.jpg
  34. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_03.jpg
  35. 二进制
      src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_04.jpg
  36. 10 2
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  37. 4 0
      src/jfw/modules/app/src/web/staticres/jyapp/local/layout.css
  38. 759 0
      src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-module-common.css
  39. 57 0
      src/jfw/modules/app/src/web/staticres/jyapp/tags/js/index.js
  40. 203 0
      src/jfw/modules/app/src/web/staticres/jyapp/tags/js/tag-common.js
  41. 2 1
      src/jfw/modules/app/src/web/templates/big-member/meta.html
  42. 170 0
      src/jfw/modules/app/src/web/templates/frontRouter/activity/free/app-register.html
  43. 1 1
      src/jfw/modules/app/src/web/templates/me/login.html
  44. 1 1
      src/jfw/modules/app/src/web/templates/me/register.html
  45. 1 1
      src/jfw/modules/app/src/web/templates/me/setpwd.html
  46. 64 0
      src/jfw/modules/app/src/web/templates/tags/index.html
  47. 6 0
      src/jfw/modules/app/src/web/templates/tags/template/bidding-card-list.html
  48. 29 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-area-nav.html
  49. 11 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-breadcrumb-navigation.html
  50. 48 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-bidding-info-list.html
  51. 18 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-bidding-title.html
  52. 47 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-buyer.html
  53. 15 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-city-list.html
  54. 75 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-ent.html
  55. 29 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-industry-nav.html
  56. 25 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-text-list.html
  57. 15 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-footer-common-assets.html
  58. 30 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-footer.html
  59. 10 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-header-common-assets.html
  60. 6 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-header.html
  61. 8 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-info-type-nav.html
  62. 17 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-meta.html
  63. 30 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-pagination.html
  64. 9 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-register-login-group.html
  65. 16 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-swiper-list.html
  66. 20 3
      src/jfw/modules/app/src/web/templates/weixin/about.html
  67. 13 13
      src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html
  68. 3 4
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  69. 1 0
      src/jfw/modules/entsesearch/src/web/templates/common/header-assets.html
  70. 1 0
      src/jfw/modules/entsesearch/src/web/templates/weixin/entseSearch.html
  71. 1 1
      src/jfw/modules/followent/src/web/templates/_error.html
  72. 1 0
      src/jfw/modules/followent/src/web/templates/common/header-assets.html
  73. 2 1
      src/jfw/modules/followent/src/web/templates/weixin/add.html
  74. 2 1
      src/jfw/modules/followent/src/web/templates/weixin/list.html
  75. 2 1
      src/jfw/modules/followent/src/web/templates/weixin/set.html
  76. 96 0
      src/jfw/modules/publicapply/.idea/workspace.xml
  77. 18 3
      src/jfw/tag/tag.go
  78. 11 1
      src/seo.json
  79. 二进制
      src/web/staticres/common-module/public/image/jianyu-logo-for-free.png
  80. 5 0
      src/web/staticres/common-module/public/js/utils.js
  81. 65 4
      src/web/staticres/css/pc/index.css
  82. 1 1
      src/web/staticres/public-pc/js/pc-bottom.js
  83. 3 0
      src/web/staticres/site/page/industryInfo/css/index.css
  84. 6 0
      src/web/staticres/site/page/industryInfo/css/industry_detail.css
  85. 3 1
      src/web/staticres/site/page/jySchool/css/introduction.css
  86. 3 3
      src/web/templates/_error.html
  87. 1 1
      src/web/templates/active/index_bak.html
  88. 2 2
      src/web/templates/common/mobilebottom.html
  89. 2 2
      src/web/templates/common/pcbottom.html
  90. 2 2
      src/web/templates/frontRouter/pc/brand/free/index.html
  91. 1 1
      src/web/templates/frontRouter/pc/squeeze/sess/test.html
  92. 27 0
      src/web/templates/frontRouter/pc/user/free/redirect-wx.html
  93. 1 1
      src/web/templates/pc/brand/index.html
  94. 2 2
      src/web/templates/pc/classifylist.html
  95. 28 4
      src/web/templates/pc/index.html
  96. 1 1
      src/web/templates/pc/index_old.html
  97. 1 1
      src/web/templates/pc/index_old_23_06_16.html
  98. 5 5
      src/web/templates/site/page/industryInfo/class.html
  99. 2 2
      src/web/templates/site/page/industryInfo/index.html
  100. 11 11
      src/web/templates/site/page/jySchool/class.html

+ 3 - 1
src/config.json

@@ -440,5 +440,7 @@
     "approvecity": true
   },
   "detailRedisByPayTimeOut": 7200,
-  "detailRedisByFreeTimeOut": 7200
+  "detailRedisByFreeTimeOut": 7200,
+  "wxBrowserContent": ["content","bdcontent","advancedProject"],
+  "hotSubjectMatter": "A4纸,安全标志,安全挡板,安全隔离网,安全网,办公耗材,办公家具,办公设备,办公椅,办公用房,办公用品,办公桌,保护装置,保密柜,笔记本,笔记本电脑,变压器,仓库,插线板,充电桩,触控一体机,传感器,打印机,打印机耗材,打印设备,档案袋,档案盒,道路工程,地铁,电池,电缆,电流互感器,电梯,电线,订书机,订书针,对讲机,多功能一体机,多媒体设备,发电机,防冻液,防护栏杆,防护门,防护棚,防雷设施,防水工程,服务器,服装,复印机,复印纸,钢板,钢结构,钢筋,工作服,工作站,公路,公用工程,固体胶,光伏,光盘,航标灯,回形针,机房空调,机柜,机油,鸡蛋,计算机,记号笔,记事本,继电器,家具,监测仪,监视器,检测报告,检测仪器,剪刀,建筑工程,交换机,交通设施,胶带,胶水,脚手架,井架,警示灯,救护车,救生设施,刻录机,空调,空气调节器,垃圾袋,垃圾桶,冷却塔,冷水机组,楼层呼唤器,路灯,绿化工程,毛巾,美工刀,门禁,密集架,灭火器,抹布,墨盒,逆变器,牛皮纸,配电箱,喷壶,起重机,汽油,桥梁,热泵机组,热水器,弱电系统,扫描仪,摄像头,生活用房,食堂,市政工程,双面胶,水电站,水桶,宿舍,碎纸机,台式机,太阳能,碳粉,天然气,投影仪,图书,土石方,拖把,挖掘机,网线,文件袋,文件柜,无人机,无线电,硒鼓,洗洁精,洗手液,洗衣粉,显示屏,橡皮,消防立管,消防器材,消防水泵,消防箱,新能源,蓄电池,液晶显示器,医疗器械,医疗设备,移动工作站,移动硬盘,预埋钢板,园林工程,纸杯,中性笔,桩基,装修工程"
 }

+ 11 - 3
src/db.json

@@ -35,12 +35,12 @@
       "address": "http://192.168.3.241:9205,http://192.168.3.149:9200",
       "size": 30,
       "version": "v7",
-      "userName":"",
-      "password":""
+      "userName": "",
+      "password": ""
     }
   },
   "redis": {
-    "main":{
+    "main": {
       "address": "other=192.168.3.149:1712,sso=192.168.3.149:1713,push=192.168.3.149:1711,session=192.168.3.149:1713,recovery=192.168.3.149:1715,merge=192.168.3.206:2711,newother=192.168.3.149:1712,poly=192.168.3.149:1713,seoCache=192.168.3.149:1713,limitation=192.168.3.149:1713"
     },
     "login": {
@@ -63,6 +63,14 @@
       "passWord": "=PDT49#80Z!RVv52_z",
       "maxOpenConns": 5,
       "maxIdleConns": 5
+    },
+    "globalCommon": {
+      "dBName": "global_common_data",
+      "address": "192.168.3.217:4000",
+      "userName": "root",
+      "passWord": "=PDT49#80Z!RVv52_z",
+      "maxOpenConns": 5,
+      "maxIdleConns": 5
     }
   }
 }

+ 2 - 2
src/go.mod

@@ -6,7 +6,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230630032557-eac72f240f41
+	app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/fsnotify/fsnotify v1.6.0
@@ -135,7 +135,7 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1 // indirect
 	k8s.io/api v0.26.3 // indirect
 	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
 	k8s.io/client-go v0.26.3 // indirect

+ 38 - 4
src/go.sum

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

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

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

+ 91 - 152
src/jfw/front/classificationTag.go

@@ -3,18 +3,13 @@ package front
 import (
 	qu "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
-	elastic "app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/redis"
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
 	"app.yhyue.com/moapp/jypkg/public"
 	"encoding/json"
 	"fmt"
 	"jy/src/jfw/config"
-	"jy/src/jfw/jyutil"
-	"jy/src/jfw/paging"
 	"log"
-	"math"
-	"math/rand"
 	"strconv"
 	"sync"
 	"time"
@@ -25,6 +20,12 @@ import (
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 )
 
+const (
+	//企业主体库身份类型区分 sql传值
+	IdentityTypeBuyer  = 0 // 采购单位
+	IdentityTypeWinner = 1 // 中标单位
+)
+
 type KeyType struct {
 	Name     string    `json:"name"`
 	Url      string    `json:"url"`
@@ -53,39 +54,74 @@ func RegionAndInformationAndTender() map[string]interface{} {
 
 // HotSubjectMatter 热门标的物
 func HotSubjectMatter() []map[string]interface{} {
-	checkedLetter := LetterArr[getRandomWithAll(0, len(LetterArr))]
-	industryHref := fmt.Sprintf("/tags/industry/%s_%s_all_%s.html", "%v", "all", "%v")
-	letterLabel, _, _ := GetLetterPaging(1, checkedLetter) //热门标的物 随机字母标签
-	tradeLabel := GetIndustry(industryHref)                //热门标的物 行业分类标签
-	letterLabel = append(letterLabel, tradeLabel...)
-	var subjectMatter []map[string]interface{}
-	if len(letterLabel) > 0 {
-		for _, v := range jyutil.GenerateRandomNumber(0, len(letterLabel)-1, 200) {
-			subjectMatter = append(subjectMatter, letterLabel[v])
-		}
+	if config.SubjectMatter == nil || len(config.SubjectMatter) == 0 {
+		config.SubjectMatter = config.GetLetterMap(qu.InterfaceToStr(config.Seoconfig["hotSubjectMatter"]))
 	}
-	return subjectMatter
+	return config.SubjectMatter
 }
 
-// 随机展示200中标企业
-func GetWinnerInfo() (data []BuyerList) {
-	randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
-	from := randGen.Intn(100)
-
+// 最新更新的200中标企业
+func GetWinnerInfo() (data []*BuyerList) {
+	// 取缓存
+	cache, err := GetHotCache(config.HotWinnerConfig.CacheKey)
+	if err == nil && cache != nil && len(cache) > 0 {
+		return cache
+	}
+	// 没取到缓存查数据
+	rs := getEntBaseInfo(IdentityTypeWinner, config.HotWinnerConfig.Limit)
 	//关联中标企业
-	r := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query": {"bool": {"must": []}},"_source": ["_id","company_name"],"from": %d,"size": 200}`, from))
-	if r != nil {
-		for _, v := range *r {
-			var vs BuyerList
-			id := encrypt.EncodeArticleId2ByCheck(qu.InterfaceToStr(v["_id"]))
-			vs.Name = qu.InterfaceToStr(v["company_name"])
-			vs.Url = fmt.Sprintf("/swordfish/page_big_pc/ent_portrait/%s", id)
-			data = append(data, vs)
-		}
+	if rs == nil || len(*rs) == 0 {
+		return
+	}
+
+	for _, v := range *rs {
+		var vs BuyerList
+		id := encrypt.EncodeArticleId2ByCheck(qu.InterfaceToStr(v["id"]))
+		vs.Name = qu.InterfaceToStr(v["name"])
+		vs.Url = fmt.Sprintf("/swordfish/page_big_pc/ent_portrait/%s", id)
+		data = append(data, &vs)
 	}
+	// 存缓存
+	go PutHotCache(config.HotWinnerConfig.CacheKey, config.HotWinnerConfig.CacheTimeout, data)
 	return
 }
 
+// PutHotCache 热门采购单位、中标单位存缓存
+func PutHotCache(redisKey string, redisTimeout int, list []*BuyerList) {
+	b, err := json.Marshal(list)
+	if err != nil {
+		log.Printf("保存缓存 序列化异常,data:%s,err:%s\n", list, err.Error())
+		return
+	}
+	if err = redis.PutBytes("seoCache", redisKey, &b, redisTimeout); err != nil {
+		log.Printf("保存缓存 redis 异常,key:%s,err:%s\n", redisKey, err.Error())
+	}
+
+}
+
+// GetHotCache 热门采购单位、中标单位取缓存
+func GetHotCache(redisKey string) (list []*BuyerList, err error) {
+	redisByte, err := redis.GetBytes("seoCache", redisKey)
+	if err != nil || redisByte == nil || len(*redisByte) == 0 {
+		return list, err
+	}
+	err = json.Unmarshal(*redisByte, &list)
+	if err != nil {
+		log.Println(fmt.Sprintf("读取缓存 序列化异常,err:%s", err.Error()))
+		return nil, err
+	}
+	return list, nil
+}
+
+// 获取最新的中标单位
+// identityType : 0 采购单位 1-中标单位
+// limit: 数量
+func getEntBaseInfo(identityType, limit int) *[]map[string]interface{} {
+	q := "SELECT  company_id AS id,name,name_id  FROM   dws_f_ent_baseinfo WHERE     company_id !='' and company_id is not null  AND (identity_type &(1 << ?)) > 0 order by latest_time desc  limit ?"
+	return public.GlobalCommonMysql.SelectBySql(q, identityType, limit)
+
+}
+
 // ContentRecommendation 实用内容推荐
 func ContentRecommendation() []KeyType {
 	if bytes, err := redis.GetBytes(RedisNameNew, "contentRecommendation"); err == nil && bytes != nil {
@@ -214,83 +250,6 @@ func RecommendationBeacon() []Signal {
 	return data
 }
 
-// 不包含上限 [min, max)
-func getRandomWithAll(min, max int) int {
-	rand.Seed(time.Now().UnixNano())
-	return rand.Intn(max-min) + min
-}
-
-// this.T["letterList"],this.T["letterListCount"],this.T["pagingMap"]=this.GetLetterPaging(pageNum,checkedLetter)
-func GetLetterPaging(pageNum int, checkedLetter string) (letterList []map[string]interface{}, letterListCount int64, pagingMap map[string]interface{}) {
-	seoLetterPageSize := qu.Int64All(config.Seoconfig["seoLetterPageSize"])
-	if pageNum == 0 {
-		pageNum = 1
-	}
-	letterList, letterListCount = GetLetterMap(seoLetterPageSize, int64(pageNum), checkedLetter)
-	pagecount := int(math.Ceil(qu.Float64All(letterListCount) / float64(seoLetterPageSize)))
-	paging := paging.PaggingHtml(pageNum, pagecount, fmt.Sprintf("/tags/letter/%s", checkedLetter)+"_%v.html")
-
-	pagingMap = map[string]interface{}{
-		"paging":    paging,
-		"pageNum":   pageNum,
-		"pageCount": pagecount,
-		"pageSize":  seoLetterPageSize,
-	}
-	return
-}
-
-func GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interface{}, int64) {
-	m := []map[string]interface{}{}
-	sql := `select id,name,letter from seo_words.seo_resource where letter = ? and state=1 order by id desc`
-	cql := `select count(1) from seo_words.seo_resource where letter = ? and state=1`
-	offset := (pageNum - 1) * pageSize
-	sql += fmt.Sprintf(" limit %v,%v", offset, pageSize)
-	data := public.BaseMysql.SelectBySql(sql, letter)
-	count := public.BaseMysql.CountBySql(cql, letter)
-	if data != nil {
-		for _, v := range *data {
-			letter := qu.ObjToString(v["letter"])
-			id := qu.Int64All(v["id"])
-			name := qu.ObjToString(v["name"])
-			name += qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
-			m = append(m, map[string]interface{}{
-				"name": name,
-				"url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
-			})
-		}
-	}
-	return m, count
-}
-
-func GetIndustry(industryHref string) []map[string]interface{} {
-	//data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a left join  seo_words.seo_industry_class b on a.class_1=b.name order by a.class_1`)
-	data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
-	industryArr := []string{}
-	industryMap := map[string][]map[string]interface{}{}
-	if len(*data) > 0 && data != nil {
-		for _, v := range *data {
-			class := qu.ObjToString(v["class_1"])
-			name := qu.ObjToString(v["name"])
-			id := qu.Int64All(v["id"])
-			industryId := qu.Int64All(v["class_id"])
-			if !IsInArr(industryArr, class) {
-				industryArr = append(industryArr, class)
-			}
-			industryMap[class] = append(industryMap[class], map[string]interface{}{
-				"name": name + qu.ObjToString(config.Seoconfig["seoKeywordSuffix"]),
-				// "url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", industryId, id),
-				"url": fmt.Sprintf(industryHref, industryId, id),
-			})
-		}
-	}
-	m := []map[string]interface{}{}
-	//
-	for _, v := range industryArr {
-		m = append(m, industryMap[v]...)
-	}
-	return m
-}
-
 type BuyerList struct {
 	Name string `json:"name"`
 	Url  string `json:"url"`
@@ -298,29 +257,33 @@ type BuyerList struct {
 
 // 热门采购单位
 func HotBuyerList(entIsNew bool) []*BuyerList {
-	// 使用当前时间作为随机数生成器的种子
-	randGen := rand.New(rand.NewSource(time.Now().UnixNano()))
-	// 获取一个范围在 [0, 100) 的随机整数
-	start := randGen.Intn(100)
-	buyerQuery := fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "name"}}]}},"from": %d,"size": %d}`, start, 200)
-	log.Println("buyerQuery:", buyerQuery)
-	data := elastic.Get("buyer", "buyer", buyerQuery)
-	if data != nil && len(*data) > 0 {
-		var buyerList []*BuyerList
-		for _, b := range *data {
-			name := qu.ObjToString(b["name"])
-			buyerId := qu.ObjToString(b["id"])
-			if name != "" && buyerId != "" {
-				idEncode := encrypt.EncodeArticleId2ByCheck(buyerId)
-				buyerList = append(buyerList, &BuyerList{
-					Name: name,
-					Url:  qu.If(entIsNew, fmt.Sprintf("/entpc/unit_portrayal_id/%s", idEncode), fmt.Sprintf("/swordfish/page_big_pc/unit_portrayal_id/%s", idEncode)).(string),
-				})
-			}
+	// 取缓存
+	cache, err := GetHotCache(config.HotBuyerConfig.CacheKey)
+	if err == nil && cache != nil && len(cache) > 0 {
+		return cache
+	}
+	// 查数据
+	data := getEntBaseInfo(IdentityTypeBuyer, config.HotBuyerConfig.Limit)
+	if data == nil || len(*data) == 0 {
+		return nil
+	}
+	var buyerList []*BuyerList
+	for _, b := range *data {
+		name := qu.ObjToString(b["name"])
+		buyerId := qu.ObjToString(b["name_id"])
+		if name != "" && buyerId != "" {
+			idEncode := encrypt.EncodeArticleId2ByCheck(buyerId)
+			buyerList = append(buyerList, &BuyerList{
+				Name: name,
+				Url:  qu.If(entIsNew, fmt.Sprintf("/entpc/unit_portrayal_id/%s", idEncode), fmt.Sprintf("/swordfish/page_big_pc/unit_portrayal_id/%s", idEncode)).(string),
+			})
 		}
-		return buyerList
 	}
-	return nil
+	//存缓存
+	go PutHotCache(config.HotBuyerConfig.CacheKey, config.HotBuyerConfig.CacheTimeout, buyerList)
+
+	return buyerList
+
 }
 
 func GetIncludedInfo() map[string]interface{} {
@@ -383,30 +346,6 @@ func GetIncludedInfo() map[string]interface{} {
 	return m
 }
 
-func HotKey() []string {
-	if bytes, err := redis.GetBytes(RedisNameNew, "jyhotkey_7"); err == nil && bytes != nil {
-		rData := []string{}
-		if err := json.Unmarshal(*bytes, &rData); err != nil {
-			log.Printf("[MANAGER-ERR]jyhotkey_7  GetData Error %v \n", err)
-			return nil
-		}
-		return rData
-	}
-	num := 7
-	count := public.BaseMysql.CountBySql(`select count(1) from seo_words.seo_resource where state=1;`)
-	rand.Seed(time.Now().UnixNano())
-	randNum := rand.Intn(int(count) - num)
-	data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource where state=1 limit ?,?`, randNum, num)
-	arr := []string{}
-	for _, v := range *data {
-		arr = append(arr, qu.ObjToString(v["name"]))
-	}
-	if bytes, err := json.Marshal(arr); err == nil && bytes != nil {
-		_ = redis.PutBytes(RedisNameNew, "jyhotkey_7", &bytes, 10*60)
-	}
-	return arr
-}
-
 func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]interface{} {
 	if bytes, err := redis.GetBytes(RedisNameNew, "jyNewIndexbids"); err == nil && bytes != nil {
 		rData := []map[string]interface{}{}

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

@@ -36,6 +36,7 @@ func (this *DataMarket) CustomExport() {
 		showA = int(uA[len(uA)-1])/10 < common.IntAll(config.Sysconfig["dataMarketShowAB"])
 	}
 	this.T["AB"] = showA
+	this.T["source"] = this.GetString("source")
 	this.Render("/dataMarket/customExport/index.html")
 }
 

+ 7 - 0
src/jfw/front/front.go

@@ -160,6 +160,7 @@ var (
 	redisLimitation          = "limitation"
 	detailRedisByPayTimeOut  = 7200
 	detailRedisByFreeTimeOut = 7200
+	IsWxBrowserContent       = map[string]bool{}
 )
 
 func init() {
@@ -170,6 +171,12 @@ func init() {
 	urlMap = config.Sysconfig["redirect"].(map[string]interface{})
 	detailRedisByPayTimeOut = util.If(util.IntAll(config.Sysconfig["detailRedisByPayTimeOut"]) > 0, util.IntAll(config.Sysconfig["detailRedisByPayTimeOut"]), detailRedisByPayTimeOut).(int)
 	detailRedisByFreeTimeOut = util.If(util.IntAll(config.Sysconfig["detailRedisByFreeTimeOut"]) > 0, util.IntAll(config.Sysconfig["detailRedisByFreeTimeOut"]), detailRedisByFreeTimeOut).(int)
+	wxBrowserContent := util.ObjArrToStringArr(config.Sysconfig["wxBrowserContent"].([]interface{}))
+	if len(wxBrowserContent) > 0 {
+		for _, v := range wxBrowserContent {
+			IsWxBrowserContent[v] = true
+		}
+	}
 }
 
 // 前端页面加载

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

@@ -208,7 +208,7 @@ func (l *Login) Login() error {
 						userInfo["isNewUser"] = true
 						nsqPath, _ := config.Sysconfig["nsq"].(string)
 						nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
-						er := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jypc_phone_register, _id, jy.Jyweb_node2)
+						er := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jypc_phone_register, _id, jy.Jyweb_node2, nil)
 						if er != nil {
 							log.Println("nsq队列写入失败-->", jy.Jypc_phone_register, _id)
 						}

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

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"jy/src/jfw/config"
+	"jy/src/jfw/site/jySchool"
 	"jy/src/jfw/wx"
 	"log"
 	"math/rand"
@@ -125,6 +126,18 @@ func (m *PcIndex) NewSordfish(flag string) error {
 			m.T["recommendBeacon"] = RecommendationBeacon()
 			//热门采购单位
 			m.T["hotBuyers"] = HotBuyerList(entIsNew)
+			//招投标攻略
+			var strategyList []map[string]interface{}
+			for _, item := range jySchool.GuidelineColumn().SeedData {
+				if res := jySchool.Guideline(item.Code, 5); res != nil && len(*res) > 0 {
+					strategyList = append(strategyList, map[string]interface{}{
+						"name": item.Name,
+						"code": item.Code,
+						"list": res,
+					})
+				}
+			}
+			m.T["strategyList"] = strategyList
 			m.T["hasLogin"] = util.ObjToString(m.GetSession("userId")) != ""
 			m.T["includedInfo"] = GetIncludedInfo()
 			m.T["hotWinner"] = GetWinnerInfo()
@@ -506,10 +519,8 @@ func (f *PcIndex) SearchResult(at, name string) error {
 				}
 				query := getLastNewsQuery(area, "", stype, industry, city)
 				datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount)
-				log.Println(len(*datas), "=====", limitcount)
 			} else {
 				//关键词  如果规定时间内未取到数据 则按照老规则取数据   //规则开发一半被砍 暂时注释
-
 				_, _, datas = bidsearch.GetPcBidSearchData(keywords, "", "", "", "", key_industry, "", "", "", "", "", "", "", 0, true, nil, bidSearch_field_1, "", false, false, "", 50, "")
 				if datas != nil && len(*datas) > limitcount {
 					*datas = (*datas)[0:limitcount]
@@ -517,7 +528,7 @@ func (f *PcIndex) SearchResult(at, name string) error {
 			}
 			if datas != nil && len(*datas) > 0 {
 				for _, v := range *datas {
-					v["_id"] = encrypt.CommonEncodeArticle("indexcontent", util.ObjToString(v["_id"]))
+					v["_id"] = encrypt.CommonEncodeArticle("content", util.ObjToString(v["_id"]))
 				}
 			}
 			timeout := util.IntAllDef(config.Sysconfig["pcIndexHotCacheTime"], 7200)

+ 38 - 30
src/jfw/front/shorturl.go

@@ -55,7 +55,7 @@ var (
 		"indexcontent":    true,
 		"advancedProject": true,
 	}
-	seoAgentReg      = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
+	//seoAgentReg      = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
 	detailNeedMosaic map[string]interface{}
 	TypeCodeMap      = map[string]string{
 		"拟建":   "拟建项目",
@@ -83,9 +83,37 @@ var (
 )
 
 func (s *Short) Article(stype, id string) error {
+	//是否是移动端
+	bm := mobileReg.MatchString(s.Header("User-Agent"))
+	//是否是微信浏览器
+	isWxB := public.CheckWxBrowser(s.Request)
 	userId, _ := s.GetSession("userId").(string)
+	//未登录用户是否访问的微信浏览器
+	if userId == "" {
+		if IsWxBrowserContent[stype] {
+			if s.GetString("state") == "wx" {
+				//微信跳回来的
+				if code := s.GetString("code"); code != "" {
+					if openid := jyutil.Getopenid(code); openid != "" {
+						if CheckUserIsSubscribe(openid) {
+							FindUserAndCreateSess(openid, s.Session(), "wx", false, true)
+							//生session后 重新获取一下
+							userId, _ = s.GetSession("userId").(string)
+						} else if !bm { //未关注用户 pc端到关注页面
+							log.Println("PC微信端浏览器 未关注用户 访问地址----")
+							s.Request.Header.Del("Referer")
+							return s.Redirect("/swordfish/frontPage/user/free/redirect-wx")
+						} //未关注用户  移动端下面处理
+					}
+				}
+			} else if isWxB {
+				//所有参数都不再使用,跳到微信验证用户
+				return s.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(s.Site()+s.Url()), "wx"), 302)
+			}
+		}
+	}
 	//PC端未登录用户程序走此逻辑  WX端走原来逻辑
-	if !mobileReg.MatchString(s.Header("User-Agent")) && (stype == "content" || stype == "indexcontent") && userId == "" {
+	if !bm && (stype == "content" || stype == "indexcontent") && userId == "" {
 		//if seoAgentReg.MatchString(s.UserAgent()) {
 		sids := encrypt.CommonDecodeArticle(stype, id)
 		return s.NologinCommon("", stype, id, sids[0])
@@ -93,12 +121,10 @@ func (s *Short) Article(stype, id string) error {
 		//	return s.Redirect("/notin/page")
 		//}
 	}
-	return s.LoginCommon(userId, stype, id)
+	return s.LoginCommon(userId, stype, id, bm)
 }
 
-func (s *Short) LoginCommon(userId, stype, id string) error {
-	client := s.Header("User-Agent")
-	bm := mobileReg.MatchString(client)
+func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 	//电脑端 剑鱼快照页面访问
 	if stype == "content" && !bm {
 		//工作桌面内嵌 快照页
@@ -141,26 +167,6 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 		s.Redirect("/not/nottype", 302)
 		return nil
 	} else if stype == "content" || stype == "bdcontent" || stype == "advancedProject" {
-		if userId == "" && bm {
-			if s.GetString("state") == "wx" {
-				//微信跳回来的
-				if code := s.GetString("code"); code != "" {
-					if openid := jyutil.Getopenid(code); openid != "" {
-						if CheckUserIsSubscribe(openid) {
-							FindUserAndCreateSess(openid, s.Session(), "wx", false, true)
-							//生session后 重新获取一下
-							userId, _ = s.GetSession("userId").(string)
-						}
-					}
-				}
-			} else if public.CheckWxBrowser(s.Request) {
-				//所有参数都不再使用,跳到微信验证用户
-				return s.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(s.Site()+s.Url()), "wx"), 302)
-			}
-		}
-		if disWord != "" {
-			from_userid = disWordNil(disWord, userId)
-		}
 		if userId == "" { //} && !regclient.MatchString(client) { //没有用户session //搜索引擎让过
 			s.Session().Set("referer", s.Request.RequestURI)
 			if bm { //是否是移动端访问
@@ -190,6 +196,8 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 				}
 			}
 			return nil
+		} else if disWord != "" {
+			from_userid = disWordNil(disWord, userId)
 		}
 		if stype == "bdcontent" {
 			stype = "content"
@@ -197,7 +205,7 @@ func (s *Short) LoginCommon(userId, stype, id string) error {
 	} else if stype == "entservice" { //大客户数据快照展示
 		//se := util.SimpleEncrypt{"entservice"}
 		sid := encrypt.SE3.DecodeString(id)
-		if len(sid) == 0 || (len(sid) > 0 && sid == "") {
+		if userId == "" || len(sid) == 0 || (len(sid) > 0 && sid == "") { //未登录用户没有权限访问
 			s.Redirect("/notin/page", 302)
 			return nil
 		}
@@ -812,7 +820,7 @@ func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry,
 		key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, from_userid, userId)
 		if redis.Incr(redisLimitation, key) == 1 {
 			redis.SetExpire(redisLimitation, key, 60*60*24)
-			err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(string), config.Sysconfig["nsq_topic"].(string), jy.Jyweb_article_open, se.Decode4Hex(from_userid), jy.Jywx_node1)
+			err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(string), config.Sysconfig["nsq_topic"].(string), jy.Jyweb_article_open, se.Decode4Hex(from_userid), jy.Jywx_node1, nil)
 			if err != nil {
 				log.Println("nsq队列写入失败-->", jy.Jyweb_article_open, se.Decode4Hex(from_userid))
 			}
@@ -1176,7 +1184,7 @@ func (s *Short) NologinArticle(stype, id string) error {
 		return nil
 	}
 	if userId != "" { //已登录用户直接跳转至正常三级页
-		return s.LoginCommon(userId, stype, id)
+		return s.LoginCommon(userId, stype, id, mobileReg.MatchString(s.Header("User-Agent"))) //是否是移动端
 	}
 	if detailNeedMosaic == nil {
 		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
@@ -1187,7 +1195,7 @@ func (s *Short) NologinArticle(stype, id string) error {
 func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 	tg := &Tags{}
 	catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s", stype, sid)
-	if res := redis.Get(redisLimitation, catchKey); true || res == nil || res == "" {
+	if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
 		industry := s.GetString("industry")
 		var shareid = s.GetString("id")
 		if len(shareid) == 0 {

+ 331 - 330
src/jfw/front/structedData.go

@@ -1,379 +1,380 @@
 package front
 
 import (
-    "fmt"
-    "jy/src/jfw/config"
-    "jy/src/jfw/jyutil"
-    "log"
-    "strings"
-    "time"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"log"
+	"strings"
+	"time"
 
-    "app.yhyue.com/moapp/jypkg/public"
+	"app.yhyue.com/moapp/jypkg/public"
 
-    util "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jybase/redis"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/redis"
 
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
 
 type StructedData struct {
-    *xweb.Action
-    index      xweb.Mapper `xweb:"/front/structed/index"`     //数据结构化首页
-    writeInfo  xweb.Mapper `xweb:"/front/structed/writeinfo"` //信息填写
-    checkUser  xweb.Mapper `xweb:"/front/structed/checkuser"`
-    success    xweb.Mapper `xweb:"/front/structed/success"`    //信息填写成功
-    saveData   xweb.Mapper `xweb:"/front/structed/savedata"`   //数据结构化保存用户
-    getPreview xweb.Mapper `xweb:"/front/structed/getpreview"` //数据结构化预览
-    //dev2.10.10
-    pc_index       xweb.Mapper `xweb:"/front/structed/pc_index.html"`  //pc端结构化数据首页
-    pc_info        xweb.Mapper `xweb:"/front/structed/pc_info.html"`   //pc端结构化数据信息页面
-    freeSamples    xweb.Mapper `xweb:"/front/structed/freeSamples"`    //数据结构化保存免费样例数据
-    verifyCode     xweb.Mapper `xweb:"/front/structed/verifyCode"`     //数据结构化验证邮箱验证码
-    sendMailVerify xweb.Mapper `xweb:"/front/structed/sendMailVerify"` //数据结构化发送邮箱验证码
-    verifyEmail    xweb.Mapper `xweb:"/front/structed/verifyEmail"`    //数据结构化验证邮箱是否验证过
+	*xweb.Action
+	index      xweb.Mapper `xweb:"/front/structed/index"`     //数据结构化首页
+	writeInfo  xweb.Mapper `xweb:"/front/structed/writeinfo"` //信息填写
+	checkUser  xweb.Mapper `xweb:"/front/structed/checkuser"`
+	success    xweb.Mapper `xweb:"/front/structed/success"`    //信息填写成功
+	saveData   xweb.Mapper `xweb:"/front/structed/savedata"`   //数据结构化保存用户
+	getPreview xweb.Mapper `xweb:"/front/structed/getpreview"` //数据结构化预览
+	//dev2.10.10
+	pc_index       xweb.Mapper `xweb:"/front/structed/pc_index.html"`  //pc端结构化数据首页
+	pc_info        xweb.Mapper `xweb:"/front/structed/pc_info.html"`   //pc端结构化数据信息页面
+	freeSamples    xweb.Mapper `xweb:"/front/structed/freeSamples"`    //数据结构化保存免费样例数据
+	verifyCode     xweb.Mapper `xweb:"/front/structed/verifyCode"`     //数据结构化验证邮箱验证码
+	sendMailVerify xweb.Mapper `xweb:"/front/structed/sendMailVerify"` //数据结构化发送邮箱验证码
+	verifyEmail    xweb.Mapper `xweb:"/front/structed/verifyEmail"`    //数据结构化验证邮箱是否验证过
 }
 
 func init() {
-    xweb.AddAction(&StructedData{})
+	xweb.AddAction(&StructedData{})
 }
 
-//验证邮箱的正确性
+// 验证邮箱的正确性
 func (t *StructedData) VerifyEmail() {
-    defer util.Catch()
-    msg := "请求方式有误"
-    status := false
-    if t.Method() == "POST" {
-        userId := util.ObjToString(t.GetSession("userId"))
-        email := t.GetString("email")
-        msg = "参数有误"
-        if email != "" {
-            msg = "未登录"
-            if userId != "" {
-                emails := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
-                    "user_mail":    email,
-                    "user_id":      userId,
-                    "product_type": "历史数据",
-                }, "user_mail", "")
-                //是否是绑定邮箱或者是数据导出邮箱  验证过的邮箱
-                if (emails != nil && util.ObjToString((*emails)["user_mail"]) != "") || (t.GetSession("s_myemail") != nil && email == t.GetSession("s_myemail").(string)) || (t.GetSession("SMVerifySucess") != nil && t.GetSession("SMVerifySucess").(bool) && email == t.GetSession("DataSMVerifyEmail")) {
-                    status = true
-                    msg = "此邮箱已被验证"
-                    t.SetSession("SMVerifySucess", true)
-                } else {
-                    msg = "未被验证"
-                }
-            }
-        }
-    }
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		email := t.GetString("email")
+		msg = "参数有误"
+		if email != "" {
+			msg = "未登录"
+			if userId != "" {
+				emails := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+					"user_mail":    email,
+					"user_id":      userId,
+					"product_type": "历史数据",
+				}, "user_mail", "")
+				//是否是绑定邮箱或者是数据导出邮箱  验证过的邮箱
+				if (emails != nil && util.ObjToString((*emails)["user_mail"]) != "") || (t.GetSession("s_myemail") != nil && email == t.GetSession("s_myemail").(string)) || (t.GetSession("SMVerifySucess") != nil && t.GetSession("SMVerifySucess").(bool) && email == t.GetSession("DataSMVerifyEmail")) {
+					status = true
+					msg = "此邮箱已被验证"
+					t.SetSession("SMVerifySucess", true)
+				} else {
+					msg = "未被验证"
+				}
+			}
+		}
+	}
 
-    t.ServeJson(map[string]interface{}{
-        "msg":    msg,
-        "status": status,
-    })
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
 }
 
-//验证 验证码的正确性
+// 验证 验证码的正确性
 func (t *StructedData) VerifyCode() {
-    defer util.Catch()
-    msg := "请求方式有误"
-    status := false
-    if t.Method() == "POST" {
-        userId := util.ObjToString(t.GetSession("userId"))
-        msg = "未登录"
-        if userId != "" {
-            s_email := t.GetString("s_email")       //邮箱
-            verifyCode := t.GetString("verifyCode") //验证码
-            VerifyEmail := util.ObjToString(t.GetSession("DataSMVerifyEmail"))
-            if verifyCode != "" && s_email != "" && VerifyEmail != "" {
-                if s_email == VerifyEmail {
-                    msg = "验证码正确"
-                    status = true
-                    SMVerifySucess := t.GetSession("SMVerifySucess")
-                    //需验证邮箱
-                    if SMVerifySucess != nil && !SMVerifySucess.(bool) {
-                        //验证码
-                        verifyStr := t.GetSession("DataSMVerify")
-                        //是否超时
-                        lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
-                        timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
-                        if lastSendDEVerify == 0 || timeSpaceing < 0 {
-                            msg = "验证码超时"
-                            status = false
-                        } else if verifyStr != verifyCode {
-                            msg = "验证码有误"
-                            status = false
-                        } else {
-                            t.SetSession("SMVerifySucess", true)
-                        }
-                    }
-                } else {
-                    msg = "验证码有误"
-                    status = false
-                }
-            }
-        }
-    }
-    t.ServeJson(map[string]interface{}{
-        "msg":    msg,
-        "status": status,
-    })
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		msg = "未登录"
+		if userId != "" {
+			s_email := t.GetString("s_email")       //邮箱
+			verifyCode := t.GetString("verifyCode") //验证码
+			VerifyEmail := util.ObjToString(t.GetSession("DataSMVerifyEmail"))
+			if verifyCode != "" && s_email != "" && VerifyEmail != "" {
+				if s_email == VerifyEmail {
+					msg = "验证码正确"
+					status = true
+					SMVerifySucess := t.GetSession("SMVerifySucess")
+					//需验证邮箱
+					if SMVerifySucess != nil && !SMVerifySucess.(bool) {
+						//验证码
+						verifyStr := t.GetSession("DataSMVerify")
+						//是否超时
+						lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+						timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+						if lastSendDEVerify == 0 || timeSpaceing < 0 {
+							msg = "验证码超时"
+							status = false
+						} else if verifyStr != verifyCode {
+							msg = "验证码有误"
+							status = false
+						} else {
+							t.SetSession("SMVerifySucess", true)
+						}
+					}
+				} else {
+					msg = "验证码有误"
+					status = false
+				}
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
 }
 
-//保存免费样例数据
+// 保存免费样例数据
 func (t *StructedData) FreeSamples() error {
-    defer util.Catch()
-    msg := "请求方式有误"
-    status := false
-    if t.Method() == "POST" {
-        userId := util.ObjToString(t.GetSession("userId"))
-        if userId != "" {
-            name := t.GetString("name")                      //联系人
-            phone_num := t.GetString("phone_num")            //手机号
-            s_email := t.GetString("s_email")                //邮箱
-            SMVerifySucess := t.GetSession("SMVerifySucess") //邮箱是否验证成功
-            if name != "" && phone_num != "" && s_email != "" && SMVerifySucess != nil && SMVerifySucess.(bool) {
-                count := public.Mysql.Count("structed_data", map[string]interface{}{
-                    "name":  name,
-                    "phone": phone_num,
-                    "email": s_email,
-                    "type":  1,
-                })
-                if count >= 1 {
-                    msg = "用户信息已存在"
-                    status = true
-                } else {
-                    source := t.GetString("source")
-                    insertMap := map[string]interface{}{
-                        "name":        name,
-                        "phone":       phone_num,
-                        "email":       s_email,
-                        "submit_time": time.Now().Unix(),
-                        "status":      0,
-                        "type":        1, //用户来源,0:联系客服,1:免费样例,2:自选购买
-                    }
-                    if source != "" {
-                        insertMap["source"] = source
-                    }
-                    stu := public.Mysql.Insert("structed_data", insertMap)
-                    if stu == 0 {
-                        msg = "数据库操作异常"
-                        status = false
-                    } else {
-                        //保存成功后 删除验证成功记录 和 发送验证码时间
-                        t.DelSession("SMVerifySucess")
-                        t.DelSession("CreatSMVerifyTime")
-                        t.DelSession("DataSMVerifyEmail")
-                        msg = "保存成功"
-                        status = true
-                        go public.SendStructedDataByEmail(s_email, config.GmailAuth, config.Sysconfig, config.Seoconfig)
-                    }
-                }
-            } else {
-                msg = "缺少参数"
-                status = false
-            }
-        }
-    }
-    t.ServeJson(map[string]interface{}{
-        "msg":    msg,
-        "status": status,
-    })
-    return nil
+	defer util.Catch()
+	msg := "请求方式有误"
+	status := false
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			name := t.GetString("name")                      //联系人
+			phone_num := t.GetString("phone_num")            //手机号
+			s_email := t.GetString("s_email")                //邮箱
+			SMVerifySucess := t.GetSession("SMVerifySucess") //邮箱是否验证成功
+			if name != "" && phone_num != "" && s_email != "" && SMVerifySucess != nil && SMVerifySucess.(bool) {
+				count := public.Mysql.Count("structed_data", map[string]interface{}{
+					"name":  name,
+					"phone": phone_num,
+					"email": s_email,
+					"type":  1,
+				})
+				if count >= 1 {
+					msg = "用户信息已存在"
+					status = true
+				} else {
+					source := t.GetString("source")
+					insertMap := map[string]interface{}{
+						"name":        name,
+						"phone":       phone_num,
+						"email":       s_email,
+						"submit_time": time.Now().Unix(),
+						"status":      0,
+						"type":        1, //用户来源,0:联系客服,1:免费样例,2:自选购买
+					}
+					if source != "" {
+						insertMap["source"] = source
+					}
+					stu := public.Mysql.Insert("structed_data", insertMap)
+					if stu == 0 {
+						msg = "数据库操作异常"
+						status = false
+					} else {
+						//保存成功后 删除验证成功记录 和 发送验证码时间
+						t.DelSession("SMVerifySucess")
+						t.DelSession("CreatSMVerifyTime")
+						t.DelSession("DataSMVerifyEmail")
+						msg = "保存成功"
+						status = true
+						go public.SendStructedDataByEmail(s_email, config.GmailAuth, config.Sysconfig, config.Seoconfig)
+					}
+				}
+			} else {
+				msg = "缺少参数"
+				status = false
+			}
+		}
+	}
+	t.ServeJson(map[string]interface{}{
+		"msg":    msg,
+		"status": status,
+	})
+	return nil
 }
 
-//必须登录
+// 必须登录
 func (t *StructedData) Pc_info() error {
-    defer util.Catch()
-    userId := util.ObjToString(t.GetSession("userId"))
-    if userId != "" {
-        //删除验证成功记录 和 发送验证码时间 邮箱
-        t.DelSession("SMVerifySucess")
-        t.DelSession("CreatSMVerifyTime")
-        t.DelSession("DataSMVerifyEmail")
-        nums := jyutil.Compatible.Select(userId, `{"s_phone":1,"s_myemail":1}`)
-        if nums == nil {
-            return t.Redirect("/front/aboutus.html")
-        }
-        if _, ok := (*nums)["s_phone"]; ok {
-            t.T["phone_num"] = (*nums)["s_phone"].(string)
-        }
-        if _, ok := (*nums)["s_myemail"]; ok {
-            t.T["s_myemail"] = (*nums)["s_myemail"].(string)
-            //验证是否是绑定的邮箱
-            t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
-            t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
-            t.SetSession("SMVerifySucess", true)
-        }
-        return t.Render("/structuredata/pc/info.html", &t.T)
-    } else {
-        return t.Redirect("/front/aboutus.html")
-    }
+	defer util.Catch()
+	userId := util.ObjToString(t.GetSession("userId"))
+	if userId != "" {
+		//删除验证成功记录 和 发送验证码时间 邮箱
+		t.DelSession("SMVerifySucess")
+		t.DelSession("CreatSMVerifyTime")
+		t.DelSession("DataSMVerifyEmail")
+		nums := jyutil.Compatible.Select(userId, `{"s_phone":1,"s_myemail":1}`)
+		if nums == nil {
+			return t.Redirect("/front/aboutus.html")
+		}
+		if _, ok := (*nums)["s_phone"]; ok {
+			t.T["phone_num"] = (*nums)["s_phone"].(string)
+		}
+		if _, ok := (*nums)["s_myemail"]; ok {
+			t.T["s_myemail"] = (*nums)["s_myemail"].(string)
+			//验证是否是绑定的邮箱
+			t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
+			t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
+			t.SetSession("SMVerifySucess", true)
+		}
+		return t.Render("/structuredata/pc/info.html", &t.T)
+	} else {
+		return t.Redirect("/front/aboutus.html")
+	}
 }
 
-//可以不登录
+// 可以不登录
 func (t *StructedData) Pc_index() error {
-    t.T["source"] = "wx_sy_dh_4"
-    return t.Render("/structuredata/pc/index.html", &t.T)
+	//t.T["source"] = "wx_sy_dh_4"
+	//return t.Render("/structuredata/pc/index.html", &t.T)
+	return t.Redirect("/front/dataMarket/customExport?source=wx_sy_dh_4")
 }
 func (t *StructedData) Index() error {
-    t.T["source"] = "wx_sy_dh_4"
-    return t.Render("/structuredata/mobile/marketing_wx.html", &t.T)
+	t.T["source"] = "wx_sy_dh_4"
+	return t.Render("/structuredata/mobile/marketing_wx.html", &t.T)
 }
 
-//信息填写
+// 信息填写
 func (t *StructedData) WriteInfo() error {
-    return t.Render("/structuredata/mobile/write_info.html")
+	return t.Render("/structuredata/mobile/write_info.html")
 }
 
-//结构化数据预览
+// 结构化数据预览
 func (t *StructedData) GetPreview() error {
-    return t.Render("/structuredata/mobile/preview.html")
+	return t.Render("/structuredata/mobile/preview.html")
 }
 func (t *StructedData) Success() error {
-    //删除验证成功记录 和 发送验证码时间 邮箱
-    t.DelSession("SMVerifySucess")
-    t.DelSession("CreatSMVerifyTime")
-    t.DelSession("DataSMVerifyEmail")
-    return t.Render("/structuredata/mobile/write_result.html")
+	//删除验证成功记录 和 发送验证码时间 邮箱
+	t.DelSession("SMVerifySucess")
+	t.DelSession("CreatSMVerifyTime")
+	t.DelSession("DataSMVerifyEmail")
+	return t.Render("/structuredata/mobile/write_result.html")
 }
 func (t *StructedData) CheckUser() error {
-    userId := util.ObjToString(t.GetSession("userId"))
-    if userId != "" {
-        //删除验证成功记录 和 发送验证码时间 邮箱
-        t.DelSession("SMVerifySucess")
-        t.DelSession("CreatSMVerifyTime")
-        t.DelSession("DataSMVerifyEmail")
-        nums := jyutil.Compatible.Select( userId,`{"s_phone":1,"s_phone":1}`)
-        if nums==nil {
-            return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
-        }
-        if _, ok := (*nums)["s_phone"]; ok {
-            t.T["phone_num"] = (*nums)["s_phone"].(string)
-        }
-        if _, ok := (*nums)["s_myemail"]; ok {
-            t.T["s_myemail"] = (*nums)["s_phone"].(string)
-            //验证是否是绑定的邮箱
-            t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
-            t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
-            t.SetSession("SMVerifySucess", true)
-        }
-        return t.Render("/structuredata/mobile/write_infor_wx.html", &t.T)
-    } else {
-        return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
-    }
+	userId := util.ObjToString(t.GetSession("userId"))
+	if userId != "" {
+		//删除验证成功记录 和 发送验证码时间 邮箱
+		t.DelSession("SMVerifySucess")
+		t.DelSession("CreatSMVerifyTime")
+		t.DelSession("DataSMVerifyEmail")
+		nums := jyutil.Compatible.Select(userId, `{"s_phone":1,"s_phone":1}`)
+		if nums == nil {
+			return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
+		}
+		if _, ok := (*nums)["s_phone"]; ok {
+			t.T["phone_num"] = (*nums)["s_phone"].(string)
+		}
+		if _, ok := (*nums)["s_myemail"]; ok {
+			t.T["s_myemail"] = (*nums)["s_phone"].(string)
+			//验证是否是绑定的邮箱
+			t.SetSession("s_myemail", (*nums)["s_myemail"].(string))
+			t.SetSession("DataSMVerifyEmail", (*nums)["s_myemail"].(string))
+			t.SetSession("SMVerifySucess", true)
+		}
+		return t.Render("/structuredata/mobile/write_infor_wx.html", &t.T)
+	} else {
+		return t.Redirect("/swordfish/about?source=open_infocontent&o=-130")
+	}
 
 }
 
 func (t *StructedData) SaveData() {
-    name := t.GetString("name")
-    phone_num := t.GetString("phone_num")
-    source := t.GetString("source")
-    if name != "" && phone_num != "" && isPhone(phone_num) {
-        count := public.Mysql.Count("structed_data", map[string]interface{}{
-            "name":  name,
-            "phone": phone_num,
-            "type":  0,
-        })
-        if count >= 1 {
-            t.ServeJson(map[string]interface{}{
-                "error_code": "0",
-                "data": map[string]interface{}{
-                    "msg":    "用户信息已存在",
-                    "status": true,
-                },
-            })
-        } else {
-            insertMap := map[string]interface{}{
-                "name":        name,
-                "phone":       phone_num,
-                "submit_time": time.Now().Unix(),
-                "status":      0,
-                "type":        0, //用户来源,0:联系客服,1:免费样例,2:自选购买
-            }
-            if source != "" {
-                insertMap["source"] = source
-            }
-            stu := public.Mysql.Insert("structed_data", insertMap)
-            if stu == 0 {
-                t.ServeJson(map[string]interface{}{
-                    "error_code": "1",
-                    "data": map[string]interface{}{
-                        "msg":    "数据库操作异常",
-                        "status": false,
-                    },
-                })
-            } else {
-                t.ServeJson(map[string]interface{}{
-                    "error_code": "0",
-                    "data": map[string]interface{}{
-                        "msg":    "保存成功",
-                        "status": true,
-                    },
-                })
-            }
-        }
-    }
+	name := t.GetString("name")
+	phone_num := t.GetString("phone_num")
+	source := t.GetString("source")
+	if name != "" && phone_num != "" && isPhone(phone_num) {
+		count := public.Mysql.Count("structed_data", map[string]interface{}{
+			"name":  name,
+			"phone": phone_num,
+			"type":  0,
+		})
+		if count >= 1 {
+			t.ServeJson(map[string]interface{}{
+				"error_code": "0",
+				"data": map[string]interface{}{
+					"msg":    "用户信息已存在",
+					"status": true,
+				},
+			})
+		} else {
+			insertMap := map[string]interface{}{
+				"name":        name,
+				"phone":       phone_num,
+				"submit_time": time.Now().Unix(),
+				"status":      0,
+				"type":        0, //用户来源,0:联系客服,1:免费样例,2:自选购买
+			}
+			if source != "" {
+				insertMap["source"] = source
+			}
+			stu := public.Mysql.Insert("structed_data", insertMap)
+			if stu == 0 {
+				t.ServeJson(map[string]interface{}{
+					"error_code": "1",
+					"data": map[string]interface{}{
+						"msg":    "数据库操作异常",
+						"status": false,
+					},
+				})
+			} else {
+				t.ServeJson(map[string]interface{}{
+					"error_code": "0",
+					"data": map[string]interface{}{
+						"msg":    "保存成功",
+						"status": true,
+					},
+				})
+			}
+		}
+	}
 }
 
-//发送邮件
+// 发送邮件
 func (t *StructedData) SendMailVerify() {
-    defer util.Catch()
-    if t.Method() == "POST" {
-        userId := util.ObjToString(t.GetSession("userId"))
-        if userId != "" {
-            email := t.GetString("email")
-            if isEmail(email) {
-                lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
-                timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
-                incurKey := fmt.Sprintf("SendSMEmail_%s_%d", t.GetSession("userId"), time.Now().Day())
-                if lastSendDEVerify == 0 || timeSpaceing < 0 {
-                    //每日限制10次
-                    times := util.IntAll(redis.Get("other", incurKey))
-                    if times < 10 {
-                        if times == 0 {
-                            redis.Put("other", incurKey, 1, 24*60*60)
-                        } else {
-                            redis.Incr("other", incurKey)
-                        }
-                        //生成随机数
-                        verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
-                        t.SetSession("SMVerifySucess", false)
-                        t.SetSession("DataSMVerify", verifyStr)
-                        t.SetSession("CreatSMVerifyTime", time.Now().Unix())
-                        t.SetSession("DataSMVerifyEmail", email)
-                        log.Println("====================", verifyStr, "====================", t.GetSession("CreatSMVerifyTime"), "====================")
-                        //发送邮箱验证码
-                        go public.SendMailIdentCode(email, verifyStr, config.GmailAuth)
-                        t.T["success"] = true
-                        t.T["errCode"] = 5
-                        t.T["errMsg"] = "已发送邮箱验证码"
-                    } else {
-                        t.T["success"] = false
-                        t.T["errCode"] = 3
-                        t.T["time"] = timeSpaceing
-                        t.T["errMsg"] = "验证码发送次数已达到今日上限"
-                    }
+	defer util.Catch()
+	if t.Method() == "POST" {
+		userId := util.ObjToString(t.GetSession("userId"))
+		if userId != "" {
+			email := t.GetString("email")
+			if isEmail(email) {
+				lastSendDEVerify := util.Int64All(t.GetSession("CreatSMVerifyTime"))
+				timeSpaceing := lastSendDEVerify - time.Now().Unix() + 60*5
+				incurKey := fmt.Sprintf("SendSMEmail_%s_%d", t.GetSession("userId"), time.Now().Day())
+				if lastSendDEVerify == 0 || timeSpaceing < 0 {
+					//每日限制10次
+					times := util.IntAll(redis.Get("other", incurKey))
+					if times < 10 {
+						if times == 0 {
+							redis.Put("other", incurKey, 1, 24*60*60)
+						} else {
+							redis.Incr("other", incurKey)
+						}
+						//生成随机数
+						verifyStr := strings.ToUpper(util.GetComplexRandom(6, 3, 3))
+						t.SetSession("SMVerifySucess", false)
+						t.SetSession("DataSMVerify", verifyStr)
+						t.SetSession("CreatSMVerifyTime", time.Now().Unix())
+						t.SetSession("DataSMVerifyEmail", email)
+						log.Println("====================", verifyStr, "====================", t.GetSession("CreatSMVerifyTime"), "====================")
+						//发送邮箱验证码
+						go public.SendMailIdentCode(email, verifyStr, config.GmailAuth)
+						t.T["success"] = true
+						t.T["errCode"] = 5
+						t.T["errMsg"] = "已发送邮箱验证码"
+					} else {
+						t.T["success"] = false
+						t.T["errCode"] = 3
+						t.T["time"] = timeSpaceing
+						t.T["errMsg"] = "验证码发送次数已达到今日上限"
+					}
 
-                } else {
-                    t.T["success"] = false
-                    t.T["errCode"] = 2
-                    t.T["time"] = timeSpaceing
-                    t.T["errMsg"] = "已发送,5分钟后再尝试"
-                }
-            } else {
-                t.T["success"] = false
-                t.T["errCode"] = 1
-                t.T["errMsg"] = "邮箱格式不正确"
-            }
-        } else {
-            t.T["success"] = false
-            t.T["errCode"] = 7
-            t.T["errMsg"] = "未登录"
-        }
-    } else {
-        t.T["success"] = false
-        t.T["errCode"] = 6
-        t.T["errMsg"] = "请求方式有误"
-    }
-    t.ServeJson(&t.T)
+				} else {
+					t.T["success"] = false
+					t.T["errCode"] = 2
+					t.T["time"] = timeSpaceing
+					t.T["errMsg"] = "已发送,5分钟后再尝试"
+				}
+			} else {
+				t.T["success"] = false
+				t.T["errCode"] = 1
+				t.T["errMsg"] = "邮箱格式不正确"
+			}
+		} else {
+			t.T["success"] = false
+			t.T["errCode"] = 7
+			t.T["errMsg"] = "未登录"
+		}
+	} else {
+		t.T["success"] = false
+		t.T["errCode"] = 6
+		t.T["errMsg"] = "请求方式有误"
+	}
+	t.ServeJson(&t.T)
 }

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

@@ -1611,7 +1611,7 @@ func searchresulthtml(list *[]map[string]interface{}) string {
 		j = i + 1
 		listhtml += `<li><div class="liLuceneList"><div class="luce-left"><em>` + strconv.Itoa(j) + `.</em>`
 		if listdata["title"] != "" {
-			listhtml += `<div class="left-title"><a onclick="noIn(this)" dataId="` + util.ObjToString(listdata["_id"]) + `" target="_blank">` + util.ObjToString(listdata["title"]) + `</a></div></div><div class="luce-right">`
+			listhtml += `<div class="left-title"><a href="/nologin/content/` + util.ObjToString(listdata["_id"]) + `.html" target="_blank">` + util.ObjToString(listdata["title"]) + `</a></div></div><div class="luce-right">`
 		}
 		area, _ := listdata["area"].(string)
 		area = strings.TrimSpace(area)

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

@@ -335,6 +335,7 @@ func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
 			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
 			reltime := time.Unix(util.Int64All(tmpdate1), 0)
 			v["time"] = reltime.Format(Date_yyyyMMdd_Point) //首页展示
+			v["date"] = reltime                             //首页展示
 			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
 			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
 			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))

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

@@ -9,6 +9,7 @@ import (
 var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/(dataReport|dataExport)/(wxpay|alipay)/callback$"),
 	regexp.MustCompile("^/jyapp/article/content/.*"),
+	regexp.MustCompile("^/jyapp/nologin/content/.*"),
 	regexp.MustCompile("^/jyapp/free/.*"),
 	regexp.MustCompile("^/jyapp/jylab/mainSearch$"),
 	regexp.MustCompile("^/jyapp/big/page/full$"),
@@ -30,6 +31,7 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/big/page/free_high_set"),
 	regexp.MustCompile("^/jyapp/big/page/ent_portrait$"),
 	regexp.MustCompile("^/jyapp/big/page/ent_portrait_change$"),
+	regexp.MustCompile("^/jyapp/s/.*"),
 }
 
 type loginFilter struct {

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

@@ -22,9 +22,9 @@ import (
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	"app.yhyue.com/moapp/jypkg/public"
 
+	"app.yhyue.com/moapp/jybase/dchest/captcha"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"github.com/SKatiyar/qr"
-	"app.yhyue.com/moapp/jybase/dchest/captcha"
 	"go.mongodb.org/mongo-driver/bson"
 )
 
@@ -84,6 +84,7 @@ type Front struct {
 
 	appConfig   xweb.Mapper `xweb:"/jyapp/free/config"`      //app配置项
 	shareDomain xweb.Mapper `xweb:"/jyapp/free/shareDomain"` //app分享 域名配置项
+	mainIndex   xweb.Mapper `xweb:"/"`                       //首页
 }
 
 var sewx encrypt.SimpleEncrypt //微信的加密方法
@@ -102,6 +103,14 @@ func init() {
 	industrylist, sortArray = jy.Getindustrys(util.ObjToString(config.Sysconfig["industry"]), mongodb)
 }
 
+// 移动首页
+func (f *Front) MainIndex() error {
+	if userId, _ := f.GetSession("userId").(string); userId == "" {
+		return f.Redirect("/jyapp/s/tags/home/home.html")
+	}
+	return f.Redirect("/jy_mobile/tabbar/home")
+}
+
 func (f *Front) PushMsgCallback() {
 	f.ServeJson(map[string]interface{}{})
 }

+ 148 - 147
src/jfw/modules/app/src/app/front/search.go

@@ -1,171 +1,172 @@
 package front
 
 import (
-    "fmt"
-    "jy/src/jfw/modules/app/src/app/jylabutil"
-    . "jy/src/jfw/modules/app/src/app/jyutil"
-    utils "jy/src/jfw/modules/app/src/app/jyutil"
-    "jy/src/jfw/modules/app/src/app/tag"
-    . "jy/src/jfw/modules/app/src/jfw/config"
-    "strings"
+	"fmt"
+	"jy/src/jfw/modules/app/src/app/jylabutil"
+	. "jy/src/jfw/modules/app/src/app/jyutil"
+	utils "jy/src/jfw/modules/app/src/app/jyutil"
+	"jy/src/jfw/modules/app/src/app/tag"
+	. "jy/src/jfw/modules/app/src/jfw/config"
+	"strings"
 
-    util "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jybase/encrypt"
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-    "app.yhyue.com/moapp/jybase/redis"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
 )
 
 type Search struct {
-    *xweb.Action
-    mainSearch          xweb.Mapper `xweb:"/jyapp/jylab/mainSearch"` //剑鱼标讯搜索主页面
-    searchIndex         xweb.Mapper `xweb:"/jyapp/free/searchIndex"`
-    getstatus           xweb.Mapper `xweb:"/jyapp/jylab/supsearch/getstatus"`
-    getHK               xweb.Mapper `xweb:"/jyapp/jylab/mainSearch/getHK"` //获取历史记录,订阅关键词
-    updateSearchHistory xweb.Mapper `xweb:"/jyapp/jylab/updateSearchHistory"`
-    site                xweb.Mapper `xweb:"/jyapp/free/site"`
+	*xweb.Action
+	mainSearch          xweb.Mapper `xweb:"/jyapp/jylab/mainSearch"` //剑鱼标讯搜索主页面
+	searchIndex         xweb.Mapper `xweb:"/jyapp/free/searchIndex"`
+	getstatus           xweb.Mapper `xweb:"/jyapp/jylab/supsearch/getstatus"`
+	getHK               xweb.Mapper `xweb:"/jyapp/jylab/mainSearch/getHK"` //获取历史记录,订阅关键词
+	updateSearchHistory xweb.Mapper `xweb:"/jyapp/jylab/updateSearchHistory"`
+	site                xweb.Mapper `xweb:"/jyapp/free/site"`
 }
 
 func init() {
-    xweb.AddAction(&Search{})
+	xweb.AddAction(&Search{})
 }
 
-//
 func (s *Search) Site() error {
-    //l:是否需要登录访问 0:不需要登录;1、2:需要登录(1:内部链接;2:外部链接)
-    l, _ := s.GetInteger("l")
-    //u:访问地址
-    userid := util.ObjToString(s.GetSession("userId"))
-    u := s.GetString("u")
-    if l > -1 && u != "" {
-        if l > 0 && userid == "" {
-            //需要登录 且 未登录状态
-            switch l { //内部链接
-            case 1:
-                u = fmt.Sprintf("/jyapp/free/login?url=%s", u)
-            case 2: //外部链接
-                u = fmt.Sprintf("/jyapp/free/login?out=%s", u)
-            }
-        }
-        return s.Redirect(u)
-    } else if userid == "" {
-        s.Redirect("/jyapp/free/login?back=index")
-    }
-    return s.Redirect("/jyapp/jylab/mainSearch")
+	//l:是否需要登录访问 0:不需要登录;1、2:需要登录(1:内部链接;2:外部链接)
+	l, _ := s.GetInteger("l")
+	//u:访问地址
+	userid := util.ObjToString(s.GetSession("userId"))
+	u := s.GetString("u")
+	if l > -1 && u != "" {
+		if l > 0 && userid == "" {
+			//需要登录 且 未登录状态
+			switch l { //内部链接
+			case 1:
+				u = fmt.Sprintf("/jyapp/free/login?url=%s", u)
+			case 2: //外部链接
+				u = fmt.Sprintf("/jyapp/free/login?out=%s", u)
+			}
+		}
+		return s.Redirect(u)
+	} else if userid == "" {
+		s.Redirect("/jyapp/free/login?back=index")
+	}
+	return s.Redirect("/jyapp/jylab/mainSearch")
 }
 
-//
 func (s *Search) MainSearch() error {
-    return s.Redirect("/jy_mobile/tabbar/home")
-    // 	if len(industrylist) > 0 {
-    // 		s.T["industry"] = industrylist
-    // 		s.T["sortArray"] = sortArray
-    // 	} else {
-    // 		industry, sortA := jy.Getindustrys(util.ObjToString(Sysconfig["industry"]), public.MQFW)
-    // 		s.T["industry"] = industry
-    // 		s.T["sortArray"] = sortA
-    // 	}
-    // 	s.T["pageSize"] = bidsearch.SearchPageSize_APP
-    // 	//搜索列表增加分享
-    // 	s.T["searchWord"] = s.GetString("searchWord")
-    // 	if now_unix := time.Now().Unix(); now_unix >= app_config.Active.Pullnew.StartTime && now_unix <= app_config.Active.Pullnew.EndTime {
-    // 		s.T["pullnew"] = true
-    // 	} else {
-    // 		s.T["pullnew"] = false
-    // 	}
-    // 	s.T["isIosExam"], s.T["isIosExamPhone"], _, _ = IosExamInfo(s.Action, false, false)
-    // 	return s.Render("/weixin/search/mainSearch.html", &s.T)
+	if userId, _ := s.GetSession("userId").(string); userId == "" {
+		return s.Redirect("/jyapp/s/tags/home/home.html")
+	}
+	return s.Redirect("/jy_mobile/tabbar/home")
+	// 	if len(industrylist) > 0 {
+	// 		s.T["industry"] = industrylist
+	// 		s.T["sortArray"] = sortArray
+	// 	} else {
+	// 		industry, sortA := jy.Getindustrys(util.ObjToString(Sysconfig["industry"]), public.MQFW)
+	// 		s.T["industry"] = industry
+	// 		s.T["sortArray"] = sortA
+	// 	}
+	// 	s.T["pageSize"] = bidsearch.SearchPageSize_APP
+	// 	//搜索列表增加分享
+	// 	s.T["searchWord"] = s.GetString("searchWord")
+	// 	if now_unix := time.Now().Unix(); now_unix >= app_config.Active.Pullnew.StartTime && now_unix <= app_config.Active.Pullnew.EndTime {
+	// 		s.T["pullnew"] = true
+	// 	} else {
+	// 		s.T["pullnew"] = false
+	// 	}
+	// 	s.T["isIosExam"], s.T["isIosExamPhone"], _, _ = IosExamInfo(s.Action, false, false)
+	// 	return s.Render("/weixin/search/mainSearch.html", &s.T)
 }
 func (p *Search) SearchIndex() {
-    isIosExam, isIosExamPhone, _, _ := IosExamInfo(p.Action, false, false)
-    data := utils.Compatible.Select(util.ObjToString(p.GetSession("userId")), `{"i_member_status":1}`)
-    member := 0
-    if len(*data) > 0  {
-        member = util.IntAll((*data)["i_member_status"])
-    }
-    m := map[string]interface{}{
-        "userId":         encrypt.EncodeArticleId(util.ObjToString(p.GetSession("userId"))),
-        "isIosExam":      isIosExam,
-        "isIosExamPhone": isIosExamPhone,
-        "member":         member,
-    }
-    if ad_name := p.GetString("ad_name"); ad_name != "" {
-        ad_names := strings.Split(ad_name, ",")
-        iosExam, _ := Seoconfig["IosExam"].(map[string]interface{})
-        ad_indexs := strings.Split(p.GetString("ad_index"), ",")
-        for k, v := range ad_names {
-            if isIosExam || isIosExamPhone {
-                iosExam_adv, _ := iosExam["adv"].(map[string]interface{})
-                if iosExam_adv[v] != nil {
-                    m[v] = iosExam_adv[v]
-                }
-            } else {
-                index := -1
-                if k < len(ad_indexs) {
-                    index = util.IntAll(ad_indexs[k])
-                }
-                m[v] = tag.Ad(v, index, p.Request.Host)
-            }
-        }
-    }
-    p.ServeJson(m)
+	isIosExam, isIosExamPhone, _, _ := IosExamInfo(p.Action, false, false)
+	data := utils.Compatible.Select(util.ObjToString(p.GetSession("userId")), `{"i_member_status":1}`)
+	member := 0
+	if len(*data) > 0 {
+		member = util.IntAll((*data)["i_member_status"])
+	}
+	m := map[string]interface{}{
+		"userId":         encrypt.EncodeArticleId(util.ObjToString(p.GetSession("userId"))),
+		"isIosExam":      isIosExam,
+		"isIosExamPhone": isIosExamPhone,
+		"member":         member,
+	}
+	if ad_name := p.GetString("ad_name"); ad_name != "" {
+		ad_names := strings.Split(ad_name, ",")
+		iosExam, _ := Seoconfig["IosExam"].(map[string]interface{})
+		ad_indexs := strings.Split(p.GetString("ad_index"), ",")
+		for k, v := range ad_names {
+			if isIosExam || isIosExamPhone {
+				iosExam_adv, _ := iosExam["adv"].(map[string]interface{})
+				if iosExam_adv[v] != nil {
+					m[v] = iosExam_adv[v]
+				}
+			} else {
+				index := -1
+				if k < len(ad_indexs) {
+					index = util.IntAll(ad_indexs[k])
+				}
+				m[v] = tag.Ad(v, index, p.Request.Host)
+			}
+		}
+	}
+	p.ServeJson(m)
 }
 func (p *Search) Getstatus() error {
-    defer util.Catch()
-    var tablepro bool
-    userid := util.ObjToString(p.GetSession("userId"))
-    if userid != "" {
-        tablepro = jylabutil.IsAuthorized(userid, "i_tablepro")
-    }
-    p.ServeJson(map[string]interface{}{
-        "tablepro": tablepro,
-        "userId":   userid,
-    })
-    return nil
+	defer util.Catch()
+	var tablepro bool
+	userid := util.ObjToString(p.GetSession("userId"))
+	if userid != "" {
+		tablepro = jylabutil.IsAuthorized(userid, "i_tablepro")
+	}
+	p.ServeJson(map[string]interface{}{
+		"tablepro": tablepro,
+		"userId":   userid,
+	})
+	return nil
 }
 
-//获取历史记录和关键词
+// 获取历史记录和关键词
 func (s *Search) GetHK() error {
-    defer util.Catch()
-    userid, _ := s.GetSession("userId").(string)
-    keys := []interface{}{}
-    arrs := []string{}
-    words := s.GetString("words")
-    if userid != "" {
-        arrs = strings.Split(redis.GetStr("other", "s_"+userid), ",")
-        if words != "" {
-            wordsArr := strings.Split(words, ",")
-            for _, word := range wordsArr {
-                for k, v := range arrs {
-                    if v == strings.TrimSpace(word) {
-                        arrs = append(arrs[:k], arrs[k+1:]...)
-                        break
-                    }
-                }
-                arrs = append(arrs, word)
-            }
-        }
-        if len(arrs) > 10 {
-            arrs = arrs[1:11]
-        }
-        redis.Del("other", "s_"+userid)
-        redis.Put("other", "s_"+userid, strings.Join(arrs, ","), -1)
-        //我的订阅
-        one := utils.Compatible.Select(userid, `{"o_jy":1}`)
-        if one != nil && len(*one) > 0 {
-            o_jy, _ := (*one)["o_jy"].(map[string]interface{})
-            a_key, _ := o_jy["a_key"].([]interface{})
-            for _, v := range a_key {
-                keyMap, _ := v.(map[string]interface{})
-                key, _ := keyMap["key"].([]interface{})
-                keys = append(keys, key)
-            }
-        }
-    } else if words != "" {
-        arrs = strings.Split(words, ",")
-    }
-    s.ServeJson(map[string]interface{}{
-        "msgset":  keys,
-        "history": arrs,
-    })
-    return nil
+	defer util.Catch()
+	userid, _ := s.GetSession("userId").(string)
+	keys := []interface{}{}
+	arrs := []string{}
+	words := s.GetString("words")
+	if userid != "" {
+		arrs = strings.Split(redis.GetStr("other", "s_"+userid), ",")
+		if words != "" {
+			wordsArr := strings.Split(words, ",")
+			for _, word := range wordsArr {
+				for k, v := range arrs {
+					if v == strings.TrimSpace(word) {
+						arrs = append(arrs[:k], arrs[k+1:]...)
+						break
+					}
+				}
+				arrs = append(arrs, word)
+			}
+		}
+		if len(arrs) > 10 {
+			arrs = arrs[1:11]
+		}
+		redis.Del("other", "s_"+userid)
+		redis.Put("other", "s_"+userid, strings.Join(arrs, ","), -1)
+		//我的订阅
+		one := utils.Compatible.Select(userid, `{"o_jy":1}`)
+		if one != nil && len(*one) > 0 {
+			o_jy, _ := (*one)["o_jy"].(map[string]interface{})
+			a_key, _ := o_jy["a_key"].([]interface{})
+			for _, v := range a_key {
+				keyMap, _ := v.(map[string]interface{})
+				key, _ := keyMap["key"].([]interface{})
+				keys = append(keys, key)
+			}
+		}
+	} else if words != "" {
+		arrs = strings.Split(words, ",")
+	}
+	s.ServeJson(map[string]interface{}{
+		"msgset":  keys,
+		"history": arrs,
+	})
+	return nil
 }

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

@@ -30,8 +30,9 @@ import (
 
 type Short struct {
 	*xweb.Action
-	article     xweb.Mapper `xweb:"/jyapp/article/(\\w+)/(.*).html"` //([pm])
-	replication xweb.Mapper `xweb:"/jyapp/shorturl/replication"`     //用户复制操作记录入库
+	//article xweb.Mapper `xweb:"/jyapp/article/(\\w+)/(.*).html"` //([pm])
+	article     xweb.Mapper `xweb:"/jyapp/(article|nologin)/(\\w+)/(.*).html"` //([pm])
+	replication xweb.Mapper `xweb:"/jyapp/shorturl/replication"`               //用户复制操作记录入库
 }
 
 func init() {
@@ -64,7 +65,7 @@ var TypeCodeMap = map[string]string{
 	"违规":   "违规信息",
 }
 
-func (s *Short) Article(stype, id string) error {
+func (s *Short) Article(contentType, stype, id string) error {
 	//先判断是否有session
 	userId, _ := s.GetSession("userId").(string)
 	log.Printf("三级页userid:%s", userId)

+ 341 - 0
src/jfw/modules/app/src/app/front/tags.go

@@ -0,0 +1,341 @@
+package front
+
+import (
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/modules/app/src/app/jyutil"
+	"jy/src/jfw/modules/app/src/jfw/config"
+	"log"
+	"regexp"
+	"strconv"
+	"strings"
+)
+
+var (
+	directRuleCity = map[string]bool{
+		"北京": true,
+		"天津": true,
+		"上海": true,
+		"重庆": true,
+	}
+	firstList = map[string]bool{
+		"list": true,
+		"tags": true,
+	}
+	infoTypeToCode = map[string]string{
+		"ZBYG":   "2_1",
+		"ZBGG":   "3_1",
+		"ZBJG":   "4_1",
+		"ZBXYXX": "5_1",
+		"NJXM":   "1_1",
+	}
+	mobileUrl = regexp.MustCompile("(?i)(app|H5|h5|ios)")
+	cookieNum = 4
+)
+
+type Tags struct {
+	*xweb.Action
+	tagsIndex xweb.Mapper `xweb:"/jyapp/s/(\\w+)/(\\w+)/(\\w+).html"`
+	isLogin   xweb.Mapper `xweb:"/jyapp/free/isLogin"`
+}
+
+func init() {
+	xweb.AddAction(&Tags{})
+	//热门地区
+	if config.Seoconfig["hotArea"] != nil {
+		jyutil.HotArea = config.Seoconfig["hotArea"].(string)
+	}
+	//广告位
+	if config.Seoconfig["mobileSeoAd"] != nil {
+		jyutil.AdCode = config.Seoconfig["mobileSeoAd"].(string)
+	}
+
+	do := qu.IntAll(config.Seoconfig["executionNum"])
+	wait := qu.IntAll(config.Seoconfig["awaitNum"])
+	//创建执行池 等待池
+	doPool := make(chan struct{}, do)
+	for i := 0; i < do; i++ {
+		doPool <- struct{}{}
+	}
+	waitPool := make(chan struct{}, wait)
+	for i := 0; i < wait; i++ {
+		waitPool <- struct{}{}
+	}
+	jyutil.ReqLimitInit = &jyutil.ReqLimit{
+		DoPool:   doPool,
+		WaitPool: waitPool,
+	}
+	//随机数
+	jyutil.RandNum = jyutil.RandomNumberGenerator()
+	//地区-读取配置
+	if areaInfoByte, err := json.Marshal(config.Seoconfig["areaInfo"]); err == nil {
+		if err = json.Unmarshal(areaInfoByte, &jyutil.AreaInfo); err != nil {
+			log.Println("areaInfo unmarshal err:", err)
+		}
+	} else {
+		log.Println("获取地区信息异常:", err)
+	}
+	//省份-读取配置
+	if areaByte, err := json.Marshal(config.Seoconfig["area"]); err == nil {
+		if err = json.Unmarshal(areaByte, &jyutil.AreaMap); err != nil {
+			log.Println("area unmarshal err:", err)
+		}
+	} else {
+		log.Println("获取地区信息异常:", err)
+	}
+	//城市-读取配置
+	if cityByte, err := json.Marshal(config.Seoconfig["city"]); err == nil {
+		if err = json.Unmarshal(cityByte, &jyutil.CityMap); err != nil {
+			log.Println("city unmarshal err:", err)
+		}
+	} else {
+		log.Println("获取地区信息异常:", err)
+	}
+	//初始化地区信息
+	jyutil.GetAllArea()
+	//热门地区
+	jyutil.GetHotArea()
+	//cookie num
+	cookieNum = qu.If(config.Seoconfig["cookieNum"] != nil, qu.IntAll(config.Seoconfig["cookieNum"]), cookieNum).(int)
+}
+
+func (tg *Tags) IsLogin() error {
+	defer qu.Catch()
+	i := 0
+	if userId, _ := tg.GetSession("userId").(string); userId != "" {
+		i = 1
+	}
+	log.Println("------islogin----", i)
+	return tg.Write(strconv.Itoa(i))
+}
+
+func (tg *Tags) TagsIndex(first, types, name string) error {
+	defer qu.Catch()
+	if userId, _ := tg.GetSession("userId").(string); userId != "" {
+		if c := jyutil.ChangeLoginCookie(20, tg.ResponseWriter, tg.Request, fmt.Sprintf("mobile_logined_%s", userId)); c < cookieNum {
+			return tg.Redirect("/jyapp/jylab/mainSearch")
+		}
+	}
+	var (
+		platform = "PC"
+	)
+	//是否是移动端
+	if bm := mobileUrl.MatchString(tg.Request.Referer()) || mobileUrl.MatchString(tg.Request.Host); bm {
+		platform = "Mobile"
+	}
+	if !firstList[first] {
+		return tg.Redirect("/jyapp/free/swordfish/about?from=tags")
+	}
+onceAgain:
+	tagsMobileKey := fmt.Sprintf("tags_mobile_%s_%s_%s", platform, types, name)
+	if res := redis.Get("seoCache", tagsMobileKey); res == nil || res == "" {
+		var (
+			infoTypeList                        []map[string]interface{} //信息类型
+			currentLocation                     []jyutil.SeoInfo
+			hasIndustryNav                      bool // 有没有招标导航
+			prevPage, nextPage, tdk, areaTopTip string
+			topInfoMap                          = map[string]*jyutil.SeoInfo{}
+			codes                               = strings.Split(name, "_")
+			biddingInfo                         = jyutil.BiddingInfo{
+				Total:    qu.IntAll(config.Seoconfig["seoTotal"]), //查询数据总量
+				PageSize: qu.IntAll(config.Seoconfig["seoSize"]),  //每页数据量
+				PageNum:  1,                                       //当前页码
+				IsSearch: true,                                    //是否进行bidding数据查询
+			}
+			isInfoList bool // 是否是在列表页面
+		)
+		if len(jyutil.AreaInfo) == 0 || jyutil.AreaMap == nil {
+			jyutil.GetAllArea()
+		}
+		//areaList, areaToCode, cityToCode, areaToCity = jyutil.GetAllArea()
+		infoTypeList, topInfoMap = jyutil.GetInfoType()
+		switch types {
+		case jyutil.Label["area"], jyutil.Label["city"]: //地区
+			if len(codes) == 2 || len(codes) == 1 {
+				if jyutil.SXSMap[name] != "" { //陕西省为了和pc端地址保持一致
+					codes[0] = jyutil.SXSMap[name]
+				}
+				if jyutil.AreaCityToCode[codes[0]] != nil {
+					biddingInfo.IsEffective = true
+					currentLocation = append(currentLocation, *jyutil.AreaCityToCode[codes[0]])
+					biddingInfo.Area = jyutil.AreaCityToCode[codes[0]].Name
+					tdk = biddingInfo.Area
+					areaTopTip = fmt.Sprintf("%s%s", biddingInfo.Area, "招标网")
+					if len(codes) == 2 {
+						if jyutil.AreaCityToCode[name] != nil {
+							currentLocation = append(currentLocation, *jyutil.AreaCityToCode[name])
+							biddingInfo.City = jyutil.AreaCityToCode[name].Name
+							areaTopTip = fmt.Sprintf("%s%s", biddingInfo.City, "招标网")
+							tdk = biddingInfo.City
+						} else {
+							biddingInfo.IsEffective = false //没有对应城市 异常
+						}
+					} else if !directRuleCity[biddingInfo.Area] { //非直辖市
+						tg.T["cityList"] = jyutil.AreaToCity[codes[0]]
+					}
+					if len(currentLocation) > 0 {
+						for i := 0; i < len(currentLocation); i++ {
+							currentLocation[i].Name = fmt.Sprintf("%s%s", currentLocation[i].Name, "招标网")
+						}
+					}
+					biddingInfo.Total = 8
+					biddingInfo.PageSize = 8
+					hasIndustryNav = true
+				} else {
+					biddingInfo.IsEffective = false //没有对应城市 异常
+				}
+			}
+		case jyutil.Label["infoType"]: //信息类型
+			if infoTypeToCode[name] != "" {
+				codes = strings.Split(infoTypeToCode[name], "_")
+			}
+			if len(codes) == 2 {
+				if topInfoMap != nil && topInfoMap[codes[0]] != nil {
+					biddingInfo.IsEffective = true
+					biddingInfo.TopType = bidsearch.TopType[topInfoMap[codes[0]].Name]
+					if biddingInfo.TopType == "" {
+						biddingInfo.TopType = "拟建" //正常不会走到此处
+					}
+					code, _ := strconv.ParseInt(codes[0], 10, 64)
+					tdk = jyutil.CodeToInfoType[code]
+					currentLocation = append(currentLocation, *topInfoMap[codes[0]])
+					biddingInfo.PageFormat(codes[1])
+					prevPage = fmt.Sprintf("%s_%d", codes[0], biddingInfo.PageNum-1)
+					nextPage = fmt.Sprintf("%s_%d", codes[0], biddingInfo.PageNum+1)
+					if biddingInfo.PageNum == 2 {
+						prevPage = jyutil.CodeToInfoType[code]
+					}
+					isInfoList = true
+				}
+			}
+		case jyutil.Label["industry"]: //行业
+			if len(codes) == 4 || len(codes) == 5 {
+				if len(codes) == 4 {
+					//默认第一页
+					codes = append(codes, "1")
+				}
+				indu2, class1, class2 := jyutil.GetIndustryKeywords(codes[3]) // 获取标的物的名称
+				if class1 != "" && class2 != "" && indu2 != "" {
+					biddingInfo.IsEffective = true
+					// 位置导航
+					currentLocation = append(currentLocation, jyutil.SeoInfo{
+						Name: fmt.Sprintf("%s招标采购", indu2),
+					})
+					biddingInfo.Industry = fmt.Sprintf("%s_%s", class1, class2)                 //行业
+					biddingInfo.Keys = indu2                                                    //关键词
+					biddingInfo.Total = qu.IntAll(config.Seoconfig["seoUnderlyingAssetsTotal"]) //标的物查询数据量100
+					tdk = indu2
+					biddingInfo.PageFormat(codes[4])
+					prevPage = fmt.Sprintf("%s_all_all_%s_%d", codes[0], codes[3], biddingInfo.PageNum-1)
+					nextPage = fmt.Sprintf("%s_all_all_%s_%d", codes[0], codes[3], biddingInfo.PageNum+1)
+					if biddingInfo.PageNum == 2 {
+						prevPage = fmt.Sprintf("%s_all_all_%s", codes[0], codes[3])
+					}
+				}
+				isInfoList = true
+			} else if name == "all" {
+				biddingInfo.IsEffective = true
+				biddingInfo.IsSearch = false
+				tg.T["industryData"] = jyutil.GetIndustry("/tags/industry/%d_all_all_%d.html") // 行业标的物全部
+			}
+		case jyutil.Label["buyer"]: //采购单位
+			biddingInfo.IsEffective = true
+			biddingInfo.PageFormat(name)
+			prevPage = fmt.Sprintf("%d", biddingInfo.PageNum-1)
+			nextPage = fmt.Sprintf("%d", biddingInfo.PageNum+1)
+			biddingInfo.IsBuyer = true
+			currentLocation = append(currentLocation, jyutil.SeoInfo{
+				Name: "采购单位",
+			})
+			biddingInfo.IsSearch = false
+			hasIndustryNav = true
+			isInfoList = true
+		case jyutil.Label["winner"]: //中标单位
+			biddingInfo.IsEffective = true
+			biddingInfo.PageFormat(name)
+			prevPage = fmt.Sprintf("%d", biddingInfo.PageNum-1)
+			nextPage = fmt.Sprintf("%d", biddingInfo.PageNum+1)
+			biddingInfo.IsWinner = true
+			currentLocation = append(currentLocation, jyutil.SeoInfo{
+				Name: "中标企业",
+			})
+			biddingInfo.IsSearch = false
+			hasIndustryNav = true
+			isInfoList = true
+		case jyutil.Label["home"]: //首页
+			if name == types {
+				biddingInfo.IsEffective = true
+				hasIndustryNav = true
+				biddingInfo.Total = 8
+				biddingInfo.PageSize = 8
+				biddingInfo.IsBuyer = true
+				biddingInfo.IsWinner = true
+			}
+		}
+		//异常参数  返回首页数据
+		if !biddingInfo.IsEffective {
+			types = jyutil.Label["home"]
+			name = jyutil.Label["home"]
+			goto onceAgain
+		}
+		//信息类型
+
+		if len(currentLocation) > 0 {
+			currentLocation[len(currentLocation)-1].Url = ""
+		}
+		tg.T["infoTypeList"] = infoTypeList //tg.GetInfoType()
+		tg.T["areaList"] = jyutil.AreaInfo
+		tg.T["currentLocation"] = currentLocation
+		//行业首页 不用广告位
+		if !(types == "industry" && name == "all") {
+			tg.T["adList"] = jyutil.GetAdInfo(tg.Request.Host)
+		}
+		if biddingInfo.IsSearch {
+			tg.T["biddingList"] = biddingInfo.GetBiddingInfo(types, codes, currentLocation, isInfoList)
+		}
+		if biddingInfo.PageNum == 1 {
+			prevPage = ""
+		}
+		if biddingInfo.PageNum == (biddingInfo.Total-1)/biddingInfo.PageSize+1 {
+			nextPage = ""
+		}
+		tg.T["prevPage"] = qu.If(prevPage != "", fmt.Sprintf("/tags/%s/%s.html", types, prevPage), "").(string)
+		tg.T["nextPage"] = qu.If(nextPage != "", fmt.Sprintf("/tags/%s/%s.html", types, nextPage), "").(string)
+		tg.T["totalPage"] = (biddingInfo.Total-1)/biddingInfo.PageSize + 1
+		tg.T["pageNum"] = biddingInfo.PageNum
+		tg.T["hotArea"] = jyutil.HotAreas
+		if biddingInfo.IsBuyer && !biddingInfo.IsWinner {
+			//tg.T["buyerList"] = &jyutil.InfoRes{
+			//	Name: "采购单位",
+			//	Url:  "/jyapp/tags/buyer/1.html",
+			//	List: biddingInfo.GetEntInfoList(qu.IntAll(config.Seoconfig["buyerListLimit"]), 0),
+			//}
+		}
+		if !biddingInfo.IsBuyer && biddingInfo.IsWinner {
+			//tg.T["winnerList"] = &jyutil.InfoRes{
+			//	Name: "中标企业",
+			//	Url:  "/jyapp/tags/winner/1.html",
+			//	List: biddingInfo.GetEntInfoList(qu.IntAll(config.Seoconfig["winnerListLimit"]), 1),
+			//}
+		}
+		if hasIndustryNav {
+			tg.T["industryNav"] = jyutil.GetIndustryNav(jyutil.GetIndustry("/tags/industry/%d_all_all_%d.html")) // 标的物小于等于5个字的
+		}
+		tg.T["areaTopTip"] = areaTopTip
+		//todo 获取tdk
+		tg.T["tdk"] = jyutil.GetTdk(types, tdk)
+		tg.T["HomeOrigin"] = "/tags/home/home.html"
+		tg.T["Home"] = qu.If(platform == "PC", "/", "/jyapp/jylab/mainSearch").(string)
+		tg.T["isInfoList"] = isInfoList
+		//模板redis缓存
+		content, _ := tg.Render4Cache("/tags/index.html", &tg.T)
+		redis.Put("seoCache", tagsMobileKey, string(content), qu.IntAll(config.Seoconfig["contentCache"]))
+		return tg.SetBody(content)
+	} else {
+		return tg.SetBody([]byte(res.(string)))
+	}
+}

+ 867 - 0
src/jfw/modules/app/src/app/jyutil/tags.go

@@ -0,0 +1,867 @@
+package jyutil
+
+import (
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
+	"app.yhyue.com/moapp/jypkg/public"
+	"context"
+	"encoding/json"
+	"fmt"
+	"jy/src/jfw/modules/app/src/jfw/config"
+	"log"
+	"math/rand"
+	"reflect"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+)
+
+var (
+	mobileHref          = "/list/%s/%s.html"
+	infoTypeRedisKey    = "mobile_seo_infoType_home"
+	biddingListKey      = "mobile_seo_list_%s_%s_%d"
+	biddingListTotalKey = "mobile_seo_list_total_%s_%s"
+	industryRedisKey    = "mobile_seo_industry"
+	buyerListRedisKey   = "mobile_seo_buyer_list_%d"
+	winnerListRedisKey  = "mobile_seo_winner_list_%d"
+	HotArea             = "北京,山东,陕西,河南,广东"
+	AdCode              = "mobile_seo_ad"
+	randCount           = 600
+	Label               = map[string]string{
+		"area":     "area",
+		"city":     "city",
+		"infoType": "stype",
+		"industry": "industry",
+		"buyer":    "buyer",
+		"winner":   "winner",
+		"home":     "home",
+	}
+	areaLock       = &sync.Mutex{}
+	infoTypeLock   = &sync.Mutex{}
+	infoListLock   = &sync.Mutex{}
+	AreaInfo       []map[string][]*SeoInfo
+	ReqLimitInit   *ReqLimit
+	RandNum        *rand.Rand
+	CodeToInfoType = map[int64]string{
+		2: "ZBYG",
+		3: "ZBGG",
+		4: "ZBJG",
+		5: "ZBXYXX",
+		1: "NJXM",
+	}
+	SXSMap             = map[string]string{}
+	defaultTitle       = "剑鱼标讯官网-招标信息查询_全国招标采购信息订阅推送_专业招标大数据服务平台"
+	defaultKeywords    = "招标网站,招标信息查询,剑鱼标讯,招标采购信息,招标大数据平台"
+	defaultDescription = "剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。提供涵盖拟在建项目、招标预告、招标公告、中标公告、政府采购、企业工商信息等多种信息类型,帮助企业全方位掌握市场动态变化。招投标大数据平台就用剑鱼标讯。"
+)
+
+type tkd struct {
+	NAME        string
+	TITLE       string
+	KEYWORDS    string
+	DESCRIPTION string
+	PARENT      string
+}
+type ReqLimit struct {
+	DoPool   chan struct{}
+	WaitPool chan struct{}
+}
+
+// GetAdInfo 获取广告位
+func GetAdInfo(host string) (adInfo []AdInfo) {
+	obj := redis.Get("other", "ad_"+AdCode)
+	if obj != nil {
+		adInfo = Handle(obj.([]interface{}), host)
+	} else {
+		res, ok := public.MQFW.FindOneByField("ad", `{"s_code":"`+AdCode+`"}`, `{"a_son":1}`)
+		if ok && res != nil && (*res)["a_son"] != nil {
+			son := (*res)["a_son"].([]interface{})
+			if len(son) > 0 {
+				redis.Put("seoCache", "ad_"+AdCode, son, qu.IntAll(config.Seoconfig["cacheTime"])+RandNum.Intn(randCount))
+			}
+			adInfo = Handle(son, host)
+		}
+	}
+	return
+}
+
+// GetInfoType 获取全部信息类型
+func GetInfoType() (list []map[string]interface{}, topMap map[string]*SeoInfo) {
+	infoTypeLock.Lock()
+	defer infoTypeLock.Unlock()
+	var (
+		data []map[string]interface{}
+	)
+	if l, ok := redis.Get("seoCache", infoTypeRedisKey).([]interface{}); ok && l != nil && len(l) > 0 {
+		data = qu.ObjArrToMapArr(l)
+	} else {
+		data = *public.BaseMysql.SelectBySql(`select id,name,pid from seo_words.seo_stype where name != "采购意向" and pid=0 order by id`)
+		if data != nil && len(data) > 0 {
+			if b := redis.Put("seoCache", infoTypeRedisKey, data, qu.IntAll(config.Seoconfig["cacheTime"])+RandNum.Intn(randCount)); !b {
+				log.Println("缓存保存失败,key:", infoTypeRedisKey)
+			}
+		}
+	}
+	if data != nil && len(data) > 0 {
+		topMap = map[string]*SeoInfo{}
+		for _, v := range data {
+			topMap[fmt.Sprintf("%d", qu.Int64All(v["id"]))] = &SeoInfo{
+				Name: qu.ObjToString(v["name"]),
+				Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[qu.Int64All(v["id"])]),
+			}
+			if qu.ObjToString(v["name"]) == "拟建项目" {
+				continue
+			}
+			list = append(list, map[string]interface{}{
+				"name": qu.ObjToString(v["name"]),
+				"url":  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[qu.Int64All(v["id"])]),
+			})
+		}
+	}
+	return
+}
+
+// GetHotArea 获取热门地区
+func GetHotArea() {
+	if HotArea != "" {
+		for _, v := range strings.Split(HotArea, ",") {
+			HotAreas = append(HotAreas, &SeoInfo{
+				Name: v,
+				Url:  AreaToUrl[v],
+			})
+		}
+	}
+}
+
+func combine(num int, pid, id, pageNum int64) string {
+	switch num {
+	case 2:
+		return fmt.Sprintf("%d_%d", pid, id)
+	case 3:
+		return fmt.Sprintf("%d_%d_%d", pid, id, pageNum)
+	default:
+		return fmt.Sprintf("%d", pid)
+	}
+}
+
+type SeoInfo struct {
+	Name     string
+	Url      string
+	Nickname string
+}
+
+// GetAllArea 获取所有地区信息
+func GetAllArea() {
+	areaLock.Lock()
+	defer areaLock.Unlock()
+	///list/area/HB.html
+	if AreaMap != nil && CityMap != nil {
+		for ak, am := range AreaMap {
+			AreaCityToCode[ak] = &SeoInfo{
+				Name: am.NAME,
+				Url:  fmt.Sprintf(mobileHref, Label["area"], ak),
+			}
+			AreaToUrl[am.NAME] = fmt.Sprintf(mobileHref, Label["area"], ak)
+		}
+		for ck, cm := range CityMap {
+			AreaCityToCode[ck] = &SeoInfo{
+				Name: cm.NAME,
+				Url:  fmt.Sprintf(mobileHref, Label["area"], ck),
+			}
+			if strings.Contains(ck, "_") {
+				cityCode := strings.Split(ck, "_")[0]
+				if cm.PARENT != "" {
+					cityCode = cm.PARENT
+					SXSMap[ck] = cm.PARENT
+				}
+				AreaToCity[cityCode] = append(AreaToCity[cityCode], &SeoInfo{
+					Name: cm.NAME,
+					Url:  fmt.Sprintf(mobileHref, Label["city"], ck),
+				})
+			}
+		}
+		if AreaToUrl != nil {
+		L:
+			for _, av := range AreaInfo {
+				for _, avv := range av {
+					for _, an := range avv {
+						if an.Url != "" {
+							break L
+						}
+						an.Url = AreaToUrl[an.Name]
+					}
+				}
+			}
+		}
+	}
+	return
+}
+
+type IndustryStruct struct {
+	Name string
+	Url  string
+	List []IndustryStruct
+}
+
+// GetIndustry 获取行业和行业下标的物
+func GetIndustry(industryHref string) *IndustryStruct {
+	saveData := IndustryStruct{
+		Name: "招标导航",
+		Url:  "/tags/industry/all.html",
+	}
+	redisKey := fmt.Sprintf(industryRedisKey)
+	if l, err := GetIndustryCache(redisKey); l != nil && (l.List != nil) && len(l.List) > 0 && err == nil {
+		return l
+	} else {
+		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
+		industryArr := []string{}
+		industryMap := map[string][]IndustryStruct{}
+		if len(*data) > 0 && data != nil {
+			for _, v := range *data {
+				class := qu.ObjToString(v["class_1"])
+				name := qu.ObjToString(v["name"])
+				id := qu.Int64All(v["id"])
+				industryId := qu.Int64All(v["class_id"])
+				if !IsInArr(industryArr, class) {
+					industryArr = append(industryArr, class)
+				}
+				industryMap[class] = append(industryMap[class], IndustryStruct{
+					Name: name,
+					Url:  fmt.Sprintf(industryHref, industryId, id),
+				})
+			}
+		}
+		var m []IndustryStruct
+		for _, v := range industryArr {
+			m = append(m, IndustryStruct{
+				Name: v,
+				List: industryMap[v],
+			})
+		}
+		saveData.List = m
+		PutIndustryCache(redisKey, qu.IntAll(config.Seoconfig["cacheTime"]), &saveData)
+		return &saveData
+	}
+}
+
+// IsInArr 判断字符串是否再数组str内
+func IsInArr(arr []string, s string) bool {
+	for _, v := range arr {
+		if v == s {
+			return true
+		}
+	}
+	return false
+}
+
+// GetIndustryKeywords 获取行业分类下的标签
+func GetIndustryKeywords(idstr string) (name, class1, class2 string) {
+	id, _ := strconv.Atoi(idstr)
+	data := public.BaseMysql.SelectBySql(`select id,class_1,class_2,name from seo_words.seo_industry where id =?`, id)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			class1 = qu.ObjToString(v["class_1"])
+			name = qu.ObjToString(v["name"])
+			class2 = qu.ObjToString(v["class_2"])
+			return
+		}
+	}
+	return
+}
+
+type BiddingInfo struct {
+	Area        string
+	City        string
+	TopType     string
+	Industry    string
+	Keys        string
+	IsBuyer     bool
+	IsWinner    bool
+	Total       int
+	PageNum     int
+	PageSize    int
+	IsSearch    bool
+	IsEffective bool //是否是有效请求
+}
+
+var (
+	biddingType = []*SeoInfo{
+		{
+			Name: "招标预告",
+			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[2]),
+		},
+		{
+			Name: "招标公告",
+			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[3]),
+		},
+		{
+			Name: "招标结果",
+			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[4]),
+		},
+		{
+			Name: "招标信用信息",
+			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[5]),
+		},
+		{
+			Name:     "拟建项目",
+			Url:      fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[1]),
+			Nickname: "拟建",
+		},
+	}
+	AreaMap        = map[string]tkd{}
+	CityMap        = map[string]tkd{}
+	AreaCityToCode = map[string]*SeoInfo{}
+	AreaToCity     = map[string][]*SeoInfo{}
+	AreaToUrl      = map[string]string{}
+	HotAreas       []*SeoInfo
+)
+
+func (b *BiddingInfo) PageFormat(page string) {
+	if page != "" {
+		b.PageNum, _ = strconv.Atoi(page)
+		if b.PageNum <= 0 || b.PageNum > b.Total/b.PageSize {
+			b.IsEffective = false
+			b.PageNum = 1
+		}
+	}
+}
+func (b *BiddingInfo) GetSearchSql() string {
+	var (
+		field                                     = `"_id","title","publishtime","toptype","subtype","area","s_subscopeclass","buyerclass","budget","bidamount","isValidFile","spidercode","site"`
+		query                                     = `{"query":{"bool":{"filter":[%s],"should": [%s],"minimum_should_match": %d}},"_source":[%s],"sort":[{"publishtime":"desc"}],"size":%d}`
+		keywords                                  = `{"multi_match": {"query": "%s","type": "phrase", "fields": ["title","purchasing"]}}`
+		filterBool                                = `{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}`
+		filterMusts, filterShould, should, filter []string
+		filterRange                               = `{"range":{"publishtime":{"gte":%d,"lte":%d}}}`
+		now                                       = time.Now()
+	)
+	filter = append(filter, fmt.Sprintf(filterRange, now.AddDate(-5, 0, 0).Unix(), now.Unix())) //发版前  改成最近一年
+	if b.Area != "" || b.City != "" {
+
+		if b.City != "" {
+			filterShould = append(filterShould, fmt.Sprintf(`{"terms":{"city":["%s"]}}`, b.City))
+		} else if b.Area != "" {
+			filterShould = append(filterShould, fmt.Sprintf(`{"terms":{"area":["%s"]}}`, b.Area))
+		}
+	}
+	//信息类型
+	if b.TopType != "" {
+		filterMusts = append(filterMusts, fmt.Sprintf(`{"terms":{"toptype":["%s"]}}`, b.TopType))
+	}
+	//行业
+	if b.Industry != "" {
+		filterMusts = append(filterMusts, fmt.Sprintf(`{"terms":{"s_subscopeclass":["%s"]}}`, b.Industry))
+	}
+	if len(filterMusts) > 0 || len(filterShould) > 0 {
+		shouldMatch := 0
+		if len(filterShould) > 0 {
+			shouldMatch = 1
+		}
+		filter = append(filter, fmt.Sprintf(filterBool, strings.Join(filterMusts, ","), strings.Join(filterShould, ","), shouldMatch))
+	}
+	//标的物
+	if b.Keys != "" {
+		should = append(should, fmt.Sprintf(keywords, b.Keys))
+	}
+	queryShouldMatch := 0
+	if len(should) > 0 {
+		queryShouldMatch = 1
+	}
+	qStr := fmt.Sprintf(query, strings.Join(filter, ","), strings.Join(should, ","), queryShouldMatch, field, b.Total)
+	return qStr
+}
+
+type InfoRes struct {
+	Name string
+	Url  string
+	List []*InfoList
+}
+type InfoList struct {
+	Title       string
+	Url         string
+	Area        string
+	Industry    string
+	Subtype     string
+	FileExists  bool
+	Site        string //来自用户发版
+	Price       string
+	PublishTime string
+	BuyerClass  string //采购单位类型
+	LegalPerson string //企业法人
+	State       string //中标企业状态
+	Address     string //地址
+}
+
+func (b *BiddingInfo) GetBiddingInfo(types string, codes []string, currentLocation []SeoInfo, isPaging bool) (birt []*InfoRes) {
+	infoListLock.Lock()
+	defer infoListLock.Unlock()
+	name := strings.Join(codes, "")
+	if n := len(codes); n > 1 {
+		name = strings.Join(codes, "_")
+		if isPaging {
+			name = strings.Join(codes[:n-1], "_")
+		}
+	}
+	redisCount := 0
+	redisKey := fmt.Sprintf(biddingListKey, types, name, b.PageNum)
+	redisTotalKey := fmt.Sprintf(biddingListTotalKey, types, name)
+	if b, err := redis.GetBytes("seoCache", redisKey); err == nil && len(*b) > 0 {
+		if err = json.Unmarshal(*b, &birt); err != nil {
+			log.Println(err)
+		}
+	}
+	if redisCountByte, err := redis.GetBytes("seoCache", redisTotalKey); err == nil && len(*redisCountByte) > 0 {
+		if err = json.Unmarshal(*redisCountByte, &redisCount); err != nil {
+			log.Println(err)
+		}
+	}
+
+	if len(birt) == 0 || ((b.Total != b.PageSize) && redisCount == 0) {
+		if flag := ReqLimitInit.Limit(context.Background()); flag == 1 {
+			defer ReqLimitInit.Release()
+		} else {
+			if flag == -2 {
+				log.Println("等待队列已满")
+			} else if flag == -1 {
+				log.Println("等待超时")
+			}
+			return nil
+		}
+		if b.Total == b.PageSize {
+			for _, bidType := range biddingType {
+				if bidsearch.TopType[bidType.Name] != "" {
+					b.TopType = bidsearch.TopType[bidType.Name]
+				} else {
+					bidsearch.TopType[bidType.Name] = bidType.Nickname
+					b.TopType = bidType.Nickname
+				}
+				biddingInfoRes := &InfoRes{
+					Name: bidType.Name,
+					Url:  bidType.Url,
+				}
+				_, data := elastic.GetWithCount("bidding", "bidding", "", b.GetSearchSql())
+				if data != nil {
+					biddingInfoRes.List = b.DataFormat(*data)
+					birt = append(birt, biddingInfoRes)
+				}
+			}
+			if b.IsWinner && b.IsBuyer {
+				//birt = append(birt, &InfoRes{
+				//	Name: "采购单位",
+				//	Url:  "/jyapp/tags/buyer/1.html",
+				//	List: b.GetEntInfoList(b.PageSize, 0),
+				//})
+				//birt = append(birt, &InfoRes{
+				//	Name: "中标企业",
+				//	Url:  "/jyapp/tags/winner/1.html",
+				//	List: b.GetEntInfoList(b.PageSize, 1),
+				//})
+			}
+			b, err := json.Marshal(birt)
+			if err == nil && len(b) > 0 {
+				if err := redis.PutBytes("seoCache", redisKey, &b, qu.IntAll(config.Seoconfig["biddingCacheTime"])+RandNum.Intn(randCount)); err != nil {
+					log.Println(err)
+				}
+			}
+		} else {
+			if len(currentLocation) > 0 {
+				redisCacheTime := qu.IntAll(config.Seoconfig["biddingCacheTime"])
+				start := time.Now()
+				if b.Keys != "" { // 标的物 一天更新一次
+					redisCacheTime = qu.IntAll(config.Seoconfig["cacheTime"])
+				}
+				count, data := elastic.GetWithCount("bidding", "bidding", "", b.GetSearchSql())
+				fmt.Println("GetWithCount", time.Since(start))
+				fmt.Println(" b.GetSearchSql()", b.GetSearchSql())
+				if count > 0 && data != nil {
+					if b.Total > int(count) {
+						b.Total = int(count)
+					}
+					formatData := b.DataFormat(*data)
+					for i := 0; i < (b.Total+b.PageSize-1)/b.PageSize; i++ {
+						var (
+							bir   []*InfoRes
+							start = i * b.PageSize
+							end   = (i + 1) * b.PageSize
+						)
+						if end > int(count) {
+							end = int(count)
+						}
+						bir = []*InfoRes{
+							{
+								Name: fmt.Sprintf("%s%s", currentLocation[0].Name, qu.If(types == "industry" && name != "all", "信息列表", "").(string)),
+								Url:  "", //currentLocation[0].url
+								List: formatData[start:end],
+							},
+						}
+						if i == b.PageNum-1 {
+							birt = bir
+						}
+						if len(bir) == 1 {
+							b, err := json.Marshal(bir)
+							if err == nil && len(b) > 0 {
+								if err = redis.PutBytes("seoCache", fmt.Sprintf(biddingListKey, types, name, i+1), &b, redisCacheTime+RandNum.Intn(randCount)); err != nil {
+									log.Println(err)
+								}
+							}
+						}
+					}
+					countByte, err := json.Marshal(b.Total)
+					if err == nil && len(countByte) > 0 {
+						if err = redis.PutBytes("seoCache", fmt.Sprintf(biddingListTotalKey, types, name), &countByte, redisCacheTime+RandNum.Intn(randCount)); err != nil {
+							log.Println("存缓存失败:", fmt.Sprintf(biddingListTotalKey, types, name), b.Total)
+						}
+					}
+
+				}
+
+			}
+		}
+	} else {
+		if b.Total != b.PageSize {
+			b.Total = redisCount
+		}
+	}
+	return
+}
+
+func (b *BiddingInfo) DataFormat(data []map[string]interface{}) (bList []*InfoList) {
+	if len(data) > 0 {
+		for _, v := range data {
+			bl := &InfoList{
+				Title:   qu.ObjToString(v["title"]),
+				Url:     fmt.Sprintf("/nologin/content/%s.html", encrypt.CommonEncodeArticle("content", qu.ObjToString(v["_id"]))),
+				Area:    qu.ObjToString(v["area"]),
+				Subtype: qu.ObjToString(v["subtype"]),
+				Site:    qu.If(qu.ObjToString(v["site"]) == "剑鱼信息发布平台", "用户发布", "").(string),
+			}
+			publishTime := v["publishtime"]
+			bl.PublishTime = date.FormatDateWithObj(&publishTime, date.Date_Short_Layout)
+			if subs := qu.InterfaceToStr(v["s_subscopeclass"]); subs != "" {
+				bl.Industry = strings.Split(strings.Split(subs, ",")[0], "_")[0]
+			}
+			if isValidFile, _ := v["isValidFile"].(bool); isValidFile {
+				bl.FileExists = true
+			}
+			if v["budget"] != nil {
+				bl.Price = ConversionMoney(v["budget"])
+			} else if v["bidamount"] != nil {
+				bl.Price = ConversionMoney(v["bidamount"])
+			}
+			bList = append(bList, bl)
+		}
+	}
+	return
+}
+
+// 金额转化   金额:0-万元以下单位为元  ,万元以上至亿元以下单位为万元 ,亿元以上单位为亿元。保留 小数点后 2 位,不进行四舍五入。
+func ConversionMoney(i_money interface{}) string {
+	if i_money == nil {
+		return ""
+	}
+	m := ""
+	if reflect.TypeOf(i_money).Name() == "float64" {
+		m = strconv.FormatFloat(qu.Float64All(i_money), 'f', -1, 64)
+	} else {
+		m = qu.ObjToString(i_money)
+	}
+	if m == "" {
+		return m
+	}
+	m_arr := strings.Split(m, ".")
+	m_1 := m_arr[0]
+	len_m1 := len([]rune(m_1))
+	if len_m1 >= 9 {
+		m = m_1[0:len_m1-8] + "." + m_1[len_m1-8:len_m1-6] + "亿元"
+	} else if len_m1 >= 5 {
+		m = m_1[0:len_m1-4] + "." + m_1[len_m1-4:len_m1-2] + "万元"
+	} else {
+		if len(m_arr) == 1 {
+			return m + ".00元"
+		}
+		m_2 := m_arr[1]
+		if len([]rune(m_2)) > 1 {
+			m_2 = m_2[0:2]
+		} else {
+			m_2 = m_2[0:1] + "0"
+		}
+		m = m_1 + "." + m_2 + "元"
+	}
+	return m
+}
+
+// -2 等待池已满
+// -1 超时
+// 1:可以执行查询
+func (r *ReqLimit) Limit(ctx context.Context) int {
+	ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
+	defer cancel()
+	select {
+	case <-r.WaitPool:
+		defer func() {
+			r.WaitPool <- struct{}{}
+		}()
+		select {
+		case <-r.DoPool:
+			return 1
+		case <-ctx.Done(): //超时
+			return -1
+		}
+	default:
+		return -2
+	}
+}
+
+func (r *ReqLimit) Release() {
+	r.DoPool <- struct{}{}
+}
+
+// PutListCache
+func PutListCache(redisKey string, redisTimeout int, list []*InfoList) {
+	b, err := json.Marshal(list)
+	if err == nil && len(b) > 0 {
+		if err := redis.PutBytes("seoCache", redisKey, &b, redisTimeout+RandNum.Intn(randCount)); err != nil {
+			log.Printf("1保存缓存 redis 异常 key:%s", redisKey)
+		}
+	} else {
+		log.Printf("2保存缓存 redis 异常 key:%s", redisKey)
+	}
+}
+
+// GetEntInfoList 采购单位列表/企业列表
+// pageNum:页码
+// identityType :0 采购单位 1 企业
+func (b *BiddingInfo) GetEntInfoList(limit, identityType int) (list []*InfoList) {
+	var (
+		redisKeyNum = ""
+		redisKey    = ""
+		pageNum     = b.PageNum
+		cachePage   int
+	)
+	if b.IsBuyer && b.IsWinner {
+		pageNum = 0
+		cachePage--
+	}
+	var rs *[]map[string]interface{}
+	switch identityType {
+	case 0:
+		redisKeyNum = fmt.Sprintf(buyerListRedisKey, pageNum)
+		redisKey = buyerListRedisKey
+	case 1:
+		redisKeyNum = fmt.Sprintf(winnerListRedisKey, pageNum)
+		redisKey = winnerListRedisKey
+	}
+	//查缓存
+	if data, err := GetListCache(redisKeyNum); err == nil && len(data) > 0 {
+		return data
+	}
+	// 查数据
+	start := time.Now()
+	switch identityType {
+	case 0:
+		rs = selectBuyerInfo(limit)
+	case 1:
+		rs = selectEntInfo(limit)
+	}
+	fmt.Println(identityType, "查询耗时", time.Since(start))
+	if rs == nil || len(*rs) == 0 {
+		return []*InfoList{}
+	}
+	var (
+		cacheList []*InfoList
+	)
+	for i := 0; i < len(*rs); i++ {
+		(*rs)[i]["id"] = encrypt.EncodeArticleId2ByCheck(qu.ObjToString((*rs)[i]["id"]))
+		infoList := &InfoList{Title: qu.ObjToString((*rs)[i]["name"])}
+		switch identityType {
+		case 0:
+			infoList.Url = fmt.Sprintf("/jyapp/big/page/unit_portrayal?entName=%s", qu.ObjToString((*rs)[i]["name"]))
+			infoList.Area = fmt.Sprintf("%s %s", qu.InterfaceToStr((*rs)[i]["province"]), qu.InterfaceToStr((*rs)[i]["city"]))
+			infoList.BuyerClass = qu.InterfaceToStr((*rs)[i]["buyerclass"])
+		case 1:
+			infoList.Url = fmt.Sprintf("/jyapp/big/page/ent_portrait?eId=%s", (*rs)[i]["id"])
+			capital := qu.Int64All((*rs)[i]["capital"])
+			if capital != 0 {
+				infoList.Price = ConversionMoney(float64(capital * 10000))
+			}
+			infoList.LegalPerson = qu.InterfaceToStr((*rs)[i]["legal_person"])
+			infoList.Address = qu.InterfaceToStr((*rs)[i]["address"])
+			if state := qu.InterfaceToStr((*rs)[i]["company_status"]); state != "" {
+				infoList.State = strings.Split(state, "(")[0]
+			}
+		}
+		if i >= (b.PageNum-1)*b.PageSize && i < b.PageNum*b.PageSize {
+			list = append(list, infoList)
+		}
+		cacheList = append(cacheList, infoList)
+		if len(cacheList) == b.PageSize || i == len(*rs)-1 {
+			cachePage++
+			PutListCache(fmt.Sprintf(redisKey, cachePage), qu.IntAll(config.Seoconfig["cacheTime"]), cacheList)
+			cacheList = []*InfoList{}
+		}
+	}
+	return list
+}
+
+func GetListCache(redisKey string) (list []*InfoList, err error) {
+	var b *[]byte
+	b, err = redis.GetBytes("seoCache", redisKey)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(*b, &list)
+	if err == nil {
+		return
+	}
+	return
+}
+
+// 获取最新的采购单位
+// limit: 数量
+func selectBuyerInfo(limit int) *[]map[string]interface{} {
+	t := time.Now()
+	defer func(time2 time.Time) {
+		fmt.Println("采购=========")
+		fmt.Println("耗时", time.Since(t))
+	}(t)
+	q := `SELECT c.name,c.company_id AS id,b. NAME AS buyerclass,p.area AS province,ca.city AS city
+          FROM (SELECT dfeb.NAME, dfeb.company_id, dfeb.area_code, dfeb.city_code, dfeb.name_id,dfet.labelvalues
+          FROM dws_f_ent_baseinfo dfeb INNER JOIN dws_f_ent_tags dfet
+                 ON (dfeb.identity_type &(1 << 0)) > 0 AND dfeb.name_id = dfet.name_id
+                ORDER BY dfeb.latest_time DESC LIMIT ?) c LEFT JOIN code_buyerclass b ON (b. CODE = c.labelvalues)
+                LEFT JOIN code_area p ON (p. CODE = c.area_code) LEFT JOIN code_area ca ON (ca. CODE = c.city_code)`
+	return public.GlobalCommonMysql.SelectBySql(q, limit)
+}
+
+// 获取最新的中标单位
+// limit: 数量
+func selectEntInfo(limit int) *[]map[string]interface{} {
+	t := time.Now()
+	defer func(time2 time.Time) {
+		fmt.Println("中标=========")
+		fmt.Println("耗时", time.Since(t))
+	}(t)
+	q := `  select c. name, c.company_id as id,c.address,cb.legal_person,cb.company_status,cb.capital  from ( SELECT
+	name, company_id,address
+	FROM
+	   dws_f_ent_baseinfo
+	WHERE   company_id!=''and
+	   (identity_type & (1 << 1)) > 0  order by latest_time desc
+	   LIMIT ?) c left join company_baseinfo cb on(cb.company_id=c.company_id) `
+	return public.GlobalCommonMysql.SelectBySql(q, limit)
+}
+
+// PutIndustryCache 存缓存
+func PutIndustryCache(redisKey string, redisTimeout int, data *IndustryStruct) {
+	b, err := json.Marshal(data)
+	if err != nil {
+		log.Printf("保存缓存 序列化异常,data:%s,err:%s\n", data, err.Error())
+		return
+	}
+	if err = redis.PutBytes("seoCache", redisKey, &b, redisTimeout+RandNum.Intn(randCount)); err != nil {
+		log.Printf("保存缓存 redis 异常,key:%s,err:%s\n", redisKey, err.Error())
+	}
+
+}
+
+// GetIndustryCache 取缓存
+func GetIndustryCache(redisKey string) (data *IndustryStruct, err error) {
+	redisByte, err := redis.GetBytes("seoCache", redisKey)
+	if err != nil || redisByte == nil || len(*redisByte) == 0 {
+		return data, err
+	}
+	err = json.Unmarshal(*redisByte, &data)
+	if err != nil {
+		log.Println(fmt.Sprintf("读取缓存 序列化异常,err:%s", err.Error()))
+		return data, err
+	}
+	return data, nil
+}
+
+// GetIndustryNav 招标导航 随机展示每个分类下 少于等于5个字的标的物 12个
+func GetIndustryNav(data *IndustryStruct) *IndustryStruct {
+	for i := 0; i < len(data.List); i++ {
+		tmpInduList := data.List[i].List
+		tmpList := []IndustryStruct{}
+		// 处理出每组少于等于5 个字的 标的物名称
+		for j := 0; j < len(tmpInduList); j++ {
+			if len([]rune(tmpInduList[j].Name)) <= 5 {
+				tmpList = append(tmpList, tmpInduList[j])
+			}
+		}
+		var randomList []IndustryStruct
+		if len(tmpList) <= 12 {
+			randomList = tmpList
+		} else {
+			// 随机出12个
+			indexMap := map[int]struct{}{}
+			for len(randomList) < 12 {
+				index := RandNum.Intn(len(tmpList))
+				if _, ok := indexMap[index]; !ok {
+					randomList = append(randomList, tmpList[index])
+					indexMap[index] = struct{}{}
+				}
+			}
+		}
+		data.List[i].List = randomList
+	}
+	return data
+}
+
+// 随机数
+func RandomNumberGenerator() *rand.Rand {
+	s1 := rand.NewSource(time.Now().UnixNano())
+	r1 := rand.New(s1)
+	return r1
+}
+
+type TdkStruct struct {
+	Title       string
+	Keywords    string
+	Description string
+}
+
+func GetTdk(types, name string) (tdk TdkStruct) {
+	title, keywords, description := defaultTitle, defaultKeywords, defaultDescription
+	switch types {
+	case Label["area"], Label["city"]: // 省份页面
+		title = fmt.Sprintf("%s免费招标信息_%s采购服务平台_%s中标公告-剑鱼标讯", name, name, name)
+		keywords = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", name, name, name, name, name)
+		description = fmt.Sprintf("剑鱼标讯%s专栏,提供%s免费招标信息、%s招标公告、%s中标公告和%s招标采购等内容,以及%s招标信息搜索查询、订阅推送和数据定制化服务,每天实时更新%s的招标信息,随时随地免费查看。", name, name, name, name, name, name, name)
+
+	case Label["infoType"]: // 信息类型页面
+		stypemp, _ := config.Seoconfig["stype"].(map[string]interface{})
+		if stypemp != nil {
+			stypemp1 := stypemp[name].(map[string]interface{})
+			if stypemp1 != nil {
+				//= stypemp1["NAME"].(string)
+				title = fmt.Sprintf("剑鱼标讯官网_%s", stypemp1["TITLE"].(string))
+				keywords = stypemp1["KEYWORDS"].(string)
+				description = stypemp1["DESCRIPTION"].(string)
+			}
+		}
+	case Label["industry"]: // 行业首页
+		area_name := fmt.Sprintf("全国%s", name)
+		if name == "" {
+			title = fmt.Sprintf("%s招标采购行业大全-剑鱼标讯", area_name)
+			keywords = fmt.Sprintf("%s招标采购分类,%s招标行业分类,%s招标采购行业,%s招标采购信息", area_name, area_name, area_name, area_name)
+			description = "剑鱼标讯提供全国各行各业的招标采购公告、预告、变更、中标等招标分类信息搜索、查看、发布服务。有详细的招标采购信息、政府采购信息、标书制作、招投标课程、企业合作需求等招标分类信息。借助高流量的主站使信息推广变得更加简单,快速,效率。"
+			break
+		}
+		// 行业标的物
+		title = fmt.Sprintf("%s免费招标信息_%s采购服务平台-剑鱼标讯", area_name, name)
+		keywords = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", area_name, area_name, area_name, area_name, area_name)
+		description = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", area_name, area_name, area_name, area_name, area_name)
+	}
+	tdk = TdkStruct{
+		Title:       title,
+		Keywords:    keywords,
+		Description: description,
+	}
+	return
+}

+ 235 - 136
src/jfw/modules/app/src/app/jyutil/util.go

@@ -1,183 +1,282 @@
 package jyutil
 
 import (
-    util "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jypkg/compatible"
-    "app.yhyue.com/moapp/jypkg/public"
-    "encoding/json"
-    . "jy/src/jfw/modules/app/src/jfw/config"
-    "reflect"
-    "regexp"
-    "sort"
-
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-    "fmt"
-    "sync"
-    "time"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jypkg/compatible"
+	"app.yhyue.com/moapp/jypkg/public"
+	"encoding/json"
+	. "jy/src/jfw/modules/app/src/jfw/config"
+	"log"
+	"net/http"
+	"reflect"
+	"regexp"
+	"sort"
+	"strconv"
+	"strings"
+
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"sync"
+	"time"
 )
 
 var Compatible = compatible.NewCompatible(&mongodb, public.BaseMysql, public.Mysql, Middleground)
 
 func init() {
-    VarOrderCode = &orderCode{
-        pool: make(chan string, 20),
-        all:  &sync.Map{},
-        lock: &sync.Mutex{},
-    }
-    VarOrderCode.gc()
-    for i := 0; i < 10; i++ {
-        go func() {
-            for {
-                o := fmt.Sprintf("%d%s", time.Now().Unix(), util.GetRandom(6))
-                VarOrderCode.lock.Lock()
-                if _, ok := VarOrderCode.all.Load(o); ok {
-                    VarOrderCode.lock.Unlock()
-                    continue
-                }
-                VarOrderCode.all.Store(o, time.Now().Day())
-                VarOrderCode.lock.Unlock()
-                VarOrderCode.pool <- o
-            }
-        }()
-    }
+	VarOrderCode = &orderCode{
+		pool: make(chan string, 20),
+		all:  &sync.Map{},
+		lock: &sync.Mutex{},
+	}
+	VarOrderCode.gc()
+	for i := 0; i < 10; i++ {
+		go func() {
+			for {
+				o := fmt.Sprintf("%d%s", time.Now().Unix(), util.GetRandom(6))
+				VarOrderCode.lock.Lock()
+				if _, ok := VarOrderCode.all.Load(o); ok {
+					VarOrderCode.lock.Unlock()
+					continue
+				}
+				VarOrderCode.all.Store(o, time.Now().Day())
+				VarOrderCode.lock.Unlock()
+				VarOrderCode.pool <- o
+			}
+		}()
+	}
 }
 
-//生成订单号
+// 生成订单号
 var VarOrderCode *orderCode
 
 type orderCode struct {
-    pool chan string
-    all  *sync.Map
-    lock *sync.Mutex
+	pool chan string
+	all  *sync.Map
+	lock *sync.Mutex
 }
 
 func (o *orderCode) gc() {
-    VarOrderCode.all.Range(func(key, value interface{}) bool {
-        if time.Now().Day() != value.(int) {
-            VarOrderCode.all.Delete(key)
-        }
-        return true
-    })
-    time.AfterFunc(24*time.Hour, o.gc)
+	VarOrderCode.all.Range(func(key, value interface{}) bool {
+		if time.Now().Day() != value.(int) {
+			VarOrderCode.all.Delete(key)
+		}
+		return true
+	})
+	time.AfterFunc(24*time.Hour, o.gc)
 }
 
-//创建订单号
+// 创建订单号
 func (o *orderCode) Get() string {
-    return <-VarOrderCode.pool
+	return <-VarOrderCode.pool
 }
 
 var IosReg = regexp.MustCompile(`\(i[^;]+;( U;)? CPU.+Mac OS X`)
 var IosIpadReg = regexp.MustCompile(`\(M[^;]+; Intel Mac OS X`)
 
 func IosExamInfo(a *xweb.Action, vip, ent bool) (bool, bool, bool, bool) {
-    if !IosReg.MatchString(a.Header("User-Agent")) && !IosIpadReg.MatchString(a.Header("User-Agent")) {
-        return false, false, false, false
-    }
-    iosExam, _ := Seoconfig["IosExam"].(map[string]interface{})
-    iosExam_flag, _ := iosExam["flag"].(bool)
-    //
-    iosExam_phone, _ := iosExam["phone"].(string)
-    isExamPhone := false
-    if phone, _ := a.GetSession("s_phone").(string); phone != "" && phone == iosExam_phone {
-        isExamPhone = true
-    }
-    //
-    isVip := false
-    isEnt := false
-    if iosExam_flag && (vip || ent) {
-        if userId, _ := a.GetSession("userId").(string); userId != "" {
-            user := Compatible.Select(  userId, `{"i_vip_status":1,"s_phone":1,"s_m_phone":1}`)
-            if user != nil {
-                i_vip_status := util.IntAll((*user)["i_vip_status"])
-                isVip = i_vip_status == 1 || i_vip_status == 2
-            }
-            s_phone, _ := (*user)["s_phone"].(string)
-            if s_phone == "" {
-                s_phone, _ = (*user)["s_m_phone"].(string)
-            }
-            if ent && public.Mysql.CountBySql(`select count(1) as count from entniche_info where phone=? and status=1`, s_phone) > 0 {
-                isEnt = true
-            }
-        }
-    }
-    return iosExam_flag, isExamPhone, isVip, isEnt
+	if !IosReg.MatchString(a.Header("User-Agent")) && !IosIpadReg.MatchString(a.Header("User-Agent")) {
+		return false, false, false, false
+	}
+	iosExam, _ := Seoconfig["IosExam"].(map[string]interface{})
+	iosExam_flag, _ := iosExam["flag"].(bool)
+	//
+	iosExam_phone, _ := iosExam["phone"].(string)
+	isExamPhone := false
+	if phone, _ := a.GetSession("s_phone").(string); phone != "" && phone == iosExam_phone {
+		isExamPhone = true
+	}
+	//
+	isVip := false
+	isEnt := false
+	if iosExam_flag && (vip || ent) {
+		if userId, _ := a.GetSession("userId").(string); userId != "" {
+			user := Compatible.Select(userId, `{"i_vip_status":1,"s_phone":1,"s_m_phone":1}`)
+			if user != nil {
+				i_vip_status := util.IntAll((*user)["i_vip_status"])
+				isVip = i_vip_status == 1 || i_vip_status == 2
+			}
+			s_phone, _ := (*user)["s_phone"].(string)
+			if s_phone == "" {
+				s_phone, _ = (*user)["s_m_phone"].(string)
+			}
+			if ent && public.Mysql.CountBySql(`select count(1) as count from entniche_info where phone=? and status=1`, s_phone) > 0 {
+				isEnt = true
+			}
+		}
+	}
+	return iosExam_flag, isExamPhone, isVip, isEnt
 }
 
 // 排序 排序键必须为数字类型
 type SortBy struct {
-    Data    []map[string]interface{}
-    Sortkey string
+	Data    []map[string]interface{}
+	Sortkey string
 }
 
 func (a SortBy) Len() int { return len(a.Data) }
 
 func (a SortBy) Swap(i, j int) {
-    a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
+	a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
 }
 
 func (a SortBy) Less(i, j int) bool {
-    //return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
-    m := a.Data[i][a.Sortkey]
-    n := a.Data[j][a.Sortkey]
-    w := reflect.ValueOf(m)
-    v := reflect.ValueOf(n)
-    switch v.Kind() {
-    case reflect.String:
-        return w.String() < v.String()
-    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-        return w.Int() < v.Int()
-    case reflect.Float64, reflect.Float32:
-        return w.Float() < v.Float()
-    default:
-        return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
-    }
+	//return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
+	m := a.Data[i][a.Sortkey]
+	n := a.Data[j][a.Sortkey]
+	w := reflect.ValueOf(m)
+	v := reflect.ValueOf(n)
+	switch v.Kind() {
+	case reflect.String:
+		return w.String() < v.String()
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		return w.Int() < v.Int()
+	case reflect.Float64, reflect.Float32:
+		return w.Float() < v.Float()
+	default:
+		return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
+	}
 }
 
 // ture  倒序3, 2, 1
-//fmt.Println(m)
+// fmt.Println(m)
 func SortData(data interface{}, sortkey string, reverse bool) {
-    //func SortData(data interface{}, sortkey string, reverse bool) {
-    var db []map[string]interface{}
-    err := Bind(data, &db)
-    if err != nil {
-        fmt.Println(err)
-        return
-    }
-    stb := SortBy{db, sortkey}
-    if !reverse {
-        sort.Sort(stb)
-    } else {
-        sort.Sort(sort.Reverse(stb))
-    }
-    err = Bind(stb.Data, data)
-    if err != nil {
-        fmt.Println(err)
-    }
+	//func SortData(data interface{}, sortkey string, reverse bool) {
+	var db []map[string]interface{}
+	err := Bind(data, &db)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	stb := SortBy{db, sortkey}
+	if !reverse {
+		sort.Sort(stb)
+	} else {
+		sort.Sort(sort.Reverse(stb))
+	}
+	err = Bind(stb.Data, data)
+	if err != nil {
+		fmt.Println(err)
+	}
 
 }
 
 // data 转换成ret
 func Bind(data interface{}, ret interface{}) error {
-    v := reflect.ValueOf(ret)
-    if v.Kind() != reflect.Ptr {
-        return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
-    }
-    havdata := false
-    var bk interface{}
-    if v.Elem().Kind() == reflect.Slice {
-        t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
-        bk = v.Elem().Interface()
-        v.Elem().Set(t)
-        havdata = true
-    }
-    _data, _ := json.MarshalIndent(data, "", "    ")
-    err := json.Unmarshal(_data, ret)
-    if err != nil {
-        fmt.Println(err)
-        if havdata {
-            v.Elem().Set(reflect.ValueOf(bk))
-        }
-        return err
-    }
-    return nil
+	v := reflect.ValueOf(ret)
+	if v.Kind() != reflect.Ptr {
+		return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
+	}
+	havdata := false
+	var bk interface{}
+	if v.Elem().Kind() == reflect.Slice {
+		t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
+		bk = v.Elem().Interface()
+		v.Elem().Set(t)
+		havdata = true
+	}
+	_data, _ := json.MarshalIndent(data, "", "    ")
+	err := json.Unmarshal(_data, ret)
+	if err != nil {
+		fmt.Println(err)
+		if havdata {
+			v.Elem().Set(reflect.ValueOf(bk))
+		}
+		return err
+	}
+	return nil
+}
+
+// AdInfo 广告信息
+type AdInfo struct {
+	S_link   string `json:"s_link"`   //广告位跳转链接
+	S_pic    string `json:"s_pic"`    //广告位弹窗
+	S_remark string `json:"s_remark"` //备注
+	S_picalt string `json:"s_picalt"` //图片ALT
+	S_id     string `json:"s_id"`     //广告标识id
+	O_extend struct {
+		Linktype  string `json:"linktype"`  //是否外部链接
+		Height    string `json:"height"`    //高度
+		Width     string `json:"width"`     //宽度
+		StartTime string `json:"startTime"` //开始时间
+		EndTime   string `json:"endTime"`   //结束时间
+		IosHref   string `json:"iosHref"`   //根据客户端不同 是否访问不同地址
+		Theme     string `json:"theme"`     // 主题样式
+		Title     string `json:"title"`     //标题
+		Power     string `json:"power"`     // 权限判断
+		Tab       string `json:"tab"`       // tab切换
+	} `json:"o_extend"` //拓展属性
+	S_script string `json:"s_script"` //脚本
+}
+
+// Handle 广告位信息处理
+func Handle(data []interface{}, host string) []AdInfo {
+	var res []AdInfo
+	if len(data) > 0 {
+		var AdinfoArr []AdInfo
+		bytes, err := json.Marshal(data)
+		if err != nil {
+			return res
+		}
+		if err := json.Unmarshal(bytes, &AdinfoArr); err == nil {
+			if len(AdinfoArr) > 0 {
+				now := time.Now()
+				for _, v := range AdinfoArr {
+					if v.S_id != "" && host != "" {
+						//根据不同环境区分广告位信息 v.S_id 填充内容, 例:app-i2;app-a1
+						if !strings.Contains(host, v.S_id) {
+							continue
+						}
+					}
+					if v.O_extend.StartTime != "" && len(strings.Split(v.O_extend.StartTime, "-")) == 6 {
+						if thisTime, err := time.ParseInLocation("2006-01-02-15-04-05", v.O_extend.StartTime, time.Local); err == nil {
+							//广告还未开始
+							if thisTime.Unix() > now.Unix() {
+								continue
+							}
+						}
+					}
+					if v.O_extend.EndTime != "" && len(strings.Split(v.O_extend.EndTime, "-")) == 6 {
+						if thisTime, err := time.ParseInLocation("2006-01-02-15-04-05", v.O_extend.EndTime, time.Local); err == nil {
+							//广告已经结束
+							if thisTime.Unix() < now.Unix() {
+								continue
+							}
+						}
+					}
+					res = append(res, v)
+				}
+			}
+		}
+	}
+	return res
+}
+
+func ChangeLoginCookie(timeOut int, w http.ResponseWriter, r *http.Request, name string) (c int) {
+	v, err := r.Cookie(name)
+	if err == nil {
+		c, _ = strconv.Atoi(v.Value)
+	} else {
+		hCookie := r.Header.Get("Cookie")
+		if hCookie != "" && strings.Contains(hCookie, name) {
+			for _, hc := range strings.Split(hCookie, ";") {
+				if len(strings.Split(hc, "=")) > 1 {
+					c, _ = strconv.Atoi(strings.Split(hc, "=")[1])
+					break
+				}
+			}
+		}
+	}
+	c++
+	log.Println(c, "-------------", err)
+	http.SetCookie(w, &http.Cookie{
+		Name:     name,
+		Value:    strconv.Itoa(c),
+		Path:     "/",
+		HttpOnly: false,
+		MaxAge:   timeOut,
+		Expires:  time.Now().Add(time.Duration(timeOut)),
+		Domain:   httpsession.Domain,
+	})
+	return
 }

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

@@ -1,11 +1,11 @@
 package tag
 
 import (
-	"jy/src/jfw/modules/app/src/jfw/config"
 	util "app.yhyue.com/moapp/jybase/common"
+	"jy/src/jfw/modules/app/src/jfw/config"
 )
 
-//自定义标签支持,读取配置文件
+// 自定义标签支持,读取配置文件
 func init() {
 	util.ReadConfig("./seo.json", &config.Seoconfig)
 	config.Seoconfig_Cdns, _ = config.Seoconfig["cdns"].(map[string]interface{})

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

@@ -1,6 +1,6 @@
 etcd:
   hosts:
-  - 127.0.0.1:2379
+  - 192.168.3.206:2379
 userCenterKey: "usercenter.rpc" #用户中台rpc
 powerCheckCenterKey: "powercheck.rpc" #权益校验中台
 entManageApplication: "entmanageapplication.rpc" #企业管理中台

+ 14 - 6
src/jfw/modules/app/src/db.json

@@ -20,7 +20,7 @@
 			"password": "jy@DevGroup"
 		},
 		"bidding": {
-			"address": "192.168.3.206:27001,192.168.3.206:27002",
+			"address": "192.168.3.206:27002",
 	 		"size": 5,
 	 		"dbName": "qfw_data",
 			"collection": "bidding",
@@ -31,8 +31,8 @@
 	},
 	"elasticsearch": {
 		"main": {
-			"address": "http://192.168.3.206:9800",
-	    	"size": 2,
+			"address": "http://192.168.3.241:9205,http://192.168.3.149:9200",
+      "size": 5,
 			"version": "v7",
 			"userName": "",
 			"password": ""
@@ -40,13 +40,13 @@
     },
   "redis": {
     "main":{
-      "address": "other=192.168.3.11:1712,push=192.168.3.206:1712,sso=192.168.3.206:1712,session=192.168.3.11:1713,recovery=192.168.3.206:1712,merge=192.168.3.206:1712,newother=192.168.3.206:1712"
+      "address": "other=192.168.3.11:1712,push=192.168.3.206:1712,sso=192.168.3.206:1712,session=192.168.3.11:1713,recovery=192.168.3.11:1712,merge=192.168.3.11:1712,newother=192.168.3.11:1712,seoCache=192.168.3.11:1712"
     }
     },
     "mysql": {
 	    "main": {
 	        "dbName": "jianyu",
-	        "address": "192.168.3.11:3366",
+	        "address": "192.168.3.149:3306",
 	        "userName": "root",
 	        "passWord": "Topnet123",
 			"maxOpenConns": 2,
@@ -59,6 +59,14 @@
 	        "passWord": "=PDT49#80Z!RVv52_z",
 	        "maxOpenConns": 5,
 	        "maxIdleConns": 5
-      	}
+      	},
+      "globalCommon": {
+        "dBName": "global_common_data",
+        "address": "192.168.3.217:4000",
+        "userName": "root",
+        "passWord": "=PDT49#80Z!RVv52_z",
+        "maxOpenConns": 5,
+        "maxIdleConns": 5
+      }
     }
 }

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

@@ -3,9 +3,9 @@ module jy/src/jfw/modules/app/src
 go 1.18
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
+	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230718012332-cd68eb58e825
+	app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/gogf/gf/v2 v2.3.1
@@ -135,7 +135,7 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
-	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e // indirect
+	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1 // indirect
 	k8s.io/api v0.26.3 // indirect
 	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
 	k8s.io/client-go v0.26.3 // indirect

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

@@ -5,12 +5,12 @@ app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547/go.mod h1:J
 app.yhyue.com/moapp/jyPoints v1.1.1/go.mod h1:SvP8p5L3jGrejHiH2LXfgCg/NPlFiKBC5Yd0gsI12FU=
 app.yhyue.com/moapp/jybase v0.0.0-20220427020729-974c1a148186/go.mod h1:qNRA0sHuYqcLoYoP8irpaWnW9YsXixe6obBIkwaXpD0=
 app.yhyue.com/moapp/jybase v0.0.0-20230117032034-ad7c00ffe11a/go.mod h1:zB47XTeJvpcbtBRYgkQuxOICWNexiZfbUO+7aUf6mNs=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b h1:Wtytm2QqQWtBV+see7t8ZTxnsCJaz5PGRqJXzwR6f7s=
-app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf h1:/Tk5haITmGc5c3/y6VxyycIy/LBWO7aYlxTiHKxmzv0=
+app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v0.0.0-20230718012332-cd68eb58e825 h1:C5sychvx6GFOlEx/KcOOqkD1FLDa/FDhMlRwIYTFBNE=
-app.yhyue.com/moapp/jypkg v0.0.0-20230718012332-cd68eb58e825/go.mod h1:xEZ6Ghkt9KcU7zBBqt6t03AkZjiQz1acyFL2WEIFGJs=
+app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0 h1:EC5n/8wE9PnSSZxTTuAjDngI9YC41MPsRShbI8Z8v8Y=
+app.yhyue.com/moapp/jypkg v0.0.0-20230802005656-6379ddc03ee0/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=
@@ -1421,8 +1421,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e h1:1O11hFuKvLD3Ls+9wxssUpMV3fG9qD4EfeeAy92dsWY=
-jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230630032508-eefb06a4588e/go.mod h1:wBxeFODhYtGenkxXJGThN/VrFaxPvvHMxzpS09pxApM=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1 h1:BItxi1gkQUs3sjxaBk6tc34fZWSO4hUSXcTM3PcnY4I=
+jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20230710093759-d9d6c68de8b1/go.mod h1:p/595fgbj4r6GhSJhHDpx3Ru1NkD5UASFL8OuIQw09E=
 k8s.io/api v0.22.9/go.mod h1:rcjO/FPOuvc3x7nQWx29UcDrFJMx82RxDob71ntNH4A=
 k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU=
 k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE=

+ 2785 - 101
src/jfw/modules/app/src/seo.json

@@ -1,105 +1,2789 @@
 {
-	"cdn":"http://web-jydev-ws.jianyu360.cn",
-	"cdns":{
-	 	"web-jydev-ws.jianyu360.cn":""
-	},
-    "qfw": {
-        "swordfish": {
-            "description": "剑鱼标讯为用户提供个性化定制的全行业招标信息订阅推送服务,用户只需微信关注剑鱼标讯并合理设定招标关键词,无需下载APP,即可实现海量招标信息智能推送。",
-            "key": "剑鱼标讯,招标订阅,招标推送,招标信息,招标公告,中标公告",
-            "title": "剑鱼标讯,全行业招标信息智能推送领导者!"
-        },
-		"swordfishsl": {
-            "description": "剑鱼标讯搜索功能依据用户输入的招标关键词,快速展现最新最全的行业招标信息搜索结果,招标公告与中标公告,一应俱全。",
-            "key": "招标搜索结果,招标搜索,剑鱼标讯",
-            "title": "招标搜索结果_剑鱼标讯,全行业招标信息智能推送领导者!"
+  "cdn": "http://web-jydev-ws.jianyu360.cn",
+  "cdns": {
+    "web-jydev-ws.jianyu360.cn": ""
+  },
+  "qfw": {
+    "swordfish": {
+      "description": "剑鱼标讯为用户提供个性化定制的全行业招标信息订阅推送服务,用户只需微信关注剑鱼标讯并合理设定招标关键词,无需下载APP,即可实现海量招标信息智能推送。",
+      "key": "剑鱼标讯,招标订阅,招标推送,招标信息,招标公告,中标公告",
+      "title": "剑鱼标讯,全行业招标信息智能推送领导者!"
+    },
+    "swordfishsl": {
+      "description": "剑鱼标讯搜索功能依据用户输入的招标关键词,快速展现最新最全的行业招标信息搜索结果,招标公告与中标公告,一应俱全。",
+      "key": "招标搜索结果,招标搜索,剑鱼标讯",
+      "title": "招标搜索结果_剑鱼标讯,全行业招标信息智能推送领导者!"
+    }
+  },
+  "version": "1444",
+  "mod_version": "5008",
+  "industry": {
+    "JZGC": {
+      "NAME": "建筑工程_勘察设计,建筑工程_工程施工,建筑工程_监理咨询,建筑工程_材料设备,建筑工程_机电安装",
+      "TITLE": "建筑工程_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "SLSD": {
+      "NAME": "水利水电_水利工程,水利水电_发电工程,水利水电_航运工程,水利水电_其他工程",
+      "TITLE": "水利水电_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "NYHG": {
+      "NAME": "能源化工_原材料,能源化工_仪器仪表,能源化工_新能源,能源化工_设备物资,能源化工_化工产品,能源化工_设备",
+      "TITLE": "能源化工_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "RDAF": {
+      "NAME": "弱电安防_综合布线,弱电安防_智能系统,弱电安防_智能家居",
+      "TITLE": "弱电安防_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "XXJS": {
+      "NAME": "信息技术_系统集成及安全,信息技术_软件开发,信息技术_运维服务,信息技术_其他",
+      "TITLE": "信息技术_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "XZBG": {
+      "NAME": "行政办公_办公家具,行政办公_通用办公设备,行政办公_专业设备,行政办公_办公用品,行政办公_生活用品",
+      "TITLE": "行政办公_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "JXSB": {
+      "NAME": "机械设备_矿山机械,机械设备_工程机械,机械设备_机械零部件,机械设备_机床相关,机械设备_车辆,机械设备_其他机械设备",
+      "TITLE": "机械设备_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "JTGC": {
+      "NAME": "交通工程_道路,交通工程_轨道,交通工程_桥梁,交通工程_隧道,交通工程_其他",
+      "TITLE": "交通工程_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "YLWS": {
+      "NAME": "医疗卫生_设备,医疗卫生_耗材,医疗卫生_药品",
+      "TITLE": "医疗卫生_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "SZSS": {
+      "NAME": "市政设施_道路,市政设施_绿化,市政设施_线路管网,市政设施_综合项目",
+      "TITLE": "市政设施_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "FWCG": {
+      "NAME": "服务采购_法律咨询,服务采购_会计,服务采购_物业,服务采购_审计,服务采购_安保,服务采购_仓储物流,服务采购_广告宣传印刷,服务采购_其他",
+      "TITLE": "服务采购_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    },
+    "NLMY": {
+      "NAME": "农林牧渔_生产物资,农林牧渔_生产设备,农林牧渔_相关服务",
+      "TITLE": "农林牧渔_剑鱼标讯,全行业招标信息智能推送领导者!",
+      "KEYWORDS": "",
+      "DESCRIPTION": ""
+    }
+  },
+  "jyDomain": "http://web-jydev-zxl.jianyu360.cn",
+  "ZBADDRESS": "https://res.jianyu360.com",
+  "IosExam": {
+    "flag": false,
+    "phone": "18613717801",
+    "adv": {
+      "jy-appsearch-home-top": [
+        {
+          "o_extend": {
+            "linktype": "",
+            "title": "使用帮助"
+          },
+          "s_link": "https://mp.weixin.qq.com/mp/homepage?__biz=MzIyNTM1NDUyNw==&hid=3&sn=badf2d7da08654c58b58169e773f58f0#wechat_redirect",
+          "s_pic": "https://web2-qmxtest.jianyu360.cn/upload/2020/05/22/20200522133112005m418U911.jpg"
         }
+      ]
+    }
+  },
+  "structedUploadA": "/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx",
+  "buryingPointUrl": "https://md.jianyu360.com",
+  "distance": "0",
+  "wxDomain": "http://web1-jydev-zxl.jianyu360.cn",
+  "jyadd": "https://web2-qmxtest.jydev.jianyu360.com/",
+  "hotArea": "北京,山东,陕西,江苏,广东",
+  "areaInfo": [
+    {
+      "华北": [
+        {
+          "Name": "北京"
+        },
+        {
+          "Name": "天津"
+        },
+        {
+          "Name": "河北"
+        },
+        {
+          "Name": "山西"
+        },
+        {
+          "Name": "内蒙古"
+        }
+      ]
+    },
+    {
+      "华中": [
+        {
+          "Name": "河南"
+        },
+        {
+          "Name": "湖北"
+        },
+        {
+          "Name": "湖南"
+        }
+      ]
+    },
+    {
+      "东北": [
+        {
+          "Name": "辽宁"
+        },
+        {
+          "Name": "吉林"
+        },
+        {
+          "Name": "黑龙江"
+        }
+      ]
+    },
+    {
+      "华东": [
+        {
+          "Name": "上海"
+        },
+        {
+          "Name": "江苏"
+        },
+        {
+          "Name": "浙江"
+        },
+        {
+          "Name": "安徽"
+        },
+        {
+          "Name": "福建"
+        },
+        {
+          "Name": "江西"
+        },
+        {
+          "Name": "山东"
+        }
+      ]
+    },
+    {
+      "华南": [
+        {
+          "Name": "广东"
+        },
+        {
+          "Name": "广西"
+        },
+        {
+          "Name": "海南"
+        }
+      ]
+    },
+    {
+      "西南": [
+        {
+          "Name": "重庆"
+        },
+        {
+          "Name": "四川"
+        },
+        {
+          "Name": "贵州"
+        },
+        {
+          "Name": "云南"
+        },
+        {
+          "Name": "西藏"
+        }
+      ]
+    },
+    {
+      "西北": [
+        {
+          "Name": "陕西"
+        },
+        {
+          "Name": "宁夏"
+        },
+        {
+          "Name": "甘肃"
+        },
+        {
+          "Name": "青海"
+        },
+        {
+          "Name": "新疆"
+        }
+      ]
+    }
+  ],
+  "executionNum": 4,
+  "awaitNum": 4,
+  "cacheTime": 86400,
+  "buyerListLimit": 5000,
+  "winnerListLimit": 5000,
+  "seoTotal": 5000,
+  "seoUnderlyingAssetsTotal": 100,
+  "seoSize": 25,
+  "biddingCacheTime": 43200,
+  "contentCache": 7200,
+  "stype": {
+    "NJXM": {
+      "NAME": "拟建",
+      "TITLE": "全国拟建项目信息",
+      "KEYWORDS": "拟建项目,拟在建项目,拟建项目网,拟建项目信息,剑鱼标讯",
+      "DESCRIPTION": "剑鱼标讯拟建项目专栏,包含国家发改委和各部委提供的尚处于前期立项、审批阶段的招投标项目,各供应商应在立项阶段就开始掌握最新的项目信息,做到早介入,早准备,稳拿单。"
+    },
+    "ZBYG": {
+      "NAME": "招标预告",
+      "TITLE": "全国招标预告信息",
+      "KEYWORDS": "招标预告,招标预告信息,招标预公告",
+      "DESCRIPTION": "剑鱼标讯招标预告栏目,每天发布国内最新的招标预告信息,提供各行业招标预告信息的搜索查询服务,不仅及时准确,而且更加专业。"
+    },
+    "ZBGG": {
+      "NAME": "招标公告",
+      "TITLE": "全国招标公告信息",
+      "KEYWORDS": "公开招标,公开招标信息,公开招标公告,公开招标网",
+      "DESCRIPTION": "剑鱼标讯公开招标栏目,提供国内各行业最新最全的公开招标信息,出色的搜索查询服务,可以让用户更加快速高效的获取想要的信息。"
+    },
+    "ZBJG": {
+      "NAME": "招标结果",
+      "TITLE": "全国招标结果信息",
+      "KEYWORDS": "公开招标,公开招标信息,公开招标公告,公开招标网",
+      "DESCRIPTION": "剑鱼标讯公开招标栏目,提供国内各行业最新最全的公开招标信息,出色的搜索查询服务,可以让用户更加快速高效的获取想要的信息。"
+    },
+    "ZBXYXX": {
+      "NAME": "招标信用信息",
+      "TITLE": "全国招标信用信息",
+      "KEYWORDS": "公开招标,公开招标信息,公开招标公告,公开招标网",
+      "DESCRIPTION": "剑鱼标讯公开招标栏目,提供国内各行业最新最全的公开招标信息,出色的搜索查询服务,可以让用户更加快速高效的获取想要的信息。"
+    }
+  },
+  "area": {
+    "AH": {
+      "NAME": "安徽",
+      "TITLE": "安徽",
+      "KEYWORDS": "安徽",
+      "DESCRIPTION": "安徽"
+    },
+    "AM": {
+      "NAME": "澳门",
+      "TITLE": "澳门",
+      "KEYWORDS": "澳门",
+      "DESCRIPTION": "澳门"
+    },
+    "BJ": {
+      "NAME": "北京",
+      "TITLE": "北京",
+      "KEYWORDS": "北京",
+      "DESCRIPTION": "北京"
+    },
+    "CQ": {
+      "NAME": "重庆",
+      "TITLE": "重庆",
+      "KEYWORDS": "重庆",
+      "DESCRIPTION": "重庆"
+    },
+    "FJ": {
+      "NAME": "福建",
+      "TITLE": "福建",
+      "KEYWORDS": "福建",
+      "DESCRIPTION": "福建"
+    },
+    "GD": {
+      "NAME": "广东",
+      "TITLE": "广东",
+      "KEYWORDS": "广东",
+      "DESCRIPTION": "广东"
+    },
+    "GX": {
+      "NAME": "广西",
+      "TITLE": "广西",
+      "KEYWORDS": "广西",
+      "DESCRIPTION": "广西"
+    },
+    "GZ": {
+      "NAME": "贵州",
+      "TITLE": "贵州",
+      "KEYWORDS": "贵州",
+      "DESCRIPTION": "贵州"
+    },
+    "GS": {
+      "NAME": "甘肃",
+      "TITLE": "甘肃",
+      "KEYWORDS": "甘肃",
+      "DESCRIPTION": "甘肃"
+    },
+    "HB": {
+      "NAME": "河北",
+      "TITLE": "河北",
+      "KEYWORDS": "河北",
+      "DESCRIPTION": "河北"
+    },
+    "HBC": {
+      "NAME": "湖北",
+      "TITLE": "湖北",
+      "KEYWORDS": "湖北",
+      "DESCRIPTION": "湖北"
+    },
+    "HLJ": {
+      "NAME": "黑龙江",
+      "TITLE": "黑龙江",
+      "KEYWORDS": "黑龙江",
+      "DESCRIPTION": "黑龙江"
+    },
+    "HN": {
+      "NAME": "海南",
+      "TITLE": "海南",
+      "KEYWORDS": "海南",
+      "DESCRIPTION": "海南"
+    },
+    "HNC": {
+      "NAME": "河南",
+      "TITLE": "河南",
+      "KEYWORDS": "河南",
+      "DESCRIPTION": "河南"
+    },
+    "HNS": {
+      "NAME": "湖南",
+      "TITLE": "湖南",
+      "KEYWORDS": "湖南",
+      "DESCRIPTION": "湖南"
+    },
+    "JL": {
+      "NAME": "吉林",
+      "TITLE": "吉林",
+      "KEYWORDS": "吉林",
+      "DESCRIPTION": "吉林"
+    },
+    "JS": {
+      "NAME": "江苏",
+      "TITLE": "江苏",
+      "KEYWORDS": "江苏",
+      "DESCRIPTION": "江苏"
+    },
+    "JX": {
+      "NAME": "江西",
+      "TITLE": "江西",
+      "KEYWORDS": "江西",
+      "DESCRIPTION": "江西"
+    },
+    "LN": {
+      "NAME": "辽宁",
+      "TITLE": "辽宁",
+      "KEYWORDS": "辽宁",
+      "DESCRIPTION": "辽宁"
+    },
+    "NMG": {
+      "NAME": "内蒙古",
+      "TITLE": "内蒙古",
+      "KEYWORDS": "内蒙古",
+      "DESCRIPTION": "内蒙古"
+    },
+    "NX": {
+      "NAME": "宁夏",
+      "TITLE": "宁夏",
+      "KEYWORDS": "宁夏",
+      "DESCRIPTION": "宁夏"
+    },
+    "QH": {
+      "NAME": "青海",
+      "TITLE": "青海",
+      "KEYWORDS": "青海",
+      "DESCRIPTION": "青海"
+    },
+    "SX": {
+      "NAME": "山西",
+      "TITLE": "山西",
+      "KEYWORDS": "山西",
+      "DESCRIPTION": "山西"
+    },
+    "SXC": {
+      "NAME": "陕西",
+      "TITLE": "陕西",
+      "KEYWORDS": "陕西",
+      "DESCRIPTION": "陕西"
+    },
+    "SH": {
+      "NAME": "上海",
+      "TITLE": "上海",
+      "KEYWORDS": "上海",
+      "DESCRIPTION": "上海"
+    },
+    "SD": {
+      "NAME": "山东",
+      "TITLE": "山东",
+      "KEYWORDS": "山东",
+      "DESCRIPTION": "山东"
+    },
+    "SC": {
+      "NAME": "四川",
+      "TITLE": "四川",
+      "KEYWORDS": "四川",
+      "DESCRIPTION": "四川"
+    },
+    "TJ": {
+      "NAME": "天津",
+      "TITLE": "天津",
+      "KEYWORDS": "天津",
+      "DESCRIPTION": "天津"
+    },
+    "XJ": {
+      "NAME": "新疆",
+      "TITLE": "新疆",
+      "KEYWORDS": "新疆",
+      "DESCRIPTION": "新疆"
+    },
+    "TW": {
+      "NAME": "台湾",
+      "TITLE": "台湾",
+      "KEYWORDS": "台湾",
+      "DESCRIPTION": "台湾"
+    },
+    "XZ": {
+      "NAME": "西藏",
+      "TITLE": "西藏",
+      "KEYWORDS": "西藏",
+      "DESCRIPTION": "西藏"
+    },
+    "XG": {
+      "NAME": "香港",
+      "TITLE": "香港",
+      "KEYWORDS": "香港",
+      "DESCRIPTION": "香港"
+    },
+    "YN": {
+      "NAME": "云南",
+      "TITLE": "云南",
+      "KEYWORDS": "云南",
+      "DESCRIPTION": "云南"
+    },
+    "ZJ": {
+      "NAME": "浙江",
+      "TITLE": "浙江",
+      "KEYWORDS": "浙江",
+      "DESCRIPTION": "浙江"
+    }
+  },
+  "city": {
+    "BJ_BJ": {
+      "NAME": "北京市",
+      "TITLE": "北京市",
+      "KEYWORDS": "北京市",
+      "DESCRIPTION": "北京市"
+    },
+    "TJ_TJ": {
+      "NAME": "天津市",
+      "TITLE": "天津市",
+      "KEYWORDS": "天津市",
+      "DESCRIPTION": "天津市"
+    },
+    "HB_SJZ": {
+      "NAME": "石家庄市",
+      "TITLE": "石家庄市",
+      "KEYWORDS": "石家庄市",
+      "DESCRIPTION": "石家庄市"
+    },
+    "HB_TS": {
+      "NAME": "唐山市",
+      "TITLE": "唐山市",
+      "KEYWORDS": "唐山市",
+      "DESCRIPTION": "唐山市"
+    },
+    "HB_QHD": {
+      "NAME": "秦皇岛市",
+      "TITLE": "秦皇岛市",
+      "KEYWORDS": "秦皇岛市",
+      "DESCRIPTION": "秦皇岛市"
+    },
+    "HB_HD": {
+      "NAME": "邯郸市",
+      "TITLE": "邯郸市",
+      "KEYWORDS": "邯郸市",
+      "DESCRIPTION": "邯郸市"
+    },
+    "HB_XT": {
+      "NAME": "邢台市",
+      "TITLE": "邢台市",
+      "KEYWORDS": "邢台市",
+      "DESCRIPTION": "邢台市"
+    },
+    "HB_BD": {
+      "NAME": "保定市",
+      "TITLE": "保定市",
+      "KEYWORDS": "保定市",
+      "DESCRIPTION": "保定市"
+    },
+    "HB_ZJK": {
+      "NAME": "张家口市",
+      "TITLE": "张家口市",
+      "KEYWORDS": "张家口市",
+      "DESCRIPTION": "张家口市"
+    },
+    "HB_CD": {
+      "NAME": "承德市",
+      "TITLE": "承德市",
+      "KEYWORDS": "承德市",
+      "DESCRIPTION": "承德市"
+    },
+    "HB_CZ": {
+      "NAME": "沧州市",
+      "TITLE": "沧州市",
+      "KEYWORDS": "沧州市",
+      "DESCRIPTION": "沧州市"
+    },
+    "HB_LF": {
+      "NAME": "廊坊市",
+      "TITLE": "廊坊市",
+      "KEYWORDS": "廊坊市",
+      "DESCRIPTION": "廊坊市"
+    },
+    "HB_HS": {
+      "NAME": "衡水市",
+      "TITLE": "衡水市",
+      "KEYWORDS": "衡水市",
+      "DESCRIPTION": "衡水市"
+    },
+    "SX_TY": {
+      "NAME": "太原市",
+      "TITLE": "太原市",
+      "KEYWORDS": "太原市",
+      "DESCRIPTION": "太原市"
+    },
+    "SX_DT": {
+      "NAME": "大同市",
+      "TITLE": "大同市",
+      "KEYWORDS": "大同市",
+      "DESCRIPTION": "大同市"
+    },
+    "SX_YQ": {
+      "NAME": "阳泉市",
+      "TITLE": "阳泉市",
+      "KEYWORDS": "阳泉市",
+      "DESCRIPTION": "阳泉市"
+    },
+    "SX_CZ": {
+      "NAME": "长治市",
+      "TITLE": "长治市",
+      "KEYWORDS": "长治市",
+      "DESCRIPTION": "长治市"
+    },
+    "SX_JC": {
+      "NAME": "晋城市",
+      "TITLE": "晋城市",
+      "KEYWORDS": "晋城市",
+      "DESCRIPTION": "晋城市"
+    },
+    "SX_SZ": {
+      "NAME": "朔州市",
+      "TITLE": "朔州市",
+      "KEYWORDS": "朔州市",
+      "DESCRIPTION": "朔州市"
+    },
+    "SX_HS": {
+      "NAME": "晋中市",
+      "TITLE": "晋中市",
+      "KEYWORDS": "晋中市",
+      "DESCRIPTION": "晋中市"
+    },
+    "SX_YC": {
+      "NAME": "运城市",
+      "TITLE": "运城市",
+      "KEYWORDS": "运城市",
+      "DESCRIPTION": "运城市"
+    },
+    "SX_XZ": {
+      "NAME": "忻州市",
+      "TITLE": "忻州市",
+      "KEYWORDS": "忻州市",
+      "DESCRIPTION": "忻州市"
+    },
+    "SX_LF": {
+      "NAME": "临汾市",
+      "TITLE": "临汾市",
+      "KEYWORDS": "临汾市",
+      "DESCRIPTION": "临汾市"
+    },
+    "SX_LL": {
+      "NAME": "吕梁市",
+      "TITLE": "吕梁市",
+      "KEYWORDS": "吕梁市",
+      "DESCRIPTION": "吕梁市"
+    },
+    "NMG_HHHT": {
+      "NAME": "呼和浩特市",
+      "TITLE": "呼和浩特市",
+      "KEYWORDS": "呼和浩特市",
+      "DESCRIPTION": "呼和浩特市"
+    },
+    "NMG_BT": {
+      "NAME": "包头市",
+      "TITLE": "包头市",
+      "KEYWORDS": "包头市",
+      "DESCRIPTION": "包头市"
+    },
+    "NMG_WH": {
+      "NAME": "乌海市",
+      "TITLE": "乌海市",
+      "KEYWORDS": "乌海市",
+      "DESCRIPTION": "乌海市"
+    },
+    "NMG_CF": {
+      "NAME": "赤峰市",
+      "TITLE": "赤峰市",
+      "KEYWORDS": "赤峰市",
+      "DESCRIPTION": "赤峰市"
+    },
+    "NMG_TL": {
+      "NAME": "通辽市",
+      "TITLE": "通辽市",
+      "KEYWORDS": "通辽市",
+      "DESCRIPTION": "通辽市"
+    },
+    "NMG_EEDS": {
+      "NAME": "鄂尔多斯市",
+      "TITLE": "鄂尔多斯市",
+      "KEYWORDS": "鄂尔多斯市",
+      "DESCRIPTION": "鄂尔多斯市"
+    },
+    "NMG_HLBE": {
+      "NAME": "呼伦贝尔市",
+      "TITLE": "呼伦贝尔市",
+      "KEYWORDS": "呼伦贝尔市",
+      "DESCRIPTION": "呼伦贝尔市"
+    },
+    "NMG_BYZE": {
+      "NAME": "巴彦淖尔市",
+      "TITLE": "巴彦淖尔市",
+      "KEYWORDS": "巴彦淖尔市",
+      "DESCRIPTION": "巴彦淖尔市"
+    },
+    "NMG_WBCB": {
+      "NAME": "乌兰察布市",
+      "TITLE": "乌兰察布市",
+      "KEYWORDS": "乌兰察布市",
+      "DESCRIPTION": "乌兰察布市"
+    },
+    "NMG_XAM": {
+      "NAME": "兴安盟",
+      "TITLE": "兴安盟",
+      "KEYWORDS": "兴安盟",
+      "DESCRIPTION": "兴安盟"
+    },
+    "NMG_XLGLM": {
+      "NAME": "锡林郭勒盟",
+      "TITLE": "锡林郭勒盟",
+      "KEYWORDS": "锡林郭勒盟",
+      "DESCRIPTION": "锡林郭勒盟"
+    },
+    "NMG_ALSM": {
+      "NAME": "阿拉善盟",
+      "TITLE": "阿拉善盟",
+      "KEYWORDS": "阿拉善盟",
+      "DESCRIPTION": "阿拉善盟"
+    },
+    "LN_SY": {
+      "NAME": "沈阳市",
+      "TITLE": "沈阳市",
+      "KEYWORDS": "沈阳市",
+      "DESCRIPTION": "沈阳市"
+    },
+    "LN_DL": {
+      "NAME": "大连市",
+      "TITLE": "大连市",
+      "KEYWORDS": "大连市",
+      "DESCRIPTION": "大连市"
+    },
+    "LN_AS": {
+      "NAME": "鞍山市",
+      "TITLE": "鞍山市",
+      "KEYWORDS": "鞍山市",
+      "DESCRIPTION": "鞍山市"
+    },
+    "LN_BX": {
+      "NAME": "本溪市",
+      "TITLE": "本溪市",
+      "KEYWORDS": "本溪市",
+      "DESCRIPTION": "本溪市"
+    },
+    "LN_FS": {
+      "NAME": "抚顺市",
+      "TITLE": "抚顺市",
+      "KEYWORDS": "抚顺市",
+      "DESCRIPTION": "抚顺市"
+    },
+    "LN_DD": {
+      "NAME": "丹东市",
+      "TITLE": "丹东市",
+      "KEYWORDS": "丹东市",
+      "DESCRIPTION": "丹东市"
+    },
+    "LN_JZ": {
+      "NAME": "锦州市",
+      "TITLE": "锦州市",
+      "KEYWORDS": "锦州市",
+      "DESCRIPTION": "锦州市"
+    },
+    "LN_YK": {
+      "NAME": "营口市",
+      "TITLE": "营口市",
+      "KEYWORDS": "营口市",
+      "DESCRIPTION": "营口市"
+    },
+    "LN_FX": {
+      "NAME": "阜新市",
+      "TITLE": "阜新市",
+      "KEYWORDS": "阜新市",
+      "DESCRIPTION": "阜新市"
+    },
+    "LN_LY": {
+      "NAME": "辽阳市",
+      "TITLE": "辽阳市",
+      "KEYWORDS": "辽阳市",
+      "DESCRIPTION": "辽阳市"
+    },
+    "LN_PJ": {
+      "NAME": "盘锦市",
+      "TITLE": "盘锦市",
+      "KEYWORDS": "盘锦市",
+      "DESCRIPTION": "盘锦市"
+    },
+    "LN_TL": {
+      "NAME": "铁岭市",
+      "TITLE": "铁岭市",
+      "KEYWORDS": "铁岭市",
+      "DESCRIPTION": "铁岭市"
+    },
+    "LN_CY": {
+      "NAME": "朝阳市",
+      "TITLE": "朝阳市",
+      "KEYWORDS": "朝阳市",
+      "DESCRIPTION": "朝阳市"
+    },
+    "LN_HLD": {
+      "NAME": "葫芦岛市",
+      "TITLE": "葫芦岛市",
+      "KEYWORDS": "葫芦岛市",
+      "DESCRIPTION": "葫芦岛市"
+    },
+    "JL_CC": {
+      "NAME": "长春市",
+      "TITLE": "长春市",
+      "KEYWORDS": "长春市",
+      "DESCRIPTION": "长春市"
+    },
+    "JL_JL": {
+      "NAME": "吉林市",
+      "TITLE": "吉林市",
+      "KEYWORDS": "吉林市",
+      "DESCRIPTION": "吉林市"
+    },
+    "JL_SP": {
+      "NAME": "四平市",
+      "TITLE": "四平市",
+      "KEYWORDS": "四平市",
+      "DESCRIPTION": "四平市"
+    },
+    "JL_LY": {
+      "NAME": "辽源市",
+      "TITLE": "辽源市",
+      "KEYWORDS": "辽源市",
+      "DESCRIPTION": "辽源市"
+    },
+    "JL_TH": {
+      "NAME": "通化市",
+      "TITLE": "通化市",
+      "KEYWORDS": "通化市",
+      "DESCRIPTION": "通化市"
+    },
+    "JL_BS": {
+      "NAME": "白山市",
+      "TITLE": "白山市",
+      "KEYWORDS": "白山市",
+      "DESCRIPTION": "白山市"
+    },
+    "JL_SY": {
+      "NAME": "松原市",
+      "TITLE": "松原市",
+      "KEYWORDS": "松原市",
+      "DESCRIPTION": "松原市"
+    },
+    "JL_BC": {
+      "NAME": "白城市",
+      "TITLE": "白城市",
+      "KEYWORDS": "白城市",
+      "DESCRIPTION": "白城市"
+    },
+    "JL_YBCXZZZZ": {
+      "NAME": "延边朝鲜族自治州",
+      "TITLE": "延边朝鲜族自治州",
+      "KEYWORDS": "延边朝鲜族自治州",
+      "DESCRIPTION": "延边朝鲜族自治州"
+    },
+    "HLJ_HEB": {
+      "NAME": "哈尔滨市",
+      "TITLE": "哈尔滨市",
+      "KEYWORDS": "哈尔滨市",
+      "DESCRIPTION": "哈尔滨市"
+    },
+    "HLJ_QQHE": {
+      "NAME": "齐齐哈尔市",
+      "TITLE": "齐齐哈尔市",
+      "KEYWORDS": "齐齐哈尔市",
+      "DESCRIPTION": "齐齐哈尔市"
+    },
+    "HLJ_JX": {
+      "NAME": "鸡西市",
+      "TITLE": "鸡西市",
+      "KEYWORDS": "鸡西市",
+      "DESCRIPTION": "鸡西市"
+    },
+    "HLJ_HG": {
+      "NAME": "鹤岗市",
+      "TITLE": "鹤岗市",
+      "KEYWORDS": "鹤岗市",
+      "DESCRIPTION": "鹤岗市"
+    },
+    "HLG_SYS": {
+      "NAME": "双鸭山市",
+      "TITLE": "双鸭山市",
+      "KEYWORDS": "双鸭山市",
+      "DESCRIPTION": "双鸭山市",
+      "PARENT": "HLJ"
+
+    },
+    "HLG_DQ": {
+      "NAME": "大庆市",
+      "TITLE": "大庆市",
+      "KEYWORDS": "大庆市",
+      "DESCRIPTION": "大庆市",
+      "PARENT": "HLJ"
+    },
+    "HLG_YC": {
+      "NAME": "伊春市",
+      "TITLE": "伊春市",
+      "KEYWORDS": "伊春市",
+      "DESCRIPTION": "伊春市",
+      "PARENT": "HLJ"
+    },
+    "HLG_JMS": {
+      "NAME": "佳木斯市",
+      "TITLE": "佳木斯市",
+      "KEYWORDS": "佳木斯市",
+      "DESCRIPTION": "佳木斯市",
+      "PARENT": "HLJ"
+    },
+    "HLG_QTH": {
+      "NAME": "七台河市",
+      "TITLE": "七台河市",
+      "KEYWORDS": "七台河市",
+      "DESCRIPTION": "七台河市",
+      "PARENT": "HLJ"
+    },
+    "HLG_DDJ": {
+      "NAME": "牡丹江市",
+      "TITLE": "牡丹江市",
+      "KEYWORDS": "牡丹江市",
+      "DESCRIPTION": "牡丹江市",
+      "PARENT": "HLJ"
+    },
+    "HLG_HH": {
+      "NAME": "黑河市",
+      "TITLE": "黑河市",
+      "KEYWORDS": "黑河市",
+      "DESCRIPTION": "黑河市",
+      "PARENT": "HLJ"
+    },
+    "HLG_SH": {
+      "NAME": "绥化市",
+      "TITLE": "绥化市",
+      "KEYWORDS": "绥化市",
+      "DESCRIPTION": "绥化市",
+      "PARENT": "HLJ"
+    },
+    "HLG_DXALDQ": {
+      "NAME": "大兴安岭地区",
+      "TITLE": "大兴安岭地区",
+      "KEYWORDS": "大兴安岭地区",
+      "DESCRIPTION": "大兴安岭地区",
+      "PARENT": "HLJ"
+    },
+    "SH_SH": {
+      "NAME": "上海市",
+      "TITLE": "上海市",
+      "KEYWORDS": "上海市",
+      "DESCRIPTION": "上海市"
+    },
+    "JS_NJ": {
+      "NAME": "南京市",
+      "TITLE": "南京市",
+      "KEYWORDS": "南京市",
+      "DESCRIPTION": "南京市"
+    },
+    "JS_WX": {
+      "NAME": "无锡市",
+      "TITLE": "无锡市",
+      "KEYWORDS": "无锡市",
+      "DESCRIPTION": "无锡市"
+    },
+    "JS_XZ": {
+      "NAME": "徐州市",
+      "TITLE": "徐州市",
+      "KEYWORDS": "徐州市",
+      "DESCRIPTION": "徐州市"
+    },
+    "JS_CZ": {
+      "NAME": "常州市",
+      "TITLE": "常州市",
+      "KEYWORDS": "常州市",
+      "DESCRIPTION": "常州市"
+    },
+    "JS_SZ": {
+      "NAME": "苏州市",
+      "TITLE": "苏州市",
+      "KEYWORDS": "苏州市",
+      "DESCRIPTION": "苏州市"
+    },
+    "JS_NT": {
+      "NAME": "南通市",
+      "TITLE": "南通市",
+      "KEYWORDS": "南通市",
+      "DESCRIPTION": "南通市"
+    },
+    "JS_LYG": {
+      "NAME": "连云港市",
+      "TITLE": "连云港市",
+      "KEYWORDS": "连云港市",
+      "DESCRIPTION": "连云港市"
+    },
+    "JS_HA": {
+      "NAME": "淮安市",
+      "TITLE": "淮安市",
+      "KEYWORDS": "淮安市",
+      "DESCRIPTION": "淮安市"
+    },
+    "JS_YC": {
+      "NAME": "盐城市",
+      "TITLE": "盐城市",
+      "KEYWORDS": "盐城市",
+      "DESCRIPTION": "盐城市"
+    },
+    "JS_YZ": {
+      "NAME": "扬州市",
+      "TITLE": "扬州市",
+      "KEYWORDS": "扬州市",
+      "DESCRIPTION": "扬州市"
+    },
+    "JZ_ZJ": {
+      "NAME": "镇江市",
+      "TITLE": "镇江市",
+      "KEYWORDS": "镇江市",
+      "DESCRIPTION": "镇江市",
+      "PARENT": "JS"
+    },
+    "JS_TZ": {
+      "NAME": "泰州市",
+      "TITLE": "泰州市",
+      "KEYWORDS": "泰州市",
+      "DESCRIPTION": "泰州市"
+    },
+    "JS_SQ": {
+      "NAME": "宿迁市",
+      "TITLE": "宿迁市",
+      "KEYWORDS": "宿迁市",
+      "DESCRIPTION": "宿迁市"
+    },
+    "ZJ_HZ": {
+      "NAME": "杭州市",
+      "TITLE": "杭州市",
+      "KEYWORDS": "杭州市",
+      "DESCRIPTION": "杭州市"
+    },
+    "ZJ_NB": {
+      "NAME": "宁波市",
+      "TITLE": "宁波市",
+      "KEYWORDS": "宁波市",
+      "DESCRIPTION": "宁波市"
+    },
+    "ZJ_WZ": {
+      "NAME": "温州市",
+      "TITLE": "温州市",
+      "KEYWORDS": "温州市",
+      "DESCRIPTION": "温州市"
+    },
+    "ZJ_JX": {
+      "NAME": "嘉兴市",
+      "TITLE": "嘉兴市",
+      "KEYWORDS": "嘉兴市",
+      "DESCRIPTION": "嘉兴市"
+    },
+    "JZ_HZ": {
+      "NAME": "湖州市",
+      "TITLE": "湖州市",
+      "KEYWORDS": "湖州市",
+      "DESCRIPTION": "湖州市",
+      "PARENT": "ZJ"
+    },
+    "JZ_SX": {
+      "NAME": "绍兴市",
+      "TITLE": "绍兴市",
+      "KEYWORDS": "绍兴市",
+      "DESCRIPTION": "绍兴市",
+      "PARENT": "ZJ"
+    },
+    "JZ_JH": {
+      "NAME": "金华市",
+      "TITLE": "金华市",
+      "KEYWORDS": "金华市",
+      "DESCRIPTION": "金华市",
+      "PARENT": "ZJ"
+    },
+    "JZ_QZ": {
+      "NAME": "衢州市",
+      "TITLE": "衢州市",
+      "KEYWORDS": "衢州市",
+      "DESCRIPTION": "衢州市",
+      "PARENT": "ZJ"
+    },
+    "ZJ_ZS": {
+      "NAME": "舟山市",
+      "TITLE": "舟山市",
+      "KEYWORDS": "舟山市",
+      "DESCRIPTION": "舟山市"
+    },
+    "ZJ_TZ": {
+      "NAME": "台州市",
+      "TITLE": "台州市",
+      "KEYWORDS": "台州市",
+      "DESCRIPTION": "台州市"
+    },
+    "ZJ_LS": {
+      "NAME": "丽水市",
+      "TITLE": "丽水市",
+      "KEYWORDS": "丽水市",
+      "DESCRIPTION": "丽水市"
+    },
+    "AH_HF": {
+      "NAME": "合肥市",
+      "TITLE": "合肥市",
+      "KEYWORDS": "合肥市",
+      "DESCRIPTION": "合肥市"
+    },
+    "AH_WH": {
+      "NAME": "芜湖市",
+      "TITLE": "芜湖市",
+      "KEYWORDS": "芜湖市",
+      "DESCRIPTION": "芜湖市"
+    },
+    "AH_BB": {
+      "NAME": "蚌埠市",
+      "TITLE": "蚌埠市",
+      "KEYWORDS": "蚌埠市",
+      "DESCRIPTION": "蚌埠市"
+    },
+    "AH_HN": {
+      "NAME": "淮南市",
+      "TITLE": "淮南市",
+      "KEYWORDS": "淮南市",
+      "DESCRIPTION": "淮南市"
+    },
+    "AH_MAS": {
+      "NAME": "马鞍山市",
+      "TITLE": "马鞍山市",
+      "KEYWORDS": "马鞍山市",
+      "DESCRIPTION": "马鞍山市"
+    },
+    "AH_HB": {
+      "NAME": "淮北市",
+      "TITLE": "淮北市",
+      "KEYWORDS": "淮北市",
+      "DESCRIPTION": "淮北市"
+    },
+    "AH_TL": {
+      "NAME": "铜陵市",
+      "TITLE": "铜陵市",
+      "KEYWORDS": "铜陵市",
+      "DESCRIPTION": "铜陵市"
+    },
+    "AH_AQ": {
+      "NAME": "安庆市",
+      "TITLE": "安庆市",
+      "KEYWORDS": "安庆市",
+      "DESCRIPTION": "安庆市"
+    },
+    "AH_HS": {
+      "NAME": "黄山市",
+      "TITLE": "黄山市",
+      "KEYWORDS": "黄山市",
+      "DESCRIPTION": "黄山市"
+    },
+    "AH_CZ": {
+      "NAME": "滁州市",
+      "TITLE": "滁州市",
+      "KEYWORDS": "滁州市",
+      "DESCRIPTION": "滁州市"
+    },
+    "AH_FY": {
+      "NAME": "阜阳市",
+      "TITLE": "阜阳市",
+      "KEYWORDS": "阜阳市",
+      "DESCRIPTION": "阜阳市"
+    },
+    "AH_SZ": {
+      "NAME": "宿州市",
+      "TITLE": "宿州市",
+      "KEYWORDS": "宿州市",
+      "DESCRIPTION": "宿州市"
+    },
+    "AH_LA": {
+      "NAME": "六安市",
+      "TITLE": "六安市",
+      "KEYWORDS": "六安市",
+      "DESCRIPTION": "六安市"
+    },
+    "AH_HZ": {
+      "NAME": "亳州市",
+      "TITLE": "亳州市",
+      "KEYWORDS": "亳州市",
+      "DESCRIPTION": "亳州市"
+    },
+    "AH_CH": {
+      "NAME": "池州市",
+      "TITLE": "池州市",
+      "KEYWORDS": "池州市",
+      "DESCRIPTION": "池州市"
+    },
+    "AH_XC": {
+      "NAME": "宣城市",
+      "TITLE": "宣城市",
+      "KEYWORDS": "宣城市",
+      "DESCRIPTION": "宣城市"
+    },
+    "AH_FZ": {
+      "NAME": "福州市",
+      "TITLE": "福州市",
+      "KEYWORDS": "福州市",
+      "DESCRIPTION": "福州市",
+      "PARENT": "FJ"
+    },
+    "XM_XM": {
+      "NAME": "厦门市",
+      "TITLE": "厦门市",
+      "KEYWORDS": "厦门市",
+      "DESCRIPTION": "厦门市",
+      "PARENT": "FJ"
+    },
+    "FJ_PT": {
+      "NAME": "莆田市",
+      "TITLE": "莆田市",
+      "KEYWORDS": "莆田市",
+      "DESCRIPTION": "莆田市"
+    },
+    "FJ_SM": {
+      "NAME": "三明市",
+      "TITLE": "三明市",
+      "KEYWORDS": "三明市",
+      "DESCRIPTION": "三明市"
+    },
+    "FJ_QZ": {
+      "NAME": "泉州市",
+      "TITLE": "泉州市",
+      "KEYWORDS": "泉州市",
+      "DESCRIPTION": "泉州市"
+    },
+    "FJ_ZZ": {
+      "NAME": "漳州市",
+      "TITLE": "漳州市",
+      "KEYWORDS": "漳州市",
+      "DESCRIPTION": "漳州市"
+    },
+    "FJ_NP": {
+      "NAME": "南平市",
+      "TITLE": "南平市",
+      "KEYWORDS": "南平市",
+      "DESCRIPTION": "南平市"
+    },
+    "FJ_LY": {
+      "NAME": "龙岩市",
+      "TITLE": "龙岩市",
+      "KEYWORDS": "龙岩市",
+      "DESCRIPTION": "龙岩市"
+    },
+    "FJ_ND": {
+      "NAME": "宁德市",
+      "TITLE": "宁德市",
+      "KEYWORDS": "宁德市",
+      "DESCRIPTION": "宁德市"
+    },
+    "JX_NC": {
+      "NAME": "南昌市",
+      "TITLE": "南昌市",
+      "KEYWORDS": "南昌市",
+      "DESCRIPTION": "南昌市"
+    },
+    "JX_JDZ": {
+      "NAME": "景德镇市",
+      "TITLE": "景德镇市",
+      "KEYWORDS": "景德镇市",
+      "DESCRIPTION": "景德镇市"
+    },
+    "JX_PX": {
+      "NAME": "萍乡市",
+      "TITLE": "萍乡市",
+      "KEYWORDS": "萍乡市",
+      "DESCRIPTION": "萍乡市"
+    },
+    "JX_JJ": {
+      "NAME": "九江市",
+      "TITLE": "九江市",
+      "KEYWORDS": "九江市",
+      "DESCRIPTION": "九江市"
+    },
+    "JX_XY": {
+      "NAME": "新余市",
+      "TITLE": "新余市",
+      "KEYWORDS": "新余市",
+      "DESCRIPTION": "新余市"
+    },
+    "JX_YT": {
+      "NAME": "鹰潭市",
+      "TITLE": "鹰潭市",
+      "KEYWORDS": "鹰潭市",
+      "DESCRIPTION": "鹰潭市"
+    },
+    "JX_GZ": {
+      "NAME": "赣州市",
+      "TITLE": "赣州市",
+      "KEYWORDS": "赣州市",
+      "DESCRIPTION": "赣州市"
+    },
+    "JX_JA": {
+      "NAME": "吉安市",
+      "TITLE": "吉安市",
+      "KEYWORDS": "吉安市",
+      "DESCRIPTION": "吉安市"
+    },
+    "JX_YC": {
+      "NAME": "宜春市",
+      "TITLE": "宜春市",
+      "KEYWORDS": "宜春市",
+      "DESCRIPTION": "宜春市"
+    },
+    "JX_FZ": {
+      "NAME": "抚州市",
+      "TITLE": "抚州市",
+      "KEYWORDS": "抚州市",
+      "DESCRIPTION": "抚州市"
+    },
+    "JX_SR": {
+      "NAME": "上饶市",
+      "TITLE": "上饶市",
+      "KEYWORDS": "上饶市",
+      "DESCRIPTION": "上饶市"
+    },
+    "SD_JN": {
+      "NAME": "济南市",
+      "TITLE": "济南市",
+      "KEYWORDS": "济南市",
+      "DESCRIPTION": "济南市"
+    },
+    "SD_QD": {
+      "NAME": "青岛市",
+      "TITLE": "青岛市",
+      "KEYWORDS": "青岛市",
+      "DESCRIPTION": "青岛市"
+    },
+    "SD_ZB": {
+      "NAME": "淄博市",
+      "TITLE": "淄博市",
+      "KEYWORDS": "淄博市",
+      "DESCRIPTION": "淄博市"
+    },
+    "SD_ZZ": {
+      "NAME": "枣庄市",
+      "TITLE": "枣庄市",
+      "KEYWORDS": "枣庄市",
+      "DESCRIPTION": "枣庄市"
+    },
+    "SD_DY": {
+      "NAME": "东营市",
+      "TITLE": "东营市",
+      "KEYWORDS": "东营市",
+      "DESCRIPTION": "东营市"
+    },
+    "SD_YT": {
+      "NAME": "烟台市",
+      "TITLE": "烟台市",
+      "KEYWORDS": "烟台市",
+      "DESCRIPTION": "烟台市"
+    },
+    "SD_WF": {
+      "NAME": "潍坊市",
+      "TITLE": "潍坊市",
+      "KEYWORDS": "潍坊市",
+      "DESCRIPTION": "潍坊市"
+    },
+    "SD_JNS": {
+      "NAME": "济宁市",
+      "TITLE": "济宁市",
+      "KEYWORDS": "济宁市",
+      "DESCRIPTION": "济宁市"
+    },
+    "SD_TA": {
+      "NAME": "泰安市",
+      "TITLE": "泰安市",
+      "KEYWORDS": "泰安市",
+      "DESCRIPTION": "泰安市"
+    },
+    "SD_WH": {
+      "NAME": "威海市",
+      "TITLE": "威海市",
+      "KEYWORDS": "威海市",
+      "DESCRIPTION": "威海市"
+    },
+    "SD_RZ": {
+      "NAME": "日照市",
+      "TITLE": "日照市",
+      "KEYWORDS": "日照市",
+      "DESCRIPTION": "日照市"
+    },
+    "SD_LY": {
+      "NAME": "临沂市",
+      "TITLE": "临沂市",
+      "KEYWORDS": "临沂市",
+      "DESCRIPTION": "临沂市"
+    },
+    "SD_DZ": {
+      "NAME": "德州市",
+      "TITLE": "德州市",
+      "KEYWORDS": "德州市",
+      "DESCRIPTION": "德州市"
+    },
+    "SD_LC": {
+      "NAME": "聊城市",
+      "TITLE": "聊城市",
+      "KEYWORDS": "聊城市",
+      "DESCRIPTION": "聊城市"
+    },
+    "SD_BZ": {
+      "NAME": "滨州市",
+      "TITLE": "滨州市",
+      "KEYWORDS": "滨州市",
+      "DESCRIPTION": "滨州市"
+    },
+    "SD_HZ": {
+      "NAME": "菏泽市",
+      "TITLE": "菏泽市",
+      "KEYWORDS": "菏泽市",
+      "DESCRIPTION": "菏泽市"
+    },
+    "HN_ZZ": {
+      "NAME": "郑州市",
+      "TITLE": "郑州市",
+      "KEYWORDS": "郑州市",
+      "DESCRIPTION": "郑州市",
+      "PARENT": "HNC"
+    },
+    "HN_KF": {
+      "NAME": "开封市",
+      "TITLE": "开封市",
+      "KEYWORDS": "开封市",
+      "DESCRIPTION": "开封市",
+      "PARENT": "HNC"
+    },
+    "HN_LY": {
+      "NAME": "洛阳市",
+      "TITLE": "洛阳市",
+      "KEYWORDS": "洛阳市",
+      "DESCRIPTION": "洛阳市",
+      "PARENT": "HNC"
+    },
+    "HN_PDS": {
+      "NAME": "平顶山市",
+      "TITLE": "平顶山市",
+      "KEYWORDS": "平顶山市",
+      "DESCRIPTION": "平顶山市",
+      "PARENT": "HNC"
+    },
+    "HN_AY": {
+      "NAME": "安阳市",
+      "TITLE": "安阳市",
+      "KEYWORDS": "安阳市",
+      "DESCRIPTION": "安阳市",
+      "PARENT": "HNC"
+    },
+    "HN_HB": {
+      "NAME": "鹤壁市",
+      "TITLE": "鹤壁市",
+      "KEYWORDS": "鹤壁市",
+      "DESCRIPTION": "鹤壁市",
+      "PARENT": "HNC"
+    },
+    "HN_XX": {
+      "NAME": "新乡市",
+      "TITLE": "新乡市",
+      "KEYWORDS": "新乡市",
+      "DESCRIPTION": "新乡市",
+      "PARENT": "HNC"
+    },
+    "HN_JZ": {
+      "NAME": "焦作市",
+      "TITLE": "焦作市",
+      "KEYWORDS": "焦作市",
+      "DESCRIPTION": "焦作市",
+      "PARENT": "HNC"
+    },
+    "HN_PY": {
+      "NAME": "濮阳市",
+      "TITLE": "濮阳市",
+      "KEYWORDS": "濮阳市",
+      "DESCRIPTION": "濮阳市",
+      "PARENT": "HNC"
+    },
+    "HN_XC": {
+      "NAME": "许昌市",
+      "TITLE": "许昌市",
+      "KEYWORDS": "许昌市",
+      "DESCRIPTION": "许昌市",
+      "PARENT": "HNC"
+    },
+    "HN_LH": {
+      "NAME": "漯河市",
+      "TITLE": "漯河市",
+      "KEYWORDS": "漯河市",
+      "DESCRIPTION": "漯河市",
+      "PARENT": "HNC"
+    },
+    "HN_SMX": {
+      "NAME": "三门峡市",
+      "TITLE": "三门峡市",
+      "KEYWORDS": "三门峡市",
+      "DESCRIPTION": "三门峡市",
+      "PARENT": "HNC"
+    },
+    "HN_NY": {
+      "NAME": "南阳市",
+      "TITLE": "南阳市",
+      "KEYWORDS": "南阳市",
+      "DESCRIPTION": "南阳市",
+      "PARENT": "HNC"
+    },
+    "HN_SQ": {
+      "NAME": "商丘市",
+      "TITLE": "商丘市",
+      "KEYWORDS": "商丘市",
+      "DESCRIPTION": "商丘市",
+      "PARENT": "HNC"
+    },
+    "HN_XY": {
+      "NAME": "信阳市",
+      "TITLE": "信阳市",
+      "KEYWORDS": "信阳市",
+      "DESCRIPTION": "信阳市",
+      "PARENT": "HNC"
+    },
+    "HN_ZK": {
+      "NAME": "周口市",
+      "TITLE": "周口市",
+      "KEYWORDS": "周口市",
+      "DESCRIPTION": "周口市",
+      "PARENT": "HNC"
+    },
+    "HN_ZMD": {
+      "NAME": "驻马店市",
+      "TITLE": "驻马店市",
+      "KEYWORDS": "驻马店市",
+      "DESCRIPTION": "驻马店市",
+      "PARENT": "HNC"
+    },
+    "HN_JY": {
+      "NAME": "济源市",
+      "TITLE": "济源市",
+      "KEYWORDS": "济源市",
+      "DESCRIPTION": "济源市",
+      "PARENT": "HNC"
+    },
+    "HB_WH": {
+      "NAME": "武汉市",
+      "TITLE": "武汉市",
+      "KEYWORDS": "武汉市",
+      "DESCRIPTION": "武汉市",
+      "PARENT": "HBC"
+    },
+    "HB_HSS": {
+      "NAME": "黄石市",
+      "TITLE": "黄石市",
+      "KEYWORDS": "黄石市",
+      "DESCRIPTION": "黄石市",
+      "PARENT": "HBC"
+    },
+    "HB_SY": {
+      "NAME": "十堰市",
+      "TITLE": "十堰市",
+      "KEYWORDS": "十堰市",
+      "DESCRIPTION": "十堰市",
+      "PARENT": "HBC"
+    },
+    "HB_YC": {
+      "NAME": "宜昌市",
+      "TITLE": "宜昌市",
+      "KEYWORDS": "宜昌市",
+      "DESCRIPTION": "宜昌市",
+      "PARENT": "HBC"
+    },
+    "HB_XY": {
+      "NAME": "襄阳市",
+      "TITLE": "襄阳市",
+      "KEYWORDS": "襄阳市",
+      "DESCRIPTION": "襄阳市",
+      "PARENT": "HBC"
+    },
+    "HB_EZ": {
+      "NAME": "鄂州市",
+      "TITLE": "鄂州市",
+      "KEYWORDS": "鄂州市",
+      "DESCRIPTION": "鄂州市",
+      "PARENT": "HBC"
+    },
+    "HB_JM": {
+      "NAME": "荆门市",
+      "TITLE": "荆门市",
+      "KEYWORDS": "荆门市",
+      "DESCRIPTION": "荆门市",
+      "PARENT": "HBC"
+    },
+    "HB_XG": {
+      "NAME": "孝感市",
+      "TITLE": "孝感市",
+      "KEYWORDS": "孝感市",
+      "DESCRIPTION": "孝感市",
+      "PARENT": "HBC"
+    },
+    "HB_JZ": {
+      "NAME": "荆州市",
+      "TITLE": "荆州市",
+      "KEYWORDS": "荆州市",
+      "DESCRIPTION": "荆州市",
+      "PARENT": "HBC"
+    },
+    "HB_HG": {
+      "NAME": "黄冈市",
+      "TITLE": "黄冈市",
+      "KEYWORDS": "黄冈市",
+      "DESCRIPTION": "黄冈市",
+      "PARENT": "HBC"
+    },
+    "HB_XN": {
+      "NAME": "咸宁市",
+      "TITLE": "咸宁市",
+      "KEYWORDS": "咸宁市",
+      "DESCRIPTION": "咸宁市",
+      "PARENT": "HBC"
+    },
+    "HB_SZ": {
+      "NAME": "随州市",
+      "TITLE": "随州市",
+      "KEYWORDS": "随州市",
+      "DESCRIPTION": "随州市",
+      "PARENT": "HBC"
+    },
+    "HB_SNTJZMZZZZ": {
+      "NAME": "恩施土家族苗族自治州",
+      "TITLE": "恩施土家族苗族自治州",
+      "KEYWORDS": "恩施土家族苗族自治州",
+      "DESCRIPTION": "恩施土家族苗族自治州",
+      "PARENT": "HBC"
+    },
+    "HB_XTS": {
+      "NAME": "仙桃市",
+      "TITLE": "仙桃市",
+      "KEYWORDS": "仙桃市",
+      "DESCRIPTION": "仙桃市",
+      "PARENT": "HBC"
+    },
+    "HB_QJ": {
+      "NAME": "潜江市",
+      "TITLE": "潜江市",
+      "KEYWORDS": "潜江市",
+      "DESCRIPTION": "潜江市",
+      "PARENT": "HBC"
+    },
+    "HB_TM": {
+      "NAME": "天门市",
+      "TITLE": "天门市",
+      "KEYWORDS": "天门市",
+      "DESCRIPTION": "天门市",
+      "PARENT": "HBC"
+    },
+    "HB_SNJLQ": {
+      "NAME": "神农架林区",
+      "TITLE": "神农架林区",
+      "KEYWORDS": "神农架林区",
+      "DESCRIPTION": "神农架林区",
+      "PARENT": "HBC"
+    },
+    "HN_CS": {
+      "NAME": "长沙市",
+      "TITLE": "长沙市",
+      "KEYWORDS": "长沙市",
+      "DESCRIPTION": "长沙市",
+      "PARENT": "HNS",
+      "PARENT": "HNS"
+    },
+    "HN_ZZS": {
+      "NAME": "株洲市",
+      "TITLE": "株洲市",
+      "KEYWORDS": "株洲市",
+      "DESCRIPTION": "株洲市",
+      "PARENT": "HNS"
+    },
+    "HN_XT": {
+      "NAME": "湘潭市",
+      "TITLE": "湘潭市",
+      "KEYWORDS": "湘潭市",
+      "DESCRIPTION": "湘潭市",
+      "PARENT": "HNS"
+    },
+    "HN_HY": {
+      "NAME": "衡阳市",
+      "TITLE": "衡阳市",
+      "KEYWORDS": "衡阳市",
+      "DESCRIPTION": "衡阳市",
+      "PARENT": "HNS"
+    },
+    "HN_SY": {
+      "NAME": "邵阳市",
+      "TITLE": "邵阳市",
+      "KEYWORDS": "邵阳市",
+      "DESCRIPTION": "邵阳市",
+      "PARENT": "HNS"
+    },
+    "HN_YY": {
+      "NAME": "岳阳市",
+      "TITLE": "岳阳市",
+      "KEYWORDS": "岳阳市",
+      "DESCRIPTION": "岳阳市",
+      "PARENT": "HNS"
+    },
+    "HN_CD": {
+      "NAME": "常德市",
+      "TITLE": "常德市",
+      "KEYWORDS": "常德市",
+      "DESCRIPTION": "常德市",
+      "PARENT": "HNS"
+    },
+    "HN_ZJJ": {
+      "NAME": "张家界市",
+      "TITLE": "张家界市",
+      "KEYWORDS": "张家界市",
+      "DESCRIPTION": "张家界市",
+      "PARENT": "HNS"
+    },
+    "HN_YYS": {
+      "NAME": "益阳市",
+      "TITLE": "益阳市",
+      "KEYWORDS": "益阳市",
+      "DESCRIPTION": "益阳市",
+      "PARENT": "HNS"
+    },
+    "HN_CZ": {
+      "NAME": "郴州市",
+      "TITLE": "郴州市",
+      "KEYWORDS": "郴州市",
+      "DESCRIPTION": "郴州市",
+      "PARENT": "HNS"
+    },
+    "HN_YZ": {
+      "NAME": "永州市",
+      "TITLE": "永州市",
+      "KEYWORDS": "永州市",
+      "DESCRIPTION": "永州市",
+      "PARENT": "HNS"
+    },
+    "HN_HH": {
+      "NAME": "怀化市",
+      "TITLE": "怀化市",
+      "KEYWORDS": "怀化市",
+      "DESCRIPTION": "怀化市",
+      "PARENT": "HNS"
+    },
+    "HN_LD": {
+      "NAME": "娄底市",
+      "TITLE": "娄底市",
+      "KEYWORDS": "娄底市",
+      "DESCRIPTION": "娄底市",
+      "PARENT": "HNS"
+    },
+    "HN_XXTJZMZZZZ": {
+      "NAME": "湘西土家族苗族自治州",
+      "TITLE": "湘西土家族苗族自治州",
+      "KEYWORDS": "湘西土家族苗族自治州",
+      "DESCRIPTION": "湘西土家族苗族自治州",
+      "PARENT": "HNS"
+    },
+    "GD_ST": {
+      "NAME": "汕头市",
+      "TITLE": "汕头市",
+      "KEYWORDS": "汕头市",
+      "DESCRIPTION": "汕头市"
+    },
+    "GD_GZ": {
+      "NAME": "广州市",
+      "TITLE": "广州市",
+      "KEYWORDS": "广州市",
+      "DESCRIPTION": "广州市"
+    },
+    "GD_SG": {
+      "NAME": "韶关市",
+      "TITLE": "韶关市",
+      "KEYWORDS": "韶关市",
+      "DESCRIPTION": "韶关市"
+    },
+    "GD_SZ": {
+      "NAME": "深圳市",
+      "TITLE": "深圳市",
+      "KEYWORDS": "深圳市",
+      "DESCRIPTION": "深圳市"
+    },
+    "GD_ZH": {
+      "NAME": "珠海市",
+      "TITLE": "珠海市",
+      "KEYWORDS": "珠海市",
+      "DESCRIPTION": "珠海市"
+    },
+    "GD_FS": {
+      "NAME": "佛山市",
+      "TITLE": "佛山市",
+      "KEYWORDS": "佛山市",
+      "DESCRIPTION": "佛山市"
+    },
+    "GD_JM": {
+      "NAME": "江门市",
+      "TITLE": "江门市",
+      "KEYWORDS": "江门市",
+      "DESCRIPTION": "江门市"
+    },
+    "GD_ZJ": {
+      "NAME": "湛江市",
+      "TITLE": "湛江市",
+      "KEYWORDS": "湛江市",
+      "DESCRIPTION": "湛江市"
+    },
+    "GD_MM": {
+      "NAME": "茂名市",
+      "TITLE": "茂名市",
+      "KEYWORDS": "茂名市",
+      "DESCRIPTION": "茂名市"
+    },
+    "GD_ZQ": {
+      "NAME": "肇庆市",
+      "TITLE": "肇庆市",
+      "KEYWORDS": "肇庆市",
+      "DESCRIPTION": "肇庆市"
+    },
+    "GD_HZ": {
+      "NAME": "惠州市",
+      "TITLE": "惠州市",
+      "KEYWORDS": "惠州市",
+      "DESCRIPTION": "惠州市"
+    },
+    "GD_MZ": {
+      "NAME": "梅州市",
+      "TITLE": "梅州市",
+      "KEYWORDS": "梅州市",
+      "DESCRIPTION": "梅州市"
+    },
+    "GD_SW": {
+      "NAME": "汕尾市",
+      "TITLE": "汕尾市",
+      "KEYWORDS": "汕尾市",
+      "DESCRIPTION": "汕尾市"
+    },
+    "GD_HY": {
+      "NAME": "河源市",
+      "TITLE": "河源市",
+      "KEYWORDS": "河源市",
+      "DESCRIPTION": "河源市"
+    },
+    "GD_YJ": {
+      "NAME": "阳江市",
+      "TITLE": "阳江市",
+      "KEYWORDS": "阳江市",
+      "DESCRIPTION": "阳江市"
+    },
+    "GD_QY": {
+      "NAME": "清远市",
+      "TITLE": "清远市",
+      "KEYWORDS": "清远市",
+      "DESCRIPTION": "清远市"
+    },
+    "GD_DG": {
+      "NAME": "东莞市",
+      "TITLE": "东莞市",
+      "KEYWORDS": "东莞市",
+      "DESCRIPTION": "东莞市"
+    },
+    "GD_ZS": {
+      "NAME": "中山市",
+      "TITLE": "中山市",
+      "KEYWORDS": "中山市",
+      "DESCRIPTION": "中山市"
+    },
+    "GD_CZ": {
+      "NAME": "潮州市",
+      "TITLE": "潮州市",
+      "KEYWORDS": "潮州市",
+      "DESCRIPTION": "潮州市"
+    },
+    "GD_JY": {
+      "NAME": "揭阳市",
+      "TITLE": "揭阳市",
+      "KEYWORDS": "揭阳市",
+      "DESCRIPTION": "揭阳市"
+    },
+    "GD_YF": {
+      "NAME": "云浮市",
+      "TITLE": "云浮市",
+      "KEYWORDS": "云浮市",
+      "DESCRIPTION": "云浮市"
+    },
+    "GX_NN": {
+      "NAME": "南宁市",
+      "TITLE": "南宁市",
+      "KEYWORDS": "南宁市",
+      "DESCRIPTION": "南宁市"
+    },
+    "GX_LZ": {
+      "NAME": "柳州市",
+      "TITLE": "柳州市",
+      "KEYWORDS": "柳州市",
+      "DESCRIPTION": "柳州市"
+    },
+    "GX_GL": {
+      "NAME": "桂林市",
+      "TITLE": "桂林市",
+      "KEYWORDS": "桂林市",
+      "DESCRIPTION": "桂林市"
+    },
+    "GX_WZ": {
+      "NAME": "梧州市",
+      "TITLE": "梧州市",
+      "KEYWORDS": "梧州市",
+      "DESCRIPTION": "梧州市"
+    },
+    "GX_BH": {
+      "NAME": "北海市",
+      "TITLE": "北海市",
+      "KEYWORDS": "北海市",
+      "DESCRIPTION": "北海市"
+    },
+    "GX_FCG": {
+      "NAME": "防城港市",
+      "TITLE": "防城港市",
+      "KEYWORDS": "防城港市",
+      "DESCRIPTION": "防城港市"
+    },
+    "GX_QZ": {
+      "NAME": "钦州市",
+      "TITLE": "钦州市",
+      "KEYWORDS": "钦州市",
+      "DESCRIPTION": "钦州市"
+    },
+    "GX_GG": {
+      "NAME": "贵港市",
+      "TITLE": "贵港市",
+      "KEYWORDS": "贵港市",
+      "DESCRIPTION": "贵港市"
+    },
+    "GX_YL": {
+      "NAME": "玉林市",
+      "TITLE": "玉林市",
+      "KEYWORDS": "玉林市",
+      "DESCRIPTION": "玉林市"
+    },
+    "GX_BS": {
+      "NAME": "百色市",
+      "TITLE": "百色市",
+      "KEYWORDS": "百色市",
+      "DESCRIPTION": "百色市"
+    },
+    "GX_HZ": {
+      "NAME": "贺州市",
+      "TITLE": "贺州市",
+      "KEYWORDS": "贺州市",
+      "DESCRIPTION": "贺州市"
+    },
+    "GX_HC": {
+      "NAME": "河池市",
+      "TITLE": "河池市",
+      "KEYWORDS": "河池市",
+      "DESCRIPTION": "河池市"
+    },
+    "GX_LB": {
+      "NAME": "来宾市",
+      "TITLE": "来宾市",
+      "KEYWORDS": "来宾市",
+      "DESCRIPTION": "来宾市"
+    },
+    "GX_CZ": {
+      "NAME": "崇左市",
+      "TITLE": "崇左市",
+      "KEYWORDS": "崇左市",
+      "DESCRIPTION": "崇左市"
+    },
+    "HN_HK": {
+      "NAME": "海口市",
+      "TITLE": "海口市",
+      "KEYWORDS": "海口市",
+      "DESCRIPTION": "海口市"
+    },
+    "HN_SYS": {
+      "NAME": "三亚市",
+      "TITLE": "三亚市",
+      "KEYWORDS": "三亚市",
+      "DESCRIPTION": "三亚市"
+    },
+    "HN_SS": {
+      "NAME": "三沙市",
+      "TITLE": "三沙市",
+      "KEYWORDS": "三沙市",
+      "DESCRIPTION": "三沙市"
+    },
+    "HN_DZ": {
+      "NAME": "儋州市",
+      "TITLE": "儋州市",
+      "KEYWORDS": "儋州市",
+      "DESCRIPTION": "儋州市"
+    },
+    "HN_WZZ": {
+      "NAME": "五指山市",
+      "TITLE": "五指山市",
+      "KEYWORDS": "五指山市",
+      "DESCRIPTION": "五指山市"
+    },
+    "HN_QH": {
+      "NAME": "琼海市",
+      "TITLE": "琼海市",
+      "KEYWORDS": "琼海市",
+      "DESCRIPTION": "琼海市"
+    },
+    "HN_WC": {
+      "NAME": "文昌市",
+      "TITLE": "文昌市",
+      "KEYWORDS": "文昌市",
+      "DESCRIPTION": "文昌市"
+    },
+    "HN_WN": {
+      "NAME": "万宁市",
+      "TITLE": "万宁市",
+      "KEYWORDS": "万宁市",
+      "DESCRIPTION": "万宁市"
+    },
+    "HN_DF": {
+      "NAME": "东方市",
+      "TITLE": "东方市",
+      "KEYWORDS": "东方市",
+      "DESCRIPTION": "东方市"
+    },
+    "HN_DAX": {
+      "NAME": "定安县",
+      "TITLE": "定安县",
+      "KEYWORDS": "定安县",
+      "DESCRIPTION": "定安县"
+    },
+    "HN_TCX": {
+      "NAME": "屯昌县",
+      "TITLE": "屯昌县",
+      "KEYWORDS": "屯昌县",
+      "DESCRIPTION": "屯昌县"
+    },
+    "HN_CMX": {
+      "NAME": "澄迈县",
+      "TITLE": "澄迈县",
+      "KEYWORDS": "澄迈县",
+      "DESCRIPTION": "澄迈县"
+    },
+    "HN_LGX": {
+      "NAME": "临高县",
+      "TITLE": "临高县",
+      "KEYWORDS": "临高县",
+      "DESCRIPTION": "临高县"
+    },
+    "HN_BSLZZZX": {
+      "NAME": "白沙黎族自治县",
+      "TITLE": "白沙黎族自治县",
+      "KEYWORDS": "白沙黎族自治县",
+      "DESCRIPTION": "白沙黎族自治县"
+    },
+    "HN_CJLZZZX": {
+      "NAME": "昌江黎族自治县",
+      "TITLE": "昌江黎族自治县",
+      "KEYWORDS": "昌江黎族自治县",
+      "DESCRIPTION": "昌江黎族自治县"
+    },
+    "HN_LDLZZZX": {
+      "NAME": "乐东黎族自治县",
+      "TITLE": "乐东黎族自治县",
+      "KEYWORDS": "乐东黎族自治县",
+      "DESCRIPTION": "乐东黎族自治县"
+    },
+    "HN_LSLZZZX": {
+      "NAME": "陵水黎族自治县",
+      "TITLE": "陵水黎族自治县",
+      "KEYWORDS": "陵水黎族自治县",
+      "DESCRIPTION": "陵水黎族自治县"
+    },
+    "HN_BTLZMZZZX": {
+      "NAME": "保亭黎族苗族自治县",
+      "TITLE": "保亭黎族苗族自治县",
+      "KEYWORDS": "保亭黎族苗族自治县",
+      "DESCRIPTION": "保亭黎族苗族自治县"
+    },
+    "HN_QZLZMZZZX": {
+      "NAME": "琼中黎族苗族自治县",
+      "TITLE": "琼中黎族苗族自治县",
+      "KEYWORDS": "琼中黎族苗族自治县",
+      "DESCRIPTION": "琼中黎族苗族自治县"
+    },
+    "CQ_CQ": {
+      "NAME": "重庆市",
+      "TITLE": "重庆市",
+      "KEYWORDS": "重庆市",
+      "DESCRIPTION": "重庆市"
+    },
+    "SC_CD": {
+      "NAME": "成都市",
+      "TITLE": "成都市",
+      "KEYWORDS": "成都市",
+      "DESCRIPTION": "成都市"
+    },
+    "SC_ZG": {
+      "NAME": "自贡市",
+      "TITLE": "自贡市",
+      "KEYWORDS": "自贡市",
+      "DESCRIPTION": "自贡市"
+    },
+    "SC_PZH": {
+      "NAME": "攀枝花市",
+      "TITLE": "攀枝花市",
+      "KEYWORDS": "攀枝花市",
+      "DESCRIPTION": "攀枝花市"
+    },
+    "SC_LZ": {
+      "NAME": "泸州市",
+      "TITLE": "泸州市",
+      "KEYWORDS": "泸州市",
+      "DESCRIPTION": "泸州市"
+    },
+    "SC_DY": {
+      "NAME": "德阳市",
+      "TITLE": "德阳市",
+      "KEYWORDS": "德阳市",
+      "DESCRIPTION": "德阳市"
+    },
+    "SC_MY": {
+      "NAME": "绵阳市",
+      "TITLE": "绵阳市",
+      "KEYWORDS": "绵阳市",
+      "DESCRIPTION": "绵阳市"
+    },
+    "SC_GY": {
+      "NAME": "广元市",
+      "TITLE": "广元市",
+      "KEYWORDS": "广元市",
+      "DESCRIPTION": "广元市"
+    },
+    "SC_SN": {
+      "NAME": "遂宁市",
+      "TITLE": "遂宁市",
+      "KEYWORDS": "遂宁市",
+      "DESCRIPTION": "遂宁市"
+    },
+    "SC_NJ": {
+      "NAME": "内江市",
+      "TITLE": "内江市",
+      "KEYWORDS": "内江市",
+      "DESCRIPTION": "内江市"
+    },
+    "SC_LS": {
+      "NAME": "乐山市",
+      "TITLE": "乐山市",
+      "KEYWORDS": "乐山市",
+      "DESCRIPTION": "乐山市"
+    },
+    "SC_NC": {
+      "NAME": "南充市",
+      "TITLE": "南充市",
+      "KEYWORDS": "南充市",
+      "DESCRIPTION": "南充市"
+    },
+    "SC_MS": {
+      "NAME": "眉山市",
+      "TITLE": "眉山市",
+      "KEYWORDS": "眉山市",
+      "DESCRIPTION": "眉山市"
+    },
+    "SC_YB": {
+      "NAME": "宜宾市",
+      "TITLE": "宜宾市",
+      "KEYWORDS": "宜宾市",
+      "DESCRIPTION": "宜宾市"
+    },
+    "SC_GA": {
+      "NAME": "广安市",
+      "TITLE": "广安市",
+      "KEYWORDS": "广安市",
+      "DESCRIPTION": "广安市"
+    },
+    "SC_DZ": {
+      "NAME": "达州市",
+      "TITLE": "达州市",
+      "KEYWORDS": "达州市",
+      "DESCRIPTION": "达州市"
+    },
+    "SC_YA": {
+      "NAME": "雅安市",
+      "TITLE": "雅安市",
+      "KEYWORDS": "雅安市",
+      "DESCRIPTION": "雅安市"
+    },
+    "SC_BZ": {
+      "NAME": "巴中市",
+      "TITLE": "巴中市",
+      "KEYWORDS": "巴中市",
+      "DESCRIPTION": "巴中市"
+    },
+    "SC_ZY": {
+      "NAME": "资阳市",
+      "TITLE": "资阳市",
+      "KEYWORDS": "资阳市",
+      "DESCRIPTION": "资阳市"
+    },
+    "SC_ABZZQZZZZ": {
+      "NAME": "阿坝藏族羌族自治州",
+      "TITLE": "阿坝藏族羌族自治州",
+      "KEYWORDS": "阿坝藏族羌族自治州",
+      "DESCRIPTION": "阿坝藏族羌族自治州"
+    },
+    "SC_GZZZZZZ": {
+      "NAME": "甘孜藏族自治州",
+      "TITLE": "甘孜藏族自治州",
+      "KEYWORDS": "甘孜藏族自治州",
+      "DESCRIPTION": "甘孜藏族自治州"
+    },
+    "SC_LSYZZZZ": {
+      "NAME": "凉山彝族自治州",
+      "TITLE": "凉山彝族自治州",
+      "KEYWORDS": "凉山彝族自治州",
+      "DESCRIPTION": "凉山彝族自治州"
+    },
+    "GZ_GY": {
+      "NAME": "贵阳市",
+      "TITLE": "贵阳市",
+      "KEYWORDS": "贵阳市",
+      "DESCRIPTION": "贵阳市"
+    },
+    "GZ_LPS": {
+      "NAME": "六盘水市",
+      "TITLE": "六盘水市",
+      "KEYWORDS": "六盘水市",
+      "DESCRIPTION": "六盘水市"
+    },
+    "GZ_ZY": {
+      "NAME": "遵义市",
+      "TITLE": "遵义市",
+      "KEYWORDS": "遵义市",
+      "DESCRIPTION": "遵义市"
+    },
+    "GZ_AS": {
+      "NAME": "安顺市",
+      "TITLE": "安顺市",
+      "KEYWORDS": "安顺市",
+      "DESCRIPTION": "安顺市"
+    },
+    "GZ_BJ": {
+      "NAME": "毕节市",
+      "TITLE": "毕节市",
+      "KEYWORDS": "毕节市",
+      "DESCRIPTION": "毕节市"
+    },
+    "GZ_TR": {
+      "NAME": "铜仁市",
+      "TITLE": "铜仁市",
+      "KEYWORDS": "铜仁市",
+      "DESCRIPTION": "铜仁市"
+    },
+    "GZ_QXNBYZMZZZZ": {
+      "NAME": "黔西南布依族苗族自治州",
+      "TITLE": "黔西南布依族苗族自治州",
+      "KEYWORDS": "黔西南布依族苗族自治州",
+      "DESCRIPTION": "黔西南布依族苗族自治州"
+    },
+    "GZ_QDNMZTZZZZ": {
+      "NAME": "黔东南苗族侗族自治州",
+      "TITLE": "黔东南苗族侗族自治州",
+      "KEYWORDS": "黔东南苗族侗族自治州",
+      "DESCRIPTION": "黔东南苗族侗族自治州"
+    },
+    "GZ_QNBYZMZZZZ": {
+      "NAME": "黔南布依族苗族自治州",
+      "TITLE": "黔南布依族苗族自治州",
+      "KEYWORDS": "黔南布依族苗族自治州",
+      "DESCRIPTION": "黔南布依族苗族自治州"
+    },
+    "YN_KM": {
+      "NAME": "昆明市",
+      "TITLE": "昆明市",
+      "KEYWORDS": "昆明市",
+      "DESCRIPTION": "昆明市"
+    },
+    "YN_QJ": {
+      "NAME": "曲靖市",
+      "TITLE": "曲靖市",
+      "KEYWORDS": "曲靖市",
+      "DESCRIPTION": "曲靖市"
+    },
+    "YN_YX": {
+      "NAME": "玉溪市",
+      "TITLE": "玉溪市",
+      "KEYWORDS": "玉溪市",
+      "DESCRIPTION": "玉溪市"
+    },
+    "YN_BS": {
+      "NAME": "保山市",
+      "TITLE": "保山市",
+      "KEYWORDS": "保山市",
+      "DESCRIPTION": "保山市"
+    },
+    "YN_ST": {
+      "NAME": "昭通市",
+      "TITLE": "昭通市",
+      "KEYWORDS": "昭通市",
+      "DESCRIPTION": "昭通市"
+    },
+    "YN_LG": {
+      "NAME": "丽江市",
+      "TITLE": "丽江市",
+      "KEYWORDS": "丽江市",
+      "DESCRIPTION": "丽江市"
+    },
+    "YN_PE": {
+      "NAME": "普洱市",
+      "TITLE": "普洱市",
+      "KEYWORDS": "普洱市",
+      "DESCRIPTION": "普洱市"
+    },
+    "YN_LC": {
+      "NAME": "临沧市",
+      "TITLE": "临沧市",
+      "KEYWORDS": "临沧市",
+      "DESCRIPTION": "临沧市"
+    },
+    "YN_CXYZZZZ": {
+      "NAME": "楚雄彝族自治州",
+      "TITLE": "楚雄彝族自治州",
+      "KEYWORDS": "楚雄彝族自治州",
+      "DESCRIPTION": "楚雄彝族自治州"
+    },
+    "YN_HHHNZYZZZZ": {
+      "NAME": "红河哈尼族彝族自治州",
+      "TITLE": "红河哈尼族彝族自治州",
+      "KEYWORDS": "红河哈尼族彝族自治州",
+      "DESCRIPTION": "红河哈尼族彝族自治州"
+    },
+    "YN_WSZZMZZZZ": {
+      "NAME": "文山壮族苗族自治州",
+      "TITLE": "文山壮族苗族自治州",
+      "KEYWORDS": "文山壮族苗族自治州",
+      "DESCRIPTION": "文山壮族苗族自治州"
+    },
+    "YN_XSBNDZZZZ": {
+      "NAME": "西双版纳傣族自治州",
+      "TITLE": "西双版纳傣族自治州",
+      "KEYWORDS": "西双版纳傣族自治州",
+      "DESCRIPTION": "西双版纳傣族自治州"
+    },
+    "YN_DLBZZZZ": {
+      "NAME": "大理白族自治州",
+      "TITLE": "大理白族自治州",
+      "KEYWORDS": "大理白族自治州",
+      "DESCRIPTION": "大理白族自治州"
+    },
+    "YN_DHDZJPZZZZ": {
+      "NAME": "德宏傣族景颇族自治州",
+      "TITLE": "德宏傣族景颇族自治州",
+      "KEYWORDS": "德宏傣族景颇族自治州",
+      "DESCRIPTION": "德宏傣族景颇族自治州"
+    },
+    "YN_NJLSZZZZ": {
+      "NAME": "怒江傈僳族自治州",
+      "TITLE": "怒江傈僳族自治州",
+      "KEYWORDS": "怒江傈僳族自治州",
+      "DESCRIPTION": "怒江傈僳族自治州"
+    },
+    "YN_DQCZZZZ": {
+      "NAME": "迪庆藏族自治州",
+      "TITLE": "迪庆藏族自治州",
+      "KEYWORDS": "迪庆藏族自治州",
+      "DESCRIPTION": "迪庆藏族自治州"
+    },
+    "XZ_LS": {
+      "NAME": "拉萨市",
+      "TITLE": "拉萨市",
+      "KEYWORDS": "拉萨市",
+      "DESCRIPTION": "拉萨市"
+    },
+    "XZ_RGZ": {
+      "NAME": "日喀则市",
+      "TITLE": "日喀则市",
+      "KEYWORDS": "日喀则市",
+      "DESCRIPTION": "日喀则市"
+    },
+    "XZ_CD": {
+      "NAME": "昌都市",
+      "TITLE": "昌都市",
+      "KEYWORDS": "昌都市",
+      "DESCRIPTION": "昌都市"
+    },
+    "XZ_LZ": {
+      "NAME": "林芝市",
+      "TITLE": "林芝市",
+      "KEYWORDS": "林芝市",
+      "DESCRIPTION": "林芝市"
+    },
+    "XZ_SN": {
+      "NAME": "山南市",
+      "TITLE": "山南市",
+      "KEYWORDS": "山南市",
+      "DESCRIPTION": "山南市"
+    },
+    "XZ_NQ": {
+      "NAME": "那曲市",
+      "TITLE": "那曲市",
+      "KEYWORDS": "那曲市",
+      "DESCRIPTION": "那曲市"
+    },
+    "XZ_ALDQ": {
+      "NAME": "阿里地区",
+      "TITLE": "阿里地区",
+      "KEYWORDS": "阿里地区",
+      "DESCRIPTION": "阿里地区"
+    },
+    "SX_XA": {
+      "NAME": "西安市",
+      "TITLE": "西安市",
+      "KEYWORDS": "西安市",
+      "DESCRIPTION": "西安市",
+      "PARENT": "SXC"
+    },
+    "SX_TL": {
+      "NAME": "铜川市",
+      "TITLE": "铜川市",
+      "KEYWORDS": "铜川市",
+      "DESCRIPTION": "铜川市",
+      "PARENT": "SXC"
+    },
+    "SX_BJ": {
+      "NAME": "宝鸡市",
+      "TITLE": "宝鸡市",
+      "KEYWORDS": "宝鸡市",
+      "DESCRIPTION": "宝鸡市",
+      "PARENT": "SXC"
+    },
+    "SX_XY": {
+      "NAME": "咸阳市",
+      "TITLE": "咸阳市",
+      "KEYWORDS": "咸阳市",
+      "DESCRIPTION": "咸阳市",
+      "PARENT": "SXC"
+    },
+    "SX_WN": {
+      "NAME": "渭南市",
+      "TITLE": "渭南市",
+      "KEYWORDS": "渭南市",
+      "DESCRIPTION": "渭南市",
+      "PARENT": "SXC"
+    },
+    "SX_YB": {
+      "NAME": "延安市",
+      "TITLE": "延安市",
+      "KEYWORDS": "延安市",
+      "DESCRIPTION": "延安市",
+      "PARENT": "SXC"
+    },
+    "SX_HZ": {
+      "NAME": "汉中市",
+      "TITLE": "汉中市",
+      "KEYWORDS": "汉中市",
+      "DESCRIPTION": "汉中市",
+      "PARENT": "SXC"
+    },
+    "SX_YL": {
+      "NAME": "榆林市",
+      "TITLE": "榆林市",
+      "KEYWORDS": "榆林市",
+      "DESCRIPTION": "榆林市",
+      "PARENT": "SXC"
+    },
+    "SX_AK": {
+      "NAME": "安康市",
+      "TITLE": "安康市",
+      "KEYWORDS": "安康市",
+      "DESCRIPTION": "安康市",
+      "PARENT": "SXC"
+    },
+    "SX_SL": {
+      "NAME": "商洛市",
+      "TITLE": "商洛市",
+      "KEYWORDS": "商洛市",
+      "DESCRIPTION": "商洛市",
+      "PARENT": "SXC"
+    },
+    "GS_LZ": {
+      "NAME": "兰州市",
+      "TITLE": "兰州市",
+      "KEYWORDS": "兰州市",
+      "DESCRIPTION": "兰州市"
+    },
+    "GS_JYG": {
+      "NAME": "嘉峪关市",
+      "TITLE": "嘉峪关市",
+      "KEYWORDS": "嘉峪关市",
+      "DESCRIPTION": "嘉峪关市"
+    },
+    "GS_JC": {
+      "NAME": "金昌市",
+      "TITLE": "金昌市",
+      "KEYWORDS": "金昌市",
+      "DESCRIPTION": "金昌市"
+    },
+    "GS_BY": {
+      "NAME": "白银市",
+      "TITLE": "白银市",
+      "KEYWORDS": "白银市",
+      "DESCRIPTION": "白银市"
+    },
+    "GS_TS": {
+      "NAME": "天水市",
+      "TITLE": "天水市",
+      "KEYWORDS": "天水市",
+      "DESCRIPTION": "天水市"
+    },
+    "GS_WW": {
+      "NAME": "武威市",
+      "TITLE": "武威市",
+      "KEYWORDS": "武威市",
+      "DESCRIPTION": "武威市"
+    },
+    "GS_ZY": {
+      "NAME": "张掖市",
+      "TITLE": "张掖市",
+      "KEYWORDS": "张掖市",
+      "DESCRIPTION": "张掖市"
+    },
+    "GS_PL": {
+      "NAME": "平凉市",
+      "TITLE": "平凉市",
+      "KEYWORDS": "平凉市",
+      "DESCRIPTION": "平凉市"
+    },
+    "GS_JQ": {
+      "NAME": "酒泉市",
+      "TITLE": "酒泉市",
+      "KEYWORDS": "酒泉市",
+      "DESCRIPTION": "酒泉市"
+    },
+    "GS_QY": {
+      "NAME": "庆阳市",
+      "TITLE": "庆阳市",
+      "KEYWORDS": "庆阳市",
+      "DESCRIPTION": "庆阳市"
+    },
+    "GS_DX": {
+      "NAME": "定西市",
+      "TITLE": "定西市",
+      "KEYWORDS": "定西市",
+      "DESCRIPTION": "定西市"
+    },
+    "GS_LN": {
+      "NAME": "陇南市",
+      "TITLE": "陇南市",
+      "KEYWORDS": "陇南市",
+      "DESCRIPTION": "陇南市"
+    },
+    "GS_LXHZZZZ": {
+      "NAME": "临夏回族自治州",
+      "TITLE": "临夏回族自治州",
+      "KEYWORDS": "临夏回族自治州",
+      "DESCRIPTION": "临夏回族自治州"
+    },
+    "GS_GNZZZZZ": {
+      "NAME": "甘南藏族自治州",
+      "TITLE": "甘南藏族自治州",
+      "KEYWORDS": "甘南藏族自治州",
+      "DESCRIPTION": "甘南藏族自治州"
+    },
+    "QH_XN": {
+      "NAME": "西宁市",
+      "TITLE": "西宁市",
+      "KEYWORDS": "西宁市",
+      "DESCRIPTION": "西宁市"
+    },
+    "QH_HD": {
+      "NAME": "海东市",
+      "TITLE": "海东市",
+      "KEYWORDS": "海东市",
+      "DESCRIPTION": "海东市"
+    },
+    "QH_HBZZZZZ": {
+      "NAME": "海北藏族自治州",
+      "TITLE": "海北藏族自治州",
+      "KEYWORDS": "海北藏族自治州",
+      "DESCRIPTION": "海北藏族自治州"
+    },
+    "QH_HNZZZZZ": {
+      "NAME": "黄南藏族自治州",
+      "TITLE": "黄南藏族自治州",
+      "KEYWORDS": "黄南藏族自治州",
+      "DESCRIPTION": "黄南藏族自治州"
+    },
+    "QH_HNZZZZZZ": {
+      "NAME": "海南藏族自治州",
+      "TITLE": "海南藏族自治州",
+      "KEYWORDS": "海南藏族自治州",
+      "DESCRIPTION": "海南藏族自治州"
+    },
+    "QH_GLSZZZZ": {
+      "NAME": "果洛藏族自治州",
+      "TITLE": "果洛藏族自治州",
+      "KEYWORDS": "果洛藏族自治州",
+      "DESCRIPTION": "果洛藏族自治州"
+    },
+    "QH_YSZZZZZ": {
+      "NAME": "玉树藏族自治州",
+      "TITLE": "玉树藏族自治州",
+      "KEYWORDS": "玉树藏族自治州",
+      "DESCRIPTION": "玉树藏族自治州"
+    },
+    "QH_HXMGZZZZZZ": {
+      "NAME": "海西蒙古族藏族自治州",
+      "TITLE": "海西蒙古族藏族自治州",
+      "KEYWORDS": "海西蒙古族藏族自治州",
+      "DESCRIPTION": "海西蒙古族藏族自治州"
+    },
+    "NX_YC": {
+      "NAME": "银川市",
+      "TITLE": "银川市",
+      "KEYWORDS": "银川市",
+      "DESCRIPTION": "银川市"
+    },
+    "NX_SZS": {
+      "NAME": "石嘴山市",
+      "TITLE": "石嘴山市",
+      "KEYWORDS": "石嘴山市",
+      "DESCRIPTION": "石嘴山市"
+    },
+    "NX_WZ": {
+      "NAME": "吴忠市",
+      "TITLE": "吴忠市",
+      "KEYWORDS": "吴忠市",
+      "DESCRIPTION": "吴忠市"
+    },
+    "NX_GY": {
+      "NAME": "固原市",
+      "TITLE": "固原市",
+      "KEYWORDS": "固原市",
+      "DESCRIPTION": "固原市"
+    },
+    "NX_ZW": {
+      "NAME": "中卫市",
+      "TITLE": "中卫市",
+      "KEYWORDS": "中卫市",
+      "DESCRIPTION": "中卫市"
+    },
+    "XJ_WLMQ": {
+      "NAME": "乌鲁木齐市",
+      "TITLE": "乌鲁木齐市",
+      "KEYWORDS": "乌鲁木齐市",
+      "DESCRIPTION": "乌鲁木齐市"
+    },
+    "XJ_KLMY": {
+      "NAME": "克拉玛依市",
+      "TITLE": "克拉玛依市",
+      "KEYWORDS": "克拉玛依市",
+      "DESCRIPTION": "克拉玛依市"
+    },
+    "XJ_TLF": {
+      "NAME": "吐鲁番市",
+      "TITLE": "吐鲁番市",
+      "KEYWORDS": "吐鲁番市",
+      "DESCRIPTION": "吐鲁番市"
+    },
+    "XJ_HM": {
+      "NAME": "哈密市",
+      "TITLE": "哈密市",
+      "KEYWORDS": "哈密市",
+      "DESCRIPTION": "哈密市"
+    },
+    "XJ_CJHZZZZ": {
+      "NAME": "昌吉回族自治州",
+      "TITLE": "昌吉回族自治州",
+      "KEYWORDS": "昌吉回族自治州",
+      "DESCRIPTION": "昌吉回族自治州"
+    },
+    "XJ_BETLMGZZZ": {
+      "NAME": "博尔塔拉蒙古自治州",
+      "TITLE": "博尔塔拉蒙古自治州",
+      "KEYWORDS": "博尔塔拉蒙古自治州",
+      "DESCRIPTION": "博尔塔拉蒙古自治州"
+    },
+    "XJ_BYGLMGZZZ": {
+      "NAME": "巴音郭楞蒙古自治州",
+      "TITLE": "巴音郭楞蒙古自治州",
+      "KEYWORDS": "巴音郭楞蒙古自治州",
+      "DESCRIPTION": "巴音郭楞蒙古自治州"
+    },
+    "XJ_AKSDQ": {
+      "NAME": "阿克苏地区",
+      "TITLE": "阿克苏地区",
+      "KEYWORDS": "阿克苏地区",
+      "DESCRIPTION": "阿克苏地区"
+    },
+    "XJ_KZLSKEKZZZZ": {
+      "NAME": "克孜勒苏柯尔克孜自治州",
+      "TITLE": "克孜勒苏柯尔克孜自治州",
+      "KEYWORDS": "克孜勒苏柯尔克孜自治州",
+      "DESCRIPTION": "克孜勒苏柯尔克孜自治州"
+    },
+    "XJ_KSDQ": {
+      "NAME": "喀什地区",
+      "TITLE": "喀什地区",
+      "KEYWORDS": "喀什地区",
+      "DESCRIPTION": "喀什地区"
+    },
+    "XJ_HTDQ": {
+      "NAME": "和田地区",
+      "TITLE": "和田地区",
+      "KEYWORDS": "和田地区",
+      "DESCRIPTION": "和田地区"
+    },
+    "XJ_YLHSKZZZ": {
+      "NAME": "伊犁哈萨克自治州",
+      "TITLE": "伊犁哈萨克自治州",
+      "KEYWORDS": "伊犁哈萨克自治州",
+      "DESCRIPTION": "伊犁哈萨克自治州"
+    },
+    "XJ_TCDQ": {
+      "NAME": "塔城地区",
+      "TITLE": "塔城地区",
+      "KEYWORDS": "塔城地区",
+      "DESCRIPTION": "塔城地区"
+    },
+    "XJ_ALTDQ": {
+      "NAME": "阿勒泰地区",
+      "TITLE": "阿勒泰地区",
+      "KEYWORDS": "阿勒泰地区",
+      "DESCRIPTION": "阿勒泰地区"
+    },
+    "XJ_SHZ": {
+      "NAME": "石河子市",
+      "TITLE": "石河子市",
+      "KEYWORDS": "石河子市",
+      "DESCRIPTION": "石河子市"
+    },
+    "XJ_ALE": {
+      "NAME": "阿拉尔市",
+      "TITLE": "阿拉尔市",
+      "KEYWORDS": "阿拉尔市",
+      "DESCRIPTION": "阿拉尔市"
+    },
+    "XJ_SMSK": {
+      "NAME": "图木舒克市",
+      "TITLE": "图木舒克市",
+      "KEYWORDS": "图木舒克市",
+      "DESCRIPTION": "图木舒克市"
+    },
+    "XJ_WJQ": {
+      "NAME": "五家渠市",
+      "TITLE": "五家渠市",
+      "KEYWORDS": "五家渠市",
+      "DESCRIPTION": "五家渠市"
+    },
+    "XJ_TMG": {
+      "NAME": "铁门关市",
+      "TITLE": "铁门关市",
+      "KEYWORDS": "铁门关市",
+      "DESCRIPTION": "铁门关市"
+    },
+    "XJ_BT": {
+      "NAME": "北屯市",
+      "TITLE": "北屯市",
+      "KEYWORDS": "北屯市",
+      "DESCRIPTION": "北屯市"
+    },
+    "XJ_SHH": {
+      "NAME": "双河市",
+      "TITLE": "双河市",
+      "KEYWORDS": "双河市",
+      "DESCRIPTION": "双河市"
+    },
+    "XJ_KKDL": {
+      "NAME": "可克达拉市",
+      "TITLE": "可克达拉市",
+      "KEYWORDS": "可克达拉市",
+      "DESCRIPTION": "可克达拉市"
+    },
+    "XJ_KY": {
+      "NAME": "昆玉市",
+      "TITLE": "昆玉市",
+      "KEYWORDS": "昆玉市",
+      "DESCRIPTION": "昆玉市"
+    },
+    "XJ_HYH": {
+      "NAME": "胡杨河市",
+      "TITLE": "胡杨河市",
+      "KEYWORDS": "胡杨河市",
+      "DESCRIPTION": "胡杨河市"
+    },
+    "XJ_XX": {
+      "NAME": "新星市",
+      "TITLE": "新星市",
+      "KEYWORDS": "新星市",
+      "DESCRIPTION": "新星市"
+    },
+    "XG_XG": {
+      "NAME": "香港",
+      "TITLE": "香港",
+      "KEYWORDS": "香港",
+      "DESCRIPTION": "香港"
     },
-	"version":"1444",
-	"mod_version":"5008",
-	"industry":{
-		"JZGC":{"NAME":"建筑工程_勘察设计,建筑工程_工程施工,建筑工程_监理咨询,建筑工程_材料设备,建筑工程_机电安装",
-				"TITLE":"建筑工程_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"SLSD":{"NAME":"水利水电_水利工程,水利水电_发电工程,水利水电_航运工程,水利水电_其他工程",
-				"TITLE":"水利水电_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"NYHG":{	"NAME":"能源化工_原材料,能源化工_仪器仪表,能源化工_新能源,能源化工_设备物资,能源化工_化工产品,能源化工_设备",
-				"TITLE":"能源化工_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"RDAF":{"NAME":"弱电安防_综合布线,弱电安防_智能系统,弱电安防_智能家居",
-				"TITLE":"弱电安防_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"XXJS":{"NAME":"信息技术_系统集成及安全,信息技术_软件开发,信息技术_运维服务,信息技术_其他",
-				"TITLE":"信息技术_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"XZBG":{"NAME":"行政办公_办公家具,行政办公_通用办公设备,行政办公_专业设备,行政办公_办公用品,行政办公_生活用品",
-				"TITLE":"行政办公_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"JXSB":{"NAME":"机械设备_矿山机械,机械设备_工程机械,机械设备_机械零部件,机械设备_机床相关,机械设备_车辆,机械设备_其他机械设备",
-				"TITLE":"机械设备_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"JTGC":{"NAME":"交通工程_道路,交通工程_轨道,交通工程_桥梁,交通工程_隧道,交通工程_其他",
-				"TITLE":"交通工程_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"YLWS":{"NAME":"医疗卫生_设备,医疗卫生_耗材,医疗卫生_药品",
-				"TITLE":"医疗卫生_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"SZSS":{"NAME":"市政设施_道路,市政设施_绿化,市政设施_线路管网,市政设施_综合项目",
-				"TITLE":"市政设施_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"FWCG":{"NAME":"服务采购_法律咨询,服务采购_会计,服务采购_物业,服务采购_审计,服务采购_安保,服务采购_仓储物流,服务采购_广告宣传印刷,服务采购_其他",
-				"TITLE":"服务采购_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			},
-		"NLMY":{"NAME":"农林牧渔_生产物资,农林牧渔_生产设备,农林牧渔_相关服务",
-				"TITLE":"农林牧渔_剑鱼标讯,全行业招标信息智能推送领导者!",
-				"KEYWORDS":"",
-				"DESCRIPTION":""
-			}
-	},
-	"jyDomain":"http://web-jydev-zxl.jianyu360.cn",
-	"ZBADDRESS":"https://res.jianyu360.com",
-	"IosExam":{
-		"flag":false,
-		"phone":"18613717801",
-		"adv":{
-			"jy-appsearch-home-top": [
-			    {
-			      "o_extend": {
-			        "linktype": "",
-					"title": "使用帮助"
-			      },
-			      "s_link": "https://mp.weixin.qq.com/mp/homepage?__biz=MzIyNTM1NDUyNw==&hid=3&sn=badf2d7da08654c58b58169e773f58f0#wechat_redirect",
-			      "s_pic": "https://web2-qmxtest.jianyu360.cn/upload/2020/05/22/20200522133112005m418U911.jpg"
-			    }
-			]
-		}
-	},
-	"structedUploadA":"/structuredata/file/【剑鱼标讯】结构化招标数据.xlsx",
-	"buryingPointUrl":"https://md.jianyu360.com",
-	"distance":"0",
-	"wxDomain":"http://web1-jydev-zxl.jianyu360.cn",
-  "jyadd": "https://web2-qmxtest.jydev.jianyu360.com/"
+    "AM_AM": {
+      "NAME": "澳门",
+      "TITLE": "澳门",
+      "KEYWORDS": "澳门",
+      "DESCRIPTION": "澳门"
+    }
+  },
+  "cookieNum": 5
 }

+ 19 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/j-icons.css

@@ -232,6 +232,11 @@
     background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADlSURBVHgB7ZbBDcIwDEUdswAj9IhARTBCJQboBmUT2ASYAAYoyghRy4Vj50BqzSXcUBtHdk95N0eK/tOPFBkgkRBkZ90SmCAIsbbN6UPoVtZlnHsGBMjrtuyR7n7sBjMU72LfhdwVaeB12D7MADc/ZkhoQ5sQaeDHpm6uhFD5MagJUYEYCXEBroSKAEdCTSBUQlUgREJdYEpiFoExCbGveApaGPp3PksDa9tegOjox3mfYCxcXWAqXFUgJFxNIDRcRYATLi7ADRcViAkXE8itK3vCqJVMroGnO4PBihMuThaxlicSX5xIxs6w9KA5AAAAAElFTkSuQmCC) no-repeat center;
     background-size: contain;
 }
+.icon-arrow-up2 {
+    background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFRSURBVHgB7drvbYMwEAXwR9UBukHbSdJNyAYdJSOgbNJMUnWDbuAeCv1CYvCdwQHf+0l8MfGfezGRsAIQERERERFROSGEg1ydXCe5XuGJFNyGWy08iBTvI4SZ4usOIbH4OkNQFl9XCMbi6wghs/h9h7BQ8fsMIaH478S2/YWQUHx/v7vT3qX0xZalFhALQDPG5mgWPhWAdqxN0C54LgDLmA9jWWhKANaxi7IuMDWAnDlWl7MwTQC5c61CJnzLWZA2gKFPOzPnAQZPsPmcuHdsmuaMhQ1jHic+MnUvyhrAS6R9leL/zYTwi1LC9TxPte1H/TvtIzDq397pbzpXfIaBfBMXmfAd10eh3w1naftCIf1OkPkvo/l/sBe5O2BJ1t+AajAAOMcA4BwDgHMMAM4xADjHALAd5d7nHy1ynuDuf0L9ueJpeDX+ABEREREREZXzBzX2bRuMDKx1AAAAAElFTkSuQmCC) no-repeat center;
+    background-size: contain;
+}
+
 /* 关键词 */
 .icon-Aa{
     background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAQwSURBVHgB7VjdcdNAEN49lCcGUAeYDkwFiAqSFIB9DEmGtyQVROkgeWOYBJ9TgVNBnAqACjAVkGeQb9m7c6Q7WX+BzPhF30xia0+6/bn9+WSAHj169OjRo8fmgA+5WcqPA6JsAgTD1dMKMTtVSt3BhhB1vdEar5c3/HWQCwmOCLbM9S5sCKLznctlwhYP1uREO8Y52BA6O0BIh7WLOpOwIXRyQMp9k/PDXIC44P953hPAIWwInRwgCg0UAlOu/mtPFEu5l8AG0C2FCJLgksQtP6lCGZzABtDaRuW7fcn5P8kfQJir6cVb83082vvFH/Fq6Q5F9upfWqo5PQ7KNhdTwqGIPfN4L1wIwhkJcavUp0X52dY2SgK2TZLnWwqh8u9AUwK8T68YlpHkzzPoCGu4xglp0910vmvJgqEG2gFNi/ejg3Ry9Xnqr4pmBdweuU16orvJxNtA4CxQZZztiNHoYEwabipbcyVooEEr+W7vyJc214Dt/QUQQ4OVuphzwOaFDki6FLMJDLIxZblJT47/af5X0mdVIJxIKfM0a0whc3OogaZrSgluOcOSXKDtic2hCfrPUZAq3JYRn7ytynHHALKvUNRaDDoyp5Cai9oTcJH0jpeV2IiXIbIg57kmxn6EKiHsHGk13sDIOUingQ6EN/lWUAMiHPvXSPq6WgF3HQwizsZHQ2gAB+IMBe2i0O8Rn76uMz7Hk0yFxhVDtT6FwuJlV7dquwtquOaoJMWjNvXm0AClLmfQESZI3LJ9UXMN2N7v9WPb+5uiZCKko5N8Y1vMMn7ITHB0ZTkELQaE4kU4D8BGpQqVDpCgsd/7NYl5O+PMFuDzJa/Q6o027xf6EEhLngVxntGkoSuiyk11lvgybnkpaZ3CA8AnaGoorVsfjfYPWY9Zj+E/sH4Cj0aNcWA6WVXnGo32TniKp+HtTEUA55wq30HoRfkZ0mJSpWXNAdMGAarz7cGomAmrE059GTtzDvgsVeqstma4iNsdcNwkGO1M0PQxdIZ4yemb3l+tZkIaFHPphB05vDxq2nXldOVa4IDr/eRtjjOlvijoCDfAbPEWU7NE8OwQ8g9Yw3XrxobS1PBmESgnksFqBXVogom0Yai+rJ3gYWOrtdHH+neNYhIvt8LBVUcd2lBiqG4mFC2YacHPYFnQuG4rMxvcLyH1jDUKNvJ5fw11aINxmgvORLVojy7vU/td0Ay0R1PYwfF4f4L2tKOFE2YDk85cj7JNn/A3Cle2Or+YlMHpel4S5OTLUggs0QxOXfNuwIX6w/3xe4KXzoZaQwW1tmYWSoobXPG2EKwmiEiB96uF/xbn9s9215yogpkNBMfq6iLlE7r17Stu8SDlhx3HQZ7PmnpyF7i8/52wN7W1xDku+eS3eWon/Bk742jBz3xzDj6d+nY8pn09evTo0aNHj8fAX1vT7P3HN7GCAAAAAElFTkSuQmCC) no-repeat center center;
@@ -323,11 +328,20 @@
 .icon-phone--gary {
     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAToSURBVHgB7Vk9UxtHGH5373DSOJE7UkXu0sSSqNxFdOksOk9GiCOCNCnAvwBRpgouMxHhJBhPUgFdOsQfwKf8AZQynZgUycDdvn5fSfeh00k6YbGMxzyNdvf29vbZ92OfXQE84AEfN8Skh1bJyniPZUkImR3XRyl0jo72T+CeMJZApbK5JQBrVMzA9GE6woUV+82vDmhGIoFKZWOHHtRgNnSFK5Z1kzDjDdZLK4vDk3eofpr8OmaI6AtahyxVMmjgz/S7DBoxYoFyuVoypDju17DTaO4/nTSAZRFhZV4GA0r3iW3bXdAEOdIgRd4vI4jGlPeBJtuhn9BtXDMPGjFCABGC1RNCfAkpgIBtv+wJuG8C2ImUn0AKIIrAAmTBHGjECAHT9ILJUIB8AylgeG4rqCCWQCNGCAx82nejTLX641Q3st/YTvQdq7xRBE2Qia0YBuX19X+p0iKl2td+WUl9VkgkgALO/TIFcqqgRFSd8B35OWhCIgGpoOWXBYg1SDWQCOKFyFyBJiQSsI/qLZjBp1l60LJbwaBKaBN3ctwDyu3BJjbJp2O6qUsC8PVgAbRgLIHoKrIbkWQYUaWrq99bUdFHkz+1m/vboBFjCfRWEYNYyChljkyMArwY1rBDk7dAM+SkhwJUIyzDVtwKZCU70ju7XvkhVcDPExMJ2Ie/2RAJ5rgV2EoUK2H+B7XHchw0Qk7rIFC9CspJVpBejd1nUM3gI/M4KV7uClMJ9K0QmaC3cDD0nLS/cOUKhJbKo2cegyZMJcAQSqyHFSzF9wU+RpKldsM+UFxbrR6ABoi0HSuV6h6l063Bax1xfbNs/94TfgGsykaNNNFO0IDiRBg360kntDItgiF4l8csVR0P8fw2txupCbBfozLeDs6/vNO1Gof1EaE3QiJGlq9q8DG5GFkp4TNdIt1S4J0jSsd03U58kW5NoPdxWjWUcBY0IOwRiVcwlQR0FSUD4191gp8t0Ps4y6nNEdfuyjgiBswA56+LTiG3xKSLvQYBz3O5JWi3L86H+rUvWoVn+Sva6b4dNH1Km14JPjFe0uS/8vux7BAKfiL1+w8NukgtSdlrEQy5Xfh66Zy/H384kwV8VMpVW8hQpfI1TLNZ3433699YGGeB2w1/eNdu1mvx/uDJoiIJL5COpkNuRq4obwrxeLoVgX48mOxK+RQkaAM0amECSJ78mO/wlQ3FXf92kKy1HBeKM7mQD8dx/i8Unv0BKNlFFgeTKia6E/Vtt9/+Sf0bdPgXEvEX+3B/L+V3urlc4Qsi/5zr5Gp/0/itaJ9bWcBHkiU4O4kbd31a9kgLkutkvX5CICvvNmOWS7WRjQP7Y6NZL0T1EPstPlo4Y6kNGvBeBHw06QzAfh22YFYKecC78V2Lu7kQYHBQcpBFdBMfGCy2Ru/IeUeYGwEGZwghveXocZStwae2tcrmJf/nMG+LzJUAgy/GyKWsEWv0iOAeye1Ldq3ynC6/3isLpYFFwUzZcydpM+PNCVC1PIRT0/WcpMzFlhsIPtoHcMWOCb47J+CjT0TyZjZJB3UHt4IO5fwryv8vorqJ/nt4Orj6DKCNgA/ru828MtV2/+JYZNO+N2731k4gCla3SkJRIJERvNJJYg67pIt27cN64u59rwTiYOuAxAw5e14JmZF832qoE51/WT3gAR8a3gG65x5HMrDqAAAAAABJRU5ErkJggg==);
 }
-/* 电话 白色 */
+/* 电话 白色描边,内容中空 */
 .icon-phone-white {
     background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKiSURBVHgB7ZmBdZswEIYPL1B3A3WCuhPUnSDeIN7A3sB0AtMJ7E6QdgKcCZxMgDdIMsHl7iG/HEISIgHBe+F7Tw89ceLdL53EIQAmJj43ie8mIs7psqKiPGanJElOMDbI+Q2VJwyjoKJgLJAzO2wPi11AZGohpEfyTGWumx6o/Hf0Z5sbeAsxDqdfMCQkYC1DI8BeGTMxh4jMLG1K1P9CAzTiFyhn6UrUMLIJeBb10NF8FPXBBVxEXUEYcga+w5AYMd24BnSfhdyNYGiwuv+rd/RZQiRmjnYZEksI44+oryASLgH3oh66KC+i/gUi4RJwEvVbCOOnqL/A0LSJaUvqsYShIScy4VDmsTOdz2AM8CjKrdGWIhhpB3OEMUEO5cK51HL/iC3fGVExRrg2C8YsMdG2z2Cw/FjxzUJmiFQwJgJmYW6IPGPklLoR7dSVO8v9BVa33RzGREisU9vWsDnAmAiJdV4jhojcFU56UPbaZo99bwCWWM8ddqaIQorVz7lDO0/63kYLVNAlWA+lPYSJYMdutfNnbMe5UyEW53YOuy3Wz5UKo85hudLXwiOi2yMbrL6BfSKUx7HUYb/WgnKL+G62Z7SHws5jmzU57+irsK8vvTYihDMsJPT74tovayu8zcNtInLscNFhdc2l5v0ZfAA61Hqm8gOq38NLKnnbkX4vHxJwhURs6fJbNCkqvNAP2HNy14kAhkSkdOGD3YtoXkM5Gzvoic4EMPpHB4uQZ6qKSqq3wQ2OLd12gWWGWqCdQ+iW2LSIewfLF5NLSKHFrNCeHJr5Vy3hSyASLIQuG/AflPHJ+IMufLZ0Y9h/08f5w6FD64j+3MdGCmNDi+GFnaP7hyK3b13PiBZCIWCZcXLCxv8YvkK5Jf/jFyZMTExYeQWVKF8Cod7i3AAAAABJRU5ErkJggg==) no-repeat;
     background-size: contain;
 }
+/* 电话 白色实心 */
+.icon-phone-white-solid {
+    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGXSURBVHgB7ZiNTcMwEEa/dIIwAWUCygTJBh0hMElggrJB6QbdgBHCBgkTtBscd4pToTY/duOLA+qTLEttLD/ZzvkuwI1/TtT2IxHF3GXcVh3jjtzeoyj6RghYsCA7EkwNT5qRPSWUWbT8lsKeJUveQ5EFxrOCIm2CX3BjcsEKbqRQ5CLMmBBzgBt3HHKOUOBiBc1EFdxYQ4mul2QPN2JMiQRgckM11HRJHizlcoSAJ97MVs4IJgNyG4SGJT57BEuqQ1JQweSvr6Iwfcp1JigZS98bLf9NH2bOJPOBVSznIFmEkIxsH5St5q5A/7VWcUu7ahVzXpv0bO+9piG7ckDOZNYyNm95VnZFLoQ1t0f4gIbPY4NMHDuOKUUWY3GccEvujA9dDpLXcLoAri6a+IC/cfcKHU4v4qiqzkg+o/7SoMLospMld9w9wb1MsMJHXSySFbcHKGy5F8EGs+Ui+gFPeBUUzGq+wLOoGlRnQ1uqY6ItGULAE6dGti/xKH6PsU4WfEP1NSiJg9zBS9SxT74L7bS+UtyYJT9T+M9OmYJnsgAAAABJRU5ErkJggg==) no-repeat;
+    background-size: contain;
+}
+.icon-person-white-solid {
+    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAE9SURBVHgB7dbdccIwEATgdSpIKgglpAOnA0owHVBC6CAlUEpIBUkqEKkAOlhOYzFgMwjrjE886JvRiwZbi/V3QFEU0yM5k/YpzfHkR9pa2itykgBL3vaBHPzAHM42pAzYMN0cVthdb0M5WJCBaurVKWM9QecNeknPagM+Qy/pWW3APfSSntUG/IXeHyw89C4OAedM18ASH/kmSQy5RE5sq5k12wrmyLGtcPJWM1Orhv5QvoQ/YP3XGHOLHPmzcF9V1TfG8sHCOtvx/lx4t+5mCmvLcXqOmrXK7qKf2ldquIb2Lg7y2F28gL1Fv+PqLpZ/s8O4skrD7+yX845YQCIDCdjJFJviLext+x2xgBvY2/Q7YlNcwz7kTGb4/7zj6hcM19AKdlb9cIMwrebTGlcr8lROOd6PC+98R1EUegfhypmJWTCZyAAAAABJRU5ErkJggg==) no-repeat;
+    background-size: contain;
+}
 /* 咨询 */
 .icon-counsel {
     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIdSURBVHgB7ZhdTsJAEMdntsVHwxH0BngDuYG+GaNl/XpWT6CeQH0WdfmIr3IDuQG9gRyBA9COuwIK26a0hbIY95cQmtlpOv90tjM7ABaLxWISjDMeHZ3vOgg3cnUX1gGCLgZ4Ld6efH0pIoAf8C3acD9hDcEh7ugimO5EJfcV1hRy6F63uRGvqbRBNtwWQvTBIJzLjAjHGRGT0izpZtPBp4khUcBfwAowjRVgmv8rQLUb6rcKnyRcyEHNu+jJulgZXZ/7suBV5fd6UITPPDK/gePjUz556JhKELi8CJ805EghVtYtiFAuxidFNJARxxl25N/Ua6YBY0NRhE8aMgtQvYnM1R0CegRCgSyo6v3KsnzSEDkPyM1Ek+tGs46wBiTFZAuZaawA01gBpkkUoEYsYJh5MUSbOTlEmpz+1XxIfoNjbwwpPGm1XkTcWq129iqLE4clQKDFphERgAR3lHMix/d4mTZLH0AzTdrSULHptkgKiXa9iyHtS7l9yMD3RG+z1NM6zGXhYwhVFZu+EHseEO1n1Wh1dLvnnQkErOl2fsgr5JbeZfBbE5us93eiWb+Fgsl1oJlGnaaIgQr+pxVGwhPRehKwAhYS4HkXlwj08Guhwbir9GFF5BbA0LmczXfq522JF2GBQjazWX0TwSsWr8RInfFhvA8GyJpCMxMDmf+PovF8BQbJ9AYYCx5G9UFuVoJr0TQbvMVisZjnCxt//wLE6WKiAAAAAElFTkSuQmCC);
@@ -372,6 +386,10 @@
     background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANySURBVHgB7VndUdtAEP5OsvPsDiIqiDMJmWEgg1VBTAVABZAKwBUEKghUEFKB7AmEBwg4FcTpgKc8YKTN7kk2MsPpx5asyUTfjHxne3W7e3u3u7cH1KhRo0aVUCgI3uWlA7/RVcp6BaIOCC0evaX/JNxxfyQPEQ0wfjhz3bURCsDCCngXP3YU0TZ3O8iHIang2F1/d4IFMLcC3rerjlLqM3cd/YPMsqXOyMcAtj/EfXPkuq/vNK1328KLMdPZbfg+v2d9mFoHbBUV9OZVJLcCIozVDA4ItD8VAHSMceNkInCmcULLHSCaAAV1FIytXp4xwvdywPMuHdVsfuFuW2acFPXcjdUjLADv/Gqfhf8UfR3ReOzm2R+ZFYiE9xDOWG5GZY1tZSGSZRNjMCxSeIGMJWPK2MJDrKz3TQZkUkDWPB5nZ6tI4SeIlNgSHvy0I56pSF1C0WYTbwNmsFKG8DP8wuV0y90WxwzXfb/aT6JPtUDkKXjP0seyhRdoS4B6mnfophORaIHY7I86G29XsET0z69/ceNwjNhNihGJFmDh96SVQIMlQ8cWLYO1nURnVEDWIsTfA3eLhvu5wIFRePPTubi5eWkiM1ug2eiGHXWGCiARmQJ8lf79H3/LRGdUQJHalJaUP0BlUH39KRmuAWYLqChJC4NLNfD9Ce+OiSRpEzv6k7NKVIaIN5ExKicpoF/Kmx0WiRjvuRT4J5CkwONhpCLEeBtXQaoC4UmqKkx5j0wURgXYB0/cZxtV4YWteXNU/m0iMVvAIu3CFOxNVAROZSa8+yYaswJc+tAtUbfCfdCdkeUZGBWIUuc+xIU1H3awZEgmjNB9DpPS+EQ3SkqdSsuH7j0sGdNzCNeOkugSFXDX35wg9ACOVA+wJAy+X8uEOcI7LRNODWR8rNuVlq1wEKXYpUJ4sAfUpZos55BUBeRMSgQxo65MlKlErLwC4ZnlHJItlXiwDzFT8iheiVjRzIEs25BnKv6PwpYgVnwaIbTEbREbWzasaugyioM5imZzFXfR8A+VwsS15q4u6zE4tkTu2ZHf9D7jZVNqcXdGiCfV5fASg8vr4RH0+fK6b7eVjU0E1J0pr7OnSytgFa7AE0VkJvMmfX223GllFxxPoT1TU66YuBhAbBV5Zq+YxELskoOfsPmKaa38Kl+NGjVqlI+/zO65Qdp3pJkAAAAASUVORK5CYII=");
 }
 
+.icon-location {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKoSURBVHgB7ZddchJBEIC7F0nMU+IJXJ4k+MNyAlm8gDeQnEBvELhBPIF4AnjzCRZPwG60kPLF9QTyZFmxmLZnE60KoWdndrd84quiqKJ7Zr+dn54BYM+ePUYQStCcXT5HopeAFCCgzz/5N6E1AcVAGBPiZNV79hEKUkgwEwM1YKmuTT7Lpiw6WIXt9+CIk6A/XpwcHePYVuwORCOCg8GXF63vtk2sBZsfFj4eYnQzlYXRowl00LWVtBKsSu4vLpIeWMBy46rksv50X3g1ssnNFWxNk3PuMMjL46emvJsn+oMIcX46dh9Fyev8PANWU6ulgIbLsHNLqhktfA/wnEtNH2TWP1E10rCzlhLugYn7Hte5f7XtDgqBS0cw3BVbhZ2Uv85aUcLrDQZCFydH4L3i77dC3DzFNcPbX8u1h5DDknN4yi/EBF3oDYiCQbQ44d3WFcLpL1DiW29TB6VfZOc06rXo87PAVXBDtbYU43U3N62bbWLO5VEcSfE6yMvIqsxsw289B0dIqUSK1an2UIoZRnDTgP8EIrlPMWDthxRSvPvAEfK8Yym2ASWeKKKgwk0iP82883aBStxwLAjiejYW6tYs0aO4c7SI6r7tga8LvnfofRPC62Wv/UBqa94kRHMphHg1AUv0WS4HydiPuVCjd2F4bHA6i6PT6VLcgfr+qHOMZzl5RsHc69bj2WVkKNjXt2XCkcLa5GvvSbZutTTB776H8AbMGyrl6W2UEnzK1/sNyFNdBg9V+DnszI05kMMn/YcHxcO+MPosz5PTWF/5W9P4He+MPlQB0mgZBmdWqeBAJZIOclk6OFJK0lEuawIFKCRZQC5rBgVxkiwolzWFElhJlpDLmkNJjJIl5bIuoAJ2SlYgl3UDFXFLsiK5ytGSrYhF9+yx5w/3wBE5lH3E2wAAAABJRU5ErkJggg==);
+}
+
 .icon-canbiao-red {
     width: .4rem;
     height: .4rem;

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

@@ -204,6 +204,7 @@ input::placeholder {
     background: #fff;
     z-index: 9;
 }
+.j-header.jy-app-header.wx-header,
 .j-header.jy-app-header.h5-header {
   height: 10.66667vw;
   padding: 0 3.2vw;

+ 5 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -394,6 +394,8 @@ var vNode = {
             if( _this.userInfo.isLogin) {
               _this.getNewMsg(); // 中标动态
               _this.getChartData(); // 企业画像
+            } else {
+              _this.chartLoading = false
             }
             _this.getUsage(); // 超级订阅用户剩余次数
             // _this.getNewMsg(); // 中标动态
@@ -748,8 +750,10 @@ var vNode = {
           }
           that.getUsage(); // 超级订阅用户剩余次数
         },
-        error: function (err) {
+        complete: function () {
           that.chartLoading = false;
+        },
+        error: function (err) {
           console.log(err)
           // setTimeout(function() {
           //   that.getChartData()

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

@@ -1084,6 +1084,7 @@ ul {
     /* top:64px; */
     top: 21.33333vw;
 }
+.wx-tabfix,
 .h5-tabfix{
   top: 10.33333vw;
 }

二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_01.jpg


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_02.jpg


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_03.jpg


二进制
src/jfw/modules/app/src/web/staticres/jyapp/images/about/register-banner_04.jpg


+ 10 - 2
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -1309,12 +1309,20 @@ function autoLogin (url, callBack) {
     if (callBack != null && typeof (callBack) != "undefined") {
       callBack(null);
     } else if (url != null && typeof (url) != "undefined") {
-      window.location.href = "/jyapp/free/login?url=" + encodeURIComponent(url);
+      if (url === 'back') {
+        window.location.href = "/jyapp/free/login?to=back";
+      } else {
+        window.location.href = "/jyapp/free/login?url=" + encodeURIComponent(url);
+      }
     }
     return;
   }
   if (url != null && typeof (url) != "undefined") {
-    window.location.href = "/jyapp/free/login?sign=" + sign + "&url=" + encodeURIComponent(url);
+    if (url === 'back') {
+      window.location.href = "/jyapp/free/login?sign=" + sign + "&to=back"
+    } else {
+      window.location.href = "/jyapp/free/login?sign=" + sign + "&url=" + encodeURIComponent(url);
+    }
     return
   }
   $.ajax({

+ 4 - 0
src/jfw/modules/app/src/web/staticres/jyapp/local/layout.css

@@ -301,13 +301,16 @@ ul, li, ol {
     border-radius: 100%;
 }
 /* 统一头部 */
+.jy-app-header.wx-header,
 .jy-app-header.h5-header {
   height: 10.66667vw;
   padding: 0 3.2vw;
 }
+.jy-app-header.wx-header .share-gift,
 .jy-app-header.h5-header .share-gift {
   margin: 0;
 }
+.jy-app-header.wx-header .header-share,
 .jy-app-header.h5-header .header-share {
   padding: 0!important;
 }
@@ -315,6 +318,7 @@ ul, li, ol {
   top: 21.33333vw;
   padding-top: 0;
 }
+.wx-body .app-layout-content-b,
 .h5-body .app-layout-content-b {
   top: 10.33333vw;
 }

+ 759 - 0
src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-module-common.css

@@ -0,0 +1,759 @@
+.mt12 {
+  margin-top: .24rem;
+}
+.fl {
+  float: left!important;
+}
+.fr {
+  float: right!important;
+}
+
+
+.loading-icon {
+  position: relative;
+  width: 30px;
+  height: 30px;
+  border: 2px solid #000;
+  border-top-color: rgba(0, 0, 0, 0.2);
+  border-right-color: rgba(0, 0, 0, 0.2);
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  border-radius: 100%;
+  animation: circle infinite 0.75s linear;
+}
+@keyframes circle {
+  0% {
+    transform: rotate(0);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+.loading-wrapper {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 100;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: transparent;
+}
+body.loading {
+  overflow: hidden;
+}
+
+
+/* tag-header */
+.page-header {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 9;
+}
+.j-header.tag-header-container {
+  width: 100%;
+  padding: 0.2rem .32rem;
+  height: 2rem;
+  padding-top: calc(0.2rem + 0.88rem);
+  background-color: #2ABED1;
+}
+.j-header.jy-app-header.wx-header,
+.j-header.jy-app-header.h5-header {
+  padding: .2rem .32rem;
+  height: 1.12rem;
+}
+.search-container {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 .24rem;
+  width: 100%;
+  height: 100%;
+  border-radius: 0.16rem;
+}
+.search-container .search-input {
+  flex: 1;
+  margin-left: .16rem;
+  font-size: 0.28rem;
+  line-height: 0.48rem;
+  color: #C0C4CC;
+}
+.page-main {
+  padding-top: 2rem;
+}
+.wx-body .page-main,
+.h5-body .page-main {
+  padding-top: 1.12rem;
+}
+
+/* tag-header */
+
+/* seo button */
+.seo-button {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: .08rem .24rem;
+  font-size: .3rem;
+  line-height: .44rem;
+  border-radius: 0.08rem; 
+}
+.seo-button.radius {
+  border-radius: 0.36rem;
+}
+.seo-button.theme-main {
+  color: #fff;
+  background-color: #2ABED1;
+}
+/* seo button */
+/* nav button */
+.nav-button {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+  padding: 0.1rem 0.08rem;
+  height: 0.64rem;
+  color: #5F5E64;
+  font-size: 0.24rem;
+  line-height: 0.36rem;
+  border-radius: 0.08rem;
+  background-color: #F5F6F7;
+}
+.text-button {
+  color: #5F5E64;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+/* nav button */
+
+/* tag-group */
+.tag-group .tag-item {
+  margin: 0.06rem 0;
+  margin-right: .16rem;
+}
+.tag-item {
+  display: inline-block;
+  box-sizing: border-box;
+  border-radius: .08rem;
+  padding: .02rem .16rem;
+  white-space: nowrap;
+  border: 1px solid transparent;
+  font-size: 0.24rem;
+  line-height: 0.36rem;
+  white-space: nowrap;
+}
+.tag-item.grey {
+  color: #5F5E64;
+  background: #F7F9FA;
+  border-color: rgba(0, 0, 0, 0.05);
+}
+.tag-item.grey.plain {
+  background: transparent;
+  border-color: #5F5E64;
+}
+.tag-item.main {
+  color: #2ABED1;
+  background: rgb(42,190,209,.1);
+  border-color: rgb(42,190,209,.1);
+}
+.tag-item.main.plain {
+  background: transparent;
+  border-color: #2ABED1;
+}
+.tag-item.orange.plain {
+  color: #FF9F40;
+  background: transparent;
+  border-color: #FF9F40;
+}
+.tag-item.red {
+  color: #fb483d;
+  background: rgba(251,72,61,.1);
+}
+.tag-item.red.plain {
+  background: transparent;
+  border-color: #fb483d;
+}
+/* tag-group */
+
+
+/* tag card common */
+.tag-card a {
+  color: inherit;
+  white-space: inherit;
+}
+.tag-card-hd {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: .32rem .32rem .12rem;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+.tag-card-title {
+  position: relative;
+  padding-left: 0.22rem;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+  color: #2ABED1;
+}
+.tag-card-title::before {
+  content: '';
+  position: absolute;
+  left: 0;
+  top: 50%;
+  width: 0.06rem;
+  height: 0.32rem;
+  border-radius: .22rem;
+  background-color: #2ABED1;
+  transform: translate(0,-50%);
+}
+.tag-card-actions {
+  color: #9B9CA3;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+.tag-card-actions .icon-arrow-up {
+  width: .32rem;
+  height: .32rem;
+  transform: rotate(90deg);
+}
+.tag-card-actions a {
+  display: flex;
+  align-items: center;
+}
+.tag-card-i-content-list {
+  position: relative;
+  display: flex;
+  flex-wrap: wrap;
+  padding: .24rem .32rem;
+  padding-right: .16rem;
+}
+.tag-card .nav-button {
+  margin-right: 0.14rem;
+  margin-bottom: 0.16rem;
+}
+.tag-card .text-button {
+  margin-right: 0.24rem;
+  margin-bottom: 0.16rem;
+}
+/* tag card common */
+
+
+.tag-city-item {
+  width: 1.62rem;
+}
+.tag-city-item:nth-of-type(4n) {
+  margin-right: 0;
+}
+
+/* tag bidding card */
+.bidding-list:not(:first-of-type) {
+  margin-top: .24rem;
+}
+.bidding-list .tag-card-list {
+  padding: .24rem .32rem;
+}
+.bidding-list .tag-card-item {
+  white-space: nowrap;
+  color: #171826;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+.bidding-list .tag-card-item:not(:last-of-type) {
+  margin-bottom: 0.16rem;
+}
+/* tag bidding card */
+
+
+/* bidding-info-list */
+.bidding-info-bd {
+  margin-top: .16rem;
+  /* margin-bottom: .12rem; */
+}
+.bidding-info-ft {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.bidding-info-list {
+  padding-left: .32rem;
+}
+.bidding-info-item {
+  padding: .32rem;
+  padding-left: 0;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+.bidding-info-title {
+  color: #171826;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+.tag-item--time {
+  font-size: .24rem;
+  line-height: .36rem;
+  color: #9B9CA3;
+  white-space: nowrap;
+}
+.tag-group .tag-item--time {
+  margin-right: 0;
+  padding-left: 0;
+  padding-right: 0;
+}
+/* bidding-info-list */
+
+/* buyer-info-list */
+.buyer-info-list {
+  padding-left: .32rem;
+}
+.buyer-info-hd {
+  margin-right: .24rem; 
+}
+.buyer-info-bd {
+  max-width: 77%;
+  flex: 1;
+}
+.buyer-info-item {
+  padding: .32rem;
+  padding-left: 0;
+  display: flex;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+.ent-info-hd-icon,
+.buyer-info-hd-icon {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 1.28rem;
+  height: 1.28rem;
+  border-radius: 0.08rem;
+  flex-shrink: 0;
+  font-size: 0.32rem;
+  color: #fff;
+  padding: .24rem .12rem;
+  letter-spacing: .533vw;
+  text-align: center;
+  line-height: .4rem;
+  background-color: #2abed1;
+  opacity: .7;
+}
+.ent-info-hd-icon.bgc-default,
+.buyer-info-hd-icon.bgc-default {
+  background-color: #2cb7ca;
+}
+.ent-info-hd-icon.bgc-blue,
+.buyer-info-hd-icon.bgc-blue {
+  background-color: #58a1e7;
+}
+.ent-info-hd-icon.bgc-orange,
+.buyer-info-hd-icon.bgc-orange {
+  background-color: #f5af5c;
+}
+.ent-info-hd-icon.bgc-green,
+.buyer-info-hd-icon.bgc-green {
+  background-color: #51cea2;
+}
+.ent-info-title,
+.buyer-info-title {
+  color: #171826;
+  font-size: 0.32rem;
+  line-height: 0.48rem;
+}
+.ent-info-sub-title,
+.buyer-info-sub-title {
+  margin-top: .08rem;
+  color: #9B9CA3;
+  font-size: 0.24rem;
+  line-height: 0.36rem;
+}
+/* buyer-info-list */
+
+/* ent-info-list */
+.ent-info-list .tag-item {
+  padding: 0 0.08rem;
+}
+.ent-info-item {
+  margin-bottom: .16rem;
+  padding: .32rem;
+}
+.ent-info-hd {
+  display: flex;
+  padding-bottom: .24rem;
+}
+.ent-info-hd-r {
+  margin-left: .24rem;
+  max-width: 77%;
+  flex: 1;
+}
+.ent-info-bd,
+.ent-info-bd-r {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.ent-info-bd-l {
+  width: calc(1.28rem + 0.24rem);
+  flex-shrink: 0;
+}
+.ent-info-bd-r {
+  flex: 1;
+}
+.ent-info-bd-l,
+.ent-info-bd-r .ent-u-location,
+.ent-info-bd-r .j-icon {
+  padding-top: .24rem;
+}
+.ent-info-bd-r .ent-u-location {
+  margin-right: .32rem;
+  flex: 1;
+  color: #5F5E64;
+  font-size: 0.22rem;
+  line-height: 0.32rem;
+  border-top: 1px solid rgba(0, 0, 0, 0.08);
+}
+/* ent-info-list */
+
+
+/* tag-register-login */
+.register-login-container {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: .24rem .32rem;
+}
+.logo-img-wrapper {
+  display: inline-block;
+  width: 2.2rem;
+  height: 0.6rem;
+}
+.logo-img-wrapper img {
+  display: block;
+  width: 100%;
+}
+.header-title {
+  flex: 1;
+  margin: 0 .16rem;
+  color: #171826;
+  font-size: 0.28rem;
+  line-height: 0.36rem;
+}
+/* tag-register-login */
+
+/* tag-info-type-nav-list */
+.tag-info-type-nav-list {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 .32rem;
+  font-size: 0.3rem;
+  line-height: 0.44rem;
+  background-color: #2ABED1;
+}
+.tag-info-type-nav-list.dark-mode {
+  background-color: #015173;
+}
+.tag-info-type-nav-item {
+  padding: .24rem 0;
+}
+.tag-info-type-nav-item a {
+  color: #fff;
+}
+/* tag-info-type-nav-list */
+
+/* tag-area-nav-container */
+.tag-area-nav-container {
+  background-color: #EDFDFF;
+  white-space: nowrap;
+}
+.tag-area-nav-container.dark-mode .tag-area-nav-list-container.simple-area,
+.tag-area-nav-container.dark-mode .tag-area-nav-list-group {
+  border-bottom-color: #171826;
+}
+.tag-area-nav-list-container,
+.tag-area-nav-list {
+  display: flex;
+  align-items: center;
+}
+.tag-area-nav-list-container.simple-area {
+  padding: .22rem .32rem;
+  border-bottom: 1px solid #2ABED1;
+}
+.tag-area-nav-list-container.more-area {
+  align-items: flex-start;
+}
+.tag-area-nav-list-container.more-area:not(:last-of-type) {
+  margin-bottom: .16rem;
+}
+.tag-area-nav-list-group {
+  padding: .26rem .32rem;
+  border-bottom: 1px solid #2ABED1;
+}
+.more-area .tag-area-nav-list {
+  flex: 1;
+  flex-wrap: wrap;
+}
+.tag-area-nav-list a {
+  color: inherit;
+  line-height: inherit;
+}
+.tag-area-nav-list-title {
+  margin-right: .46rem;
+  color: #5F5E64;
+  font-size: 0.24rem;
+  line-height: 0.48rem;
+}
+.tag-area-nav-item {
+  color: #171826;
+  font-size: 0.28rem;
+  line-height: 0.48rem;
+}
+.tag-area-nav-item:not(:last-of-type) {
+  margin-right: .48rem;
+}
+/* tag-area-nav-container */
+
+/* tag-industry-nav */
+.tag-industry-hd-container {
+  overflow-x: scroll;
+}
+.tag-industry-item:first-of-type {
+  margin-left: .32rem;
+}
+.tag-industry-item:last-of-type {
+  margin-right: .32rem;
+}
+.tag-industry-hd-container {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}
+.tag-industry-list {
+  display: flex;
+  flex-wrap: nowrap;
+  width: max-content;
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+.tag-industry-item {
+  display: inline-flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0.2rem 0;
+  margin-right: .4rem;
+  flex-shrink: 0;
+  white-space: nowrap;
+  border-bottom: 1px solid transparent;
+}
+.tag-industry-content-item {
+  min-width: 1.6rem;
+  max-width: 1.8rem;
+}
+.tag-industry-item.active {
+  color: #2ABED1;
+  border-color: #2ABED1;
+}
+/* tag-industry-nav */
+
+/* tag-card-text-list */
+.text-list-container:first-of-type {
+  margin-top: 0;
+}
+.text-list-container .tag-card-bd-content {
+  padding: 0.24rem 0.32rem;
+}
+.text-list-container .tag-card-i-content-list {
+  display: block;
+  padding: 0;
+}
+.tag-card-i-content-list.max-height {
+  max-height: 2.76rem;
+  overflow: hidden;
+}
+.text-list-container .action-group {
+  margin: 0;
+  text-align: right;
+}
+/* tag-card-text-list */
+
+/* tag-pagination */
+.tag-pagination {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  height: .96rem;
+  font-size: .28rem;
+  line-height: .4rem;
+  color: #5F5E64;
+}
+.tag-pagination-button {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 100%;
+  flex: 2;
+}
+.tag-pagination-page-num {
+  flex: 1;
+  color: #171826;
+}
+.tag-pagination-button a {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  height: 100%;
+}
+.tag-pagination .j-icon {
+  width: .32rem;
+  height: .32rem;
+}
+.tag-pagination-prev .icon-arrow-up {
+  margin-right: .16rem;
+  transform: rotateZ(-90deg);
+}
+.tag-pagination-next .icon-arrow-up {
+  margin-left: .16rem;
+  transform: rotateZ(90deg);
+}
+/* tag-pagination */
+
+
+
+/* tag-swiper */
+.tag-swiper-list-container {
+  padding-top: 0.08rem;
+  width: 100%;
+}
+.tag-swiper-item {
+  padding: .16rem .32rem;
+  border-radius: .16rem;
+  overflow: hidden;
+}
+.tag-swiper-item a {
+  display: inline-block;
+  width: 100%;
+  height: 100%;
+  border-radius: 0.16rem;
+  overflow: hidden;
+}
+.tag-swiper-item img {
+  display: block;
+  width: 100%;
+}
+.swiper-container-horizontal .swiper-custom-dot {
+  bottom: .28rem;
+}
+.swiper-pagination .swiper-pagination-bullet {
+  width: 0.08rem;
+  height: 0.08rem;
+  
+}
+.swiper-pagination .swiper-pagination-bullet-active {
+  background-color: #fff;
+}
+/* tag-swiper */
+
+
+/* tag-breadcrumb-navigation */
+.tag-breadcrumb-navigation {
+  padding: 0.08rem .32rem;
+  color: #5F5E64;
+  font-size: 0.2rem;
+  line-height: 0.28rem;
+}
+.tag-breadcrumb-navigation a {
+  color: inherit;
+}
+/* tag-breadcrumb-navigation */
+
+/* tag-footer */
+.tag-footer-container {
+  color: #fff;
+}
+.tag-footer-container a {
+  color: inherit;
+}
+.footer-card {
+  padding: .32rem;
+  padding-bottom: calc(.32rem + 1.08rem);
+  background-color: #5F5E64;
+}
+.footer-divider {
+  height: 1px;
+  background-color: rgba(255, 255, 255, 0.24);
+}
+.footer-button-group {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0.2rem .32rem;
+  background: rgba(0, 0, 0, 0.70);
+}
+.footer-button-group .seo-button {
+  padding: 0.12rem 0.68rem;
+}
+.footer-button-group .seo-button .j-icon {
+  margin-right: 0.08rem;
+  width: 0.4rem;
+  height: 0.4rem;
+}
+.footer-card-line {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.tel-container {
+  font-size: 0.28rem;
+  line-height: 0.4rem;
+}
+.bottom-navs {
+  margin-top: .16rem;
+  margin-bottom: .32rem;
+  color: rgba(255, 255, 255, 0.90);
+  font-size: 0.26rem;
+  line-height: 0.4rem;
+}
+.bottom-nav-link:first-of-type {
+  margin-right: 1.6rem;
+}
+.copyright {
+  margin-top: .32rem;
+}
+.tel-link {
+  margin-left: 0.32rem;
+  font-size: 0.36rem;
+  line-height: 0.52rem;
+}
+.tag-footer-container.fixed {
+  position: fixed;
+  width: 100%;
+  left: 0;
+  bottom: 0;
+  z-index: 99;
+}
+.tag-footer-container.fixed .footer-button-group {
+  background: rgba(0, 0, 0, 0.70);
+}
+/* tag-footer */
+
+/* back-to-top */
+.back-to-top {
+  position: fixed;
+  right: .32rem;
+  bottom: calc(1.12rem + 0.8rem);
+  width: .96rem;
+  height: .96rem;
+  background-color: rgba(0, 0, 0, 0.4);
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.back-to-top .j-icon {
+  width: .64rem;
+  height: .64rem;
+}
+/* back-to-top */

+ 57 - 0
src/jfw/modules/app/src/web/staticres/jyapp/tags/js/index.js

@@ -0,0 +1,57 @@
+var page = {
+  init: function () {
+    areaNavModule.init()
+    bannerSwiper.init()
+    backToTop.init()
+    industryNav.init()
+    entBuyerInfoList.init()
+    textTagListShowMore.init()
+    loading.init()
+    this.initEvents()
+    this.changeTopNavTheme(!!templateData.areaTopTitle)
+    this.clearSessionStorages()
+  },
+  initEvents: function () {
+    this.initFooterPhoneCall()
+    // this.showAppFooterNavs()
+  },
+  showAppFooterNavs: function () {
+    var isInHomePage = location.pathname === '/jyapp/jylab/mainSearch'
+    if (utils.$envs.inApp) {
+      setTimeout(function () {
+        try {
+          if (isInHomePage) {
+            JyObj.hiddenBottom('1')
+          }
+        } catch (error) {
+          console.log(error)
+        }
+      }, 10)
+    }
+  },
+  clearSessionStorages: function () {
+    localStorage.removeItem('JY-MOBILE-home-top-search')
+  },
+  initFooterPhoneCall: function () {
+    if (utils.$envs.inApp) {
+      $('.tel-link,.phone-concat-customer').on('click', function (e) {
+        e.preventDefault()
+        var tel = $(this).attr('data-tel')
+        try {
+          JyObj.callPhone(tel)
+        } catch (error) {
+          console.log(error)
+        }
+      })
+    }
+  },
+  changeTopNavTheme: function (f) {
+    if (f) {
+      $('.tag-info-type-nav-list, .tag-area-nav-container').addClass('dark-mode')
+    }
+  }
+}
+
+$(function () {
+  page.init()
+})

+ 203 - 0
src/jfw/modules/app/src/web/staticres/jyapp/tags/js/tag-common.js

@@ -0,0 +1,203 @@
+var areaNavModule = {
+  $el: null,
+  init: function () {
+    this.getTargetDOM()
+    this.addListener()
+  },
+  getTargetDOM: function () {
+    this.$el = $('.tag-area-nav-container')
+  },
+  addListener: function () {
+    var _this = this
+    if (!this.$el) return
+    this.$el.find('.action-show-more').on('click', function () {
+      _this.$el.find('.tag-area-nav-list-group').toggle()
+    })
+  }
+}
+
+var loading = {
+  $el: $('.loading-wrapper'),
+  init: function () {
+    var _this = this
+    $('[v-loading]').on('click', function () {
+      _this.show()
+    })
+  },
+  show: function () {
+    this.$el.show()
+    $('body').addClass('loading')
+  },
+  hide: function () {
+    this.$el.hide()
+    $('body').removeClass('loading')
+  }
+}
+
+var bannerSwiper = {
+  $el: $('.swiper-container'),
+  className: '.swiper-container',
+  init: function () {
+    this.initSwiper()
+  },
+  initSwiper: function () {
+    var _this = this
+    var conf = {
+      slidesPerView: 1,
+      centeredSlides: true,
+      observer: true,
+      speed: 800,
+      pagination: {
+        el: '.swiper-pagination'
+      },
+      autoplay: _this.$el.find('.swiper-slide').length > 1 ? {
+        delay: 5000
+      } : false, // imageList.length > 1 ? true : false
+      loop: _this.$el.find('.swiper-slide').length > 1 ? true : false,
+    }
+    // console.log(conf)
+    this.$el = new Swiper(this.className, conf)
+  },
+}
+
+var backToTop = {
+  $scrollDOM: $(window),
+  $backToTop: $('.back-to-top'),
+  init: function () {
+    this.checkBackToTopButtonShow()
+    this.bindEvents()
+  },
+  bindEvents: function () {
+    var _this = this
+    this.$backToTop.on('click', function () {
+      $('html').animate({
+        scrollTop: 0
+      })
+    })
+    this.$scrollDOM.on('scroll', function (e) {
+      _this.checkBackToTopButtonShow()
+    })
+  },
+  checkBackToTopButtonShow: function () {
+    var scrollTop = this.$scrollDOM.scrollTop()
+    if (scrollTop < 5) {
+      this.$backToTop.hide()
+    } else {
+      this.$backToTop.show()
+    }
+  },
+}
+
+var industryNav = {
+  $el: $('.industry-nav-container'),
+  init: function () {
+    this.bindEvents()
+    this.$el.find('.tag-industry-item:eq(0)').trigger('click')
+  },
+  bindEvents: function () {
+    var _this = this
+    this.$el.find('.tag-industry-list').on('click', '.tag-industry-item', function () {
+      var $this = $(this)
+      var value = $this.attr('data-value')
+      $this.addClass('active').siblings().removeClass('active')
+      var target = _this.$el.find('[data-list-title='+value+']')
+      target.show().siblings().hide()
+    })
+  }
+}
+
+var textTagListShowMore = {
+  $el: $('.text-list-container'),
+  init: function () {
+    this.bindEvents()
+  },
+  // calcActionButtonPosition: function () {
+  //   this.$el.find('.tag-card-bd').each(function (_, cardBody) {
+  //     var cardBodyHeight = $(this).height()
+  //     var actionGroup = $(this).find('.action-group')
+  //     $(cardBody).find('.text-list-item').each(function (index, item) {
+  //       var offsetTop = item.offsetTop
+  //       if (offsetTop >= cardBodyHeight) {
+  //         // 将操作按钮组插入此元素前
+  //         actionGroup.find('.more').show().end().insertBefore($(item))
+  //         return false // return false 提前结束循环
+  //       }
+  //     })
+  //   })
+  // },
+  bindEvents: function () {
+    this.$el.find('.action-group').on('click', '.more,.shouqi', function () {
+      var $this = $(this)
+      var parentWrapper = $(this).parents('.tag-card-bd').find('.tag-card-i-content-list')
+      if ($(this).hasClass('more')) {
+        parentWrapper.removeClass('max-height')
+      }
+      if ($(this).hasClass('shouqi')) {
+        parentWrapper.addClass('max-height')
+      }
+      $this.hide().siblings().show()
+    })
+  }
+}
+
+var entBuyerInfoList = {
+  $elBuyer: $('.buyer-info-list-container'),
+  $elEnt: $('.ent-info-list-container'),
+  init: function () {
+    this.calcEntBuyerShortname()
+  },
+  calcEntBuyerShortname: function () {
+    var _this = this
+    // 计算采购采购单位shortName
+    this.$elBuyer.find('.buyer-info-item').each(function (index, buyer) {
+      var $buyer = $(buyer)
+      var entName = $buyer.find('.buyer-info-title a').text()
+      var shortname = _this.getShortName(entName)
+      $buyer.find('.hd-icon').text(shortname)
+    })
+    // 计算企业列表shortName,并添加colorful icon bgc
+    this.$elEnt.find('.ent-info-item').each(function (index, ent) {
+      var $ent = $(ent)
+      var buyerName = $ent.find('.ent-info-title a').text()
+      var shortname = _this.getShortName(buyerName)
+      var colorfulIconClassName = _this.randomBgc()
+      $ent.find('.hd-icon').text(shortname).addClass(colorfulIconClassName)
+    })
+  },
+  getShortName: function (comName) {
+    var areaMap = chinaMapJSON || []
+    var shortname = comName
+    // 1. 循环省份城市进行替换
+    areaMap.forEach(function (item) {
+        var p = item.name.replace(/[省市]/, '')
+        if (shortname.indexOf(p) !== -1) {
+            shortname = shortname.replace(item.name, '').replace(p, '')
+            // console.log(p + ' -> \'\'')
+        }
+        item.city.forEach(function (iitem) {
+            var c = iitem.name.replace(/[省市]/, '')
+            if (shortname.indexOf(c) !== -1) {
+                shortname = shortname.replace(iitem.name, '').replace(c, '')
+                // console.log(c + ' -> \'\'')
+            }
+            iitem.area.forEach(function (iiitem) {
+                if (shortname.indexOf(iiitem) !== -1) {
+                    shortname = shortname.replace(iiitem, '')
+                    // console.log(iiitem + ' -> \'\'')
+                }
+            })
+        })
+    })
+    var matchRes = shortname.match(/[\u4e00-\u9fa5]{4}/gm)
+    var shortname = matchRes ? matchRes[0] : shortname.slice(0, 4)
+    if (shortname.length < 4) {
+        shortname = shortname.slice(0, 4)
+    }
+    return shortname
+  },
+  randomBgc: function () {
+    var arr = ['default', 'blue', 'orange', 'green']
+    var randomIndex = utils.getRandomNumber(0, arr.length - 1)
+    return 'bgc-' + arr[randomIndex]
+  }
+}

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

@@ -14,7 +14,8 @@
 <meta name="format-detection" content="telephone=no">
 <link rel="icon" href="/favicon.ico">
 <script src='https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js'></script>
-<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/track/j-track.min.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+<!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/track/j-track.min.js?v={{Msg "seo" "version"}}'></script> -->
 <!--E-meta-->
 
 <!--S-必定会使用的资源-->

+ 170 - 0
src/jfw/modules/app/src/web/templates/frontRouter/activity/free/app-register.html

@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+
+<head>
+  <!-- <title>投标人专属免费计划</title> -->
+    <title>免费注册查看全国招标信息</title>
+    <!--引入公共资源头部-->
+    {{include "/big-member/meta.html"}}
+
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
+    <!--E-当前页面的css资源-->
+    <style>
+        .j-container.app > .j-main {
+            margin-top: -21.34vw;
+            padding-bottom: .72rem;
+            background: linear-gradient(177deg, #134CEE 0%, #0923A0 40.57%, #00005E 54.10%);
+        }
+        .banner-container {
+            position: relative;
+        }
+        .banner-container img {
+            display: block;
+            width: 100%;
+        }
+        .button-container {
+            position: absolute;
+            top: .72rem;
+            left: 0;
+            width: 100%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+        }
+        .register-now-button {
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            width: 5.34rem;
+            height: 0.96rem;
+            flex-shrink: 0;
+            color: #FFF;
+            text-shadow: 1px 1px 0px #0976EA;
+            font-size: 0.4rem;
+            font-weight: 700;
+            line-height: 0.48rem;
+            border-radius: 0.6rem;
+            background: linear-gradient(180deg, #07FFFF 0%, #0BA6FD 100%);
+            box-shadow: 0px 2px 12px 0px rgba(1, 7, 61, 0.28);
+        }
+        .footer-button-container {
+            position: fixed;
+            bottom: 0;
+            left: 0;
+            width: 100%;
+            padding: .24rem 0;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            background: rgba(0, 0, 0, 0.60);
+        }
+    </style>
+    <script>
+        try {
+            window.JyObj.hiddenBottom('0')
+        } catch (e) {
+            console.log('error: app not function')
+        }
+    </script>
+</head>
+
+<body>
+    <div class="j-container app">
+        {{include "/big-member/header.html"}}
+        <div class="j-main" id="main-app">
+            <div class="banner-container">
+                <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/about/register-banner_01.jpg' alt="">
+            </div>
+            <div class="banner-container">
+                <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/about/register-banner_02.jpg' alt="">
+                <div class="button-container">
+                    <a class="register-now-button" href="/jyapp/free/login?url=/jyapp/jylab/mainSearch">立即注册</a>
+                </div>
+            </div>
+            <div class="banner-container">
+                <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/about/register-banner_03.jpg' alt="">
+            </div>
+            <div class="banner-container">
+                <img src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/about/register-banner_04.jpg' alt="">
+            </div>
+        </div>
+        <div class="footer-button-container" style="display: none;">
+            <a class="register-now-button" href="/jyapp/free/login?url=/jyapp/jylab/mainSearch">立即注册</a>
+        </div>
+    </div>
+
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js> </script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js> </script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js> </script>
+    {{include "/big-member/commonjs.html"}}
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+    <script>
+        var page = {
+            init: function () {
+                this.transparentHeader(true)
+                this.initScrollEvents()
+            },
+            isElementInViewport: function (element) {
+                // 获取元素的位置和尺寸
+                var rect = element.getBoundingClientRect();
+
+                // 获取视口的尺寸
+                var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
+                var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
+
+                // 检查元素是否在视口中
+                var elementInViewport = (
+                rect.top >= 0 &&
+                rect.left >= 0 &&
+                rect.bottom <= viewportHeight &&
+                rect.right <= viewportWidth
+                );
+                return elementInViewport;
+            },
+            transparentHeader: function (f) {
+                var $header = $('.j-header.jy-app-header')
+                if (f) {
+                    $header.addClass('transparent-header')
+                } else {
+                    $header.removeClass('transparent-header')
+                }
+            },
+            showFooterRegisterButton: function (f) {
+                if (f) {
+                    $('.footer-button-container').show()
+                } else {
+                    $('.footer-button-container').hide()
+                }
+            },
+            initScrollEvents: function () {
+                var _this = this
+                $('#main-app').on('scroll', function () {
+                    // 头部透明
+                    var scrollTop = $(this).scrollTop()
+                    if (scrollTop > 50) {
+                        _this.transparentHeader(false)
+                    } else {
+                        _this.transparentHeader(true)
+                    }
+                    // 底部按钮
+                    var target = $('.button-container .register-now-button')[0]
+                    var isInViewport = _this.isElementInViewport(target);
+                    if (isInViewport) {
+                        _this.showFooterRegisterButton(false);
+                    } else {
+                        _this.showFooterRegisterButton(true)
+                    }
+                })
+            }
+        }
+        $(function () {
+            page.init()
+        })
+    </script>
+    {{include "/common/baiducc.html"}}
+</body>
+
+</html>

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

@@ -212,7 +212,7 @@
         if (!c_type) return
         try {
           clab_tracker.track('c_register', {
-            c_platform: 'app',
+            c_platform: utils.$env.platform,
             c_type: c_type,
             date: new Date()
           })

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

@@ -309,7 +309,7 @@
         if (!c_type) return
         try {
           clab_tracker.track('c_register', {
-            c_platform: 'app',
+            c_platform: utils.$env.platform,
             c_type: c_type,
             date: new Date()
           })

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

@@ -97,7 +97,7 @@
         if (!c_type) return
         try {
           clab_tracker.track('c_register', {
-            c_platform: 'app',
+            c_platform: utils.$env.platform,
             c_type: c_type,
             date: new Date()
           })

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

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+  {{include "/tags/template/tag-meta.html"}}
+  <title>{{.T.tdk.Title}}</title>
+  {{include "/tags/template/tag-header-common-assets.html"}}
+</head>
+<body>
+  <section class="page-container">
+    <header class="page-header">
+      {{include "/tags/template/tag-header.html"}}
+    </header>
+    <main class="page-main">
+      <div class="module-wrapper">
+        {{include "/tags/template/tag-register-login-group.html"}}
+        {{include "/tags/template/tag-info-type-nav.html"}}
+        {{include "/tags/template/tag-area-nav.html"}}
+        {{if  .T.adList }}
+            {{include "/tags/template/tag-swiper-list.html"}}
+        {{end}}
+        {{if .T.buyerList}}
+            {{include "/tags/template/tag-card-buyer.html"}}
+        {{end}}
+        {{if .T.winnerList}}
+            {{include "/tags/template/tag-card-ent.html"}}
+        {{end}}
+        {{if and  .T.biddingList .T.isInfoList}}
+            {{include "/tags/template/tag-card-bidding-info-list.html"}}
+        {{else}}
+            {{include "/tags/template/bidding-card-list.html"}}
+        {{end}}
+        {{if .T.industryNav}}
+            {{include "/tags/template/tag-card-industry-nav.html"}}
+        {{end}}
+        {{if .T.cityList}}
+            {{include "/tags/template/tag-card-city-list.html"}}
+        {{end}}
+        {{if .T.industryData}}
+          {{include "/tags/template/tag-card-text-list.html"}}
+        {{end}}
+        {{if .T.currentLocation}}
+            {{include "/tags/template/tag-breadcrumb-navigation.html"}}
+        {{end}}
+        {{include "/tags/template/tag-footer.html"}}
+      </div>
+    </main>
+  </section>
+  <div class="loading-wrapper" style="display: none;">
+    <div class="loading-icon"></div>
+  </div>
+  {{include "/tags/template/tag-footer-common-assets.html"}}
+  <script>
+    var templateData = {
+      homeLink: {{.T.HomeOrigin}},
+      areaTopTitle: {{.T.areaTopTip}}
+    }
+  </script>
+  <script src='/common-module/public/js/china-map-data.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/tag-common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/index.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>
+

+ 6 - 0
src/jfw/modules/app/src/web/templates/tags/template/bidding-card-list.html

@@ -0,0 +1,6 @@
+<section class="card-list">
+  {{$biddingList:=.T.biddingList}}
+  {{range $v := $biddingList}}
+    {{include "/tags/template/tag-card-bidding-title.html" $v }}
+  {{end}}
+</section>

+ 29 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-area-nav.html

@@ -0,0 +1,29 @@
+<section class="tag-area-nav-container">
+  <div class="tag-area-nav-list-container simple-area">
+    <p class="tag-area-nav-list-title">分站</p>
+    <ul class="tag-area-nav-list">
+      {{range $val:=.T.hotArea}}
+      <li class="tag-area-nav-item">
+        <a href="{{$val.Url}}" title="{{$val.Name}}招标网">{{$val.Name}}</a>
+      </li>
+      {{end}}
+      <li class="tag-area-nav-item highlight-text action-show-more">更多 &gt;</li>
+    </ul>
+  </div>
+  <ul class="tag-area-nav-list-group" style="display: none;">
+    {{range  $v:=.T.areaList}}
+      {{range $kal, $val:=$v}}
+      <li class="tag-area-nav-list-container more-area">
+        <p class="tag-area-nav-list-title">{{$kal}}</p>
+        <ul class="tag-area-nav-list">
+          {{range  $city:=$val}}
+          <li class="tag-area-nav-item">
+            <a href="{{$city.Url}}" title="{{$city.Name}}招标网"> {{$city.Name}}</a>
+          </li>
+          {{end}}
+        </ul>
+      </li>
+      {{end}}
+    {{end}}
+  </ul>
+</section>

+ 11 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-breadcrumb-navigation.html

@@ -0,0 +1,11 @@
+<section class="tag-breadcrumb-navigation">
+  <span>当前位置:</span>
+  <a href="{{.T.Home}}">剑鱼标讯首页</a>
+  {{range $l:=.T.currentLocation}}
+  {{if $l.Url}}
+  &gt; <a href="{{$l.Url}}">{{$l.Name}}</a>
+  {{else}}
+  &gt; <a href="javascript:;">{{$l.Name}}</a>
+  {{end}}
+  {{end}}
+</section>

+ 48 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-bidding-info-list.html

@@ -0,0 +1,48 @@
+<section class="tag-card bg-white bidding-info-list-container mt12">
+  {{$infoList :=index .T.biddingList 0}}
+  <header class="tag-card-hd">
+    <h2 class="tag-card-title">  {{$infoList.Name}}</h2>
+    <div class="tag-card-actions"></div>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="bidding-info-list">
+      {{range $info:=$infoList.List}}
+      <li class="bidding-info-item">
+        <div class="bidding-info-hd">
+          <a class="bidding-info-title ellipsis-2" href="{{$info.Url}}"> {{$info.Title}} </a>
+        </div>
+        <div class="bidding-info-bd">
+          <div class="tag-group clearfix">
+            {{if $info.Site}}
+            <p class="tag-item red fl">{{$info.Site}}</p>
+            {{end}}
+            {{if $info.Area}}
+            <p class="tag-item grey fl">{{$info.Area}}</p>
+            {{end}}
+            {{if $info.BuyerClass}}
+            <p class="tag-item grey fl">{{$info.BuyerClass}}</p>
+            {{end}}
+            {{if $info.Subtype}}
+            <p class="tag-item grey fl">{{$info.Subtype}}</p>
+            {{end}}
+            {{if $info.Price}}
+            <p class="tag-item grey fl">{{$info.Price}}</p>
+            {{end}}
+            {{if $info.FileExists}}
+            <p class="tag-item main fl">有附件</p>
+            {{end}}
+            {{if $info.PublishTime }}
+            <p class="tag-item tag-item--time fr">{{$info.PublishTime }}</p>
+            {{end}}
+          </div>
+        </div>
+        <!-- <div class="bidding-info-ft"></div> -->
+      </li>
+      {{end}}
+    </ul>
+  </main>
+  <footer class="tag-card-ft">
+    {{include "/tags/template/tag-pagination.html"}}
+  </footer>
+</section>
+<script></script>

+ 18 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-bidding-title.html

@@ -0,0 +1,18 @@
+<section class="tag-card bg-white bidding-list">
+  <header class="tag-card-hd">
+    <h3 class="tag-card-title">{{.Name}}</h3>
+    <div class="tag-card-actions">
+      <a href="{{.Url}}">更多<i class="j-icon base-icon icon-arrow-up"></i></a>
+    </div>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="tag-card-list">
+      {{range $info:=.List}}
+      <li class="tag-card-item ellipsis">
+        <a href="{{$info.Url}}">{{$info.Title}}</a>
+      </li>
+{{end}}
+    </ul>
+  </main>
+</section>
+

+ 47 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-buyer.html

@@ -0,0 +1,47 @@
+<section class="tag-card bg-white buyer-info-list-container">
+  <header class="tag-card-hd">
+    <h2 class="tag-card-title"> {{.T.buyerList.Name}}</h2>
+    <div class="tag-card-actions"></div>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="buyer-info-list">
+      {{range $buyer:=.T.buyerList.List}}
+      <li class="buyer-info-item">
+        <div class="buyer-info-hd">
+          <div class="buyer-info-hd-icon hd-icon"></div>
+        </div>
+        <div class="buyer-info-bd">
+          <h3 class="buyer-info-title ellipsis">
+            <a href="{{$buyer.Url}}">{{$buyer.Title}}</a>
+          </h3>
+          <div class="buyer-info-sub-title">
+            <p>
+              <span>所在地:</span>
+              <span class="highlight-text">
+                {{if $buyer.Area }}
+                    {{$buyer.Area}}
+                {{else}}
+                    -
+                {{end}}
+              </span>
+            </p>
+            <p>
+              <span>采购单位类型:</span>
+              <span class="highlight-text">
+              {{if  $buyer.BuyerClass }}
+                  {{$buyer.BuyerClass}}
+              {{else}}
+                  -
+              {{end}}
+              </span>
+            </p>
+          </div>
+        </div>
+      </li>
+      {{end}}
+    </ul>
+  </main>
+  <footer class="tag-card-ft">
+    {{include "/tags/template/tag-pagination.html" }}
+  </footer>
+</section>

+ 15 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-city-list.html

@@ -0,0 +1,15 @@
+<section class="tag-card bg-white city-list-container mt12">
+  <header class="tag-card-hd">
+    {{$v:=index .T.currentLocation 0}}
+    <h3 class="tag-card-title">{{$v.Name}}相关城市</h3>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="tag-card-i-content-list">
+      {{range $city:=.T.cityList}}
+      <li class="tag-city-item nav-button ellipsis">
+        <a class="ellipsis" v-loading href="{{$city.Url}}" title="{{$city.Name}}招标网">{{$city.Name}}招标网</a>
+      </li>
+      {{end}}
+    </ul>
+  </main>
+</section>

+ 75 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-ent.html

@@ -0,0 +1,75 @@
+<section class="tag-card ent-info-list-container">
+  <header class="tag-card-hd bg-white">
+    <h2 class="tag-card-title">{{.T.winnerList.Name}}</h2>
+    <div class="tag-card-actions"></div>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="ent-info-list">
+      {{range $winner:=.T.winnerList.List}}
+      <li class="ent-info-item bg-white clickable">
+        <div class="ent-info-hd">
+          <div class="ent-info-hd-l">
+            <div class="ent-info-hd-icon hd-icon"></div>
+          </div>
+          <div class="ent-info-hd-r">
+            <h3 class="ent-info-title ellipsis">
+              <a href="{{$winner.Url}}">{{$winner.Title}}</a>
+            </h3>
+            <div class="ent-info-sub-title">
+              <p>
+                <span>法定代表人:</span>
+                <span class="highlight-text">
+                  {{if $winner.LegalPerson}}
+                      {{$winner.LegalPerson}}
+                  {{else}}
+                      -
+                   {{end}}
+                </span>
+              </p>
+              <p>
+                <span>注册资本:</span>
+                <span class="highlight-text">
+                  {{if $winner.Price}}
+                      {{$winner.Price}}
+                  {{else}}
+                      -
+                  {{end}}
+                </span>
+              </p>
+            </div>
+          </div>
+        </div>
+        {{if or $winner.Address  $winner.State }}
+        <div class="ent-info-bd">
+          <div class="ent-info-bd-l">
+            {{ if eq $winner.State "吊销"}}
+            <div class="tag-item plain grey">吊销</div>
+            {{else if eq $winner.State "注销"}}
+            <div class="tag-item plain orange">注销</div>
+            {{else if eq $winner.State "撤销"}}
+            <div class="tag-item plain red">撤销</div>
+            {{else if  $winner.State }}
+            <div class="tag-item plain main">{{$winner.State}}</div>
+            {{else}}
+            <div></div>
+            {{end}}
+
+          </div>
+          {{if  $winner.Address}}
+          <div class="ent-info-bd-r">
+            <p class="ent-u-location">{{$winner.Address}}</p>
+            <i class="j-icon base-icon icon-location"></i>
+          </div>
+          {{else}}
+          <div></div>
+          {{end}}
+        </div>
+        {{end}}
+      </li>
+      {{end}}
+    </ul>
+  </main>
+  <footer class="tag-card-ft">
+    {{include "/tags/template/tag-pagination.html"}}
+  </footer>
+</section>

+ 29 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-industry-nav.html

@@ -0,0 +1,29 @@
+<section class="tag-card bg-white industry-nav-container mt12">
+  <header class="tag-card-hd">
+    <h3 class="tag-card-title">{{.T.industryNav.Name}}</h3>
+    <div class="tag-card-actions">
+      <a href="{{.T.industryNav.Url}}">更多<i class="j-icon base-icon icon-arrow-up"></i></a>
+    </div>
+  </header>
+  <main class="tag-card-bd">
+    <div class="tag-industry-hd-container">
+      <ul class="tag-industry-list">
+        {{range $industry:=.T.industryNav.List}}
+        <li class="tag-industry-item active" data-value="{{$industry.Name}}">{{$industry.Name}}</li>
+        {{end}}
+
+      </ul>
+    </div>
+    <div class="tag-industry-bd-container">
+      {{range $industry:=.T.industryNav.List}}
+      <ul class="tag-card-i-content-list" style="display: none;" data-list-title="{{$industry.Name}}">
+        {{range $info:=$industry.List}}
+        <li class="tag-industry-content-item nav-button">
+          <a href="{{$info.Url}}" v-loading>{{$info.Name}}</a>
+        </li>
+        {{end}}
+      </ul>
+{{end}}
+    </div>
+  </main>
+</section>

+ 25 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-text-list.html

@@ -0,0 +1,25 @@
+<section>
+  {{range $industry:=.T.industryData.List}}
+  <section class="tag-card bg-white text-list-container mt12">
+    <header class="tag-card-hd">
+      <h3 class="tag-card-title">{{$industry.Name}}</h3>
+      <div class="tag-card-actions"></div>
+    </header>
+    <main class="tag-card-bd">
+      <div class="tag-card-bd-content">
+        <ul class="tag-card-i-content-list max-height clearfix">
+          {{range $v:=$industry.List}}
+          <li class="text-list-item text-button fl">
+            <a href="{{$v.Url}}">{{$v.Name}}</a>
+          </li>
+          {{end}}
+        </ul>
+        <div class="text-button action-group highlight-text">
+          <span class="more">更多&gt;</span>
+          <span class="shouqi" style="display: none;">收起&lt;</span>
+        </div>
+      </div>
+    </main>
+  </section>
+  {{end}}
+</section>

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

@@ -0,0 +1,15 @@
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
+<script>
+    utils.iosBackRefresh()
+    // 头部事件js
+    // goBack写外面方便随时解绑
+    function goBack() {
+        history.back()
+        window.afterClickBack && window.afterClickBack()
+    }
+</script>
+<!-- seo相关页面未使用到客户端方法,暂时不引用commonjs -->
+<!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script> -->
+<script src='https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js'></script>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/swiper/5.4.2/swiper.min.js"></script>
+{{include "/common/baiducc.html"}}

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

@@ -0,0 +1,30 @@
+<section class="tag-footer-container">
+  <div class="footer-card">
+    <div class="footer-card-line tel-container">
+      <p>咨询热线</p>
+      <a class="tel-link" data-tel="400-108-6670" href="tel:400-108-6670">400-108-6670</a>
+    </div>
+    <div class="footer-card-line bottom-navs">
+      <a class="bottom-nav-link" href="{{.T.Home}}">首页</a>
+      <a class="bottom-nav-link" href="/jyapp/free/swordfish/about">关于剑鱼标讯</a>
+    </div>
+    <div class="footer-divider"></div>
+    <p class="footer-card-line copyright">版权所有-剑鱼标讯</p>
+  </div>
+</section>
+<section class="tag-footer-container fixed">
+  <div class="footer-button-group">
+    <a class="seo-button theme-main radius phone-concat-customer" data-tel="400-108-6670" href="tel:400-108-6670">
+      <span class="j-icon base-icon icon-phone-white-solid"></span>
+      <p>电话咨询</p>
+    </a>
+    <a class="seo-button theme-main radius" href="/jyapp/free/login?url=/jyapp/jylab/mainSearch">
+      <span class="j-icon base-icon icon-person-white-solid"></span>
+      <p>登录/注册</p>
+    </a>
+  </div>
+</section>
+<section class="back-to-top">
+  <i class="j-icon base-icon icon-arrow-up2"></i>
+</section>
+

+ 10 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-header-common-assets.html

@@ -0,0 +1,10 @@
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/history-push/local/rem.js'></script>
+<script src='https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>
+<!-- <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/track/j-track.min.js?v={{Msg "seo" "version"}}'></script> -->
+
+<link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
+<link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/public.css?v={{Msg "seo" "version"}}' />
+<link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/j-icons.css?v={{Msg "seo" "version"}}' />
+<link rel="stylesheet" href="https://cdn-common.jianyu360.com/cdn/lib/swiper/5.4.2/swiper.min.css"/>
+<link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/tags/css/tags-module-common.css?v={{Msg "seo" "version"}}' />

+ 6 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-header.html

@@ -0,0 +1,6 @@
+<div class="tag-header-container j-header jy-app-header">
+    <a class="search-container bg-white" href="/jy_mobile/search/middle/bidding">
+        <i class="search-icon j-icon base-icon icon-search"></i>
+        <div class="search-input">请输入您要搜索的内容</div>
+    </a>
+</div>

+ 8 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-info-type-nav.html

@@ -0,0 +1,8 @@
+<ul class="tag-info-type-nav-list">
+
+  {{range $val:=.T.infoTypeList}}
+  <li class="tag-info-type-nav-item">
+    <a href="{{$val.url}}">{{$val.name}}</a>
+  </li>
+  {{end}}
+</ul>

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

@@ -0,0 +1,17 @@
+
+<!--S-meta-->
+<meta charset="utf-8">
+<meta name="keywords" content="{{.T.tdk.Keywords}}">
+<meta name="description" content="{{.T.tdk.Description}}">
+<meta name="author" content="剑鱼标讯">
+<meta name="applicable-device" content="mobile" />
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
+<meta name="browsermode" content="application">
+<meta name="x5-orientation" content="portrait">
+<meta name="screen-orientation" content="portrait">
+<meta name="x5-page-mode" content="app">
+<meta name="apple-mobile-web-app-capable" content="yes">
+<meta name="apple-mobile-web-app-status-bar-style" content="black">
+<meta name="format-detection" content="telephone=no">
+<link rel="icon" href="/favicon.ico">

+ 30 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-pagination.html

@@ -0,0 +1,30 @@
+<ul class="tag-pagination bg-white">
+  {{if .T.prevPage }}
+  <li class="tag-pagination-button tag-pagination-prev clickable">
+    <a href="{{.T.prevPage}}">
+      <i class="j-icon base-icon icon-arrow-up"></i>
+      <p>上一页</p>
+    </a>
+  </li>
+  {{else}}
+  <li class="tag-pagination-button tag-pagination-placeholder"></li>
+  {{end}}
+
+  <li class="tag-pagination-button tag-pagination-page-num">
+    <span class="highlight-text">    {{.T.pageNum}}</span>
+    <span>&nbsp;/&nbsp;</span>
+    <span>    {{.T.totalPage}}</span>
+  </li>
+
+  {{if .T.nextPage }}
+  <li class="tag-pagination-button tag-pagination-next clickable">
+    <a href="{{.T.nextPage}}">
+      <p>下一页</p>
+      <i class="j-icon base-icon icon-arrow-up"></i>
+    </a>
+  </li>
+  {{else}}
+    <li class="tag-pagination-button tag-pagination-placeholder"></li>
+  {{end}}
+</ul>
+

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

@@ -0,0 +1,9 @@
+<section class="register-login-container bg-white">
+  <a class="logo-img-wrapper" href="{{.T.Home}}">
+    <img class="logo-img" src="/common-module/public/image/jianyu-logo-for-free.png" alt="">
+  </a>
+  {{if .T.areaTopTip}}
+    <h1 class="header-title">{{.T.areaTopTip}}</h1>
+  {{end}}
+  <a class="seo-button theme-main" href="/jyapp/free/login?url=/jyapp/jylab/mainSearch">登录/注册</a>
+</section>

+ 16 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-swiper-list.html

@@ -0,0 +1,16 @@
+<section class="tag-swiper-list-container swiper-container bg-white">
+  <ul class="tag-swiper-list swiper-wrapper">
+    {{range $ad:=.T.adList}}
+    <li class="tag-swiper-item swiper-slide">
+      {{if $ad.S_link}}
+      <a href="{{$ad.S_link}}">
+      {{else}}
+      <a href="javascript:;">
+      {{end}}
+        <img class="banner-img" src="{{$ad.S_pic}}" alt="{{$ad.S_picalt}}">
+      </a>
+    </li>
+    {{end}}
+  </ul>
+  <div class="swiper-pagination swiper-custom-dot"></div>
+</section>

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

@@ -1,7 +1,7 @@
 <html>
 	<head>
 		{{include "/common/meta.html"}}
-		<title>关于剑鱼标讯</title>
+		<title>关于剑鱼标讯_剑鱼标讯官网</title>
 		<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
 <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/common.css?v={{Msg "seo" "version"}}" rel="stylesheet">
@@ -152,7 +152,7 @@
 			</ul>
 		</div>
 		<img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/about/bg_4.jpg?v=51430">
-		<center class="tip">电脑访问剑鱼标讯官网<font>www.jianyu360.com</font>查看详情</center>
+		<center class="tip">电脑访问剑鱼标讯官网<font>www.jianyu360.cn</font>查看详情</center>
 		<center class="phone">客服电话:400-108-6670</center>
 	</div>
 	<div class="screen_5">
@@ -188,7 +188,7 @@
 		<center class="phone">客服电话:400-108-6670</center>
 	</div>
 </div>
-<ul class="float-navbar">
+<ul class="float-navbar" style="display: none;">
 	<li><span class="j-sprite-icon bgi-feedback"></span><div>反馈</div></li>
   <li><span class="j-sprite-icon bgi-help"></span><div>帮助</div></li>
 	<li><span class="j-sprite-icon bgi-share"></span><div>分享</div></li>
@@ -219,6 +219,23 @@
 		<a href="javascript:;" class="shareQx">取消</a>
 	</div>
 </div>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}'></script>
+<script>
+	$(function () {
+		getUserSimpleInfo()
+		function getUserSimpleInfo () {
+			$.ajax({
+				url: '/jypay/user/getSimpleData',
+				type: 'POST',
+				success: function (r) {
+					if (r && r.userId) {
+						$('.float-navbar').show()
+					}
+				}
+			})
+		}
+	})
+</script>
 <script type="text/javascript">
 var originalWidth = 320;
 var windowW = document.body.clientWidth;

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

@@ -1015,7 +1015,6 @@
 <!-- <script src="https://cdn.bootcss.com/vConsole/3.3.4/vconsole.min.js"></script>
 <script> new VConsole(); </script> -->
 <script>
-
   // 表格样式兼容
   $(function () {
     $('table').each(function() {
@@ -1455,13 +1454,18 @@
   }
     function appAutoLogin(){
       // 去登录
-        const url = `/jyapp/article/content/${id}.html`
-        autoLogin(url)
+      backAfterLogin()
+    }
+
+    function backAfterLogin () {
+      // var url = `/jyapp/article/content/${id}.html`
+      // autoLogin(url)
+      autoLogin('back')
     }
+
     // 去登录
     $('.option-login').on('click', function() {
-      const url = `/jyapp/article/content/${id}.html`
-      autoLogin(url)
+      backAfterLogin()
     })
     // 去注册
     $('.option-register').on('click', function() {
@@ -2414,8 +2418,7 @@
       $(".header-share").click(function(){
          if(!userId){
            $('.overlay').hide()
-           const url = `/jyapp/article/content/${id}.html`
-           autoLogin(url)
+           backAfterLogin()
            return
          }
           $(".depthread-share").hide();
@@ -2658,8 +2661,7 @@
       })
       // 未登录底部引导点击跳转
       $('.login-guide').click(function() {
-        const url = `/jyapp/article/content/${id}.html`
-        autoLogin(url)
+        backAfterLogin()
       })
       // 中标单位跳转
       $('.zhongbiaounit').on('click',function(){
@@ -3005,8 +3007,7 @@
 
       $(".follow").click(function(){
         if (!userId) {
-          const url = `/jyapp/article/content/${id}.html`
-          autoLogin(url)
+          backAfterLogin()
           return
         }
           $('#loading').show()
@@ -3301,8 +3302,7 @@
       // 收藏
       $('.collec_star').on('click', function () {
         if(!userId) {
-          const url = `/jyapp/article/content/${id}.html`
-          autoLogin(url)
+          backAfterLogin()
           return
         }
         var $this = $(this)

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

@@ -572,10 +572,9 @@ func getBuyerListMsg(buyerNames []string) (dMap map[string]map[string]interface{
 }
 
 func getBuyerNameById(buyerId string) (buyerName string) {
-	r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"_id":["%s"]}}]}},"size":1,"_source":["name"]}`, buyerId))
-	if r == nil || len(*r) == 0 {
-		return
+	rs := db.MysqlGloabl.SelectBySql(`SELECT name  FROM dws_f_ent_baseinfo where name_id=? and (identity_type &(1 << 0)) > 0 limit 1`, buyerId)
+	if rs != nil && len(*rs) > 0 {
+		return qutil.InterfaceToStr((*rs)[0]["name"])
 	}
-	buyerName, _ = (*r)[0]["name"].(string)
 	return
 }

+ 1 - 0
src/jfw/modules/entsesearch/src/web/templates/common/header-assets.html

@@ -0,0 +1 @@
+<script src='/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>

+ 1 - 0
src/jfw/modules/entsesearch/src/web/templates/weixin/entseSearch.html

@@ -19,6 +19,7 @@
 <script src="/jylab/entsesearch/js/dropload.js?v={{Msg "seo" "version"}}"></script>
 <script src="/jylab/entsesearch/js/rem.js"></script>
 <link rel="stylesheet" href="/jylab/entsesearch/css/reset.css" />
+{{include "/common/header-assets.html"}}
 
 <script>
     var scrollTop = 0;

+ 1 - 1
src/jfw/modules/followent/src/web/templates/_error.html

@@ -578,7 +578,7 @@ function infoListCss(){
 				nowCopyRightInfo = v
 			}
 		})
-		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
 		$('.copyright').html(copyright)
 	}
 	setCopyRightForBottom()

+ 1 - 0
src/jfw/modules/followent/src/web/templates/common/header-assets.html

@@ -0,0 +1 @@
+<script src='/common-module/public/head.js?v={{Msg "seo" "version"}}'></script>

+ 2 - 1
src/jfw/modules/followent/src/web/templates/weixin/add.html

@@ -15,6 +15,7 @@
 <script src="/jylab/followent/js/fastclick.js?v={{Msg "seo" "version"}}"></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>
+{{include "/common/header-assets.html"}}
 <style>
 	.addpage input{
 		width: 100%;
@@ -143,6 +144,6 @@
 		<div id="recList" style="display: none">
 		</div>
 	</from>
-	{{include "/common/baiducc.html"}}
+	<!-- {{include "/common/baiducc.html"}} -->
 </body>
 </html>

+ 2 - 1
src/jfw/modules/followent/src/web/templates/weixin/list.html

@@ -18,6 +18,7 @@ if(sessionStorage){
 <link href="/jylab/followent/css/common.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="/jylab/followent/css/follow.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="/jylab/followent/css/merge-wx.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+{{include "/common/header-assets.html"}}
 
 </head>
 <style>
@@ -339,6 +340,6 @@ initShare({{.T.signature}},{{.T.openid}},2,"jy_extend",{{.T.nickname}},{{.T.avat
 
     });
 </script>
-	{{include "/common/baiducc.html"}}
+	<!-- {{include "/common/baiducc.html"}} -->
 </body>
 </html>

+ 2 - 1
src/jfw/modules/followent/src/web/templates/weixin/set.html

@@ -17,6 +17,7 @@ if(sessionStorage){
 <link href="/jylab/followent/css/common.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="/jylab/followent/css/follow.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <link href="/jylab/followent/css/font.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+{{include "/common/header-assets.html"}}
 <style>
   .bid-dec-in{
   position: absolute;
@@ -270,6 +271,6 @@ function beforeRedirect(obj,sid,link,isOld){
 			</div>
 		</div>
 	</div>
-{{include "/common/baiducc.html"}}
+<!-- {{include "/common/baiducc.html"}} -->
 </body>
 </html>

+ 96 - 0
src/jfw/modules/publicapply/.idea/workspace.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AutoImportSettings">
+    <option name="autoReloadType" value="ALL" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="99903b5d-26c6-49b2-8d9c-56347398c448" name="变更" comment="">
+      <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/oneclick/initjson/initjson.go" afterDir="false" />
+    </list>
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Go File" />
+      </list>
+    </option>
+  </component>
+  <component name="GOROOT" url="file://D:/Executable Program/go1.20.4" />
+  <component name="Git.Settings">
+    <option name="RECENT_BRANCH_BY_REPOSITORY">
+      <map>
+        <entry key="$PROJECT_DIR$/../../../.." value="release/v4.8.47_ws" />
+      </map>
+    </option>
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../../../.." />
+  </component>
+  <component name="GoLibraries">
+    <option name="indexEntireGoPath" value="false" />
+  </component>
+  <component name="MarkdownSettingsMigration">
+    <option name="stateVersion" value="1" />
+  </component>
+  <component name="ProjectId" id="2U0WcI5LsBAvZP5KALRLTr8au8R" />
+  <component name="ProjectLevelVcsManager" settingsEditedManually="true" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
+  <component name="PropertiesComponent">
+    <property name="DefaultGoTemplateProperty" value="Go File" />
+    <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
+    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="configurable..is.expanded" value="false" />
+    <property name="configurable.GoLibrariesConfigurable.is.expanded" value="true" />
+    <property name="go.formatter.settings.were.checked" value="true" />
+    <property name="go.import.settings.migrated" value="true" />
+    <property name="go.modules.go.list.on.any.changes.was.set" value="true" />
+    <property name="go.sdk.automatically.set" value="true" />
+    <property name="go.watchers.conflict.with.on.save.actions.check.performed" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main.go" />
+    <property name="settings.editor.selected.configurable" value="go.vgo" />
+    <property name="vue.rearranger.settings.migration" value="true" />
+  </component>
+  <component name="RunManager">
+    <configuration name="public" type="GoApplicationRunConfiguration" factoryName="Go Application">
+      <module name="publicapply" />
+      <working_directory value="$PROJECT_DIR$/src/" />
+      <kind value="FILE" />
+      <directory value="$PROJECT_DIR$" />
+      <filePath value="$PROJECT_DIR$/src/main.go" />
+      <output_directory value="$PROJECT_DIR$/src/" />
+      <method v="2" />
+    </configuration>
+  </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="3" />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
+  <component name="VgoProject">
+    <integration-enabled>true</integration-enabled>
+    <environment>
+      <map>
+        <entry key="GOPRIVATE" value="*.jydev.jianyu360.cn,app.yhyue.com" />
+        <entry key="GOPROXY" value="https://goproxy.cn,https://goproxy.io,https://mirrors.aliyun.com/goproxy/,https://proxy.golang.org/,direct" />
+        <entry key="GOSUMDB" value="off" />
+      </map>
+    </environment>
+  </component>
+</project>

+ 18 - 3
src/jfw/tag/tag.go

@@ -15,7 +15,7 @@ var applyVersion = map[string]string{}
 var applyAction = map[string]int64{}
 var applyTime int64 = 5
 
-//自定义标签支持,读取配置文件
+// 自定义标签支持,读取配置文件
 func init() {
 	//应用版本号
 	seoConfigInit()
@@ -23,7 +23,6 @@ func init() {
 	go watchDir("./seo.json")
 }
 
-//
 func seoConfigInit() {
 	util.ReadConfig("./seo.json", &config.Seoconfig)
 	if config.Seoconfig["applyVersion"] != nil {
@@ -38,9 +37,25 @@ func seoConfigInit() {
 			}
 		}
 	}
+	hotBuyerData := util.ObjToMap(config.Seoconfig["hotBuyer"])
+	hotWinnerData := util.ObjToMap(config.Seoconfig["hotWinner"])
+	if hotBuyerData != nil && hotWinnerData != nil {
+		config.HotWinnerConfig = config.HotConfig{
+			CacheKey:     util.InterfaceToStr((*hotWinnerData)["cacheKey"]),
+			CacheTimeout: util.IntAll((*hotWinnerData)["cacheTimeout"]),
+			Limit:        util.IntAll((*hotWinnerData)["limit"]),
+		}
+		config.HotBuyerConfig = config.HotConfig{
+			CacheKey:     util.InterfaceToStr((*hotBuyerData)["cacheKey"]),
+			CacheTimeout: util.IntAll((*hotBuyerData)["cacheTimeout"]),
+			Limit:        util.IntAll((*hotBuyerData)["limit"]),
+		}
+	} else {
+		log.Fatal("获取配置失败,请检查配置文件")
+	}
 }
 
-//监控目录
+// 监控目录
 func watchDir(dir string) {
 	watch, err := fsnotify.NewWatcher()
 	if err != nil {

+ 11 - 1
src/seo.json

@@ -4556,5 +4556,15 @@
 	"seoLetterPageSize":1000,
 	"seoAreaSuffix":"政府采购网",
   "appNewUserTime":1668155814,
-  "tagsLimitCount":300
+  "tagsLimitCount":300,
+  "hotWinner": {
+    "cacheKey": "hotWinnerCache",
+    "cacheTimeout": 86400,
+    "limit": 200
+  },
+  "hotBuyer": {
+    "cacheKey": "hotBuyerCache",
+    "cacheTimeout": 86400,
+    "limit": 200
+  }
 }

二进制
src/web/staticres/common-module/public/image/jianyu-logo-for-free.png


+ 5 - 0
src/web/staticres/common-module/public/js/utils.js

@@ -915,5 +915,10 @@ if (utils.$envs.inH5) {
   $('.jy-app-header').addClass('h5-header')
   $('.childNav').addClass('h5-tabfix')
   $('.share1 .app-layout-content-b').css('top', '10.33333vw')
+} else if (utils.$envs.inWX) {
+  $('body').addClass('wx-body')
+  $('.jy-app-header').addClass('wx-header')
+  $('.childNav').addClass('wx-tabfix')
+  $('.share1 .app-layout-content-b').css('top', '10.33333vw')
 }
 utils.fixSomeH5BackRefresh()

+ 65 - 4
src/web/staticres/css/pc/index.css

@@ -1602,7 +1602,7 @@ color: #999999;
   line-height: 38px;
 }
 
-.jy-index-recommend .recommend-context .item-one .item-header a:hover {
+.jy-index-recommend .recommend-context .item-one .item-header a:hover,.jy-index-strategy .strategy-content .strate_module .strate_more:hover{
   color: #2CB7CA;
   background: url(/images/index/link-arrow-active.png) right center no-repeat;
   background-size: 20px 20px;
@@ -1659,7 +1659,7 @@ color: #999999;
   color: #2CB7CA;
 }
 
-.jy-index-recommend .recommend-context .item-one .more {
+.jy-index-recommend .recommend-context .item-one .more,.jy-index-strategy .strategy-content .strate_module .strate_more {
   background: url(/images/index/link-arrow.png) right center no-repeat;
   background-size: 20px 20px;
 }
@@ -1785,10 +1785,71 @@ letter-spacing: 0.1em;
 color: #686868;
 margin-top: 2px;
 text-align: center;
-
+}
+.jy-index-strategy{
+  margin-top: 60px;
+  text-decoration: none;
+}
+.jy-index-strategy .strategy-content{
+  display: flex;
+  flex-wrap: wrap;
 }
 
-/* 首页底部pc-bottom单独设置的样式 */
+.jy-index-strategy .strategy-content .strate_module{
+  flex-basis: calc(33.33% - 20px); /* 33.33% - margin */
+  margin: 10px;
+  width: 380px;
+}
+.jy-index-strategy .strategy-content .strate_title{
+  display: flex;
+  height: 38px;
+  flex-direction: row;
+  justify-content: space-between;
+  border-bottom: 1px solid #2ABED1;
+  padding-left: 20px;
+}
+.jy-index-strategy .strategy-content .strate_module .strate_title .strate_name{
+  font-size: 16px;
+  font-style: normal;
+  font-weight: 400;
+  line-height: 38px;
+}
+.jy-index-strategy .strategy-content .strate_title .strate_more{
+  padding-right: 23px;
+  color: #686868;
+  text-decoration: none;
+  line-height: 38px;
+  font-size: 14px;
+}
+.jy-index-strategy .strategy-content .strate_content{
+  display: flex;
+  flex-direction: column;
+  margin: 10px 10px 10px 20px;
+}
+.jy-index-strategy .strategy-content .strate_content .strate_c_list{
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  margin-top: 10px;
+  height: 22px;
+}
+.jy-index-strategy .strategy-content .strate_content .strate_c_list a{
+  color: #686868;
+  text-decoration: none;
+}
+.jy-index-strategy .strategy-content .strate_content .strate_c_list a:hover{
+  color: #2CB7CA;
+}
+.jy-index-strategy .strategy-content .strate_content .strate_l_r_c_date{
+  color: #999999;
+  min-width: 50px;
+}
+.jy-index-strategy .strategy-content .strate_content .strate_c_list .title-div{
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+  /* 首页底部pc-bottom单独设置的样式 */
 .jy_classify{
   padding-top: 32px!important;
 }

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

@@ -279,7 +279,7 @@ $(function () {
         nowCopyRightInfo = v
       }
     })
-    var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+    var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow"">' + nowCopyRightInfo.icp + '</a>'
     $('.copyright').html(copyright)
   }
   setCopyRightForBottom()

+ 3 - 0
src/web/staticres/site/page/industryInfo/css/index.css

@@ -154,6 +154,9 @@
   box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.05);
   border-radius: 8px;
 }
+.school-in-content .strate_module a{
+  text-decoration: none;
+}
 .strate_module .strate_title{
   display: flex;
   justify-content: space-between;

+ 6 - 0
src/web/staticres/site/page/industryInfo/css/industry_detail.css

@@ -156,6 +156,9 @@
   border-radius: 8px;
   cursor: pointer;
 }
+.school_tabs a:focus, a:hover{
+  text-decoration: none;
+}
 .school_tabs .seo-pagination{
   padding: 0 0 20px;
 }
@@ -424,6 +427,9 @@
   font-size: 16px;
   line-height: 24px;
 }
+.module_content a{
+  color: rgb(29, 29, 29);
+}
 /*E-- 侧边信息流样式 --E*/
 
 /* S--空状态样式--S */

+ 3 - 1
src/web/staticres/site/page/jySchool/css/introduction.css

@@ -29,7 +29,6 @@
   width: 100%;
   height: 160px;
 }
-
 .school-in-content{
   display: flex;
   flex-wrap: wrap;
@@ -68,6 +67,9 @@
   display: flex;
   flex-direction: column;
 }
+.strate_module  a{
+  text-decoration: none;
+}
 .strate_content .strate_c_list{
   display: flex;
   align-items: center;

+ 3 - 3
src/web/templates/_error.html

@@ -569,7 +569,7 @@ function infoListCss(){
 			</div>
 			<div class="jy_renzheng">
 				<div class="jy_otherlink"><a href="/" target="_bank">剑鱼标讯</a>|<a href="/front/subscribe.html">招标订阅</a>|<a href="/jylab/supsearch/index.html">招标搜索</a>|<a  data-toggle="modal" data-target="#bidcommunity">招标社区</a>|<a href="/jyblog/index.html" target="_bank">剑鱼标讯博客</a>|<a href="/front/busicooperation.html" target="_bank">商务合作</a>|<a href="/front/advservices.html" target="_bank">广告服务</a>|<a href="/front/aboutus.html">关于我们</a>|<a href="http://www.qmx.top" target="_bank">企明星</a>|<a href="http://www.qmx.top/front/entCommunity.html" target="_bank">企业社区</a></div>
-				<div style="color: #B9B9BB;" class="copyright" id="cpinfo">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">京ICP备14030217号-3</a></div>
+				<div style="color: #B9B9BB;" class="copyright" id="cpinfo">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备14030217号-3</a></div>
 			</div>
 		</div>
 		<div style="position:relative" class="jy_imgright">
@@ -591,7 +591,7 @@ function infoListCss(){
 				</span>
 			</form>
 			<div class="jy_otherlink"><a href="/" target="_bank">剑鱼标讯</a>|<a href="/front/subscribe.html">招标订阅</a>|<a href="/jylab/supsearch/index.html">招标搜索</a>|<a  data-toggle="modal" data-target="#bidcommunity">招标社区</a>|<a href="/jyblog/index.html" target="_bank">剑鱼标讯博客</a>|<a href="/front/busicooperation.html" target="_bank">商务合作</a>|<a href="/front/advservices.html" target="_bank">广告服务</a>|<a href="/front/aboutus.html">关于我们</a>|<a href="http://www.qmx.top" target="_bank">企明星</a>|<a href="http://www.qmx.top/front/entCommunity.html" target="_bank">企业社区</a></div>
-			<div class="copyright">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">京ICP备14030217号-3</a></div>
+			<div class="copyright">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备14030217号-3</a></div>
 		</div>
 		<div class="j-bottom-b">
 			<img src="/front/share/RV8=" alt="剑鱼标讯微信公众号"><br>
@@ -630,7 +630,7 @@ $(function(){
 				nowCopyRightInfo = v
 			}
 		})
-		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
 		$('.copyright').html(copyright)
 	}
 	setCopyRightForBottom()

+ 1 - 1
src/web/templates/active/index_bak.html

@@ -145,7 +145,7 @@ $(function(){
 				nowCopyRightInfo = v
 			}
 		})
-		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
 		$('.copyright').html(copyright)
 	}
 	setCopyRightForBottom()

+ 2 - 2
src/web/templates/common/mobilebottom.html

@@ -1,7 +1,7 @@
 <div class="j-bottom">
 	<img src="{{Msg "seo" "cdn"}}/images/pc_6.png" class="backTop" id="backTop">
 	<div><span>手机版</span><span>|</span><span onclick="goToPcIndex()">电脑版</span></div>
-	<div id="cpinfo" class="copyright">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">京ICP备14030217号-3</a></div>
+	<div id="cpinfo" class="copyright">©2015-2021 jianyu360.com 版权所有 |  <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备14030217号-3</a></div>
 </div>
 
 <script type="text/javascript">
@@ -32,7 +32,7 @@ $(function () {
 				nowCopyRightInfo = v
 			}
 		})
-		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+		var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
 		$('.copyright').html(copyright)
 	}
 	setCopyRightForBottom()

+ 2 - 2
src/web/templates/common/pcbottom.html

@@ -10,7 +10,7 @@
             <dl>
               <dt><a {{if $v.Link}} href="{{$v.Link}}"{{else}} href="javascript:;"{{end}}>{{$v.Title}}</a></dt>
               {{range $ii,$c := $v.Child }}
-                <dd><a {{if $c.Link}} href="{{$c.Link}}"{{else}} href="javascript:;"{{end}}>{{$c.Title}}</a></dd>
+                <dd><a {{if $c.Link}} href="{{$c.Link}}"{{else}} href="javascript:;"{{end}} {{ParseHtmlAttr $c.Attr}}>{{$c.Title}}</a></dd>
               {{end}}
             </dl>
           {{end}}
@@ -65,7 +65,7 @@
 			</div>
 		</div>
         <div class="jy_renzheng">
-            <div class="copyright" id="cpinfo">©2015-2021 jianyu360.com 版权所有 | <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">京ICP备14030217号-3</a></div>
+            <div class="copyright" id="cpinfo">©2015-2021 jianyu360.com 版权所有 | <a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">京ICP备14030217号-3</a></div>
         </div>
         <div class="bdsharebuttonbox" style="display: none;">
 			<a href="#" id="bds_sqq" data-cmd="sqq" title="分享QQ好友">QQ</a>

+ 2 - 2
src/web/templates/frontRouter/pc/brand/free/index.html

@@ -67,7 +67,7 @@
       <div class="right_line rl"></div>
     </div>
     <p class="company_profile">
-      北京剑鱼信息技术有限公司旗下知名产品“剑鱼标讯”于2016年发布,是国内最早自主研发招投标大数据信息服务的平台。剑鱼标讯基于<br>云计算、大数据和人工智能技术搭建了完善的数据服务架构,全面收录权威机构公开的招标采购、企业公示等信息,为政府和企业提供大数<br>据服务与解决方案,满足用户商机发现与挖掘、商机跟踪管理、市场分析与监控、决策分析等需求,实现数据驱动企业增长。
+      北京剑鱼信息技术有限公司旗下知名产品“剑鱼标讯”于2016年发布,是国内最早的数字化营销和开源情报服务平台。剑鱼标讯基于<br>云计算、大数据和人工智能技术搭建了完善的数据服务架构,全面收录权威机构公开的招标采购、企业公示等信息,为政府和企业提供大数<br>据服务与解决方案,满足用户商机发现与挖掘、商机跟踪管理、市场分析与监控、决策分析等需求,实现数据驱动企业增长。
     </p>
     <p class="deadline">截止<span data-update-text="day">2022年6月</span>剑鱼标讯已累计收录</p>
     <div class="data_text">
@@ -168,7 +168,7 @@
       </div>
       <div class="item">
         <img src="{{Msg "seo" "cdn"}}/brand/img/jyyj.png?v={{Msg "seo" "version"}}" alt="">
-        <p class="tit">全国领先招投标数据服务商</p>
+        <p class="tit">数字化营销和开源情报服务平台</p>
         <p class="text">成为赋能招投标全流程、引导行业变革、创造<br>新价值的行业引领者。</p>
       </div>
       <div class="item">

+ 1 - 1
src/web/templates/frontRouter/pc/squeeze/sess/test.html

@@ -458,7 +458,7 @@ $(function () {
                 nowCopyRightInfo = v
             }
         })
-        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
         $('.copyright').html(copyright)
     }
     setCopyRightForBottom()

+ 27 - 0
src/web/templates/frontRouter/pc/user/free/redirect-wx.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>剑鱼标讯</title>
+    <style>
+      p {
+        text-align: center;
+      }
+      a {
+        color: #171826;
+        text-decoration: none;
+      }
+    </style>
+    <script>
+        function redirect () {
+            document.getElementById('link').click()
+        }
+    </script>
+</head>
+<body onload="redirect()">
+    <p>
+      <a id="link" href="https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzk0MjIyMzY2Nw==&scene=110#wechat_redirect" rel="noopener noreferrer">跳转中...</a>
+    </p>
+</body>
+</html>

+ 1 - 1
src/web/templates/pc/brand/index.html

@@ -393,7 +393,7 @@
           nowCopyRightInfo = v
         }
       })
-      var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+      var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
       $('.copyright').html(copyright)
     },
 

+ 2 - 2
src/web/templates/pc/classifylist.html

@@ -1133,10 +1133,10 @@ function noIn(p){
 	var thisId = $(p).attr("dataId");
 	dataId = thisId;
   if(!loginflag){//未登录详情
-    window.open("/nologin/indexcontent/"+thisId+".html");
+    window.open("/nologin/content/"+thisId+".html");
 
   }else{
-    window.open("/article/indexcontent/"+thisId+".html");
+    window.open("/article/content/"+thisId+".html");
   }
 
 

+ 28 - 4
src/web/templates/pc/index.html

@@ -265,7 +265,7 @@
             </div>
             <div class="hot-winner-content simple-show">
               {{range $i,$v := .T.hotWinner}}
-              <a href="{{$v.Url}}" target="_blank">{{$v.Name}}</a>
+              <a href="{{$v.Url}}" rel="nofollow" target="_blank">{{$v.Name}}</a>
               {{end}}
             </div>
             <div class="recommend-content line-show">
@@ -292,7 +292,7 @@
             </div>
             <div class="hot-buyer-content simple-show">
                 {{range $k,$v := .T.hotBuyers}}
-                  <a class="tab-link tab-label" href="{{$v.Url}}" target="_blank">{{$v.Name}}</a>
+                  <a class="tab-link tab-label" href="{{$v.Url}}" rel="nofollow" target="_blank">{{$v.Name}}</a>
                 {{end}}
             </div>
           </div>
@@ -373,7 +373,7 @@
         </div>
       </div>
       <div class="jy-index-dataServices CfadeInUp">
-        <h3 class="module-title">专业的招投标大数据服务平台</h3>
+        <h3 class="module-title">数字化营销和开源情报服务平台</h3>
         <div class="dataServices-content">
           <div class="items">
             <img src="{{Msg "seo" "cdn"}}/images/index/new/serve-1.png?v={{Msg "seo" "version"}}" alt="">
@@ -407,6 +407,30 @@
           </div>
         </div>
       </div>
+      <div class="jy-index-strategy CfadeInUp">
+        <h3 class="module-title">招投标攻略</h3>
+        <div class="strategy-content w1200">
+          <!-- 攻略模块 -->
+          {{range $k,$v := .T.strategyList}}
+          <div class="strate_module">
+            <div class="strate_title">
+              <div class="strate_name">{{$v.name}}</div>
+              <a class="strate_more" href="/jySchool/{{$v.code}}/index.html" target="_blank">查看更多</a>
+            </div>
+            <div class="strate_content">
+              {{range $m,$n := $v.list}}
+              <div class="strate_c_list">
+                <div class="title-div">
+                  <a class="strate_l_r_title" href="/jySite/{{$n._id}}.html" target="_blank" title="{{$n.s_title}}">{{$n.s_title}}</a>
+                </div>
+                <div class="strate_l_r_c_date">{{FormatDate $n.date "01-02"}}</div>
+              </div>
+              {{end}}
+            </div>
+          </div>
+          {{end}}
+        </div>
+      </div>
       <!-- 多条广告如下脚本只需引入一次 -->
       <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" >
       </script>
@@ -747,7 +771,7 @@
             nowCopyRightInfo = v
           }
         })
-        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
         $('.copyright').html(copyright)
       },
       // click事件、页面初始化执行

+ 1 - 1
src/web/templates/pc/index_old.html

@@ -816,7 +816,7 @@ $(function () {
                 nowCopyRightInfo = v
             }
         })
-        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
         $('.copyright').html(copyright)
     }
     setCopyRightForBottom()

+ 1 - 1
src/web/templates/pc/index_old_23_06_16.html

@@ -766,7 +766,7 @@
             nowCopyRightInfo = v
           }
         })
-        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank">' + nowCopyRightInfo.icp + '</a>'
+        var copyright = '©2015-' + new Date().getFullYear() + ' ' +nowCopyRightInfo.rule+ ' 版权所有 | ' + '<a style="color: inherit; font-size: inherit;" href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">' + nowCopyRightInfo.icp + '</a>'
         $('.copyright').html(copyright)
       },
       // click事件、页面初始化执行

+ 5 - 5
src/web/templates/site/page/industryInfo/class.html

@@ -60,9 +60,9 @@
             {{range $k,$v := .T.list}}
             <div class="art_list">
               <div class="art_l_left">
-                <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
+                <a class="art_l_l_title ellipsis" href="/jySite/{{$v._id}}.html">
                   {{$v.s_title}}
-                </div>
+                </a>
                 <div class="art_l_l_content">
                   {{$v.s_description}}
                 </div>
@@ -118,7 +118,7 @@
                   <img class="subscript" src='/site/page/jySchool/image/{{$v.docFileType}}@2x.png?v={{Msg "seo" "version"}}' alt="">
                 </div>
                 <div class="module_c_l_right">
-                  <div class="m_c_l_r_title ellipsis-2" onclick="window.location.href='/swordfish/docs/content/{{$v.docId}}'">{{$v.docName}}</div>
+                  <div class="m_c_l_r_title ellipsis-2"><a href="/swordfish/docs/content/{{$v.docId}}">{{$v.docName}}</a></div>
                   <div class="m_c_l_r_active">
                     <span>{{$v.downTimes}}次下载</span>
                     <span>共{{$v.docPageSize}}页</span>
@@ -136,9 +136,9 @@
             </div>
             <ul class="module_content">
               {{range $k,$v := .T.rightData.guideline}}
-              <li class="module_c_list" onclick="window.location.href='/jySite/{{$v._id}}.html'">
+              <li class="module_c_list">
                 <span></span>
-                <span>{{$v.s_title}}</span>
+                <span><a href="/jySite/{{$v._id}}.html">{{$v.s_title}}</a></span>
               </li>
               {{end}}
             </ul>

+ 2 - 2
src/web/templates/site/page/industryInfo/index.html

@@ -65,7 +65,7 @@
           <div class="strate_module">
             <div class="strate_title">
               <div class="strate_name">{{$v.name}}</div>
-              <div class="strate_more" onclick="window.location.href='/industryInfo/{{$v.code}}/index.html'">MORE</div>
+              <a class="strate_more" href="/industryInfo/{{$v.code}}/index.html">MORE</a>
             </div>
             <div class="strate_content">
               {{range $m,$n := $v.list}}
@@ -76,7 +76,7 @@
                   </div>
                   {{end}}
                   <div class="strate_l_right">
-                    <div class="strate_l_r_title" onclick="window.location.href='/jySite/{{$n._id}}.html'">{{$n.s_title}}</div>
+                    <a href="/jySite/{{$n._id}}.html"><div class="strate_l_r_title">{{$n.s_title}}</div></a>
                     <div class="strate_l_r_content">
                       <div class="strate_l_r_c_text">{{$n.s_description}}</div>
                       <div class="strate_l_r_c_date">{{$n.time}}</div>

+ 11 - 11
src/web/templates/site/page/jySchool/class.html

@@ -67,9 +67,9 @@
           <div class="school_classify jyxt">
             {{$thisCode := .T.code}}
             {{range $k,$v := .T.classList}}
-            <div {{if eq $v.code $thisCode}} class="classify_tabs is-active" {{else}} class="classify_tabs"{{end}} onclick="window.location.href='/jySchool/{{$v.code}}/index.html'">
+            <a {{if eq $v.code $thisCode}} class="classify_tabs is-active" {{else}} class="classify_tabs"{{end}} href="/jySchool/{{$v.code}}/index.html">
               {{$v.name}}
-            </div>
+            </a>
             {{end}}
           </div>
           <div class="school_tabs_content" label="招标采购" name="招标采购">
@@ -78,9 +78,9 @@
                 {{range $k,$v := .T.list}}
                 <div class="art_list">
                   <div class="art_l_left">
-                    <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
+                    <a class="art_l_l_title ellipsis" href="/jySite/{{$v._id}}.html">
                       {{$v.s_title}}
-                    </div>
+                    </a>
                     <div class="art_l_l_content">
                       {{$v.s_description}}
                     </div>
@@ -107,9 +107,9 @@
                 </div>
                 <ul class="module_content">
                   {{range $i,$v := .T.rightData.hotspot}}
-                  <li class="module_c_list"  onclick="window.location.href='/jySite/{{$v._id}}.html'">
-                    <span></span>
-                    <span>{{$v.s_title}}</span>
+                  <li class="module_c_list">
+                      <span></span>
+                      <span><a href="/jySite/{{$v._id}}.html">{{$v.s_title}}</a></span>
                   </li>
                   {{end}}
                 </ul>
@@ -121,10 +121,10 @@
                 </div>
                 <ul class="module_content">
                   {{range $i,$v := .T.rightData.important}}
-                  <li class="module_c_list"  onclick="window.location.href='/jySite/{{$v._id}}.html'">
-                    <span></span>
-                    <span>{{$v.s_title}}</span>
-                  </li>
+                    <li class="module_c_list">
+                      <span></span>
+                      <span><a href="/jySite/{{$v._id}}.html">{{$v.s_title}}</a></span>
+                    </li>
                   {{end}}
                 </ul>
               </div>

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