Procházet zdrojové kódy

Merge branch 'dev4.5' of ssh://192.168.3.207:10022/qmx/jy into dev4.5

wangchuanjin před 4 roky
rodič
revize
3d0b4420ff
39 změnil soubory, kde provedl 3752 přidání a 737 odebrání
  1. 8 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/j-icons.css
  2. 0 399
      src/jfw/modules/app/src/web/staticres/jyapp/css/index.css
  3. 12 0
      src/jfw/modules/app/src/web/staticres/jyapp/css/subscribe.css
  4. 64 25
      src/jfw/modules/app/src/web/staticres/jyapp/js/historypush.js
  5. 64 6
      src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js
  6. 22 24
      src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html
  7. 114 24
      src/jfw/modules/app/src/web/templates/weixin/historypush.html
  8. 113 4
      src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html
  9. 197 0
      src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html
  10. 1 0
      src/jfw/modules/bigmember/src/service/use/use.go
  11. 10 7
      src/jfw/modules/publicapply/src/bidcollection/entity/entity.go
  12. 2 1
      src/jfw/modules/publicapply/src/bidcollection/service/action.go
  13. 17 1
      src/jfw/modules/publicapply/src/bidcollection/service/service.go
  14. 24 7
      src/jfw/modules/publicapply/src/dataexport/service/action.go
  15. 1 1
      src/jfw/modules/subscribepay/src/service/vipSubscribeChange.go
  16. 1 4
      src/jfw/public/dataexport.go
  17. 284 0
      src/web/staticres/collection/css/index-pc.css
  18. 366 0
      src/web/staticres/collection/js/index-pc.js
  19. 32 2
      src/web/staticres/common-module/collection/css/index.css
  20. binární
      src/web/staticres/common-module/collection/image/icon-right-bg.png
  21. 2 3
      src/web/staticres/common-module/collection/js/cate-mobile.js
  22. 145 40
      src/web/staticres/common-module/collection/js/date-mobile.js
  23. 272 0
      src/web/staticres/common-module/collection/js/index-wx.js
  24. 192 98
      src/web/staticres/common-module/collection/js/index.js
  25. 1 0
      src/web/staticres/common-module/collection/js/notice-mobile.js
  26. 53 0
      src/web/staticres/common-module/collection/js/phone-mobile.js
  27. 40 0
      src/web/staticres/common-module/collection/js/root-mobile.js
  28. 61 0
      src/web/staticres/common-module/collection/js/tags-mobile.js
  29. 350 0
      src/web/staticres/common-module/keep-tags/keep-tags-template.js
  30. 49 0
      src/web/staticres/css/ele-reset.css
  31. 87 1
      src/web/staticres/css/selector/selector.css
  32. 53 0
      src/web/staticres/js/selector/article-item-pc.js
  33. 0 89
      src/web/staticres/js/selector/choice-list-pc.js
  34. 255 0
      src/web/staticres/js/selector/date-time-pc.js
  35. 17 0
      src/web/staticres/js/selector/no-data-pc.js
  36. 263 0
      src/web/staticres/js/selector/select-level2-pc.js
  37. 195 0
      src/web/staticres/js/selector/select-list-pc.js
  38. 271 1
      src/web/templates/frontRouter/pc/collection/sess/index.html
  39. 114 0
      src/web/templates/frontRouter/wx/collection/sess/index.html

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

@@ -331,6 +331,14 @@
 .icon-care {
     background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMdSURBVHgB7ZhNbtNAFMffG4e2qpDwDZplqIQan4CECCRWFScATtDcgPQG7QmanqBLJBBKNqydbtJKbMINsuoHpPOYl5Lijxl/jkMX/m3aWOM3/9947BkboKampqamBAg5aX31O0JAR526QyBcBDkHoJ9SwvjytTdOO7955rtbT6GNwtlX57pFauQW4E633cYBkuwTgJvQdAYohlewOJ51vXmZGtPui0PIQKrA7he/DQ1xxhkgO7PfC/nuxxtvUqaGvJXdy7feLKlRogB3jA0xShkxE3OJ0Od/HIKjojXUQHRXA6HDKND67DedTeFrOp4TyVMEZ0J0N0d0XMK7DoB4idlHOE+NuboSnulKNEw9iM34yBPB8bWQg9mr8PxWDFsjv4kSPqj5+wkSyFCjr2ocBI67KgtPP09XT3sFdr/5HOQk3DMcTnt7A0hBnTswSpSpQfLjtOcNo22FrgCGR0AdoGGWjhnVyUB1Fn+CZAy/qkEgT0Ono/Ne1zYmwHNfTZ128JgEyvRICwYISeQIv2Lz7wNgBQJ1nn+f7kTbxQTwSTg8AY4vu8mPMh0PEgXCMxO1jqjQ4+AxvLntRtvFbmLEsIC6686hIEuJEhD3jdh5+K15FIu0IvfL/H8j1DdmEaDISSAwNu/Wh7MX/BXLBjoBCeFVj/5dwrWDFL4fo9lAI7DVWDYKmjZ5BwprZrkWRVblm0YGAb77lfk41MgRJ82RX2QvUwjeucYWMrUWRXe4y2y6AnJBx9Ga2yRG65BYbrufiRFERt+0FmkFli8VJKMS7aolAuHDc1/tn0xrkfExuiFgoP5E51xlEsbwKsNFb69vOs8owPfCBkpe+SqXSAp/fZ/BSOobWVsF/UXx4orJlSquu7HykBY+rX6md+KqJMqGZzJ/lbAtYSM8k+uzii0JW+GZ3N+FykrYDM/kFmCKStgOzxQSYPJKVBGeKSzAZJWoKjxTSoBJk+B9bVXhmdICTJLEqknwoK3wjBUBJkEihM3wjDUBJk3CdnjGqgBjkqgiPGNdYEVLvRIKwH3gD7lA5xc97whqampqah4bfwB4gRKgFSK1ugAAAABJRU5ErkJggg==);
 }
+/* 上拉加载 */
+.icon-up-allow {
+    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFPSURBVHgB7ZddSsNAEMdnN+t7j1BPoEeIR/BZBEXMq96g8Qa+BbOEQIvnKJ5Aj+AR+qxk146aKjVxN50RLJ0fLCEf+8+P7AcTAEEQhBWFrVNswIgGJmx1PzHKzLHZajYBJhQwgHLgXb6WnF9enN4AEbJgp9xXOlmSJPhTzi8+Y0ff3kCS3FiwS8675ug9VCdzLsmNBPvksuz8Cc/Ksj7kkhwsGJJr4ZIcJBgrxykZLRiSK4p6bPbMowK1cE4dZ9kJy3BHbdQxX04bjfdHHvxYJ81Vex2f+Vg87QrH7pDHbuZBwbKang0Z1i76JO/s9DrUNyjonU+BIPebZKLhINQvKKi8u10O2zNFbl2yzXt9aYLz0MSELg/7wMTQPLZq5q8QQSoiSGV3BDWo1f7oGniA/4i1sxQb7BIsf3VIX7lFhW8O9pRb5FxgQhaJIAhbyhuCrfgwlEMNCwAAAABJRU5ErkJggg==");
+}
+/* 上拉加载 */
+.icon-address {
+    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKaSURBVHgB7ZhBkhIxFED/T+OMsxJv0OwAF8AJBKa0ypVHgCPMDYAbOCeQOQHDyoUOjSdocIFUubBvIKsplenE/JapckZ+Ot2dZb8qqqvIT3jwk58EgJKSEiMIBah/DLsovLd6lDaC8vVb/mHQnQRcgYKVkvF8+6qzhJzkEkzEPG+kpbqWXSJQcrI570whI5kE/VlYPXvmzTKIPUThVP6OJ9s3nci2i7Vg/UPoi1MRwCGNBYjkL9mzlbQSdCh3j7WkAAu03AzcyRE+nnrvbQJTBZvBeqQfbUhHLwR1nbxArdKCaR43bsKL9DgDVqlFdb3fq8m3150HUvUg9FHBGEEMgGd3i7IW9To7LqBi6AziBLpGOQWTTb89Pta07SXza9i8CSNAMWJGqJ5JGOrnO+AcwAAiDoxy560xpKBr31jXwEv+Q3ShN8AKtoOwqgC7cNQNolsh2W/9mBMBY/04mkaai77+LMgq+POOXxiIammaN49ZUaySV1z7E8M0sioz/yHVZ8gOu7IrcQ5BIZzWPSOIkD3FSgGbQj0H2QHz9JFS11AGXtDjU5K28o52Ae8l1xZX+B/DWKibi/UPYL653ktrthv+oeB/Z5p3m37rOdfXvEgULtmOf/dnK4yxSFujoa+pUcr40tDcbiy+BPTrcAF0fqQYMOzlKlZzMJB63HqxWAVcwT5AW9l0v7+b3+/HSUqfVgao5IVpcVDB/9pv1aCIIB3vhZccGJwjY30mTLmvpBbqZAB9nwDX6L3c5jJlfeRvfFpPUcAAHKBTe6VTO7SJzXRpciGZRY7IfO0sIplVjsh1L84jmUeOyP3PQhbJvHJEob8+bCSLyBGFBAmTZFE5orAgcUzShRzhRJD4V9KVnHNIsrFYT6GkxJ4/YdQTQvZUTqcAAAAASUVORK5CYII=");
+}
 
 /******** img背景图 **********/
 .j-img {

+ 0 - 399
src/jfw/modules/app/src/web/staticres/jyapp/css/index.css

@@ -1,399 +0,0 @@
-.collection{
-  width: 100%;
-}
-
-/* 时间选择弹窗s */
-.headertitle{
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: .44rem .32rem .24rem;
-  width: 100%;
-  font-size: .4rem;
-  font-weight: 500;
-  color: #171826;
-}
-.headertitle .title_close{
-  display: flex;
-  width: .4rem;
-  height: .4rem;
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAgVBMVEUAAAChoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaEAAADUxRFJAAAAKXRSTlMABUuRxuj4EH7q6VXnA5Srk1b+wcP8f2UBm6BgxL+SxfkGgFhX60zH+uqurTcAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78AAAA00lEQVQoz4WT1xaCMAxAwyh7uVAQAVFG/v8HLSAjiO19aU7vOZBmAEwoqqYzw2C6piqwxbRsnHEsk1rXQ4LnrqQf4A+BP9sQdwgnH+Eu0fe/+IfDkPOY1fG03J8vw8H6/OPRXm/JZFP/PvqYV2N8b+bD5FMePobIVkDF5TIhAUeFHKlfW8whQ+KJxQJWpe4VsWhDicQTi6VMSz5eiFMTPiySlUVY1KewJVXfUCZsqGQcZMMkG0XJIHNejEr23ixRVS+yrjZL1K9gk7dO1zlt3iwr+AHFoWJRdvcdHQAAAABJRU5ErkJggg==) no-repeat;
-  background-size: contain;
-}
-.datepopup .van-picker-column__item.van-picker-column__item--selected{
-  font-size: .36rem;
-  color: #2ABED1;
-}
-.datepopup .van-picker-column__item{
-  float: none!important;
-}
-/* end */
-.collection .search-container{
-  position: relative;
-}
-.collection .van-dropdown-menu__bar.van-dropdown-menu__bar--opened{
-  width: auto;
-  overflow: auto;
-  height: .88rem;
-  box-shadow: none;
-  border-bottom: 1.5px solid rgba(0,0,0,0.05);
-  z-index: 10;
-}
-.collection .van-dropdown-menu__item{
-  flex: none;
-  padding: .24rem .38rem;
-}
-.collection .my-search.van-search.van-search--show-action{
-  border-bottom:1.5px solid rgba(0,0,0,0.05);
-}
-.collection .van-search__content{
-  border-radius: .18rem;
-  height: .8rem;
-}
-
-.collection .van-search .van-cell{
-  padding: 10px 12px;
-}
-
-.collection .van-dropdown-menu__title.van-dropdown-menu__title--active.van-dropdown-menu__title--down{
-  color: #2ABED1;
-  font-size: .28rem;
-}
-.collection .van-icon.van-icon-search{
-  width: .4rem;
-  height: .4rem;
-}
-.collection .van-list{
-  padding: 0 .32rem;
-  background: #ffffff;
-}
-.collection .listaction{
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 0 .32rem;
-  width: 100%;
-  height: .88rem;
-  background: #ffffff;
-  font-size: .28rem;
-  font-weight: 500;
-  color: #2abed1;
-  line-height: .4rem;
-}
-.collection .data_report .collec_datareport{
-  display: flex;
-}
-.collection .data_download{
-  display: flex;
-  margin-right: .08rem;
-  width: .32rem;
-  height: .32rem;
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAeCAYAAABNChwpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAJkSURBVFhH7ZbLaxNRFMb9e5RWtCKoCzelO0FEpAg+Fy7adalvBAVd6E78H0QXgtWKYhu1BJtEm7RJ20zS1Ngkk1jzaB6TmWQmX88ZJ8poksmMjW7ywV3ce7nz/eaec8+9u/Cf1QdwDKA2GsgpdfgLFYSKEurUdyLHAMW6ipfpPI7OhXDSI0CsKsaMPTkGSEoKHsXS2D0TwOEPQUyJeWPGnhwDxCsyHkRTfYA+QB+g9wBCqYq337YQLkmQNc0YtQYoU6FyZ0vw5kp6xWwnS4C7QhKnfRFcW/6KefpYE6ITAJs/TWZxyR/DWGAdc9miMfOnLAHGAjEMuRZx4N0SLofiWCiUoRBEO4CKqmI6k8cpr4C9s4sYdi9jKp3T51rJEoAXX/gc/QkxSRB+goiUqyaA52IOkqphmu6HE54wBsn8CI3fCSf0MLZTV0n4OlPAeYLYb0BMBON4QUb3KDwMcOh9EI8T3ylXChhxr2Bg9sfYzZUNPXc6qSsA1hv6OEPsI4gh1xJGvRGMU3wZgKGuU47wzbiH+geN/hrtkpW6BmDxH54jCI4tG7dqHKqrZB6XZGNVZ9kCYLk2t3DmUxQDLcwZ7AaZ23kb2AaoaQ19J0Z9gsl8kOI+Efyin3nNxuvINgCrStk+QztxlnaCzTk5+XTYNWc5AmDxeffly7i1uqEfx3/+JGPJtBMJepqJsjNz1l8B7IRMAFznPVTvn1Ad71V7RUVtvfKrPpgANpUaLi6s4djH1Z41LmAPY6Lh+BtARq7h+HzYdLx2unGJvk33Q1MmAM7sZ6ksrlAx6VW7H0nRO6F5PQPb/EEL2Uq9DN4AAAAASUVORK5CYII=) no-repeat;
-  background-size: contain;
-}
-.collection .collec_active{
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-.collec_active .cancel_collec{
-  margin-right: .22rem;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-.collection .collec_li{
-  padding: .36rem 0 .4rem;
-  width: 100%;
-  background: #ffffff;
-  border-bottom: 0.5px solid rgba(0,0,0,0.05);
-}
-.collection .collec_li .collec_head{
-  display: flex;
-  justify-content: space-between;
-  align-items: flex-start;
-}
-.collection .collec_li .collec_title{
-  flex: 1;
-  font-size: .32rem;
-  color: #171826;
-  font-weight: 500;
-  line-height: .48rem;
-}
-.collec_star{
-  margin-left: .36rem;
-  width: .4rem;
-  height: .4rem;
-}
-.collec_star .shoucang{
-  display: flex;
-  width: .4rem;
-  height: .4rem;
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHRSURBVHgB1VVLTsMwEH1jCB8hpHICwpIVsASERE4CV+AEcARuAjdoJYTY0e4QbBpOQBGC8quH5/RD2jiti7rhSZNY8fjNmxnbAaaAVlFxNs2a+WmcEeECJhslmDX0Cod6Dc2M49B1JtQRgtPBeC43nkWATLHkVCuzCcwiLAODo8K3wCxkkgN3TYwFNL2TFokcoIbQAHpDsi9sU3FMW6fKWFfkEO+oyIf61qdkSPluMNgjS9fgupbs850PwHqecaKQsi5yerWn4UshL+pUh0FwIns47/bA4JLPVsFpKTeOBLpmoMsTq+o2QYtW61K7YN2UkkKQSEZVASsM5LIyY8iFvemVaeCWfTDYAbKaulNbDpZOK8YXJM2T9zUNC3CNtqiyFLFTOxau72/sTVu75Ibkuz2BZQH6QViGOksUdLHJm6Z41wK5g7eSmWMkKUJg1e2wlo/cYdxtuo1J+N26cZmLN4PPhwnkSuJX2vPgXFT0lgczNIDRuRhlcKqfSNweOdlt/z/C3wOrxQxEax1rE5InVJ0W5kvK5O2BMbqlgw2mjY7Vk2hz6FLb4I/nmG93vcQ9qd4SeWEfpGrvpfl9l5GMhQtEa9LqCIXWp/ux/3XN/8APC++o0hFQWAMAAAAASUVORK5CYII=) no-repeat;
-  background-size: contain;
-}
-.collec_star .weishoucang{
-  display: flex;
-  width: .4rem;
-  height: .4rem;
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJESURBVHgB1VXRbdswEL2jqH5rg7gT1NnA3iAdIKmNxiqCfhSdQOkETb+M2goUxO13vEHcCapOEGUDfQaQyOsdYQV2ItdU/noATYt6994deUcBdLAsyyIZXXx0F3Bt9M3679DXR/kCp/PFgCc35vNs4OvnLaAREgQqAKgE1Imvn5dAE7218MUSfoMOWXgJhIjvJPo4Prl6peuLLlnsFZhOsx4BjSR6eR6Px2WXLPApmQp1H4h6WqkDwzMDBhx9GQTmUMgFJ6Vam+AOQZUsXijEvLb23oLJLUH5MR7nWwLf54tzxYe4rc3bAFggUm4N/JLt2XybposjC8BbBz3G8sCt/rBEnz9MTi5cHyDVS8Dgk4DY4W1V1fnZ2biAf9jp6fGSp2XzLFlVVXCECjMJDsmsZN2dQcwpkTXDddRf4QX28AARKJUIh3DF6216PGRZqCtzaMFCGIa3ch6+5IIN2Eex7ya5GLaDAwYrqKpquG+rNsmryjzDPytTARgGEthIhzqDPRaG+mYXeatAI4JcQeBnBQGWuzLd2WgE0OfxB/YYn9k9uFJtt1aB2Szrr0VWzZqU4fxykcxm16MtMDcZ/0Zp+vPAW0Ap3ZO5tnXhBC+vR5UJf7PiudR5mv64exQyxlWMdWXuKWDIugy4u6MZkyFh5q5q4g8NDynlRogwGLhskXptXK1ftADVG5KXqG/ZNRfSyeR4tQF5LVkRUcL3kGvMQOGBtwCTRxKx3KBP76DG4vdu/UqE2CHhFPrga10/7C/1+T/sL+2vJ0ALxXBYAAAAAElFTkSuQmCC) no-repeat;
-  background-size: contain;
-}
-.collection .collec_li .collec_action{
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-top: .24rem;
-}
-
-.collec_action .collec_tags{
-  display: flex;
-  align-items: center;
-}
-.collec_action .collec_tags .tag_active{
-  margin-right: .08rem;
-  padding: .02rem .16rem;
-  height: .36rem;
-  font-size: .24rem;
-  font-weight: 500;
-  text-align: CENTER;
-  color: #5f5e64;
-  border-radius: .05rem;
-  opacity: 1;
-  background: #f7f9fa;
-  border: 1px solid rgba(0,0,0,0.05);
-}
-.collec_action .collec_time{
-  font-size: .24rem;
-  font-weight: 500;
-  color: #9b9ca3;
-  line-height: .36rem;
-}
-
-.collection .taglist{
-  flex: none;
-  height: 6rem;
-  display: flex;
-  flex-wrap: wrap;
-  padding: .32rem;
-  flex-direction: row;
-
-}
-.collection .taglist .area-card-item{
-  height: .72rem;
-  background: #F5F6F7;
-  border-radius: .08rem;
-  color: #5F5E64;
-  font-size: .28rem;
-  line-height: .72rem;
-  padding: 0 .4rem;
-  margin:0 .2rem .2rem 0;
-}
-.collection .taglist .area-card-item.active{
-  position: relative;
-  background: #E8FAFD;
-  color: #2ABED1;
-}
-.collection .taglist .area-card-item.active::after{
-  content: "";
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  background: url(/jyapp/big-member/image/icon-check.png);
-  width: .28rem;
-  height: .28rem;
-  background-size: 100% 100%;
-}
-
-.collection .dateTags{
-  padding: 0 .32rem;
-  flex: none;
-  height: 6rem;
-}
-.collection .dateTags .van-field__control{
-  font-size: .28rem;
-  color: #171826;
-  line-height: .4rem;
-}
-.collection .timeTag{
-  display: flex;
-  padding: .32rem 0;
-}
-.collection .timeTag .area-card-item{
-  width: 1.56rem;
-  height: .72rem;
-  background: #F5F6F7;
-  border-radius: .08rem;
-  color: #5F5E64;
-  font-size: .28rem;
-  text-align: center;
-  line-height: .72rem;
-  margin:0 .2rem .2rem 0;
-}
-.collection .timeTag .area-card-item.active{
-  position: relative;
-  background: #E8FAFD;
-  color: #2ABED1;
-}
-.collection .timeTag .area-card-item.active::after{
-  content: "";
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  background: url(/jyapp/big-member/image/icon-check.png);
-  width: .28rem;
-  height: .28rem;
-  background-size: 100% 100%;
-}
-.collection .timePicker{
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: .16rem;
-  width: 100%;
-  height: 1.04rem;
-  opacity: 1;
-  background: #f5f6f7;
-  border-radius: .08rem;
-}
-.collection .timePicker.clickactive{
-  position: relative;
- background: #E8FAFD;
-}
-.collection .timePicker.clickactive::after{
-  content: '';
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  background: url(/jyapp/big-member/image/icon-check.png);
-  width: .28rem;
-  height: .28rem;
-  background-size: 100% 100%;
- }
-.timePicker .line{
-  width: 12px;
-  height: 1px;
-  background: #ACACAD;
-}
-.timePicker .van-cell.van-field {
-  width: 2.96rem;
-  height: .72rem;
-  background: #ffffff;
-  border: 1px solid rgba(0,0,0,0.10);
-  border-radius: .1rem;
-  align-items: center;
-}
-.collection .j-footer{
-  box-shadow: 0px -2px 8px rgb(54 147 179 / 5%);
-  z-index: inherit;
-}
-.collection .j-button-group {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  width: 100%;
-  padding: 0.16rem 0.32rem 0.24rem;
-  background-color: #fff;
-  box-sizing: border-box;
-}
-.collection .j-button-group .j-button-confirm, .j-button-cancel {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  flex: 1;
-  width: 100%;
-  height: 0.8rem;
-  font-size: 0.32rem;
-  line-height: inherit;
-  text-align: center;
-  border-radius: 0.16rem;
-}
-.collection .j-button-group .j-button-cancel {
-  margin-right: 0.26rem;
-  color: #5f5e64;
-  background-color: #edeff2;
-}
-.collection .j-button-group .j-button-confirm {
-  color: #fff;
-  background-color: #2cb7ca;
-}
-/* 地区 */
-.collection .area-list.van-index-bar{
-  height: 8.6rem;
-  overflow: auto;
-}
-/* 采购单位类型 */
-.collection .unitTab{
-  overflow: hidden;
-  height: 7.5rem;
-  flex: none;
-}
-.collection .unitTab .van-tabs__content{
-  height: 7.5rem;
-  overflow: auto;
-}
-.collection .unitType {
-  height: 100%;
-  /* overflow: auto; */
-  flex: 1;
-  display: flex;
-}
-.collection .unitType .van-tabs__wrap{
-  height: 100%;
-  overflow: auto;
-}
-.collection .unitType .van-tabs__content{
-  flex: 1;
-}
-.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card{
-  height: auto;
-  margin: 0;
-  display: flex;
-  flex-direction: column;
-  border: 0;
-  overflow: auto;
-}
-.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab{
-  flex: none;
-  width: 2.5rem;
-  min-height: .8rem;
-  background: #f5f6f7;
-  border: 0;
-  padding: 0;
-}
-.unitType .van-tab__text.van-tab__text--ellipsis{
-  padding: 0 0.08rem 0 .32rem;
-  display: flex;
-  align-items: center;
-  width: 100%;
-  height: 100%;
-  font-size: .3rem;
-  font-weight: 500;
-  text-align: LEFT;
-  color: #171826;
-  line-height: .44rem;
-}
-.unitType .van-tab__text.van-tab__text--ellipsis .tabtitle{
-  flex: 1;
-}
-.unitType .van-tab__text.van-tab__text--ellipsis .optionnum{
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  margin-left: .1rem;
-  width: .8rem;
-  height: .4rem;
-  background: #2abed1;
-  border: 1px solid #ffffff;
-  border-radius: .82rem;
-  font-size: .22rem;
-  font-weight: 500;
-  text-align: CENTER;
-  color: #ffffff;
-}
-.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active {
-  background: #ffffff;
-}
-.unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active .van-tab__text.van-tab__text--ellipsis{
-  color: #2ABED1;
-}

+ 12 - 0
src/jfw/modules/app/src/web/staticres/jyapp/css/subscribe.css

@@ -862,6 +862,18 @@ font-weight: bold;
 .filter_tab .van-dropdown-menu__title{
   padding: 0 8px 0 0;
 }
+.filter_tab .van-dropdown-menu__title .rootstyletitle{
+  font-size: .28rem;
+  font-weight: 500;
+  color: #c0c4cc;
+}
+.filter_tab .van-dropdown-menu__title .rootstyletitle .root_open{
+  padding: .04rem .12rem;
+  border: 1px solid #fb483d;
+  border-radius: 9px;
+  font-size: .2rem;
+  color: #fb483d;
+}
 
 /*.filter_tab:after {
   position: absolute;

+ 64 - 25
src/jfw/modules/app/src/web/staticres/jyapp/js/historypush.js

@@ -7,7 +7,8 @@ var vm = new Vue({
     industryComponent: industryComponent,
     cateComponent: cateComponent,
     keywordComponent: keywordComponent,
-    noticeComponent: noticeComponent
+    noticeComponent: noticeComponent,
+    rootComponent: rootComponent
   },
   data () {
     return {
@@ -16,55 +17,93 @@ var vm = new Vue({
       // 地区参数
       area: '',
       // 行业参数
-      industry: ''
+      subscopeclass: '',
+      // 采购单位
+      buyerclass: '',
+      // 关键词
+      key: '',
+      // 公告类型
+      subtype: '',
+      screenShow: false
     }
   },
+  created () {
+    this.getUserRoot()
+  },
   methods: {
+    // 判断是否是有筛选条件
+    getUserRoot: function() {
+      let _this = this
+      $.ajax({
+        url: '/publicapply/bidcoll/power',
+        type: 'POST',
+        success: function(res) {
+          console.log(res)
+          if(res.data) {
+            _this.screenShow = true
+          } else {
+            _this.screenShow = false
+          }
+        }
+      })
+    },
     confirm: function(data){
-      console.log(data)
+      this.setToggle()
       if(data.name === 'dateItem'){
-        this.$refs.dateItem.toggle()
-        this.time = data.data
-        initpage()
+        if ((data.data.start / 1000).toFixed(0) == 0 && (data.data.end / 1000).toFixed(0) == 0) {
+          this.time = ''
+        } else if((data.data.start / 1000).toFixed(0) == 0 && (data.data.end / 1000).toFixed(0) != 0) {
+          this.time = '_' + (data.data.end / 1000).toFixed(0)
+        } else if((data.data.start / 1000).toFixed(0) != 0 && (data.data.end / 1000).toFixed(0) == 0) {
+          this.time = (data.data.start / 1000).toFixed(0) + '_'
+        } else {
+          this.time = (data.data.start / 1000).toFixed(0) + '_' + (data.data.end / 1000).toFixed(0)
+        }
+        FTAGData(this.time)
+        return
       } else if(data.name === 'areaItem'){
-        this.$refs.areaItem.toggle()
         this.area = data.data.join('、')
       } else if(data.name === 'industryItem'){
-        this.$refs.industryItem.toggle()
-        this.industry = data.data.join(',')
+        this.subscopeclass = data.data.join(',')
       } else if(data.name === 'cateItem'){
-        this.$refs.cateItem.toggle()
-        this.industry = data.data.join(',')
+        this.buyerclass = data.data.join(',')
       } else if(data.name === 'keywordItem'){
         this.$refs.keywordItem.toggle()
-        this.industry = data.data.join(',')
       } else if(data.name === 'noticeItem'){
-        this.$refs.noticeItem.toggle()
-        this.industry = data.data.join(',')
+        this.subtype = data.data.join(',')
+      } else if(data.name === 'rootItem'){
+        location.href = '/jyapp/vipsubscribe/introducePage'
       }
+      this.getAjaXParams()
     },
     cancel: function(data){
       console.log(data)
       if(data.name === 'dateItem'){
-        this.$refs.dateItem.toggle()
-        // this.time = data.data
+        firstTime = (data.data.start / 1000).toFixed(0) + '_' + (data.data.end / 1000).toFixed(0)
         initpage()
       } else if(data.name === 'areaItem'){
-        this.$refs.areaItem.toggle()
         // this.area = data.data.join('、')
       } else if(data.name === 'industryItem'){
-        this.$refs.industryItem.toggle()
-        // this.industry = data.data.join(',')
+        // this.subscopeclass = data.data.join(',')
       } else if(data.name === 'cateItem'){
-        this.$refs.cateItem.toggle()
-        // this.industry = data.data.join(',')
+        // this.subscopeclass = data.data.join(',')
       } else if(data.name === 'keywordItem'){
-        this.$refs.keywordItem.toggle()
-        // this.industry = data.data.join(',')
+        // this.subscopeclass = data.data.join(',')
       } else if(data.name === 'noticeItem'){
-        this.$refs.noticeItem.toggle()
-        // this.industry = data.data.join(',')
+        // this.subscopeclass = data.data.join(',')
       }
+      this.setToggle()
+    },
+    getAjaXParams: function() {
+      ajaxFun(this.time, this.area, this.subscopeclass, this.buyerclass, this.key, this.subtype)
+    },
+    setToggle: function() {
+      this.$refs.dateItem.toggle(false)
+      this.$refs.areaItem.toggle(false)
+      this.$refs.industryItem.toggle(false)
+      this.$refs.cateItem.toggle(false)
+      this.$refs.keywordItem.toggle(false)
+      this.$refs.noticeItem.toggle(false)
     }
   }
 })

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

@@ -1319,6 +1319,10 @@ var SuperSearch = {
             });
 	},
 	getHtml: function (list,pageNum){//生成list表单 或 table表单
+    // 获取收藏状态
+    SuperSearch.checkStartKeepStatus(list.map(function(v) {
+      return v._id
+    }))
 		var html ={};
 		var ListHtml='';
 		var TableHtml='';
@@ -1482,10 +1486,13 @@ var SuperSearch = {
 						+'<div class="one">'
 						+'<span class="xh">'+index+'.</span>'
 						+'</div>'
+            + '<div class="two-group">'
 						+'<div class="two bt-parent"'+thisStyle+'>'
 						+'<a class="bt" sid="'+list[i]._id+'" s="'+href+'" href="javascript:void(0);">'+title+'</a>'
 						+'</div>'
-						+'</div>'
+            + '<div class="flow-start-box"><i class="icon-flow-start"></i></div>'
+            +'</div>'
+            +'</div>'
 						+'<div style="clear:both;"></div>'
 						+'<div class="restime time-diff">'
 						+area+industry+datatype+moneyTag+tdf
@@ -1569,14 +1576,60 @@ var SuperSearch = {
 			SuperSearch.showToOrder(true);
 		}
 	},
+  changeKeepStatus (id, type) {
+    var aDom = $("a[sid='"+id+"']")
+    if (aDom.length) {
+      var gDom = aDom.parents('.two-group').find('.flow-start-box')
+      if (type) {
+        gDom.addClass('fill')
+      } else {
+        gDom.removeClass('fill')
+      }
+    }
+  },
+  checkStartKeepStatus: function (list) {
+      $.ajax({
+        url: '/publicapply/bidcoll/isColl',
+        type: 'POST',
+        data: {
+          bids: list.join(',')
+        }
+      }).done(function (r) {
+        if (r && r.error_msg == '' && r.data) {
+          console.log('start', r.data)
+          r.data.forEach(function(v) {
+            SuperSearch.changeKeepStatus(v, true)
+          })
+        }
+      })
+  },
+  checkIsStartFn: function (event, attrData) {
+    var isStart = $(event.target).hasClass('.flow-start-box') || $(event.target).parents('.flow-start-box').length
+    console.log(isStart, 'isStart')
+    if (isStart) {
+      event.preventDefault();
+      event.stopPropagation();
+      console.log('收藏')
+      var isStartStatus = $(event.target).hasClass('.flow-start-box.fill') || $(event.target).parents('.flow-start-box.fill').length
+
+      if (vKeepComponent) {
+        vKeepComponent.changeBid(attrData.sid, !isStartStatus)
+      }
+
+      return false
+    }
+    return true
+  },
 	appendListHtml: function (html){  //下拉时展示信息
 	    // 插入数据到页面,放到最后面
 	    var ListHtmlObj = $(html.ListHtml);
 	    ListHtmlObj.on("tap", function(event){
 	        var h = $(this).find("a.bt").attr("s");
 	        var sid = $(this).find("a.bt").attr("sid");
-			var industry = $(this).find(".industry").text();
-	        SuperSearch.myredirect(h,sid,industry);
+			    var industry = $(this).find(".industry").text();
+			    if (SuperSearch.checkIsStartFn(event, { sid: sid })) {
+            SuperSearch.myredirect(h,sid,industry);
+          }
 	    });
 	    $('#supersearchPage #list').append(ListHtmlObj);
 		$(".loading_").hide();
@@ -1623,8 +1676,11 @@ var SuperSearch = {
 	   	ListHtmlObj.on("tap", function(event){
 	       var h = $(this).find("a.bt").attr("s");
 	       var sid = $(this).find("a.bt").attr("sid");
-		   var industry = $(this).find(".industry").text();
-	       SuperSearch.myredirect(h,sid,industry);
+         var industry = $(this).find(".industry").text();
+
+        if (SuperSearch.checkIsStartFn(event, { sid: sid })) {
+          SuperSearch.myredirect(h,sid,industry);
+        }
 	   	});
 	   	$('#supersearchPage #list').html(ListHtmlObj);
 
@@ -1960,7 +2016,9 @@ var SuperSearch = {
 				    var h = $(this).find("a.bt").attr("s");
 				    var sid = $(this).find("a.bt").attr("sid");
 					var industry = $(this).find(".industry").text();
-				    SuperSearch.myredirect(h,sid,industry);
+          if (SuperSearch.checkIsStartFn(event, { sid: sid })) {
+            SuperSearch.myredirect(h,sid,industry);
+          }
 				});
 				$("#supersearchPage #list").html(ListContent);
 				//

+ 22 - 24
src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html

@@ -30,37 +30,33 @@
         <div class="j-main">
           <div class="search-container van-fade-an" ref="searchContainer">
             <div class="listaction">
-              <div class="action_editor" @click="screenBtn">筛选</div>
+              <div class="action_editor">
+                <span v-show="screenShow" @click="screenBtn">筛选</span>
+              </div>
               <div class="data_report">
-                <div class="collec_datareport">
+                <div class="collec_datareport" @click="dataReport">
                   <span class="data_download"></span>
                   <span class="data text">数据导出</span>
                 </div>
               </div>
             </div>
           </div>
-          <van-dropdown-menu v-if="limitshow" :get-container="getContainer">
-            <van-dropdown-item v-model="params.value1" title="个人标签" :options="params.option1">
-              <div class="j-container">
-                <div class="taglist j-main">
-                  <div class="area-card-item" :class="{active:index==personTagactive}" v-for="(item, index) in 100" :key="index" @click="selectTags(index)">标签1</div>
-                </div>
-                <div class="j-footer">
-                  <div class="j-button-group">
-                    <button class="j-button-cancel" @click="resetAll">重置</button>
-                    <button class="j-button-confirm" @click="onConfirm">确认</button>
-                  </div>
-                </div>
-              </div>
+          <van-dropdown-menu v-show="limitshow" :get-container="getContainer" :close-on-click-outside="false">
+            <van-dropdown-item  title="个人标签"  ref="tagItem">
+              <tags-component @confirm="confirm" @cancel="cancel" :taglist="tagList"></tags-component>
+            </van-dropdown-item>
+            <van-dropdown-item title="收藏日期" ref="dateItem">
+              <date-component @confirm="confirm" @cancel="cancel"></date-component>
+            </van-dropdown-item>
+            <van-dropdown-item title="采购单位类型" ref="cateItem">
+              <cate-component @confirm="confirm" @cancel="cancel"></cate-component>
             </van-dropdown-item>
-            <van-dropdown-item v-model="params.value2" title="收藏日期" :options="params.option2">
-              <date-component />
+            <van-dropdown-item ref="buyerItem" v-model="limitlist.buyerPhone" title="采购单位联系方式">
+              <phone-component :data="params.buyerData" @confirm="confirm"></phone-component>
             </van-dropdown-item>
-            <van-dropdown-item v-model="params.value2" title="采购单位类型" :options="params.option2">
-              <cate-component></cate-component>
+            <van-dropdown-item ref="winnerItem" v-model="limitlist.winnerPhone"  title="中标企业联系方式">
+              <phone-component :data="params.winnerData" @confirm="confirm"></phone-component>
             </van-dropdown-item>
-            <van-dropdown-item v-model="params.value2" title="采购单位联系方式" :options="params.option4"></van-dropdown-item>
-            <van-dropdown-item v-model="params.value2" title="中标企业联系方式" :options="params.option5"></van-dropdown-item>
           </van-dropdown-menu>
           <div class="list-mian">
             <van-list
@@ -69,7 +65,7 @@
               finished-text="没有更多了"
               @load="getList"
             >
-              <div class="collec_li" v-for="(item, index) in listState.list" :key="index">
+              <div class="collec_li" v-for="(item, index) in listState.list" :key="index" @click="linkRouter(item._id)">
                 <div class="collec_head">
                   <div class="collec_title ellipsis-2">
                     ${item.title}
@@ -82,11 +78,11 @@
                 <div class="collec_action">
                   <ul class="collec_tags">
                     <li class="tag_active" v-if="item.area&&item.area!==''">${item.area}</li>
-                    <li class="tag_active" v-if="item.s_subscopeclass&&item.s_subscopeclass!==''">${item.s_subscopeclass}</li>
+                    <li class="tag_active" v-if="item.buyerclass&&item.buyerclass!==''">${item.buyerclass}</li>
                     <li class="tag_active" v-if="item.type&&item.type!==''">${item.type}</li>
                     <li class="tag_active" v-if="item.bidamount&&item.bidamount!==''">${item.bidamount}</li>
                   </ul>
-                  <div class="collec_time">${item.time}</div>
+                  <div class="collec_time">${item.publishtime}</div>
                 </div>
               </div>
             </van-list>
@@ -101,8 +97,10 @@
   <script src=//cdn.jsdelivr.net/npm/zepto@1.2.0/dist/zepto.min.js></script>
   <!--E-当前页面的资源-->
   {{include "/big-member/commonjs.html"}}
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/tags-mobile.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/phone-mobile.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/index.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
 </body>

+ 114 - 24
src/jfw/modules/app/src/web/templates/weixin/historypush.html

@@ -59,6 +59,12 @@
             height: .88rem;
             /* padding-left: 16px; */
         }
+        .app-layout-content-b .app-content::after{
+            content: '';
+            width: 100%;
+            height: 8px;
+            background: #F5F6F7;
+        }
     </style>
 </head>
 <body class="p13" id="viperSuper">
@@ -76,8 +82,8 @@
     </li>
     <li>
         <div class="tab_right">
-            <span class="report_book"></span>
             <div class="vip_report" style="display: none;">
+                <span class="report_book"></span>
                 <a></a>报告
             </div>
         </div>
@@ -87,13 +93,13 @@
 </div>
 {{include "/big-member/commonjs.html"}}
 <div class="app-layout-content-b">
-    <div class="app-content">
+    <div class="app-content" style="background:#fff">
       {{if and (not .T.isIosExam) (not .T.isIosExamPhone)}}
   		<div class="header_header" style="height: 60px;display:none;transition: all 0.1s;">
-  			<div class="only-personal" style="position: absolute;top: .2rem;left: 4%;background-image: url(/jyapp/vipsubscribe/image/entback.png?v=51430);background-size: 100%;background-repeat: no-repeat;border-radius: 8px;width: 92%;display: flex;align-items: center;justify-content: space-between;height: 44px;">
+  			<div class="only-personal" style="position: absolute;top: .35rem;left: 4%;background-image: url(/jyapp/vipsubscribe/image/entback.png?v=51430);background-size: 100%;background-repeat: no-repeat;border-radius: 8px;width: 92%;display: flex;align-items: center;justify-content: space-between;height: 44px;">
   				<img style="width: 20px;height: 20px; margin-left: .3rem;" src="/jyapp/vipsubscribe/image/vip-icon.png?v=1">
-  				<span  data-name="doubleEleven_title" style="color:#fff;font-weight: bold;font-size: 13px;text-align: left;">全国企业随手查,竞争实力尽展示!</span>
-  				<span  data-name="doubleEleven_button" class="switch_ext" id="app-historypush-vipSub-banner" style="border-radius: 32px;display: flex;flex-direction: row;padding: 3px 12px;font-size: 12px;color: #FAE7CA;margin-right: .2rem;background: linear-gradient(to bottom, #F1D090 0%, #FAE7CA 100%);color: #33323A;font-family: PingFang SC;font-size: 12px;line-height: 18px;letter-spacing: 0px;text-align: center;white-space: nowrap;">立即使用</span>
+  				<span  data-name="doubleEleven_title" style="position: absolute;color:#fff;font-weight: bold;font-size: 15px;text-align: left;left: 43px;">直接对接项目联系人</span>
+  				<span  data-name="doubleEleven_button" class="switch_ext" id="app-historypush-vipSub-banner" style="border-radius: 32px;display: flex;flex-direction: row;padding: 3px 12px;font-size: 12px;color: #FAE7CA;margin-right: .2rem;background: linear-gradient(to bottom, #F1D090 0%, #FAE7CA 100%);color: #33323A;font-family: PingFang SC;font-size: 12px;line-height: 18px;letter-spacing: 0px;text-align: center;white-space: nowrap;">免费试用</span>
   			</div>
   		</div>
       {{end}}
@@ -115,20 +121,60 @@
                         <van-dropdown-item title="时间"  ref="dateItem">
                             <date-component @cancel="cancel" @confirm="confirm" />
                         </van-dropdown-item>
-                        <van-dropdown-item title="地区" ref="areaItem">
-                            <area-component @cancel="cancel" @confirm="confirm"></area-component>
+                        <van-dropdown-item ref="areaItem">
+                            <template #title>
+                                <span v-if="screenShow">地区</span>
+                                <span v-if="!screenShow" class="rootstyletitle">
+                                    <span>地区</span>
+                                    <span class="root_open">开通</span>
+                                </span>
+                            </template>
+                            <area-component v-if="screenShow" @cancel="cancel" @confirm="confirm"></area-component>
+                            <root-component v-if="!screenShow" @cancel="cancel" @confirm="confirm"></root-component>
                         </van-dropdown-item>
-                        <van-dropdown-item title="行业" ref="industryItem">
-                            <industry-component @cancel="cancel" @confirm="confirm"></industry-component>
+                        <van-dropdown-item ref="industryItem">
+                            <template #title>
+                                <span v-if="screenShow">行业</span>
+                                <span v-if="!screenShow" class="rootstyletitle">
+                                    <span>行业</span>
+                                    <span class="root_open">开通</span>
+                                </span>
+                            </template>
+                            <industry-component v-if="screenShow" @cancel="cancel" @confirm="confirm"></industry-component>
+                            <root-component v-if="!screenShow" @cancel="cancel" @confirm="confirm"></root-component>
                         </van-dropdown-item>
-                        <van-dropdown-item title="采购单位" ref="cateItem">
-                            <cate-component @cancel="cancel" @confirm="confirm"></cate-component>
+                        <van-dropdown-item  ref="cateItem">
+                            <template #title>
+                                <span v-if="screenShow">采购单位</span>
+                                <span v-if="!screenShow" class="rootstyletitle">
+                                    <span>采购单位</span>
+                                    <span class="root_open">开通</span>
+                                </span>
+                            </template>
+                            <cate-component @cancel="cancel" v-if="screenShow" @confirm="confirm"></cate-component>
+                            <root-component v-if="!screenShow" @cancel="cancel" @confirm="confirm"></root-component>
                         </van-dropdown-item>
                         <van-dropdown-item title="关键词" ref="keywordItem">
-                            <keyword-component @cancel="cancel" @confirm="confirm"></keyword-component>
+                            <template #title>
+                                <span v-if="screenShow">关键词</span>
+                                <span v-if="!screenShow" class="rootstyletitle">
+                                    <span>关键词</span>
+                                    <span class="root_open">开通</span>
+                                </span>
+                            </template>
+                            <keyword-component @cancel="cancel" v-if="screenShow" @confirm="confirm"></keyword-component>
+                            <root-component v-if="!screenShow" @cancel="cancel" @confirm="confirm"></root-component>
                         </van-dropdown-item>
                         <van-dropdown-item title="公告类型" ref="noticeItem">
-                            <notice-component @cancel="cancel" @confirm="confirm"></notice-component>
+                            <template #title>
+                                <span v-if="screenShow">公告类型</span>
+                                <span v-if="!screenShow" class="rootstyletitle">
+                                    <span>公告类型</span>
+                                    <span class="root_open">开通</span>
+                                </span>
+                            </template>
+                            <notice-component @cancel="cancel" v-if="screenShow" @confirm="confirm"></notice-component>
+                            <root-component v-if="!screenShow" @cancel="cancel" @confirm="confirm"></root-component>
                         </van-dropdown-item>
                     </van-dropdown-menu>
                 </div>
@@ -207,7 +253,6 @@
             </div>
         </div>
     </div>
-</div>
 <div class="vip_report_tip">
     <div class="weui-mask weui-animate-fade-in"></div>
     <div class="weui-dialog weui-animate-fade-in">
@@ -287,6 +332,7 @@
 <script src=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/vant.min.js></script>
 <script src=//cdn.jsdelivr.net/npm/zepto@1.2.0/dist/zepto.min.js></script>
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/js/utils.js?v={{Msg "seo" "version"}}"></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/root-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/industry-mobile.js?v={{Msg "seo" "version"}}'></script>
@@ -467,7 +513,7 @@
       }
   });
 
-  var firstTime = {{.T.selectTime}};
+  var firstTime = {{.T.selectTime}}+'-'+{{.T.selectTime}};
   var userId = "";
   var selectCity = "";
 
@@ -1024,9 +1070,9 @@ function hasNoData() {
               + '</div>'
               + '<div class="two bt-parent" style="display: flex;justify-content: space-between;padding-left:' + paddingLeft + 'px;">'
               + '<a class="bt ' + visited + '" eid="' + obj["_id"] + '"  push_date="' + obj["ca_date"] + '" list_index="' + obj["ca_index"] + '" projectM="' + obj["ca_type"] + '">' + title + '</a>'
-              + '<div class="collec_star">'
-              + '<span class="shoucang"></span>'
-              + '<span class="weishoucang" style="display:none"></span>'
+              + '<div class="collec_star" data-id="' + obj["_id"] + '">'
+              + '<span class="shoucang" style="display:none"></span>'
+              + '<span class="weishoucang"></span>'
               + '</div>'
               + '</div>'
               + '</div>'
@@ -1050,6 +1096,48 @@ function hasNoData() {
       }
   }
 
+  // 收藏或取消收藏
+  $(document).off('click').on('click','.collec_star', function(e){
+      const _this = this
+      e.stopPropagation()
+      const id = $(this).attr('data-id')
+    const paramsObj = {
+        baction: 'C',
+        binfo: [
+            {
+            bid: id
+            }
+        ]
+    }
+    $.ajax({
+        url: '/publicapply/bidcoll/action',
+        type: "POST",
+        contentType: 'application/json;charset=utf-8',
+        data:JSON.stringify(paramsObj),
+        success: function(res){
+            console.log(res)
+            if(res.error_code == 0) {
+                if(res.data) {
+                    $(_this).find('.shoucang').show()
+                    $(_this).find('.weishoucang').hide()
+                    _this.$toast(res.error_msg)
+                } else {
+                    _this.$toast(res.error_msg)
+                }
+            }
+        },
+        error: function(err){
+            _this.$toast(res.error_msg)
+        }
+    })
+    this.listState.list.map((item,index) => {
+    console.log(item)
+    if(id === item._id) {
+        this.getList()
+    }
+    })
+  })
+
   //
   function formatDate(date, sl) {
       var myDate = new Date(date * 1000);
@@ -1157,19 +1245,20 @@ function hasNoData() {
   //
   var ajaxFlag = true;
 
-  function ajaxFun(time, area) {
+  function ajaxFun(time, area, subscopeclass, buyerclass, key, subtype) {
+      console.log(ajaxFlag)
       if (!ajaxFlag) {
           return
       }
       ajaxFlag = false;
       $("#loading").show();
-      if(time==""&&area==""){
+      if(time==""&&area==""&&subscopeclass==""&&buyerclass==""&&key==""&&subtype==""){
         afterJyObjInit();
       }
       $.ajax({
           type: 'post',
           url: '/jyapp/front/hasPushHistory?t=' + new Date().getTime(),
-          data: {"selectTime": time, "area": area},
+          data: {"selectTime": time, "area": area, "subscopeclass": subscopeclass, "buyerclass": buyerclass, "key": key, "subtype": subtype},
           async: false,
           dataType: 'json',
           success: function (data) {
@@ -1445,9 +1534,10 @@ function hasNoData() {
     //
     function FTAGData(time) {
         if (time != undefined && time.toString() != "") {
-            var Time = new Date(time);
-            var timestemp = Time.getTime();
-            firstTime = timestemp.toString();
+            // var Time = new Date(time);
+            // var timestemp = Time.getTime();
+            // firstTime = timestemp.toString();
+            firstTime = time;
             ajaxFun(firstTime, selectCity);
         } else {
             firstTime = "";

+ 113 - 4
src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html

@@ -45,6 +45,9 @@
     <link href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/iconfont/iconfont.css?v={{Msg "seo" "version"}}' rel="stylesheet"/>
     <link href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/css/weui.min.css?v={{Msg "seo" "version"}}' rel="stylesheet"/>
     <link href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/p13.css?v={{Msg "seo" "version"}}' rel="stylesheet"/>
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/index.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/icon/local.css />
     <!-- 账号合并弹窗css -->
     <link href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/merge-wx.css?v={{Msg "seo" "version"}}' rel="stylesheet"/>
 
@@ -99,8 +102,41 @@
         width: .88rem;
     }
 
-</style>
+    .p13 .resnumb .two-group {
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        width: 100%;
+    }
+
+    .flow-start-box {
+        padding-left: 0.36rem;
+        flex-shrink: 0;
+        height: 0.48rem;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+    }
+
+    .flow-start-box.fill .icon-flow-start {
+        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALxSURBVHgB7VhNbtNAFP7GSRwKAiIugLOCrpqyA4REbgAngJ6g6glQbwAnAE4APUErIWBHs0NiU3MCAqWlJc08vrEcNz+OZ+zxohL9JNujGc+bL9+b9+Y5wP8E+YRN+YjnuIiQD3hMcpJcbKMmBKgLCi+ydmOq7YlaCCaKqSnVhGrWpGI9CgZ4ttBXk4oKnpBdRAhxkDuo0VePsAcP+CsYFihVg4peChaqN4Gnin4Khg4KeapYWUEn9SbwULG6gmEJZTxULFRQPlOlEXr8GRGv2+yKmON6ck1FaHPqiUAdC0pgwBWHyVPjO20NaHeoHvJpI5i4rI3NCYnkmQdqLremhNc0csjbCL4w5GM+Y5zileonbTSz4RZemxPAZkXaapHwzeBcTY2q6KXCmO3T5f1Jaj6FwlsnM+GS/isK0gnqOZsU3kyamTnuA9O5YZlIpQu2bep+ueqVXjfUA7yfXnIGySEf4B2bnYWxkK/fcFx8TJf/LOFyYfAIns6no9zVWNOZvbA7T5LRC6yUUMcE0BFvp7CTU8yVOdGcu2PSF/u8hjMDTZSDcfl1i8sLyKUm8pFLslVxb5GgmK0RlCNXSHCBZAt+COei3IGclWBGMsA61YvhC+NyQ7LBJNzAuo1cOsUOdR+xXlE7qANcUbexY2y6vO687YNA1kQ8C3Bh6vnF6wxrrlOcCZJcDz4YkdhhlhedbTm5WA6SfNhBFRjVjhaSdke+JNVRPQTPTlBNPaPaDxL7k1OS/WbgOcDJxYEKyhE0qh0jn1hmdEk5NwfXPRjBFbN7bTmUW6A4udhEsPUlJXtjrft0aZ/kYtjh5BUnBYsjWAZjLVut1ZkqpJv+y2W+RaIlE5f1z8Ca2P5+Q68pwf7iiMRay3Zz9by4zEMh0RVE6h6/TQpgP+rG8+lFhoyBreCOdG3kkvkshHmZEt4Uw/HMoEMklyjQSUxjm98d3cZd/RIlkRGlDcDtmHPG6Cv/TtuvmKhzYD5n06L4Epe48PgHEbMB7isFmsoAAAAASUVORK5CYII=");
 
+    }
+    .icon-flow-start {
+        background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPJSURBVHgB7ZhdctowEMd3hcgzPUHICUJvADdon5svJpiZTB+SniDhBE2eMsVkgNA8d3ICcoPSE4ScoPStg22puzYC4zogwHnoNP+ZjCxbkn9e7a42APxParZ6p83m7RFkKISMdO32yhKhH3a0X3Gc6gNkIAEZieDOpx2U55CRMgFk61FTjt0qu267DBkoE8A84uGsp0dhk5EVNwa8vm4XNegjvkbEjtJ4NXmUiRU3Bszn81NLeWOvsSX9yyytuBFg0nonJ9VhtVod0b3uZMjGVtwIMGk9cx146nI6aEMrrg2YZj3zLLzWkIkV1wZ8znpGvu9fTDsbWHHhScJWEnlZAq2LUojtgFqaUkLgdrIAWa92vFdNm++6vQ69IZaCcMABJBAHvlJPCoKB0jD6WK8OYBkgw2xt5U/TIBbJ9/yd+PYmP1Dm5SNYCQfkMsMc4nA89q7MmtI8poXaSutyRKxTFuDUgUNEPQCNvxS3QTB4Do7Fz8iKFS10UStdRBS7tH4Rwo/HQmJ9MgqUiAFyMrdDN97NAdICXRRYnvsiVFdC48jz/IUgi+Q4+w9p99vtdsH3ZUkRmEBxyIDmGblAZ0oRn8SlEkG2Zw/xqFbb68ILqtX6ekhb2zF9MlS1Xj/ozBgScvngR/3NbMFLQs7DkQtpfJ+0eGoUN5vtEopc/yUhk3BaBZV6SjSn5kEeyBPMmcoLuTe9zGo89+bu3AaOtTAPJi1Joy+c4/0GbAhHjnZhAxe9comyhFwVLnqdhTjh5vK5PvliMZokirXahydYQfGkTYfA0POCik3qsjqLo4X0/aQ7WhUutkbo0wrw3javWhcLZLXdyeUA1hTtwDBqYdd2zgrVTJTpqTgYwpoKtPoxuSzZzrEC5GPJBEmgpi9ZQ2isX2i17rZtZkibQb/pzJSTcBJUIqWNCc9WJU85kLg+TPMxrlRMGRKAekvNUl+2AhTh9kaEUs77oAHzAzijboESMBezZUrsHX/sd+OgXHRQJEcdbVfOWW0xlVjFyeWI/ykyYHy6+AGlDg0XDGfGay6n6B6B9r+4t2fmfjySc8IuUOwAExHMPxKlgD1Qv8J/XHgaUCqdPtO5+zj7USnyQ63RKlCsErXbuv0ZBQlXvVBIVNtUwMKnZBXSvCEgDecmuUcvYx8MLchwI6e2/2bZuy2POvn974l6qBQ04rVb6vwU0Nkay0+kpUESoCzMD+K6TTRqzv4lWKh+HH5AJw3UJpKX+qCcA4OGzAU7jrNnBZcErdcOdngN46OZiavsKFlnIy4c2HXgVa/6B/QH9KsAvtIf+2MAAAAASUVORK5CYII=");
+        width: 0.4rem;
+        height: 0.4rem;
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+        background-position: center;
+        transition: all 0.2s;
+    }
+
+</style>
+<div id="jyKeepComponent">
+    <keep-component ref="vKeepComponent" @on-change-keep="changeKeepStatus" :bid="nowOpenBid" :first="false"></keep-component>
+</div>
 <div class="loading_Top" style="display: none;">
     <p><span></span></p>
 </div>
@@ -438,8 +474,77 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/vipsubscribe/js/weui.min.js?v={{Msg "seo" "version"}}'></script>
 <!-- 账号合并弹窗js -->
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/merge-wx.js?v={{Msg "seo" "version"}}'></script>
-<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/searchindex.js?v={{Msg "seo" "mod_version"}}1'></script>
-
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/js/searchindex.js?v={{Msg "seo" "mod_version"}}'></script>
+<!--S-当前页面的资源-->
+<script src=//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js></script>
+<script src=//cdn.jsdelivr.net/npm/vant@2.8.2/lib/vant.min.js></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js'></script>
+<script>
+    var vKeepComponent = new Vue({
+      delimiters: ['${', '}'],
+      el: '#jyKeepComponent',
+      data: {
+        nowOpenBid: ''
+      },
+      methods: {
+        changeBid (id, type) {
+          this.nowOpenBid = id
+          this.$refs.vKeepComponent.ajaxAddKeep(id, type)
+        },
+        changeKeepStatus (type) {
+            SuperSearch.changeKeepStatus(this.nowOpenBid, type)
+        }
+      }
+    })
+</script>
+<script>
+  new Vue({
+    el: '#v-ent-ent-search-group',
+    delimiters: ['@@', '@@'],
+    data: {
+      statusEnum: ['存续', '吊销', '停业', '撤销'],
+      list: [
+        {
+          name: '北京剑鱼信息技术有限公司北京剑鱼信息技术有限公司北京剑鱼信息技术有限公司北京剑鱼信息技术有限公司',
+          legal: '贾新',
+          money: '1000万元',
+          address: '北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号',
+          status: 0,
+          checked: false
+        },
+        {
+          name: '北京剑鱼信息技术有限公司',
+          legal: '贾新',
+          money: '1000万元',
+          address: '北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号',
+          status: 1,
+          checked: true
+        },
+        {
+          name: '北京剑鱼信息技术有限公司',
+          legal: '贾新',
+          money: '1000万元',
+          address: '北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号',
+          status: 2,
+          checked: false
+        },
+        {
+          name: '北京剑鱼信息技术有限公司',
+          legal: '贾新',
+          money: '1000万元',
+          address: '北京市朝阳区北四环中路华严北里健翔3号地峻峰华亭嘉园C座2011号',
+          status: 3,
+          checked: false
+        }
+      ]
+    },
+    methods: {
+      selectEnt (ent) {
+        console.log(ent)
+      }
+    }
+  })
+</script>
 <script type="text/javascript">
   var adv_url = "/datareport/page/introduce";
   var adv_img = "/jyapp/images/reportTip.png?v=51430"
@@ -780,7 +885,11 @@
             window.event.returnValue = false;
             //超级搜索
             if(SuperSearch.isMyPage){
-                if (!$(".tabs-box").hasClass('hidden') && $(".tabs-box .tabs-nav .active").index() !== 0) {
+              var isNowIndex = $(".tabs-box .tabs-nav .active").index()
+                if (!$(".tabs-box").hasClass('hidden') && isNowIndex !== 0) {
+                    if (isNowIndex === 1) {
+
+                    }
                     return
                 }
                 var max=$("#supersearchPage .maxMrice").val(),min=$("#supersearchPage .minMrice").val();

+ 197 - 0
src/jfw/modules/app/src/web/templates/weixin/search/tabSearch.html

@@ -489,6 +489,203 @@
                 <ul class="history-list-box"></ul>
             </div>
             <div class="tabs-content-page">
+                <!---->
+                <style>
+                    #v-ent-ent-search-group {
+                        display: block !important;
+                        background-color: rgba(0, 0, 0, 0.05);
+                    }
+                    #v-ent-ent-search-group .ent-search-item {
+                        margin-top: 8px;
+                        display: flex;
+                        flex-direction: column;
+                        padding: 0.32rem;
+                        background-color: #fff;
+                    }
+                    #v-ent-ent-search-group .ent-search-list {
+                        display: flex;
+                        flex-direction: column;
+                    }
+                    .ent-info-head {
+                        flex-shrink: 0;
+                        position: relative;
+                        width: 1.68rem;
+                        height: 1.68rem;
+                        background: rgba(0, 0, 0, 0.05);
+                        border: 0.5px solid rgba(0, 0, 0, 0.05);
+                        box-sizing: border-box;
+                        border-radius: 0.08rem;
+                    }
+                    .ent-info-head .ent-info-status.status-1 {
+                        background: #FB483D;
+                    }
+                    .ent-info-head .ent-info-status.status-2 {
+                        background: #FF9F40;
+                    }
+                    .ent-info-head .ent-info-status.status-3 {
+                        background: #9B9CA3;
+                    }
+                    .ent-info-head .ent-info-status {
+                        position: absolute;
+                        top: 0.08rem;
+                        left: 0.08rem;
+                        background: #2ABED1;
+                        border-radius: 0.08rem;
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: 500;
+                        font-size: 0.24rem;
+                        line-height: 0.36rem;
+                        color: #FFFFFF;
+                        padding: 0 0.08rem;
+                        display: inline-block;
+                    }
+                    .ent-info-top {
+                        display: flex;
+                        flex-direction: row;
+                        align-items: center;
+                        justify-content: space-between;
+                    }
+                    .ent-row {
+                        display: flex;
+                        flex-direction: row;
+                        align-items: center;
+                        justify-content: space-between;
+                    }
+                    .ent-search-list .j-icon {
+                        flex-shrink: 0;
+                        width: 0.4rem;
+                        height: 0.4rem;
+                    }
+                    .ent-info-keep .ent-name {
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: 500;
+                        font-size: 0.32rem;
+                        line-height: 0.48rem;
+                        color: #171826;
+                        max-width: 4.3rem;
+                    }
+                    .ent-info-keep .fill-icon-box {
+                        padding: 0.12rem;
+                        padding-right: 0;
+                    }
+                    .ent-info-keep {
+                        margin-left: 0.24rem;
+                        flex: 1;
+                    }
+                    .ent-more span {
+                        color: #2ABED1;
+                        margin-top: 0.08rem;
+                    }
+                    .ent-more {
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: 500;
+                        font-size: 0.26rem;
+                        line-height: 0.36rem;
+                        color: #5F5E64;
+                        margin-top: 0.2rem;
+                    }
+                    .ent-info-bottom {
+                        display: flex;
+                        flex-direction: row;
+                        justify-content: flex-end;
+                        margin-top: 0.24rem;
+                    }
+                    .ent-line-box {
+                        margin-top: 0.24rem;
+                        width: 4.22rem;
+                        height: 0.02rem;
+                        background: rgba(0, 0, 0, 0.05);
+                        border-radius: 0.08rem;
+                    }
+                    .ent-address > div{
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: normal;
+                        font-size: 0.22rem;
+                        line-height: 0.32rem;
+                        color: #5F5E64;
+                        max-width: 4.22rem;
+                        margin-right: 0.32rem;
+                    }
+                    .up-button {
+                        margin: 0 auto;
+                        display: flex;
+                        flex-direction: column;
+                        align-items: center;
+                        justify-content: center;
+                        width: 4.98rem;
+                        height: 0.64rem;
+                        border: 1px solid #2ABED1;
+                        box-sizing: border-box;
+                        border-radius: 0.08rem;
+
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: 500;
+                        font-size: 0.26rem;
+                        line-height: 0.48rem;
+                        color: #2ABED1;
+
+                    }
+                    .ent-more-tip .j-icon {
+                        margin-right: 0.08rem;
+                    }
+                    .ent-more-tip {
+                        display: flex;
+                        flex-direction: row;
+                        align-items: center;
+                        justify-content: center;
+                        font-family: PingFang SC;
+                        font-style: normal;
+                        font-weight: 500;
+                        font-size: 0.28rem;
+                        line-height: 0.4rem;
+                        color: #9B9CA3;
+                    }
+
+
+                </style>
+                <div id="v-ent-ent-search-group" v-cloak>
+                    <div class="ent-search-list">
+                        <div class="ent-search-item" v-for="(item, i) in list" :key="i" @click="selectEnt(item)">
+                            <div class="ent-info-top">
+                                <div class="ent-info-head">
+                                    <span class="ent-info-status" :class="'status-' + item.status">@@statusEnum[item.status]@@</span>
+                                </div>
+                                <div class="ent-info-keep">
+                                    <div class="ent-row">
+                                        <div class="ent-name van-ellipsis">@@item.name@@</div>
+                                        <div class="fill-icon-box">
+                                            <i class="j-icon base-icon icon-no-favorite"></i>
+                                        </div>
+                                    </div>
+                                    <div class="ent-more">
+                                        <div>法定代表人: <span>@@item.legal@@</span></div>
+                                        <div>注册资本: <span>@@item.money@@</span></div>
+                                    </div>
+                                    <div class="ent-line-box"></div>
+                                </div>
+                            </div>
+                            <div class="ent-info-bottom">
+                                <div  class="ent-row ent-address">
+                                    <div class="van-multi-ellipsis--l2">@@item.address@@</div>
+                                    <i class="j-icon base-icon icon-address"></i>
+                                </div>
+
+                            </div>
+                        </div>
+
+                        <div class="up-button">升级会员,查看更多搜索结果</div>
+                        <div class="ent-more-tip">
+                            <i class="j-icon base-icon icon-up-allow"></i>
+                            <span>上拉查看更多搜索结果</span>
+                        </div>
+                    </div>
+                </div>
+                <!---->
                 <ul class="ent-search-list-box"  id="search-ent-list"></ul>
                 <div class="del_ent_history">
                     <div class="history-title-box">

+ 1 - 0
src/jfw/modules/bigmember/src/service/use/use.go

@@ -535,6 +535,7 @@ func (u *Use) IsAdd() {
 		for k, _ := range bigPower.PowerMap {
 			power = append(power, k)
 		}
+		d["vipStatus"] = bigPower.VipStatus
 		d["power"] = power
 		d["isUsed"] = bigPower.Used
 		d["memberStatus"] = bigPower.Status

+ 10 - 7
src/jfw/modules/publicapply/src/bidcollection/entity/entity.go

@@ -196,9 +196,9 @@ func LabelAction(labInfo *LabelInfo, userid string) map[string]interface{} {
 			if db.Mysql.UpdateOrDeleteBySql(`update bdcollection set labelid = 
 				(select new.lab from 
 					(SELECT TRIM(BOTH ',' FROM REPLACE(CONCAT(',',labelid,','),CONCAT(',',?,','),',')) lab
-					 FROM bdcollection WHERE bid = ? ) new
+					 FROM bdcollection WHERE bid = ? and userid =? ) new
 				)
-				WHERE bid = ?`, v, k, k) > -1 {
+				WHERE bid = ? and userid =?`, v, k, userid, k, userid) > -1 {
 				index++
 			}
 		}
@@ -339,12 +339,12 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 		} else if c.SelectTime == "thisyear" { //去年
 			start = fmt.Sprint(time.Date(now.Year()-1, 1, 1, 0, 0, 0, 0, time.Local).Format(qu.Date_Full_Layout))
 			end = fmt.Sprint(time.Date(now.Year()-1, 12, 31, 23, 59, 59, 0, time.Local).Format(qu.Date_Full_Layout))
-		} else {
-			if c.SelectTime != "" {
-				starttime := strings.Split(c.SelectTime, "-")[0]
+		} else if len(strings.Split(c.SelectTime, "_")) == 2 {
+			if c.SelectTime != "0_0" {
+				starttime := strings.Split(c.SelectTime, "_")[0]
 				startstamp, _ := strconv.Atoi(starttime)
 				start = time.Unix(int64(startstamp), 0).Format(qu.Date_Full_Layout)
-				endtime := strings.Split(c.SelectTime, "-")[1]
+				endtime := strings.Split(c.SelectTime, "_")[1]
 				et, _ := strconv.ParseInt(endtime, 0, 64)
 				etTime := time.Unix(et, 0)
 				end = fmt.Sprint(time.Date(etTime.Year(), etTime.Month(), etTime.Day()+1, 0, 0, 0, 0, time.Local).Format(qu.Date_Full_Layout))
@@ -378,6 +378,7 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 			i := 0
 			sql += ` and `
 			if labelArr := strings.Split(c.Label, ","); len(labelArr) > 0 {
+				sql += `(`
 				for _, v := range labelArr {
 					i++
 					labid := qu.SE.DecodeString(v)
@@ -387,6 +388,7 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 						sql += fmt.Sprintf(`FIND_IN_SET(%s,labelid) or `, labid)
 					}
 				}
+				sql += `)`
 			}
 		}
 		//是否存在采购单位电话
@@ -408,6 +410,7 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 	sql += fmt.Sprintf(` order by createdate desc limit %v`, limit)
 	log.Println(sql)
 	data := db.Mysql.SelectBySql(sql)
+	count := 0
 	result := []map[string]interface{}{}
 	if data != nil && len(*data) > 0 {
 		if c.Pagenum <= 0 {
@@ -421,8 +424,8 @@ func GetCollList(c *CollList, userid string) map[string]interface{} {
 		if start < len(*data) {
 			result = (*data)[start:end]
 		}
+		count = len(*data)
 	}
-	count := len(*data)
 	haveNextPage := len(result) >= pagesize_max
 	// rdata["res"] = result
 	rdata["count"] = count

+ 2 - 1
src/jfw/modules/publicapply/src/bidcollection/service/action.go

@@ -11,5 +11,6 @@ type ServiceStruct struct {
 	getLabelAction xweb.Mapper `xweb:"/bidcoll/getLabel"` //获取标签
 	isCollAction   xweb.Mapper `xweb:"/bidcoll/isColl"`   //招标信息是否被收藏
 	list           xweb.Mapper `xweb:"/bidcoll/list"`     //获取收藏列表
-	addLabel       xweb.Mapper `xweb:"/bidcoll/addLabel"`
+	addLabel       xweb.Mapper `xweb:"/bidcoll/addLabel"` //添加标签
+	power          xweb.Mapper `xweb:"/bidcoll/power"`    // 是否有权限(超级订阅、商机管理、大会员)
 }

+ 17 - 1
src/jfw/modules/publicapply/src/bidcollection/service/service.go

@@ -97,7 +97,9 @@ func (this *ServiceStruct) List() {
 			return Result{Data: nil, Error_msg: Error_msg_1003}
 		}
 		//接收参数
-		json.Unmarshal(this.Body(), &collList)
+		if err := json.Unmarshal(this.Body(), &collList); err != nil {
+			return Result{Data: nil, Error_msg: Error_msg_1003}
+		}
 		//
 		return Result{Data: entity.GetCollList(collList, userId)}
 	}()
@@ -120,3 +122,17 @@ func (this *ServiceStruct) AddLabel() {
 	}()
 	this.ServeJson(r)
 }
+
+//是否有权限(超级订阅、商机管理、大会员)
+func (this *ServiceStruct) Power() {
+	defer qu.Catch()
+	userId, _ := this.GetSession("userId").(string)
+	r := func() Result {
+		ispay, msg := false, ""
+		if userId != "" {
+			ispay = entity.Power(userId)
+		}
+		return Result{Data: ispay, Error_msg: msg}
+	}()
+	this.ServeJson(r)
+}

+ 24 - 7
src/jfw/modules/publicapply/src/dataexport/service/action.go

@@ -5,11 +5,11 @@ import (
 	"db"
 	"fmt"
 	"github.com/go-xweb/xweb"
-	"jfw/public"
 	"log"
 	"qfw/util"
 	"qfw/util/dataexport"
 	"strings"
+	"time"
 )
 
 type DataExportStruct struct {
@@ -20,13 +20,30 @@ type DataExportStruct struct {
 func (des *DataExportStruct) ByCollection() {
 	userId, _ := des.GetSession("userId").(string)
 	rData, errMsg := func() (interface{}, error) {
-		reqData := public.BidSearchExport{
-			SelectIds: strings.TrimSpace(des.GetString("selectIds")), //选择信息id
+		defer util.Catch()
+		selectIds := strings.TrimSpace(des.GetString("selectIds"))
+		if selectIds == "" {
+			return nil, fmt.Errorf("参数异常")
+		}
+		ids := []string{}
+		for _, encodeId := range strings.Split(selectIds, ",") {
+			if tmp := util.CommonDecodeArticle("content", encodeId); len(tmp) > 0 {
+				if id := tmp[0]; id != "" {
+					ids = append(ids, id)
+				}
+			}
+		}
+
+		if len(ids) == 0 {
+			return nil, fmt.Errorf("参数异常")
+		}
+
+		saveData := map[string]interface{}{
+			"s_userid":   userId,
+			"comeinfrom": "collectionPage",
+			"comeintime": time.Now().Unix(),
+			"selectIds":  ids,
 		}
-		saveData := reqData.PassBidSearchExport()
-		saveData["s_openid"] = util.ObjToString(des.GetSession("s_m_openid"))
-		saveData["s_userid"] = userId
-		saveData["comeinfrom"] = "collectionPage"
 
 		_id := db.Mgo.Save(dataexport.ExportTable, saveData)
 		if _id == "" {

+ 1 - 1
src/jfw/modules/subscribepay/src/service/vipSubscribeChange.go

@@ -264,7 +264,7 @@ func (this *SubscribeChange) Upgrade() {
 		}
 		//老用户升级 一个省 全行业 时间不变 会出现零元升级得情况 0元升级直接到支付成功页面 开通超级订阅
 		if req_price == 0 && 0 == final_price && oldBuyset.Upgrade == 0 {
-			if !entity.JyVipSubStruct.StartSubVip(userId, filter, time.Unix(startUnix, 0), time.Unix(endUnix, 0), false) { //设置开始试用
+			if !entity.JyVipSubStruct.StartSubVip(userId, filter, time.Unix(startUnix, 0), time.Unix(endUnix, 0), false) {
 				return &entity.FuncResult{false, errors.New("老用户升级超级订阅高版本异常"), nil}
 			}
 			return &entity.FuncResult{true, nil, map[string]interface{}{"code": ordercode, "needPay": false}}

+ 1 - 4
src/jfw/public/dataexport.go

@@ -75,9 +75,6 @@ var finaceLock *sync.Mutex = &sync.Mutex{}
 func GetWaitPayToken(orderid int64, order_money int, ordercode, payway, userid string) string {
 	return util.GetMd5String(fmt.Sprintf("%d_%d_%s_%s_%s", orderid, order_money, ordercode, payway, userid))
 }
-func GetOrderCode(id string) string {
-	return fmt.Sprintf("%s%s", time.Now().Format("150405"), util.GetRandom(6))
-}
 
 /*
 	获取-筛选条件-金额
@@ -113,6 +110,7 @@ type BidSearchExport struct {
 }
 
 func (this *BidSearchExport) PassBidSearchExport() (returnData map[string]interface{}) {
+	defer util.Catch()
 	areaSave, industrySave := []string{}, []string{}
 	winnerSave, buyerclassSave := []string{}, []string{}
 	publishtimeSave := ""
@@ -168,7 +166,6 @@ func (this *BidSearchExport) PassBidSearchExport() (returnData map[string]interf
 		"hasBuyertel":  this.Hasbuyertel,
 		"hasWinnertel": this.Haswinnertel,
 		"comeintime":   now.Unix(),
-		"comeinfrom":   "supersearchPage",
 	}
 	//选择信息id
 	if this.SelectIds != "" {

+ 284 - 0
src/web/staticres/collection/css/index-pc.css

@@ -0,0 +1,284 @@
+.j-icon {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+}
+.icon-list {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAApElEQVRIie2UwQkDIRBFn7JNbEkWYAWmrTSg96Si3aQLc3AFI0H3EE0O82AufuEPKE957w1wJeGAu7UWgBACQM5XxvIAnC7K1mKxkhnLkPt1dagmFLdQGrgAT2AjPVlNzkezAW4BbrSfpJd/FRVjnNV1ivoP/RxZqMdyyO+NSoxT0SQT78eYD3dyHgfPDhgxdQcxdRcxdQ9ZqIeYujFi6jP8n6lfC3duA8uNLvEAAAAASUVORK5CYII=);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-list-active {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAYAAACSuF9OAAAAmklEQVRIie3UsQ2DMBCF4d+IJcIMULJDModZizmcGaBkBscZgwIswBE4KQwp7qtsn6U76aSnStM9gJaJBgxbvn4jLQdoVZrutWrmgCL4uK6n5rLgQZ3UeI/KgAZ4A5ZpZSFfT80yr+yEXvuGe725hyu7nAwUIwPF5CxJDBckdfXs/VGS+huS1B8kqX8lA8X83UCS1BGS1EcsoEd3djhI1jC4DwAAAABJRU5ErkJggg==);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-table {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAA3ElEQVRIie3XQUrDQBiG4SdDeghdeABX9QZScCH0EuqhulPX/wVcCD2DXqELewcttAsbO2jNys4UzAuBBD743vlDhkwTEad4xCVGyrDCM+5a3OOqUHFHi2s8JEwKl+dMkt3YVxijOfB1se2CUcps3vD694v8wQuW3UPqCR6SdW2BLwaBNrs/k72bUlSfwFEJLPy+eUyz3KwnN8ty057cYp9AFQaB6gJNRBT/9nOqT+CoBIZ94F8JNPsETnBeoHy87fo0iYh35Q4k3/lImFcqh3nCDZ7s/tVL0B3NbjcYbCQMu974QgAAAABJRU5ErkJggg==);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-table-active {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAcCAYAAAAAwr0iAAAA30lEQVRIie3XQUrDQBiG4SdDeghdeICSRb2BFFwUegnbQ3VXvUUWQg+QlV6hC71DLejCph1qzcrOFMwLgQQ++N75Q4ZMUdXNNZ5wh4E0bPGMeYkl7hMVt5SY4DFgnLg8Zhwcxr7FCMWZr9tdFwxCZPOG179f5A9e8N4+hI7gOfnMLbCnFyij+xvRu0lF9glclMDa75vHNMotOnKLKDftyK1PCWShF8guUFR1k/zbj8k+gYsS6PeBfyVQnBK4wjBB+WjX9W1S1c1GugPJMR8Bq0zlsAp4QO3wr56C9mg2+wJlxSMZcnbbKAAAAABJRU5ErkJggg==);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-data-export {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAFfElEQVRoQ+2ZbYhUVRjHn/+dXWfKD72gvdArW2CW6QdLRIpAKiTb3kwNsbSMKHqVtb3nzJpeiOacGVeG3N7YMisR1jYsCjVoIwtLSKUQoQwphYw+1H6IXXfG3blPnOHOcr3tzN5178w60Pl4z3Oe5/87zznnPudeUJ031Ll++h8gqgwKIVYCWMTMr2qte8L6PSsykEwmL3Vd9wQAMDMT0cNa621hIP4D4DiONTAwsNyyrGZmvgXAJWEclbNh5gEAbyqlWsrZ2LZ9nmVZx4jofGNjIAAsUUp9NFrs0wCklNcx8w4A00cbONb+U6dOTd24ceNfFSDMZPUAiHsQBQAPjQYxDOA4TiKfzx8kouvHKi6E/QGl1M2j2Qkh5gPYTUSTwkIMAySTyaeZ+bVSEGbusSxrs+u6f44WuFK/67onM5nM92F9CCEWAPiMiBrCQAwDCCE2A3jMG7Rfaz0nbNCo7aSU93hLOeaDeEAp9Wkwlh9gH4C53oB1WuuXoxY2Fn9SygeZuQtAEYKIhohoURDCD3AIwI2e8YtKqfaxBKyGrQfxoTley0GcdQCLFy+ONTU1zQBwgRENYCURrfBN0BAzN2utPy/2lzqEEBOSASHEbMuy5jLzbGaeSUQzATRWyigzDwKYoZT6ZUIAbNu+EsBzRLQUwOVnsvxc1707nU7vrCmAEOJaAOuYeZlvc45ZPzPv6e3tvbOzs3OwJgBeqZBm5sdHEs7MeSIyL9FviegYM59oaGg4MTQ0lAfQDWCa7/20p7+/f0FHR4cZU/090NraOicWi5ma5orgVDPzN0S0JZ/Pb89mswP+/paWlimNjY17ANzge/5FX19fc0l81QFs257n1Tfn+MUx83uu6+pMJnNkpPXjid8bmPmdvb2995tl4x9TtSXkzfxXRHSuL/2/MvOKdDq9t9zCLyc+kUjc5ziOeZmd1qoCsHbt2msKhcKBUnnsRdwaj8efdBznZDnxyWTyYtd1vw7M/MeJRGLJSOKrtYQghPgBwCzfzL+jtX7ClPqjiP8OQJPPpuvo0aPLu7u7C+XGRZ4BIcQzADp84ru11ksriXccZ1Iul/sxcA/pUkotqzQu8gx4QszVcIoHcDyXy00PnjDB2Wxra7vKdV1zIys2Zv5Aa21KiLIZK9lGmgEhhDnn3/YJXKiU2lUu/f7nUsp3iciU0W9prV8KIz7yDEgp9xPRTZ6ww0qpUnUbhuGMbCLLQGtr67RYLPazbxms0lqbWR13W7169YWJRAJKqb+DziIDsG37WcuyNnkBcoODg1Pa29v7x6vetu17LcvqMh8qmHmRKeD8PiMDkFJuJ6IlnvNdSqmF4xVvxgsh3gfwiOdri1KqeO2NfBMLIX4DcLV3irRqrTdEBLAVwHLP11alVAmm+CiSDKxZs2ZyY2Nj3/CsALenUqkv6wbA3KoAmNKh2AqFwmWZTOaPugHwNton3vLJa60TUYj39kD1l5CU8ikiesMTfVwpVdwLUTQhRE0AkkT0ipeBg1rr0sts3Aw1ARBCOADWewB7tda3jlu556AmAFJKZY5sD6BHa31HXQEEirhNSqnn6wrA/BTJ5XKvmzI6Ho+vchznn7oCiErsSH5C74FAKdymlEpVU1hY3/4ay3zN0Fo/6h/rLyWGiyZm3q21vitskGrZeTe8I6Uai4i0UkqOCCClfIGIsr7OTYVCYUMmk/m9WgIr+U0mkzNc100BaC7ZAZifSqXMp5rhNpwBc2mIx+M/AbhoIgSHiLlPKTUvaHfaX0rbtpsty9pR+j8VwmmtTA7ncrnbstlsb0UA02nb9iwA2wLfJGslNBjHfATrjMfj68sdzWX/1EsppzKzKcomT5T6fD5/aKRZH3EPTJTI8cb9FyJEG14SVWmfAAAAAElFTkSuQmCC);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+/* /images/collected.png */
+.icon-star {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANtSURBVHgB7VhbTuMwFL0tBfHUdAeEFdAldHZQPniJD9oVwKygdAewgqQfCPGQyqyAzgomrICwg/wgIfE8J9hgoqR1cPrXI1ncXMf26bm27w0iU0xhj4uLiwM2KREVKQlnZ2fezMzMHe2Xl5ffu7u7QykBVSkJs7OzXW3XarWulIRSFDTV04CKa1AxEkeUoqChXoQWp3xOcCZI9V5fX9vqcfj29nZCA76W7/t1cYQzQVMphLU3Nzd3LB8q1hcXFw/FEU4ElXot9Rhwz21sbJBcn45KpXLgqqITQZzWffxJCFA97Yd9rExnFZ0IYr+1lRmYJ1bZ17RdVaxJQXCx+fn5OtQ7AEGPPlM9DfhOcPUw/PXl5eXu6elpf29vL5SCyL0Hub+q1WqDJLDQqiLTQPPM97AH/+7s7LSy5ri8vLzBuGbKHUJV7tMQP+Ie/eHj42PY6XTirDm+KXh+ft7C4K4ikYQFzwyl5AF9x3l9z8/PPfy4ZsrdUPM1IUDiWFpaYh6PsVbIMWaaTIeYSjQy1uLgSE1wSxvKheMyhVqogsUbOgIYu45WxzPXMfcmfU303cIeaue3EKuUdSNfYbx+eHjo5MnvCu7nlZUV37iqIlVoRPqdb6eYHXxBPlIW0VpYWGjLhIDQ7o8iR2QekrSSvE62t7f7UiKurq5ILhhFLpfgpEnakhtJcFIki5AbS7BskkXJWREsi6S6YwdFyBFWudg43RprUhA6LQKxLTnCulhA/v28C7FA8ZyKy12ZdaQ263vVmiAm/cwwUCOSgmDm0TaKWs92nDVBKPBJ8CdViQqp/l5p2I6zJojE7ikzlxxTFw+U5CMhCDXLJ8gkrya/lwxiKK26SF13PO20s+bA1vinTE/KJqhPISsa049KpQ1i/9F/JB/ViUcb/jv2paaJkkWr1XWxhBXBwWCQLExbn2CEssmCFKav+0B+yKaG0eeTKN9V/ZHus/0MsCJonmCE8BeJMZRGtZzck5ubm0mD3ZGviii55JFFfPi1z/okW2WSVBYwEWNP9lDyZ1bVUK4NcrpCT6OztbUVyBhYKQhyzZQrhno9FLNreeQIXC0BleW76T7bk2z1VYdNvYoJ9WMAYn9sq2x1/x1BzQDzHOHH7qsuz2a8FUGGEZPHT09P/Z/+308RbYMoSR5ivkCmmELkHXyZDJTCB+QVAAAAAElFTkSuQmCC);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-star-active {
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALRSURBVHgB7ZdPbtNAFMa/GTcuf6QmIFZs6myQumojsUEIqblBb4B6gnKDhBPQGxBOQjcFNojskLppOEGjFqo2KfN4MyTBST32i8dsqnxSEscev/n5mxm/N8BKK8lFn3BAX3CACqVQkegjEsQ4dX8M2uoVjlCBNKpSjM7sOEodB6oSB+fcm2qEpmpjgEBV42Cc4VhcjYvBDma691fDiYtDBCjcQb9TDb72BoEKcnDi3jcHk61gF8McjPEafjigAhfDHDx2cy8paBbk4tIO8rA26DMS+op3AjirBtbR4YfZQQl5HbQQGHNQzb8amw6GXCcJany9rm3GgLrgrzGWUZ97Hbpfgx8cs48b9H0OzwFyLt3jGzr8SfiKd25RnW+rpW69IqhLcsClRQyoGfY33qbT5PwQGwYEu5QD5x6ptmD8PQVq6LAlZ/sk7HKMvfTp+ZARuvw9yItDNc+s4Ej0WIMeBK27Acc5XAj7T+qFa9BGHuQ68sWAtKHKuOn6dgw+QBFkJHAoXnrIM+EyAXMhLdsaZJoO+f3CB/LCTcJkKxNSCpfWQ5U3L3PhcgGRAeldIEWy87J+a14WwhUC3oIs4+BUtbl5KYJz/UMol9429GkQpJXNPkPTlMBZydfZFb/pQ+FYirOOiyWUGPDmSblkPxNxOjxn+2xKjEVFhpMYUBtdHnDMcGdkN1JTiWPJBy2SP3Vabkh/0uLp6gF1RNu0TH1ruPUF+UqxBEItMe1VIm5pXftFtoTyaRvSWJJGrop+qs+Ko9GROmeqay6bijTCI8k2QLRIilcwDYwx+/oZtdVz91LfR0HZJl3JIkAVR54CloZkuAK+pNbaFnqz9i/R40+zAFS0UGSAY9pFNlgz2jJd1fLsJxjUpUlui/8JqNdoc9Yp0Ls21MoDm4PklMZ7jC731ORF8yF1KUFVGp1gh070+/F3weQvkMvpxzgsuw1d6c7pD2qO79xI3BNVAAAAAElFTkSuQmCC);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+.icon-box {
+    display: flex;
+    align-items: center;
+    color: #252627;
+    font-size: 14px;
+}
+.icon-box .icon-text {
+    margin-left: 6px;
+}
+.icon-box.active {
+    color: #2abed1;
+}
+
+.tab-title {
+    margin: 40px 0 44px;
+    font-size: 24px;
+    line-height: 36px;
+}
+
+.flex {
+    display: flex;
+    align-items: center;
+}
+[class*=el-icon-] {
+    transition: transform .2s ease;
+}
+[class*=no-select] {
+    user-select: none;
+}
+.rotate180 {
+    transform: rotate(180deg);
+}
+
+/* selector样式定制 */
+.tag-list-container .j-button-item:not(.all) {
+    border: 1px solid #ECECEC;
+    background-color: #F5F6F7;
+}
+
+.selector-card:not(:last-of-type) {
+    border-bottom: 1px dashed #ECECEC;
+}
+
+.other-filter .el-select {
+    margin: 0 12px;
+}
+.other-filter .el-select input::placeholder {
+    color: inherit;
+}
+
+.manage-tags {
+    display: inline-block;
+    position: relative;
+    right: 0;
+    top: 3px;
+    font-size: 14px;
+    height: 22px;
+    line-height: 22px;
+    color: #2CB7CA;
+    cursor: pointer;
+}
+
+.collect-list-container {
+    margin-top: 28px;
+}
+.collect-list-container .el-checkbox {
+    margin: 16px;
+}
+.collect-list-header {
+    border: 1px solid #ECECEC;
+}
+.collect-list-content,
+.collect-list-content .list {
+    min-height: 400px;
+}
+.c-tab-container {
+    height: 49px;
+    width: 100%;
+    justify-content: space-between;
+}
+.c-tab-container .list-title {
+    position: relative;
+    height: 100%;
+    line-height: 49px;
+    text-align: center;
+    color: #2abed1;
+}
+.c-tab-container .list-title::after {
+    content: '';
+    position: absolute;
+    left: 0;
+    bottom: -1px;
+    width: 100%;
+    height: 2px;
+    background-color: #2abed1;
+}
+.c-tab-container .icon-box {
+    cursor: pointer;
+}
+.c-tab-container .j-icon {
+    width: 16px;
+    height: 16px;
+}
+.c-tab-container .icon-box {
+    padding: 0 10px;
+}
+.c-tab-container .right-line {
+    position: relative;
+}
+.c-tab-container .right-line::after {
+    content: '';
+    position: absolute;
+    margin-top: -8px;
+    width: 1px;
+    height: 16px;
+    right: 0;
+    top: 50%;
+    background-color: #ECECEC;
+}
+.list-item {
+    border-bottom: 1px solid #ECECEC;
+}
+.list-index {
+    margin-right: 2px;
+}
+.append-container .j-icon {
+    margin: 0 16px 0 8px;
+    cursor: pointer;
+}
+
+/* table */
+.collect-table-list table {
+    width: 1199px;
+    border-collapse:collapse;
+}
+.collect-table-list .thead tr {
+    font-size: 14px;
+    color: #888;
+    background-color: #f3fbff;
+    cursor: pointer;
+}
+.collect-table-list table tr td {
+    vertical-align: middle;
+    text-align: center;
+    line-height: 26px;
+    border: 1px solid #e0e0e0;
+}
+.collect-table-list table tr td.tt-l {
+    text-align: left;
+}
+.collect-table-list table tr td.tt-c {
+    text-align: center;
+}
+.collect-table-list table tr td.tt-r {
+    text-align: right;
+}
+.collect-table-list .thead td {
+    padding: 6px 0;
+    border-top: 3px solid #2cb7ca;
+}
+.collect-table-list .tbody tr {
+    cursor: pointer;
+}
+.collect-table-list .thead .deep {
+    border-top: 3px solid #2C90CB;
+}
+
+.tag-drawer .el-drawer__header {
+    font-size: 20px;
+    line-height: 32px;
+}
+.tag-drawer .tag-title {
+    flex: unset;
+    color: #1D1D1D;
+}
+.tag-drawer .tag-count {
+    margin-left: 8px;
+    color: #2CB7CA;
+}
+
+.tag-drawer .el-drawer__body {
+    overflow-y: scroll;
+}
+.tag-drawer .tag-container {
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+}
+.tag-drawer .tag-main {
+    padding: 0 20px;
+    flex: 1;
+    overflow-y: scroll;
+}
+.tag-drawer .tag-footer {
+    padding: 0 20px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 100px;
+    box-shadow: 0px -8px 8px 0px rgba(0,0,0,0.05);
+}
+.tag-drawer .el-tag {
+    margin: 6px;
+}
+
+.j-t-button {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 7px 50px;
+    font-size: 16px;
+    color: #686868;
+    border: 1px solid #e0e0e0;
+    border-radius: 7px;
+    background-color: #fff;
+}
+.j-t-button.confirm {
+    color: #2cb7ca;
+    border-color: #2cb7ca;
+}
+.j-t-button.confirm:hover {
+    color: #fff;
+    background-color: #2cb7ca;
+}
+.j-t-button.cancel {
+    margin-left: 40px;
+}
+.j-el-confirm .el-dialog__header,
+.j-el-confirm .el-dialog__body,
+.j-el-confirm .el-dialog__footer {
+    text-align: center;
+}
+.j-el-confirm .el-dialog__header {
+    padding-top: 30px;
+}
+.j-el-confirm .el-dialog__footer {
+    padding-bottom: 40px;
+}
+.dialog-footer {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}

+ 366 - 0
src/web/staticres/collection/js/index-pc.js

@@ -0,0 +1,366 @@
+var vm = new Vue({
+    el: '.search-content',
+    delimiters: ['${', '}'],
+    components: {
+        selectListComponent: selectListComponent,
+        dateTimeComponent: dateTimeComponent,
+        selectLevel2Component: selectLevel2Component,
+        articleItemComponent: articleItemComponent,
+        noData: noDataComponent
+    },
+    data: function () {
+        return {
+            power: false,
+            toast: {
+                show: false,
+                content: '暂无数据'
+            },
+            buyclassMap: buyclassArr,
+            tagList: [],
+            tagSelectList: [],
+            buyerPhoneOptions: [
+                {
+                    label: '有联系方式',
+                    value: 1
+                },
+                {
+                    label: '无联系方式',
+                    value: -1
+                }
+            ],
+            filterState: {
+                tags: [],
+                timeStart: 0,
+                timeEnd: 0,
+                buyerclass: [],
+                buyerPhone: '', // 采购单位联系方式
+                bidPhone: '', // 中标企业联系方式
+            },
+            listState: {
+                listType: 'line', // line/table
+                loaded: true, // 是否已经搜索过
+                loading: false,
+                pageNum: 1, // 当前页
+                pageSize: 10, // 每页多少条数据
+                total: 0, // 一共多少条数据
+                list: [] // 查询请求返回的数据
+            },
+            currentPageAllChecked: false,
+            tagDrawer: {
+                dialogShow: false,
+                toastShow: false,
+                show: false,
+                currentDelTagInfo: {}, // 当前要删除标签的信息
+            }
+        }
+    },
+    created: function () {
+        this.getPower(function () {
+            this.getTagList()
+            this.getList()
+        }.bind(this))
+    },
+    mounted: function () {},
+    methods: {
+        showToast: function (content, timer, callback) {
+            content = content || '暂无数据'
+            timer = timer || 2000
+            this.toast.content = content
+            this.toast.show = true
+            setTimeout(function () {
+                this.toast.show = false
+                callback && callback()
+            }.bind(this), timer)
+        },
+        getPower: function (callback) {
+            $.ajax({
+                url: '/publicapply/bidcoll/power',
+                type: 'POST',
+                success: function (res) {
+                    if (res.error_code === 0 && res.data) {
+                        this.power = res.data
+                    }
+                }.bind(this),
+                complete: function () {
+                    callback && callback()
+                }.bind(this)
+            })
+        },
+        getTagList: function () {
+            $.ajax({
+                url: '/publicapply/bidcoll/getLabel',
+                type: 'POST',
+                success: function (res) {
+                    if (res.error_code === 0 && res.data) {
+                        this.tagList = res.data
+                        this.initSelectTagList()
+                    }
+                }.bind(this)
+            })
+        },
+        getList: function () {
+            var _this = this
+            var data = {
+                pagenum: this.listState.pageNum,
+                label: this.filterState.tags.join(','),
+                colltime_start: this.filterState.timeStart / 1000,
+                colltime_end: this.filterState.timeEnd / 1000,
+                buyerclass: this.filterState.buyerclass.join(','),
+                buyPhone: this.filterState.buyPhone ? this.filterState.buyPhone : 0,
+                bidPhone: this.filterState.bidPhone ? this.filterState.bidPhone : 0
+            }
+
+            this.listState.loading = true
+            this.listState.loaded = false
+
+            $.ajax({
+                url: '/publicapply/bidcoll/list',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(data),
+                success: function (res) {
+                    if (res.error_code === 0 && res.data) {
+                        var list = res.data.res
+                        this.listState.pageSize = res.data.pageSize
+                        if (res.data.count) {
+                            this.listState.total = res.data.count
+                        }
+                        // 给list添加额外属性
+                        if (list) {
+                            list.forEach(function (item, index) {
+                                item.selected = false
+                                item.star = true
+                                item.index = _this.calcListIndex(index)
+                            })
+                            this.listState.list = list || []
+                        }
+                    } else {
+                        this.listState.total = 0
+                        this.listState.list = []
+                    }
+                }.bind(this),
+                complete: function () {
+                    this.listState.loading = false
+                    this.listState.loaded = true
+                }.bind(this)
+            })
+        },
+        bidCollectAction: function (ids, callback) {
+            var binfo = []
+            ids.forEach(function (item) {
+                binfo.push({
+                    bid: item
+                })
+            })
+            var data = {
+                baction: 'R',
+                binfo: binfo
+            }
+            $.ajax({
+                url: '/publicapply/bidcoll/action',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(data),
+                success: function (res) {
+                    if (res.error_code === 0 && res.data) {
+                        callback && callback()
+                    }
+                }.bind(this)
+            })
+        },
+        resetListState: function () {
+            var state = {
+                loaded: false,
+                loading: false,
+                pageNum: 1, // 当前页
+                total: 0, // 一共多少条数据
+                list: []
+            }
+            Object.assign(this.listState, state)
+        },
+        onPageChange: function (p) {
+            this.listState.pageNum = p
+            this.getList()
+        },
+        doQuery: function () {
+            this.resetListState()
+            this.getList()
+        },
+        initSelectTagList: function () {
+            var arr = []
+            this.tagList.forEach(function (item) {
+                arr.push({
+                    label: item.lanme,
+                    value: item.lid,
+                    count: item.count
+                })
+            })
+            this.tagSelectList = arr
+        },
+        tagFilterChange: function (tagList) {
+            this.filterState.tags = tagList
+            this.doQuery()
+        },
+        dateTimeFilterChange: function (t) {
+            this.filterState.timeStart = t.start
+            this.filterState.timeEnd = t.end
+            this.doQuery()
+        },
+        buyerClassFilterChange: function (buyerclass) {
+            var buyerclassArr = []
+            for (var key in buyerclass) {
+                buyerclassArr = buyerclassArr.concat(buyerclass[key])
+            }
+            this.filterState.buyerclass = buyerclassArr
+            this.doQuery()
+        },
+        otherFilterChange: function (t) {
+            this.doQuery()
+        },
+        changeListType: function (type) {
+            this.listState.listType = type
+        },
+        dataExport: function () {
+            var info = this.getSelectedIdArr()
+            var ids = info.ids
+            window.open('/front/dataExport/superSearchExport?selectIds=' + ids.join(','))
+        },
+        // 批量取消收藏
+        unStarSelected: function () {
+            var _this = this
+            var info = this.getSelectedIdArr()
+            var ids = info.ids
+            var selectedArr = info.arr
+            if (ids.length === 0) {
+                return this.showToast('请选择收藏信息')
+            }
+            this.bidCollectAction(ids, function () {
+                selectedArr.forEach(function (item) {
+                    item.star = false
+                })
+                _this.showToast('已取消收藏', null, function () {
+                    _this.getList()
+                })
+            })
+        },
+        unStarThis: function (item) {
+            var _this = this
+            this.bidCollectAction([item._id], function () {
+                _this.showToast('已取消收藏', null, function () {
+                    item.star = false
+                    _this.getList()
+                })
+            })
+        },
+        getSelectedIdArr: function () {
+            var arr = []
+            var ids = []
+            this.listState.list.forEach(function (item) {
+                if (item.selected) {
+                    arr.push(item)
+                    ids.push(item._id)
+                }
+            })
+            return {
+                ids: ids,
+                arr: arr
+            }
+        },
+        toListDetail: function (item) {
+            window.open('/article/content/' + item._id + '.html')
+        },
+        calcArticleItemTags: function (article) {
+            var arr = []
+            if (article.area) {
+                arr.push(article.area)
+            }
+            if (article.buyerclass) {
+                arr.push(article.buyerclass)
+            }
+            if (article.type) {
+                arr.push(article.type)
+            }
+            if (article.budget) {
+                arr.push(utils.moneyUnit(article.budget))
+            }
+            return arr
+        },
+        calcListIndex: function (index) {
+            return (this.listState.pageSize * (this.listState.pageNum - 1)) + index + 1
+        },
+        calcMoney: function (m) {
+            if (m) {
+                return parseInt(utils.moneyUnit(m))
+            } else {
+                return ''
+            }
+        },
+        calcArticleType: function (type) {
+            if (type) {
+                return type + '公告'
+            } else {
+                return ''
+            }
+        },
+        calcTime: function (time, pattern) {
+            if (time) {
+                var t = new Date(time)
+                return t.pattern(pattern)
+            } else {
+                return ''
+            }
+        },
+        allCheckboxChange: function (state) {
+            this.listState.list.forEach(function (item) {
+                item.selected = state
+            })
+        },
+        listItemCheckboxChange: function () {
+            var arr = []
+            this.listState.list.forEach(function (item) {
+                arr.push(item.selected)
+            })
+            this.currentPageAllChecked = arr.indexOf(false) === -1
+        },
+        openTagDrawer: function () {
+            this.tagDrawer.show = true
+        },
+        drawerConfirm: function () {
+            this.tagDrawer.show = false
+        },
+        drawerCancel: function () {
+            this.tagDrawer.show = false
+        },
+        delThisTag: function (tag) {
+            this.tagDrawer.dialogShow = true
+            this.tagDrawer.currentDelTagInfo = tag
+        },
+        delThisTagConfirm: function () {
+            var _this = this
+            var data = {
+                lids: this.tagDrawer.currentDelTagInfo.value,
+                lname: this.tagDrawer.currentDelTagInfo.label,
+                laction: 'D'
+            }
+
+            $.ajax({
+                url: '/publicapply/bidcoll/label',
+                type: 'POST',
+                contentType: 'application/json',
+                data: JSON.stringify(data),
+                success: function (res) {
+                    if (res.error_code === 0) {
+                        _this.tagDrawer.dialogShow = false
+                        if (res.data) {
+                            _this.tagDrawer.toastShow = true
+                            setTimeout(function () {
+                                _this.tagDrawer.toastShow = false
+                                _this.getTagList()
+                            }, 1500)
+                        }
+                    }
+                }.bind(this)
+            })
+        },
+    }
+})

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

@@ -180,7 +180,7 @@
   flex-wrap: wrap;
   padding: .32rem;
   flex-direction: row;
-
+  align-content: flex-start;
 }
 .collection .taglist .area-card-item{
   height: .72rem;
@@ -322,7 +322,7 @@
 }
 /* 地区 */
 .collection .area-list.van-index-bar{
-  height: 8.6rem;
+  height: 7.6rem;
   overflow: auto;
 }
 /* 采购单位类型 */
@@ -402,4 +402,34 @@
 }
 .unitType .van-tabs__wrap .van-tabs__nav.van-tabs__nav--card .van-tab.van-tab--active .van-tab__text.van-tab__text--ellipsis{
   color: #2ABED1;
+}
+
+/* 采购单位联系方式 */
+.icon-duihao{
+  display: flex;
+  width: .48rem;
+  height: .48rem;
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF4AAABQCAMAAACnBjIsAAAAk1BMVEXOzs7Ozs7Pz8/Ozs7Ozs4AAADOzs7Ozs729vvOzs4st8rz9fo5vM7f7/aX2eRJwNHk8fei3Oc0uczv9Pnr8/nZ7fTS6/K95e5mydhfx9ZQwtM+vc8xuMvo8vjK6PDE5u+r3+nk5OeC0t9wzdtXxdVDvtCy4euN1eF3z9xbxtXM6fG14uuN1eKJ1ODV7PN80N1ty9q7gJB9AAAACHRSTlOt8/DDJwAoJUOi5sAAAAF6SURBVFjD7dlrb4IwFAZgdLodW7moqFwVkKuXbf//1y20WU4yJksK54Oz5yMNzxde8rap8bKgmqnxNjcWQDU8nc6QJ5jUIOX5hJSHheY1r3nNa17zT8FvfYeQNwtmm2S8YzPGCpOIjwPWTkPDu7nQwy0Jv/GFvtwBBc89qR9IksNPQl8faXJfCz3aAwmfMTElKPH8D72SegJK/MF+79Utqa9Aid8tWbjreXEldQuU+G3YBu58971E6hWo8U1/oC9Sz0CRN+2+SO8jsVqDIo/+b6E+rsXaiavz4AT3/PNSrHhcva3Qjy7dTLXjbwaWYZxLv+xmirHcHdy1btP9Mc1CPAriEarc9X/+mo784rYzyk5h46GP1YfVOoxH3+qrPnUe+Cf6WH0j8VhJ7NqpvkE8+rX0b1h9Y/DofzCcaD/+HjNDvqTYwt6+9YRmh3zF/FPwYGH6CXjhV5THh1X2Lw8/mte85jWvec0/Ms8nj3upx9PpK+GF6sSYzb8A2b742RBkpdEAAAAASUVORK5CYII=) no-repeat;
+  background-size: contain;
+}
+
+/* 没有权限样式 */
+.useRoot{
+  height: 3.52rem;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  font-size: .36rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #171826;
+  line-height: .52rem;
+}
+.useRoot .open_root{
+  font-size: .3rem;
+  font-weight: 500;
+  text-align: CENTER;
+  color: #5f5e64;
+  line-height: .44rem;
 }

binární
src/web/staticres/common-module/collection/image/icon-right-bg.png


+ 2 - 3
src/web/staticres/common-module/collection/js/cate-mobile.js

@@ -1,3 +1,4 @@
+// 采购单位类型
 var cateComponentTemplate = `<div class="j-container">
 <div class="j-main unitTab">
   <van-tabs type="card" class="unitType">
@@ -176,9 +177,7 @@ var cateComponent = {
       this.tablist.forEach(function(item, index){
         item[Object.keys(item)[0]].forEach(function(data, i) {
           if(data.type){
-            console.log(data)
-            let str = Object.keys(item)[0] +'_'+data.name
-            cateArr.push(str)
+            cateArr.push(data.name)
           }
         })
       })

+ 145 - 40
src/web/staticres/common-module/collection/js/date-mobile.js

@@ -1,12 +1,12 @@
 var dateComponentTemplate = `<div class="j-container">
 <div class="dateTags j-main">
     <div class="timeTag">
-    <div class="area-card-item" :class="{active:index==colDate}" v-for="(item, index) in dateOption" :key="index" @click="selectFixedDate(index, item.value)">{{item.name}}</div>
+    <div class="area-card-item" :class="{active:item.selected==true}" v-for="(item, index) in timeSelectList" :key="index" @click="selectFixedDate(item)">{{item.name}}</div>
     </div>
     <div class="timePicker" @click="dateShowEvent" :class="{clickactive:dateStyle==true}">
-    <van-field v-model="selectDate.startDate" placeholder="开始时间"></van-field>
+    <van-field v-model="dateTimePickerState.startPlaceHolder" placeholder="开始时间"></van-field>
     <div class="line"></div>
-    <van-field @focus="getEndFocus" v-model="selectDate.endDate" placeholder="结束时间"></van-field>
+    <van-field @focus="getEndFocus" v-model="dateTimePickerState.endPlaceHolder" placeholder="结束时间"></van-field>
     </div>
 </div>
 <van-popup v-model="datePicker.startshow" round position="bottom" :style="{ height: '43%' }">
@@ -22,7 +22,6 @@ var dateComponentTemplate = `<div class="j-container">
       </div>
       <div class="j-main">
         <van-datetime-picker
-          @change="changeDate"
           class="datepopup"
           :show-toolbar="false"
           swipe-duration="300"
@@ -57,7 +56,6 @@ var dateComponentTemplate = `<div class="j-container">
       </div>
       <div class="j-main">
         <van-datetime-picker
-          @change="changeDate"
           class="datepopup"
           :show-toolbar="false"
           swipe-duration="300"
@@ -94,22 +92,26 @@ var dateComponent = {
   data:function () {
     return {
       colDate: 0,
-      dateOption:[
+      timeSelectList:[
         {
           name: '不限',
-          value: 'all'
+          value: 'all',
+          selected: true
         },
         {
           name: '最近7天',
-          value: 'lately-7'
+          value: 'lately7',
+          selected: false
         },
         {
           name: '最近30天',
-          value: 'lately-30'
+          value: 'lately30',
+          selected: false
         },
         {
           name: '去年',
-          value: 'lastyear'
+          value: 'lastYear',
+          selected: false
         }
       ],
       // 点击选择时间添加样式
@@ -122,33 +124,142 @@ var dateComponent = {
         maxDate: new Date(2025, 10, 1),
         currentDate: new Date(),
       },
-      selectDate: {
-        tagDate: '',
-        startDate: '',
-        endDate: ''
-      }
+      dateTimePickerState: {
+        start: '',
+        end: '',
+        startPlaceHolder: '', // 开始日期
+        endPlaceHolder: '' // 结束日期
+      },
     }
   },
   methods: {
-    selectFixedDate: function(i, value) {
-      this.colDate = i
+    setState (data) {
+      // {
+      //   start: 1620230400000, // 2021-5-6
+      //   end: 1620489600000, // 2021-5-9
+      //   exact: 'all'
+      // }
+      if (!data || Object.keys(data).length === 0) {
+        this.setTimeSelectListState('all')
+      } else {
+        switch (data.exact) {
+          case 'all': {
+            this.setTimeSelectListState('all')
+            this.clearDateTimePicker()
+            break
+          }
+          case 'lately7': {
+            this.setTimeSelectListState('lately7')
+            this.clearDateTimePicker()
+            break
+          }
+          case 'lately30': {
+            this.setTimeSelectListState('lately30')
+            this.clearDateTimePicker()
+            break
+          }
+          case 'lastYear': {
+            this.setTimeSelectListState('lastYear')
+            this.clearDateTimePicker()
+            break
+          }
+          case 'exact': {
+            // if (!data.start || !data.end) break
+            if (data.start < data.end) {
+              this.dateTimePickerState.start = new Date(data.start)
+              this.dateTimePickerState.end = new Date(data.end)
+            }
+            break
+          }
+          default: {
+            console.warn('exact值为空')
+          }
+        }
+      }
+    },
+    clearDateTimePicker () {
+      this.dateTimePickerState.start = ''
+      this.dateTimePickerState.end = ''
+    },
+    getState () {
+      // timeState.exact: all/lately7/lately30/lastYear/exact5种状态
+      // 为true时候表示精确筛选,从时间选择器中获取值(其他为根据当前时间计算出的值)
+      const timeState = {
+        start: '',
+        end: '',
+        exact: 'exact'
+      }
+      const selectButton = this.timeSelectList.find(item => item.selected)
+      console.log(selectButton)
+      if (selectButton) {
+        timeState.exact = selectButton.value
+        Object.assign(timeState, this.calcNotExactTime(timeState.exact))
+      } else {
+        timeState.exact = 'exact'
+        if(this.dateTimePickerState.start !== '') {
+          timeState.start = this.dateTimePickerState.start.getTime()
+        } else {
+          timeState.start = ''
+        }
+        console.log(this.dateTimePickerState.end == '')
+        if(this.dateTimePickerState.end != '') {
+          timeState.end = this.dateTimePickerState.end.getTime()
+        } else {
+          timeState.end = ''
+        }
+      }
+      return timeState
+    },
+    // 计算lately7/lately30/lastYear的开始和结束时间
+    // endTime传入一个时间戳
+    calcNotExactTime (exact, endTime = Date.now()) {
+      const t = {
+        start: 0,
+        end: +new Date(endTime)
+      }
+      const durations = {
+        hour1: 60 * 60 * 1000,
+        day1: 60 * 60 * 1000 * 24 * 1,
+        day7: 60 * 60 * 1000 * 24 * 7,
+        day30: 60 * 60 * 1000 * 24 * 30
+      }
+      switch (exact) {
+        case 'lately7': {
+          t.start = t.end - durations.day7
+          break
+        }
+        case 'lately30': {
+          t.start = t.end - durations.day30
+          break
+        }
+        case 'lastYear': {
+          const year = new Date(t.end).getFullYear()
+          const lastYear = year - 1
+          t.start = +new Date(`${lastYear}`)
+          t.end = +new Date(`${year}`) - durations.hour1 * 8 - 1
+          break
+        }
+        default: {
+          t.start = 0
+          t.end = 0
+          break
+        }
+      }
+      return t
+    },
+    selectFixedDate: function(item) {
+      if (item.selected) return
+      this.timeSelectList.forEach(v => (v.selected = false))
+      item.selected = true
       this.dateStyle = false
-      this.selectDate.tagDate = value
-      this.selectDate.startDate = ''
-      this.selectDate.endDate = ''
+      this.clearDateTimePicker()
     },
     // 显示选择时间弹窗
     dateShowEvent: function() {
-      this.colDate = -1
+      this.timeSelectList.forEach(v => (v.selected = false))
       this.dateStyle = true
       this.datePicker.startshow = true
     },
-    // 获取选中的时间
-    changeDate: function(e) {
-      console.log(e.getValues())
-      let timer = e.getValues()
-      console.log(timer)
-    },
     formatter: function(type, val) {
       if (type === 'year') {
         return val + '年';
@@ -170,15 +281,15 @@ var dateComponent = {
         name: 'dateItem',
         data: ''
       }
-      this.$emit('confirm', params)
+      this.$emit('cancel', params)
     },
     // 选择开始时间弹窗确认按钮
     onStartConfirm:function() {
-      this.selectDate.tagDate = ''
-      this.selectDate.startDate = this.$refs.getstartValues.value.pattern('yyyy年MM月dd日')
+      this.dateTimePickerState.start = new Date(this.$refs.getstartValues.value)
+      this.dateTimePickerState.startPlaceHolder = this.$refs.getstartValues.value.pattern('yyyy年MM月dd日')
       this.datePicker.startshow = false
       // 如果结束时间不为空 选择过开始时间不弹出结束时间弹窗
-      if(this.selectDate.endDate == '') {
+      if(this.dateTimePickerState.end == '') {
         this.datePicker.endshow = true
       }else{
         this.datePicker.endshow = false
@@ -186,8 +297,8 @@ var dateComponent = {
     },
     // 选择结束时间弹窗确认按钮
     onendConfirm: function(){
-      this.selectDate.tagDate = ''
-      this.selectDate.endDate = this.$refs.getendValues.value.pattern('yyyy年MM月dd日')
+      this.dateTimePickerState.end = new Date(this.$refs.getendValues.value)
+      this.dateTimePickerState.endPlaceHolder = this.$refs.getendValues.value.pattern('yyyy年MM月dd日')
       this.datePicker.endshow = false
     },
     // 选择时间弹窗关闭按钮
@@ -197,15 +308,9 @@ var dateComponent = {
     },
     // 筛选条件确认按钮
     onConfirm: function(){
-      let timerDate = ''
-      if(this.selectDate.tagDate == ''){
-        timerDate = this.selectDate.startDate-this.selectDate.endDate
-      }else{
-        timerDate = this.selectDate.tagDate
-      }
       let params = {
         name: 'dateItem',
-        data: timerDate
+        data: this.getState()
       }
       this.$emit('confirm', params)
     }

+ 272 - 0
src/web/staticres/common-module/collection/js/index-wx.js

@@ -0,0 +1,272 @@
+var vNode = {
+  delimiters: ['${', '}'],
+  el: '#myCollection',
+  components: {
+    tagsComponent: tagsComponent,
+    dateComponent: dateComponent,
+    cateComponent: cateComponent,
+    phoneComponent: phoneComponent
+  },
+  data: {
+    listState: {
+      value: '',
+      loading: false,
+      finished: false,
+      pageSize: 10,
+      offset: 80,
+      scrollTop: 0,
+      total: 0,
+      list: []
+    },
+    // 筛选参数
+    limitlist: {
+      pageNum: 1,
+      label: '',
+      selectTime: '',
+      buyerclass: '',
+      buyerPhone: 0,
+      winnerPhone: 0
+    },
+    // 个人标签列表
+    tagList: [],
+    // 下拉菜单参数
+    params: {
+      value2: '',
+      buyerData: {
+        dataType: '1',
+        option: [
+          { text: '有联系方式', value: 1, type: false },
+          { text: '无联系方式', value: -1, type: false },
+        ],
+      },
+      winnerData: {
+        dataType: '2',
+        option: [
+          { text: '有联系方式', value: 1, type: false },
+          { text: '无联系方式', value: -1, type: false },
+        ]
+      }
+    },
+    // 收藏日期选择时间参数
+    selectDate: {
+      startDate: '',
+      endDate: ''
+    },
+    limitshow: false, // 筛选框显示
+    condition: true, // 列表星星显示
+    personTagactive:0, //个人标签选择按钮下标
+    screenShow: false // 筛选按钮是否显示
+  },
+  computed: {},
+  created () {
+    this.getUserRoot()
+    this.getList()
+    this.getTagsList()
+  },
+  mounted() {
+  },
+  methods: {
+    // 判断是否是有筛选条件
+    getUserRoot: function() {
+      $.ajax({
+        url: '/publicapply/bidcoll/power',
+        type: 'POST',
+        success: function(res) {
+          console.log(res)
+          if(res.data) {
+            this.screenShow = true
+          } else {
+            this.screenShow = false
+          }
+        }
+      })
+    },
+    // 列表跳转
+    linkRouter: function(id) {
+      location.href = '/front/wx_dataExport/submitOrder?id=' + id + '&source=d&dataspec='
+      debugger
+    },
+    // 筛选按钮
+    screenBtn() {
+      this.limitshow = true
+      setTimeout(()=>{
+        this.$refs.tagItem.toggle()
+      })
+    },
+    getContainer: function() {
+      return this.$refs.searchContainer
+    },
+    // 获取列表数据
+    getList: function() {
+      let _this = this
+      _this.listState.loading = true
+      let params = _this.limitlist
+      $.ajax({
+        url: '/publicapply/bidcoll/list',
+        type: "POST",
+        contentType: 'application/json;charset=utf-8',
+        data: JSON.stringify(params),
+        success: function(res){
+          console.log(res)
+          if (res.error_code == 0) {
+            if (res.data && res.data.res && $.isArray(res.data.res)) {
+              // 当数组为空时,且不为第一页,底部显示没有更多数据
+              if(res.data.res.length == 0 && _this.limitlist.pageNum != 1){
+                _this.listState.list = _this.listState.list.concat(res.data.res)
+                _this.listState.loading = false
+                if(!res.data.haveNextPage){
+                    _this.listState.loading = true
+                    _this.listState.finished = true;
+                }else{
+                    _this.listState.loading = false
+                    _this.limitlist.pageNum++
+                }
+              } else if(res.data.res.length == 0 && _this.limitlist.pageNum == 1){
+                // 当数组为空时,且为第一页,页面为暂无数据页面
+                _this.listState.loading = true
+                _this.listState.finished = true;
+              } else {
+                // 数据正常加载更多
+                for (let i = 0; i < res.data.res.length; i++) {
+                  res.data.res[i].bidamount = utils.moneyUnit(res.data.res[i].bidamount)
+                  res.data.res[i].publishtime = utils.dateFromNow(res.data.res[i].publishtime * 1000)
+                }
+                _this.listState.list = _this.listState.list.concat(res.data.res)
+                _this.listState.loading = false
+                if(!res.data.haveNextPage){
+                  _this.listState.loading = true
+                  _this.listState.finished = true;
+                }else{
+                    _this.listState.loading = false
+                    _this.limitlist.pageNum++
+                }
+              }
+            } else {
+              _this.listState.loading = true
+              _this.listState.finished = true;
+            }
+          } else {
+            _this.$toast(res.error_msg)
+          }
+        },
+        error: function(err){
+          _this.listState.loading = true
+          _this.listState.finished = true;
+        }
+      })
+    },
+    // 取消收藏
+    collecClick: function(id) {
+      let _this = this
+      let params = {
+        baction: 'R',
+        binfo: [
+          {
+            bid: id
+          }
+        ]
+      }
+      $.ajax({
+        url: '/publicapply/bidcoll/action',
+        type: "POST",
+        contentType: 'application/json;charset=utf-8',
+        data:JSON.stringify(params),
+        success: function(res){
+          console.log(res)
+          if(res.error_code == 0) {
+            if(res.data) {
+              _this.$toast('取消收藏成功')
+              _this.reLoadList()
+            } else {
+              _this.$toast('取消收藏失败')
+            }
+          }
+        },
+        error: function(err){
+          _this.$toast('取消收藏失败')
+        }
+      })
+    },
+    // 确定按钮事件
+    confirm: function(data) {
+      if(data.name == 'dateItem'){
+        this.limitlist.selectTime = (data.data.start / 1000).toFixed(0) + '_' + (data.data.end / 1000).toFixed(0)
+        this.$refs.dateItem.toggle()
+      } else if (data.name == 'cateItem') {
+        this.limitlist.buyerclass = data.data.join(',')
+        this.$refs.cateItem.toggle()
+      } else if (data.name == 'tagsItem') {
+        this.limitlist.label = data.data
+        this.$refs.tagItem.toggle()
+      } else if (data.name == 'buyerItem') {
+        this.limitlist.buyerPhone = parseInt(data.data)
+        this.$refs.buyerItem.toggle(false)
+      } else if (data.name == 'winnerItem') {
+        this.limitlist.winnerPhone = parseInt(data.data)
+        this.$refs.winnerItem.toggle(false)
+      }
+      this.reLoadList()
+    },
+    // 取消按钮事件
+    cancel: function(data) {
+      console.log(data)
+    },
+    // 刷新列表
+    reLoadList: function() {
+      this.listState.list = []
+      this.getList()
+    },
+
+    // 中标企业联系方式
+    getWinnerPhone: function(value) {
+      this.params.option5.forEach(function(data){
+        data.type = false
+      })
+      value.type = true
+      this.limitlist.winnerPhone = value.value
+      this.$refs.winnerItem.toggle(false)
+      this.reLoadList()
+    },
+    // 获取个人标签列表
+    getTagsList: function() {
+      let _this = this
+      $.ajax({
+        url: '/publicapply/bidcoll/getLabel',
+        type: "POST",
+        success: function(res){
+          console.log(res)
+          if(res.error_code == 0) {
+            res.data.forEach(function(item, index){
+              item.type = false
+            })
+            _this.tagList = res.data
+          }
+        },
+        error: function(err){
+          console.log(err)
+        }
+      })
+    },
+    // 数据导出
+    dataReport: function() {
+      let idArr = []
+      this.listState.list.forEach(function(item) {
+        idArr.push(item._id)
+      })
+      $.ajax({
+        url: '/publicapply/dataexpoet/bycollection',
+        type: 'POST',
+        data: {
+          selectIds: idArr.join(',')
+        },
+        success: function(res) {
+          console.log(res)
+          if(res.error_code == 0 && res.data) {
+            location.href = '/front/dataExport/toCreateOrderPage?id=' + res.data._id
+          }
+        }
+      })
+    }
+  }
+}
+var myCollection = new Vue(vNode)

+ 192 - 98
src/web/staticres/common-module/collection/js/index.js

@@ -2,41 +2,50 @@ var vNode = {
   delimiters: ['${', '}'],
   el: '#myCollection',
   components: {
+    tagsComponent: tagsComponent,
     dateComponent: dateComponent,
-    cateComponent: cateComponent
+    cateComponent: cateComponent,
+    phoneComponent: phoneComponent
   },
   data: {
     listState: {
       value: '',
       loading: false,
-      finished: true,
-      pageNum: 1,
+      finished: false,
       pageSize: 10,
       offset: 80,
       scrollTop: 0,
       total: 0,
       list: []
     },
-    dateOption:[
-      '不限',
-      '最近7天',
-      '最近30天',
-      '去年'
-    ],
-    list: ['a', 'b'],
-    result: [],
+    // 筛选参数
+    limitlist: {
+      pageNum: 1,
+      label: '',
+      selectTime: '',
+      buyerclass: '',
+      buyerPhone: 0,
+      winnerPhone: 0
+    },
+    // 个人标签列表
+    tagList: [],
     // 下拉菜单参数
     params: {
-      value1: '',
       value2: '',
-      option4: [
-        { text: '有联系方式', value: 'a' },
-        { text: '无联系方式', value: 'b' },
-      ],
-      option5: [
-        { text: '有联系方式', value: 'a' },
-        { text: '无联系方式', value: 'b' },
-      ]
+      buyerData: {
+        dataType: '1',
+        option: [
+          { text: '有联系方式', value: 1, type: false },
+          { text: '无联系方式', value: -1, type: false },
+        ],
+      },
+      winnerData: {
+        dataType: '2',
+        option: [
+          { text: '有联系方式', value: 1, type: false },
+          { text: '无联系方式', value: -1, type: false },
+        ]
+      }
     },
     // 收藏日期选择时间参数
     selectDate: {
@@ -46,31 +55,51 @@ var vNode = {
     limitshow: false, // 筛选框显示
     condition: true, // 列表星星显示
     personTagactive:0, //个人标签选择按钮下标
-    colDate:0 // 收藏日期选择按钮下标
+    screenShow: false // 筛选按钮是否显示
   },
   computed: {},
   created () {
+    this.getUserRoot()
     this.getList()
     this.getTagsList()
   },
   mounted() {
   },
   methods: {
-    toggle(index) {
-      this.$refs.checkboxes[index].toggle();
+    // 判断是否是有筛选条件
+    getUserRoot: function() {
+      $.ajax({
+        url: '/publicapply/bidcoll/power',
+        type: 'POST',
+        success: function(res) {
+          console.log(res)
+          if(res.data) {
+            this.screenShow = true
+          } else {
+            this.screenShow = false
+          }
+        }
+      })
     },
-    onClick: function(){},
-    screenBtn(val) {
+    // 列表跳转
+    linkRouter: function(id) {
+      location.href = '/jyapp/article/content/' + id + '.html'
+    },
+    // 筛选按钮
+    screenBtn() {
       this.limitshow = true
+      setTimeout(()=>{
+        this.$refs.tagItem.toggle()
+      })
     },
     getContainer: function() {
       return this.$refs.searchContainer
     },
+    // 获取列表数据
     getList: function() {
       let _this = this
-      let params = {
-        pagenum: _this.listState.pageNum
-      }
+      _this.listState.loading = true
+      let params = _this.limitlist
       $.ajax({
         url: '/publicapply/bidcoll/list',
         type: "POST",
@@ -78,58 +107,50 @@ var vNode = {
         data: JSON.stringify(params),
         success: function(res){
           console.log(res)
+          if (res.error_code == 0) {
+            if (res.data && res.data.res && $.isArray(res.data.res)) {
+              // 当数组为空时,且不为第一页,底部显示没有更多数据
+              if(res.data.res.length == 0 && _this.limitlist.pageNum != 1){
+                _this.listState.list = _this.listState.list.concat(res.data.res)
+                _this.listState.loading = false
+                if(!res.data.haveNextPage){
+                    _this.listState.loading = true
+                    _this.listState.finished = true;
+                }else{
+                    _this.listState.loading = false
+                    _this.limitlist.pageNum++
+                }
+              } else if(res.data.res.length == 0 && _this.limitlist.pageNum == 1){
+                // 当数组为空时,且为第一页,页面为暂无数据页面
+                _this.listState.loading = true
+                _this.listState.finished = true;
+              } else {
+                // 数据正常加载更多
+                for (let i = 0; i < res.data.res.length; i++) {
+                  res.data.res[i].bidamount = utils.moneyUnit(res.data.res[i].bidamount)
+                  res.data.res[i].publishtime = utils.dateFromNow(res.data.res[i].publishtime * 1000)
+                }
+                _this.listState.list = _this.listState.list.concat(res.data.res)
+                _this.listState.loading = false
+                if(!res.data.haveNextPage){
+                  _this.listState.loading = true
+                  _this.listState.finished = true;
+                }else{
+                    _this.listState.loading = false
+                    _this.limitlist.pageNum++
+                }
+              }
+            } else {
+              _this.listState.loading = true
+              _this.listState.finished = true;
+            }
+          } else {
+            _this.$toast(res.error_msg)
+          }
         },
         error: function(err){
-          console.log(err)
-        }
-      })
-      this.listState.list = [
-        {
-          "_id": "ABCY1wIfjwOOyw7I39zcE8sMDI%2FQTBgcUJ1Px4sODogZ31wAFpUCeg%3D",
-          "title": "吉林市鑫业建筑安装有限公司舒兰市人民医院异地新建项目户外门采购项目中标公告",
-          "area": "吉林",
-          "buyerclass": "建筑业",
-          "type": "成交",
-          "s_subscopeclass": "建筑工程",
-          "publishtime": 1619573067,
-          "budget": null,
-          "bidamount": 2270472.4
-        },
-        {
-          "_id": "ABCY2EEcjxYNyAsI2t2c2UoDScoGj10XFJ%2BPy8FJiEgWX1zYy9UCbE%3D",
-          "title": "广东实验中学货物采购合同采购合同",
-          "area": "广东",
-          "buyerclass": "学校",
-          "type": "合同",
-          "s_subscopeclass": "",
-          "publishtime": 1514735849,
-          "budget": 1799691.27,
-          "bidamount": 1728000
-        },
-        {
-          "_id": "ABCY1wIfjwOAj07NFlzcE8sMDI%2FQTBgcUJ1Px4vIDogUXxwBFpUCYM%3D",
-          "title": "大埔县农业农村局2021年食用农产品抽检服务项目成交公告",
-          "area": "广东",
-          "buyerclass": "农业",
-          "type": "成交",
-          "s_subscopeclass": "服务采购",
-          "publishtime": 1619573075,
-          "budget": null,
-          "bidamount": 223500
-        }
-      ]
-    },
-    // 获取个人标签列表
-    getTagsList: function() {
-      let _this = this
-      $.ajax({
-        url: '/publicapply/bidcoll/getLabel',
-        type: "POST",
-        success: function(res){
-          console.log(res)
-        },
-        error: function(err){
-          console.log(err)
+          _this.listState.loading = true
+          _this.listState.finished = true;
         }
       })
     },
@@ -151,35 +172,108 @@ var vNode = {
         data:JSON.stringify(params),
         success: function(res){
           console.log(res)
+          if(res.error_code == 0) {
+            if(res.data) {
+              _this.$toast('取消收藏成功')
+              _this.reLoadList()
+            } else {
+              _this.$toast('取消收藏失败')
+            }
+          }
         },
         error: function(err){
-          console.log(err)
+          _this.$toast('取消收藏失败')
         }
       })
-      this.listState.list.map((item,index) => {
-        console.log(item)
-        if(id === item._id) {
-          this.getList()
+    },
+    // 确定按钮事件
+    confirm: function(data) {
+      if(data.name == 'dateItem'){
+        if ((data.data.start / 1000).toFixed(0) == 0 && (data.data.end / 1000).toFixed(0) == 0) {
+          this.limitlist.selectTime = ''
+        } else if((data.data.start / 1000).toFixed(0) == 0 && (data.data.end / 1000).toFixed(0) != 0) {
+          this.limitlist.selectTime = '_' + (data.data.end / 1000).toFixed(0)
+        } else if((data.data.start / 1000).toFixed(0) != 0 && (data.data.end / 1000).toFixed(0) == 0) {
+          this.limitlist.selectTime = (data.data.start / 1000).toFixed(0) + '_'
+        } else {
+          this.limitlist.selectTime = (data.data.start / 1000).toFixed(0) + '_' + (data.data.end / 1000).toFixed(0)
         }
-      })
+        this.$refs.dateItem.toggle()
+      } else if (data.name == 'cateItem') {
+        this.limitlist.buyerclass = data.data.join(',')
+        this.$refs.cateItem.toggle()
+      } else if (data.name == 'tagsItem') {
+        this.limitlist.label = data.data
+        this.$refs.tagItem.toggle()
+      } else if (data.name == 'buyerItem') {
+        this.limitlist.buyerPhone = parseInt(data.data)
+        this.$refs.buyerItem.toggle(false)
+      } else if (data.name == 'winnerItem') {
+        this.limitlist.winnerPhone = parseInt(data.data)
+        this.$refs.winnerItem.toggle(false)
+      }
+      this.reLoadList()
     },
-    // 个人标签重置
-    resetAll: function() {},
-    // 个人标签确定
-    onConfirm: function(){},
-    // 个人标签点击
-    selectTags: function(i) {
-      console.log(i)
-      this.personTagactive = i
+    // 取消按钮事件
+    cancel: function(data) {
+      console.log(data)
     },
-    // 收藏日期标签选择
-    selectFixedDate: function(i) {
-      this.colDate = i
+    // 刷新列表
+    reLoadList: function() {
+      this.listState.list = []
+      this.getList()
     },
-    // 采购单位类型全选
-    checkAll:function() {
-      this.$refs.checkboxGroup.toggleAll();
+
+    // 中标企业联系方式
+    getWinnerPhone: function(value) {
+      this.params.option5.forEach(function(data){
+        data.type = false
+      })
+      value.type = true
+      this.limitlist.winnerPhone = value.value
+      this.$refs.winnerItem.toggle(false)
+      this.reLoadList()
+    },
+    // 获取个人标签列表
+    getTagsList: function() {
+      let _this = this
+      $.ajax({
+        url: '/publicapply/bidcoll/getLabel',
+        type: "POST",
+        success: function(res){
+          console.log(res)
+          if(res.error_code == 0) {
+            res.data.forEach(function(item, index){
+              item.type = false
+            })
+            _this.tagList = res.data
+          }
+        },
+        error: function(err){
+          console.log(err)
+        }
+      })
     },
+    // 数据导出
+    dataReport: function() {
+      let idArr = []
+      this.listState.list.forEach(function(item) {
+        idArr.push(item._id)
+      })
+      $.ajax({
+        url: '/publicapply/dataexpoet/bycollection',
+        type: 'POST',
+        data: {
+          selectIds: idArr.join(',')
+        },
+        success: function(res) {
+          console.log(res)
+          if(res.error_code == 0 && res.data) {
+            location.href = '/jyapp/front/dataExport/toCreateOrderPage?id=' + res.data._id + '&source=d&payway=&dataspec='
+          }
+        }
+      })
+    }
   }
 }
 var myCollection = new Vue(vNode)

+ 1 - 0
src/web/staticres/common-module/collection/js/notice-mobile.js

@@ -1,3 +1,4 @@
+// 公告类型
 var noticeComponentTemplate = `<div class="j-container">
 <div class="j-main unitTab">
   <van-tabs type="card" class="unitType">

+ 53 - 0
src/web/staticres/common-module/collection/js/phone-mobile.js

@@ -0,0 +1,53 @@
+var phoneComponentTemplate = `
+<div class="j-container">
+  <div class="j-main">
+    <van-cell center :title="item.text" v-for="(item,index) in data.option" @click="getBuyerPhone(item)">
+      <template #right-icon>
+        <span class="icon-duihao" v-if="item.type"></span>
+      </template>
+    </van-cell>
+  </div>
+</div>
+`
+
+var phoneComponent = {
+  name: 'phone-mobile',
+  template: phoneComponentTemplate,
+  props: ['data'],
+  data: function() {
+    return {
+    }
+  },
+  methods: {
+    getStates: function(data) {
+      let dataArr2 = []
+      let data2 = data.filter(function(value){
+        return value.type == true
+      })
+      data2.forEach((item)=>{
+        dataArr2.push(item.value)
+      })
+      return dataArr2.join(',')
+    },
+    getBuyerPhone: function(value) {
+      let params
+      this.data.option.forEach(function(data){
+        data.type = false
+      })
+      value.type = true
+      if (this.data.dataType == '1') {
+        params = {
+          name: 'buyerItem',
+          data: this.getStates(this.data.option)
+        }
+      } else if (this.data.dataType == '2'){
+        params = {
+          name: 'winnerItem',
+          data: this.getStates(this.data.option)
+        }
+      }
+      
+      this.$emit('confirm', params)
+    }
+  }
+}

+ 40 - 0
src/web/staticres/common-module/collection/js/root-mobile.js

@@ -0,0 +1,40 @@
+var rootComponentTemplate = `
+<div class="j-container">
+  <div class="useRoot j-main">
+    <p class="no-root">您暂无使用权限</p>
+    <p class="open_root">开通超级订阅,搜索招标采购项目更<br/>精准,300万+投标人都在用!</p>
+  </div>
+  <div class="j-footer">
+    <div class="j-button-group">
+      <button class="j-button-cancel" @click="resetAll">再想一想</button>
+      <button class="j-button-confirm" @click="onConfirm">去开通</button>
+    </div>
+  </div>
+</div>
+`
+
+var rootComponent = {
+  name: 'root-mobile',
+  template: rootComponentTemplate,
+  data: function() {
+    return {
+
+    }
+  },
+  methods: {
+    resetAll: function(){
+      let params = {
+        name: 'rootItem',
+        data: ''
+      }
+      this.$emit('cancel', params)
+    },
+    onConfirm: function(){
+      let params = {
+        name: 'rootItem',
+        data: ''
+      }
+      this.$emit('confirm', params)
+    },
+  }
+}

+ 61 - 0
src/web/staticres/common-module/collection/js/tags-mobile.js

@@ -0,0 +1,61 @@
+var tagsComponentTemplate = `
+<div class="j-container">
+  <div class="taglist j-main">
+    <div class="area-card-item" :class="{active:item.type==true}" v-for="(item, index) in taglist" :key="index" @click="selectTags(item)">{{item.lanme}}</div>
+  </div>
+  <div class="j-footer">
+    <div class="j-button-group">
+      <button class="j-button-cancel" @click="resetAll">重置</button>
+      <button class="j-button-confirm" @click="onConfirm">确认</button>
+    </div>
+  </div>
+</div>
+`
+
+var tagsComponent = {
+  name: 'tags-mobile',
+  props: ['taglist'],
+  template: tagsComponentTemplate,
+  data:function () {
+    return {
+    }
+  },
+  created () {
+    this.getTagsList() 
+  },
+  methods: {
+    // 个人标签方法
+    setState (data) {
+    },
+    getState (data) {
+      let dataArr2 = []
+      let data2 = data.filter(function(value){
+        return value.type == true
+      })
+      data2.forEach((item)=>{
+        dataArr2.push(item.lid)
+      })
+      return dataArr2.join(',')
+    },
+    // 个人标签重置
+    resetAll: function() {
+      let params = {
+        name: 'tagsItem',
+        data: ''
+      }
+      this.$emit('cancel', params)
+    },
+    // 个人标签确定
+    onConfirm: function(){
+      let params = {
+        name: 'tagsItem',
+        data: this.getState(this.taglist)
+      }
+      this.$emit('confirm', params)
+    },
+    // 个人标签点击
+    selectTags: function(data) {
+      data.type = !data.type
+    } 
+  }
+}

+ 350 - 0
src/web/staticres/common-module/keep-tags/keep-tags-template.js

@@ -0,0 +1,350 @@
+var tempStyleComponent = `<style>
+    #v-keep-component[v-cloak]{
+        display: none;
+    }
+    #v-keep-component > .van-overlay {
+        z-index: 100000 !important;
+    }
+    #v-keep-component > .popup-group {
+        z-index: 100002 !important;
+    }
+    #v-keep-component .disabled-event {
+        pointer-events: none;
+    }
+    #v-keep-component .keep-component-group {
+        width: 6.54rem;
+        background-color: #fff;
+        padding: 16px;
+        box-sizing: border-box;
+        border-radius: 8px 8px 16px 16px;
+    }
+    #v-keep-component .popup-group {
+        background-color: transparent;
+    }
+    #v-keep-component .icon-padding-box {
+        padding: 0.12rem;
+        padding-right: 0;
+        box-sizing: border-box;
+    }
+    #v-keep-component .j-icon {
+        width: 0.4rem;
+        height: 0.4rem;
+    }
+    #v-keep-component .keep-component-title {
+        padding-bottom: 0.12rem;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        font-family: PingFang SC;
+        font-style: normal;
+        font-weight: 500;
+        font-size: 0.4rem;
+        line-height: 0.6rem;
+        color: #171826;
+    }
+    #v-keep-component .keep-component-bottom {
+        padding: 0.16rem;
+    }
+    #v-keep-component .keep-component-bottom .van-button {
+        width: 100%;
+        background: #2ABED1;
+        border-radius: 0.16rem;
+        font-family: PingFang SC;
+        font-style: normal;
+        font-weight: 500;
+        font-size: 0.36rem;
+        line-height: 0.52rem;
+        color: #F7F9FA;
+        border-color: #2ABED1;
+        padding-top: 0.44rem;
+        padding-bottom: 0.44rem;
+    }
+    #v-keep-component .keep-component-bottom .van-button__loading {
+        font-size: 0.32rem;
+        width: 0.32rem;
+        height: 0.32rem;
+    }
+    #v-keep-component .kee-component-content {
+        padding-top: 0.24rem;
+    }
+    #v-keep-component .keep-component-tag-group {
+        display: flex;
+        flex-direction: row;
+        flex-wrap: wrap;
+        max-height: 30vh;
+        overflow-x: hidden;
+        overflow-y: scroll;
+    }
+
+    #v-keep-component .keep-component-tag i {
+        position: absolute;
+        width: 0.28rem;
+        height: 0.28rem;
+        bottom: 0;
+        right: 0;
+        opacity: 0;
+        transition: all 0.2s;
+    }
+    #v-keep-component .keep-component-tag {
+        position: relative;
+        max-width: 100%;
+        background: #F5F6F7;
+        border-radius: 0.08rem;
+        font-family: PingFang SC;
+        font-style: normal;
+        font-weight: 500;
+        font-size: 0.28rem;
+        line-height: 0.4rem;
+        color: #5F5E64;
+        padding: 0.1rem 0.2rem;
+        margin-bottom: 0.24rem;
+        margin-right: 0.24rem;
+        transition: color 0.2s;
+    }
+    #v-keep-component .keep-component-tag.checked i {
+        opacity: 1;
+    }
+    #v-keep-component .keep-component-tag.checked {
+        background: #E8FAFD;
+        color: #2ABED1;
+    }
+
+    #v-keep-component .keep-component-input-group .van-button {
+        margin-left: 0.3rem;
+        padding: 0.2rem;
+        padding-right: 0;
+        flex-shrink: 0;
+        background: transparent;
+        border-color: transparent;
+        color: inherit;
+    }
+    #v-keep-component .keep-component-input-group {
+        width: 100%;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: space-between;
+        margin-bottom: 0.44rem;
+        font-family: PingFang SC;
+        font-style: normal;
+        font-weight: 500;
+        font-size: 0.28rem;
+        line-height: 0.4rem;
+        color: #2ABED1;
+    }
+    #v-keep-component .keep-component-input-group  input:focus {
+        border-color: #2ABED1;
+    }
+    #v-keep-component .keep-component-input-group  input {
+        transition: width 0.2s;
+        flex: 1;
+        border: 1px solid rgba(0, 0, 0, 0.1);
+        box-sizing: border-box;
+        border-radius: 0.08rem;
+        font-family: PingFang SC;
+        font-style: normal;
+        font-weight: 500;
+        font-size: 0.3rem;
+        line-height: 0.44rem;
+        color: #5F5E64;
+        padding: 0.26rem 0.32rem;
+    }
+
+    #v-keep-component  .disabled-event .van-button{
+        opacity: 0.5;
+        cursor: not-allowed;
+    }
+
+</style>`
+
+Vue.component('keep-component', {
+  delimiters: ['@@', '@@'],
+  template: `
+<div id="v-keep-component" v-cloak>
+    <van-popup v-model="showKeepDialog" class="popup-group"  :close-on-click-overlay="!isLoading && !isAddLoading" :close-on-popstate="true">
+        <div class="keep-component-group" v-bind:class="{'disabled-event': isLoading || isAddLoading}">
+            <div class="keep-component-title">
+                <h3>选择标签</h3>
+                <div class="icon-padding-box" @click="togglePopStatus(false)">
+                    <i class="j-icon base-icon icon-delete-gray"></i>
+                </div>
+            </div>
+            <div class="kee-component-content">
+                <div class="keep-component-input-group">
+                    <input v-model.trim="tagInput" type="text" placeholder="请输入标签">
+                    <van-button v-show="isAddLoading || getOnlyStatus" @click="addTag" :loading="isAddLoading"  type="primary">添加并使用</van-button>
+                </div>
+                <div v-show="!isGetTagsLoading" class="keep-component-tag-group">
+                    <div class="keep-component-tag" @click="toggleTagStatus(item)" v-for="item in tags" :key="item.title" :class="{'checked': item.checked}">
+                        <div class="van-ellipsis">@@item.title@@</div>
+                        <i class="j-icon base-icon icon-corner-mark"></i>
+                    </div>
+                </div>
+                <van-loading  v-show="isGetTagsLoading" />
+            </div>
+            <div class="keep-component-bottom">
+                <van-button @click="submitSave" :loading="isLoading" loading-text="保存中..."  type="primary">确定</van-button>
+            </div>
+        </div>
+    </van-popup>
+</div>
+  `,
+  props: {
+    baseAjaxURL: {
+      type: String,
+      default: ''
+    },
+    bid: {
+      type: String,
+      required: true,
+      default: ''
+    },
+    // 是否首次打开时默认请求一次标签组
+    first: {
+      type: Boolean,
+      default: false
+    },
+    // 是否每次打开这遮罩时都请求标签组
+    every: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data: function () {
+    return {
+      showKeepDialog: false,
+      isLoading: false,
+      isAddLoading: false,
+      isGetTagsLoading: true,
+      tagInput: '',
+      tags: []
+    }
+  } ,
+  mounted () {
+    $('#v-keep-component').before(tempStyleComponent)
+    if (this.first) {
+      this.ajaxGetAllTags()
+    }
+  },
+  computed: {
+    getLids () {
+      return this.tags.filter(function (v) {
+        return v.checked
+      }).map(function (v) {
+        return v.lid
+      }).join(',')
+    },
+    getOnlyStatus () {
+      var _this = this
+      return this.tagInput !== '' && this.tags.filter(function (v) {
+        return v.title === _this.tagInput
+      }).length === 0
+    }
+  },
+  methods: {
+    checkAjaxFirst () {
+      if (!this.first) {
+        this.ajaxGetAllTags()
+      }
+    },
+    ajaxFn: function (url, data, callback, type) {
+      return $.ajax({
+        type: 'post',
+        url: this.baseAjaxURL + url,
+        contentType: type ? 'application/x-www-form-urlencoded' : "application/json;charset=utf-8",
+        data: type ? data : JSON.stringify(data),
+        dataType: "json",
+        success: typeof callback === 'function' ? callback.bind(this) : new Function()
+      })
+    },
+    ajaxGetAllTags () {
+      this.isGetTagsLoading = true
+      this.ajaxFn('/publicapply/bidcoll/getLabel', {} , function (r) {
+        this.isGetTagsLoading = false
+        if (r && r.error_msg === '' && r.data) {
+          this.tags = r.data.map(function (v) {
+            return {
+              lid: v.lid,
+              title: v.lanme,
+              checked: false
+            }
+          })
+        }
+      })
+    },
+    ajaxAddKeep (id, type) {
+      var t = this.$toast.loading({
+        duration: 0, // 持续展示 toast
+        forbidClick: true,
+        message: '提交中',
+      })
+      this.ajaxFn('/publicapply/bidcoll/action', { baction: type ? 'C' : 'R', binfo: [{ bid: id }] }, function (r) {
+        if (r && r.error_msg === '' && r.data) {
+          t.clear()
+          if (type) {
+            this.togglePopStatus(true)
+            this.$emit('on-change-keep', true)
+          } else {
+            this.$toast(r.error_msg || '已取消收藏')
+            this.$emit('on-change-keep', false)
+          }
+        } else {
+          t.clear()
+          this.$toast(r.error_msg)
+        }
+      })
+    },
+    togglePopStatus (type) {
+      this.showKeepDialog = type
+      if (type && this.every) {
+        this.ajaxGetAllTags()
+      }
+    },
+    toggleTagStatus (item) {
+      item.checked = !item.checked
+    },
+    submitSave () {
+      this.isLoading = true
+      this.ajaxFn('/publicapply/bidcoll/label', {
+        lids: this.getLids,
+        laction: 'S',
+        binfo: [
+          {
+            bid: this.bid
+          }
+        ]
+      }, function (r) {
+        if (r && r.error_msg === '' && r.data) {
+          this.isLoading = false
+          this.$toast(r.error_msg || '已收藏至“我的-标讯收藏”')
+          this.togglePopStatus(false)
+        } else {
+          this.$toast(r.error_msg)
+          this.isLoading = false
+        }
+      })
+    },
+    addTagInList (id) {
+      var tempInput = this.tagInput
+      this.tagInput = ''
+      this.tags.push({
+        lid: id,
+        title: tempInput,
+        checked: true
+      })
+      this.isAddLoading = false
+    },
+    addTag () {
+      this.isAddLoading = true
+      this.ajaxFn('/publicapply/bidcoll/addLabel', { name: this.tagInput }, function (r) {
+        if (r && r.error_msg === '' && r.data) {
+          this.addTagInList(r.data)
+        } else {
+          this.$toast(r.error_msg)
+          this.isAddLoading = false
+        }
+      }, true)
+    }
+  }
+})

+ 49 - 0
src/web/staticres/css/ele-reset.css

@@ -1,3 +1,18 @@
+[v-cloak] {
+    display: none;
+}
+
+::-webkit-scrollbar {
+    /*滚动条整体样式*/
+    width: 8px;
+}
+::-webkit-scrollbar-thumb {
+    /*滚动条里面小方块*/
+    border-radius: 3px;
+    background-color: #ECECEC;
+    opacity: 0.15;
+}
+
 /* 输入框focus颜色 */
 .el-input.is-active .el-input__inner,
 .el-input__inner:focus {
@@ -65,3 +80,37 @@ li.el-select-dropdown__item {
 .el-select-dropdown__item.selected {
     color: #2cb7ca;
 }
+
+/* image */
+.el-image__error,
+.el-image__inner,
+.el-image__placeholder {
+    height: unset;
+}
+
+/* toast */
+.j-el-toast {
+    position: fixed;
+    top: 50%;
+    left: 50%;
+    width: unset!important;
+    display: flex;
+    min-width: 96px;
+    min-height: 0;
+    box-sizing: content-box;
+    font-size: 16px;
+    background-color: rgba(0, 0, 0, 0.65);
+    border-radius: 8px;
+    transform: translate(-50%, -50%);
+}
+.j-el-toast .el-dialog__header {
+    display: none;
+}
+.j-el-toast .el-dialog__body {
+    padding: 16px 32px;
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: #fff;
+}

+ 87 - 1
src/web/staticres/css/selector/selector.css

@@ -1,3 +1,12 @@
+.icon-time {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAACE4AAAhOAFFljFgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAUHSURBVHgB7Vq7UhsxFBVmYHg0LlNuunR2epiYL0jSpQN/AU7BDI+CdQPM0JguXcwX2H/AMlCki/mCbLqUTsM4wyvngrQRItJKu9rYTPbMaFbS6nV0r15XYqxEiRIlSkwupliBaLVa1bm5uXdTU1M1uABRdXyrd3d3VSlZjLj49vZ2gO8FvtHBwUHMCoJ3wkRyYWFhHY1vgFiDZcMA7qgI8t4IS0RbigTzogvibV/EvRDe3t7eNRAdwkVwpK4xvvGjBkDF4erw1uAacLrOCvf29tosJ3IR3tzcDCqVSg/euvJrCHLH+PYhmYg5AGU20AFrcG/ZU/I01lfySDsz4Z2dnVV8OopUSZpHl5eXHWDIcoB35hrKX+UTXlIH4pr7+/t9lgGZCJMK4xMq0X0QbeYlqoKIg3AIt6r8yqTizoT/QpZ6vI0e77ACsbW11YLEdxWNcibtRBiV0praE2FUTmvoe1Q6SMvL1+T7xo5Go2EWTUBn11FnT1ZxhNfQ2ce2ZVRsE/Ix9VmqKIZbsSFLwJL1Dvm/kVtcXOyxDKC6qE6qW8SBfIfaZluGNWE09ERSpyFJtsgdkQ5UJ9UNJzSkylcKK1gR5uM2EGEas7aSLQJUN21GpKg62hja5E0lzNUllKK6RU9QNuBtkJemdZon0vKlEqaZUfhp7Cg9O1bMzs42ZdXGPNFKy2MkzKW7JsIo/Hgc41aHMAxpSTySolKlbCQM6TakIG0Xu2zCACl3XKRsJIyC1qVgf5KkK8ClnKzD8L8xpdcSJnVG5uRQwA8DEwm0LZm86BxuUmstYVWdXU89/xLUNkmt7zc5urQmlZale8omHNDGSPjR3rounZYw2aGSRJXK2DYZDriQ/IEukZYweiwQ/uvr6+dAOBYeCKimS2RS6UAqwOsZtwhw85GA+6T1zPHfEdbCNGkVpsa0vm9sbNTZGGCatBLCGMMBywl1jM3MzJz4JE3mXikY69KZVFqemQOWE7Q5AOmmFOWVNLdtC3+sS2ci/F14TAu5C0C6WyDpZCm6ubm50CWykjBU2rghd0FRpGkPLQW1+wYtYRy7ZGtClW4EmCf4Jk1tU8y3kS6tljA/dkVSlHZDngU+SUMDEyM92jwwHWPTzsOncqE2NiMX+CDNbyYSYSgWkCcwEna1JmSBhrS1NpEgbNX5Pr3pZxabURYopMkEHNrkU21uQDfNKpO6tVSlPD8//5kVACKNz2tbsgRuUQ1E2MaiOp2WIIqi0fLy8jx7uKymcf1qaWnp5/n5+RfmGWdnZz9s08LwTva2TSmqbXOFan2Zhgq+sj9WkOHV1dXK4eHhWM7JdKmGjk+ufsheDrIvbfJan5agLo/uczCx9FwusXyB19mT77nogs02vzVhmgywZfsoRdFt4sm/PPWQZKlO9vieq+liPk4dwzIwbgcYzzQMGjyqOj09/QFj+lcRY1oGjVloWBfeF1I0jdtPzAFZnzyE+Owq0V6fFwnw51C0Mqhrc9tlRhfI/KiFXgPQBbn6qo49EM99B2V490XzyEeQ7bIMyP1siWZL5ZXNvbUEjexz4hFzAH+29Ja/4FE3OXQv/H4sz5ZkaFT8oYIH8hG8F7Sxly0pHAG3qNT4c0Xd47ajLCr8pD3MEwzPi/LA27svAe+PS/k62cDsvS5fxrkAnRYh76lPoknZrEAI8nB1dECN32YEUpIhdzQ2yaQ0GI1Gfd8kS5QoUaLEc8FvXgunwnkjxD4AAAAASUVORK5CYII=);
+    background-repeat: no-repeat;
+    background-size: contain;
+}
+
 [class^=el-icon-] {
     transition: transform 0.2s ease;
 }
@@ -5,6 +14,23 @@
     transform: rotate(180deg);
 }
 
+/* no-data组件 */
+.no-data {
+    margin: 0 auto;
+    margin-top: 100px;
+    text-align: center;
+}
+.no-data .el-image {
+    width: 200px;
+    overflow: visible;
+}
+.no-data .tip-text {
+    margin-top: 14px;
+    color: #686868;
+    font-size: 16px;
+    line-height: 24px;
+}
+
 .selector-card-container {
     padding: 0 14px;
     border: 1px solid #ebebeb;
@@ -36,6 +62,11 @@
     display: flex;
     align-items: center;
     flex-wrap: wrap;
+    flex: 1;
+}
+.selector-content.no-more {
+    height: 38px;
+    overflow: hidden;
 }
 
 .j-button-item {
@@ -53,7 +84,7 @@
     cursor: pointer;
 }
 
-.selector-content .j-button-item.all,
+.selector-content .j-button-item.button-level-0,
 .selector-content .j-button-item.button-level-1 {
     font-weight: 700;
 }
@@ -78,6 +109,11 @@
     background-color: rgba(44,183,202,.1);
 }
 
+.selector-content .el-checkbox {
+    min-height: 34px;
+}
+
+/* 更多按钮 */
 .selector-card .action-button.show-more {
     display: flex;
     align-items: center;
@@ -281,3 +317,53 @@
     background-color: #2CB7CA;
     border-color: #2CB7CA;
 }
+
+/* 信息流 article-item */
+.article-item {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    flex: 1;
+    padding: 18px 0;
+    cursor: pointer;
+}
+.article-item .a-i-left {
+    flex: 1;
+    max-width: 750px;
+}
+.article-item .a-i-title {
+    font-size: 16px;
+    color: #1d1d1d;
+    line-height: 24px;
+}
+.article-item .a-i-right,
+.article-item .a-i-tags,
+.article-item .a-i-time-container {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.article-item .a-i-tags {
+    margin-right: 14px;
+}
+.article-item .a-i-tag {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    padding: 1px 6px;
+    color: #686868;
+    font-size: 12px;
+    line-height: 20px;
+    border: 1px solid #ececec;
+    background-color: #f5f5fb;
+    border-radius: 5px;
+}
+.article-item .a-i-tag:not(:last-of-type) {
+    margin-right: 8px;
+}
+.article-item .a-i-time-container .icon-text {
+    margin-left: 6px;
+    font-size: 14px;
+    color: #797a7e;
+    line-height: 24px;
+}

+ 53 - 0
src/web/staticres/js/selector/article-item-pc.js

@@ -0,0 +1,53 @@
+var articleItemComponentTemplate = `
+<div class="article-item">
+    <div class="a-i-left a-i-title ellipsis">{{ title }}</div>
+    <div class="a-i-right">
+        <div class="a-i-tags">
+            <div
+                class="a-i-tag"
+                v-for="(tag, index) in tags"
+                :key="index"
+            >{{ tag }}</div>
+        </div>
+        <div class="a-i-time-container">
+            <span class="icon-time"></span>
+            <span class="icon-text">{{ dateFromNow(time * 1000) }}</span>
+        </div>
+    </div>
+</div>
+`
+
+var articleItemComponent = {
+    name: 'article-item-pc',
+    template: articleItemComponentTemplate,
+    props: {
+        title: {
+            type: String,
+            default: ''
+        },
+        time: {
+            type: Number,
+            default: 0
+        },
+        tags: {
+            type: Array,
+            default: function () {
+                return []
+            }
+        }
+    },
+    data: function () {
+        return {}
+    },
+    created: function () {},
+    methods: {
+        dateFromNow: utils.dateFromNow,
+        calcTime: function () {
+            if (this.time) {
+                return utils.dateFromNow(this.time)
+            } else {
+                return ''
+            }
+        }
+    }
+}

+ 0 - 89
src/web/staticres/js/selector/choice-list-pc.js

@@ -1,89 +0,0 @@
-// var choiceListComponentTemplate = `
-// <div class="selector-content choice-list-content">
-//     <div class="select-group-container">
-//         <el-checkbox
-//             v-for="(item, index) in selectList"
-//             :key="index"
-//             :name="item.value"
-//             v-model="item.selected"
-//             @change="changeState(item)"
-//         >{{ item.label }}</el-checkbox>
-//     </div>
-// </div>
-// `
-
-var choiceListComponentTemplate = "\n<div class=\"selector-content choice-list-content\">\n    <div class=\"select-group-container\">\n        <el-checkbox\n            v-for=\"(item, index) in selectList\"\n            :key=\"index\"\n            :name=\"item.value\"\n            v-model=\"item.selected\"\n            @change=\"changeState(item)\"\n        >{{ item.label }}</el-checkbox>\n    </div>\n</div>\n";
-
-var choiceListComponent = {
-    name: 'choice-list-pc',
-    template: choiceListComponentTemplate,
-    props: {
-        multi: {
-            type: Boolean,
-            default: true
-        },
-        list: {
-            type: Array,
-            default: function () {
-                return [
-                    // {
-                    //     label: '',
-                    //     value: ''
-                    // }
-                ]
-            }
-        }
-    },
-    data: function () {
-        return {
-            selectList: [],
-            selectedList: []
-        }
-    },
-    created: function () {
-        this.initData()
-    },
-    methods: {
-        initData: function () {
-            var arr = []
-            this.list.forEach(function (item, index) {
-                var i = JSON.parse(JSON.stringify(item))
-                i.selected = false
-                arr.push(i)
-            })
-            this.selectList = arr
-        },
-        setState: function (arr) {
-            this.selectList.forEach(function (item) {
-                if (arr.indexOf(item.label) !== -1 || arr.indexOf(item.value) !== -1) {
-                    item.selected = true
-                } else {
-                    item.selected = false
-                }
-            })
-            this.selectedList = this.getState()
-        },
-        getState: function () {
-            var arr = []
-            this.selectList.forEach(function (item) {
-                if (item.selected) {
-                    arr.push(item.value)
-                }
-            })
-            return arr
-        },
-        onChange: function () {
-            this.selectedList = this.getState()
-            this.$emit('change', this.selectedList)
-        },
-        changeState: function (item) {
-            if (!this.multi) {
-                this.selectList.forEach(function (c) {
-                    c.selected = false
-                })
-                item.selected = !item.selected
-            }
-            this.onChange()
-        }
-    }
-}

+ 255 - 0
src/web/staticres/js/selector/date-time-pc.js

@@ -0,0 +1,255 @@
+// var dateTimeComponentTemplate = `
+// <div class="selector-content time-content">
+//     <div class="select-group-container" v-show="showSelectGroup">
+//         <div
+//             v-for="(item, index) in timeSelectList"
+//             :key="index"
+//             class="j-button-item bgc"
+//             :class="{
+//                 active: item.selected
+//             }"
+//             @click="clickTimeButton(item)"
+//         >{{ item.name }}</div>
+//     </div>
+//     <div class="date-time-container section-d">
+//         <el-date-picker
+//             v-model="dateTimePickerState.start"
+//             class="date-time-item section-d-item left"
+//             :type="dateTimePickerConf.type"
+//             :editable="dateTimePickerConf.editable"
+//             :align="dateTimePickerConf.align"
+//             :prefix-icon="dateTimePickerConf.prefixIcon"
+//             :format="dateTimePickerConf.format"
+//             :placeholder="dateTimePickerState.startPlaceHolder"
+//             :picker-options="startPickerOptions"
+//             @change="startDatePickerChange">
+//         </el-date-picker>
+//         <el-date-picker
+//             v-model="dateTimePickerState.end"
+//             class="date-time-item section-d-item right"
+//             :type="dateTimePickerConf.type"
+//             :editable="dateTimePickerConf.editable"
+//             :align="dateTimePickerConf.align"
+//             :prefix-icon="dateTimePickerConf.prefixIcon"
+//             :format="dateTimePickerConf.format"
+//             :placeholder="dateTimePickerState.endPlaceHolder"
+//             :picker-options="endPickerOptions"
+//             @change="endDatePickerChange">
+//         </el-date-picker>
+//     </div>
+// </div>
+// `
+
+var dateTimeComponentTemplate = "\n<div class=\"selector-content time-content\">\n    <div class=\"select-group-container\" v-show=\"showSelectGroup\">\n        <div\n            v-for=\"(item, index) in timeSelectList\"\n            :key=\"index\"\n            class=\"j-button-item bgc\"\n            :class=\"{\n                active: item.selected\n            }\"\n            @click=\"clickTimeButton(item)\"\n        >{{ item.name }}</div>\n    </div>\n    <div class=\"date-time-container section-d\">\n        <el-date-picker\n            v-model=\"dateTimePickerState.start\"\n            class=\"date-time-item section-d-item left\"\n            :type=\"dateTimePickerConf.type\"\n            :editable=\"dateTimePickerConf.editable\"\n            :align=\"dateTimePickerConf.align\"\n            :prefix-icon=\"dateTimePickerConf.prefixIcon\"\n            :format=\"dateTimePickerConf.format\"\n            :placeholder=\"dateTimePickerState.startPlaceHolder\"\n            :picker-options=\"startPickerOptions\"\n            @change=\"startDatePickerChange\">\n        </el-date-picker>\n        <el-date-picker\n            v-model=\"dateTimePickerState.end\"\n            class=\"date-time-item section-d-item right\"\n            :type=\"dateTimePickerConf.type\"\n            :editable=\"dateTimePickerConf.editable\"\n            :align=\"dateTimePickerConf.align\"\n            :prefix-icon=\"dateTimePickerConf.prefixIcon\"\n            :format=\"dateTimePickerConf.format\"\n            :placeholder=\"dateTimePickerState.endPlaceHolder\"\n            :picker-options=\"endPickerOptions\"\n            @change=\"endDatePickerChange\">\n        </el-date-picker>\n    </div>\n</div>\n";
+
+var dateTimeComponent = {
+    name: 'date-time-pc',
+    template: dateTimeComponentTemplate,
+    props: {
+        showSelectGroup: {
+            type: Boolean,
+            default: true
+        }
+    },
+    data: function () {
+        return {
+            timeSelectList: [
+                {
+                    name: '全部',
+                    value: 'all',
+                    selected: true
+                },
+                {
+                    name: '最近7天',
+                    value: 'lately7',
+                    selected: false
+                },
+                {
+                    name: '最近30天',
+                    value: 'lately30',
+                    selected: false
+                },
+                {
+                    name: '去年',
+                    value: 'lastYear',
+                    selected: false
+                }
+            ],
+            dateTimePickerConf: {
+                type: 'date',
+                editable: false,
+                align: 'center',
+                prefixIcon: 'clear-icon',
+                format: 'yyyy-MM-dd'
+            },
+            dateTimePickerState: {
+                start: '',
+                end: '',
+                startPlaceHolder: '', // 开始日期
+                endPlaceHolder: '' // 结束日期
+            },
+            startPickerOptions: {
+                disabledDate: function (time) {
+                    var end = this.dateTimePickerState.end
+                    if (end) {
+                        return time.getTime() > +new Date(end)
+                    }
+                }.bind(this)
+            },
+            endPickerOptions: {
+                disabledDate: function (time) {
+                    var start = this.dateTimePickerState.start
+                    if (start) {
+                        return time.getTime() < +new Date(start)
+                    }
+                }.bind(this)
+            }
+        }
+    },
+    created: function () {},
+    methods: {
+        setState: function () {
+            // {
+            //   start: 1620230400000, // 2021-5-6
+            //   end: 1620489600000, // 2021-5-9
+            //   exact: 'all'
+            // }
+            if (!data || Object.keys(data).length === 0) {
+                this.setTimeSelectListState('all')
+            } else {
+                switch (data.exact) {
+                    case 'all': {
+                        this.setTimeSelectListState('all')
+                        this.clearDateTimePicker()
+                        break
+                    }
+                    case 'lately7': {
+                        this.setTimeSelectListState('lately7')
+                        this.clearDateTimePicker()
+                        break
+                    }
+                    case 'lately30': {
+                        this.setTimeSelectListState('lately30')
+                        this.clearDateTimePicker()
+                        break
+                    }
+                    case 'lastYear': {
+                        this.setTimeSelectListState('lastYear')
+                        this.clearDateTimePicker()
+                        break
+                    }
+                    case 'exact': {
+                        if (!data.start || !data.end) break
+                        if (data.start < data.end) {
+                            this.dateTimePickerState.start = new Date(data.start)
+                            this.dateTimePickerState.end = new Date(data.end)
+                        }
+                        break
+                    }
+                    default: {
+                        console.warn('exact值为空')
+                    }
+                }
+            }
+        },
+        getState: function () {
+            // timeState.exact: all/lately7/lately30/lastYear/exact5种状态
+            // 为true时候表示精确筛选,从时间选择器中获取值(其他为根据当前时间计算出的值)
+            var timeState = {
+                start: 0,
+                end: 0,
+                exact: 'exact'
+            }
+            var selectButton = this.timeSelectList.find(function (item) { return item.selected })
+            if (selectButton) {
+                timeState.exact = selectButton.value
+                Object.assign(timeState, this.calcNotExactTime(timeState.exact))
+            } else {
+                timeState.exact = 'exact'
+                timeState.start = this.dateTimePickerState.start.getTime()
+                timeState.end = this.dateTimePickerState.end.getTime()
+            }
+            return timeState
+        },
+        onChange: function () {
+            var state = this.getState()
+            this.$emit('change', state)
+        },
+        setTimeSelectListState: function (value, callback) {
+            this.timeSelectList.forEach(function (item) {
+                item.selected = item.value === value
+                callback && callback(item)
+            })
+        },
+        clearDateTimePicker: function () {
+            this.dateTimePickerState.start = ''
+            this.dateTimePickerState.end = ''
+        },
+        // 计算lately7/lately30/lastYear的开始和结束时间
+        // endTime传入一个时间戳
+        calcNotExactTime: function (exact, endTime) {
+            exact = exact || 'lately7'
+            endTime = endTime || Date.now()
+            var t = {
+                start: 0,
+                end: +new Date(endTime)
+            }
+            var durations = {
+                hour1: 60 * 60 * 1000,
+                day1: 60 * 60 * 1000 * 24 * 1,
+                day7: 60 * 60 * 1000 * 24 * 7,
+                day30: 60 * 60 * 1000 * 24 * 30
+            }
+            switch (exact) {
+                case 'lately7': {
+                    t.start = t.end - durations.day7
+                    break
+                }
+                case 'lately30': {
+                    t.start = t.end - durations.day30
+                    break
+                }
+                case 'lastYear': {
+                    var year = new Date(t.end).getFullYear()
+                    var lastYear = year - 1
+                    t.start = +new Date(`${lastYear}`)
+                    t.end = +new Date(`${year}`) - durations.hour1 * 8 - 1
+                    break
+                }
+                default: {
+                    t.start = 0
+                    t.end = 0
+                    break
+                }
+            }
+            return t
+        },
+        clickTimeButton: function (item) {
+            if (item.selected) return
+            this.timeSelectList.forEach(v => (v.selected = false))
+            item.selected = true
+      
+            this.onChange()
+        },
+        startDatePickerChange: function (start) {
+            var end = this.dateTimePickerState.end
+            if (start && end) { // start和end都有值
+                this.setTimeSelectListState()
+                this.onChange()
+            } else if (!start && !end) { // start和end都没值
+                this.setTimeSelectListState('all')
+                this.onChange()
+            }
+        },
+        endDatePickerChange: function (end) {
+            var start = this.dateTimePickerState.start
+            if (start && end) { // start和end都有值
+              this.setTimeSelectListState()
+              this.onChange()
+            } else if (!start && !end) { // start和end都没值
+              this.setTimeSelectListState('all')
+              this.onChange()
+            }
+        }
+    }
+}

+ 17 - 0
src/web/staticres/js/selector/no-data-pc.js

@@ -0,0 +1,17 @@
+// var noDataComponentTemplate = `
+// <div class="no-data">
+//     <el-image src="/images/pc_12.png"></el-image>
+//     <div class="tip-text"><p>{{ tipText }}</p></div>
+// </div>
+// `
+var noDataComponentTemplate = '<div class="no-data"><el-image src="/images/pc_12.png"></el-image><div class="tip-text"><p>{{ tipText }}</p></div></div>'
+var noDataComponent = {
+    name: 'no-data-pc',
+    template: noDataComponentTemplate,
+    props: {
+        tipText: {
+            type: String,
+            default: '暂无数据'
+        }
+    }
+}

+ 263 - 0
src/web/staticres/js/selector/select-level2-pc.js

@@ -0,0 +1,263 @@
+// var selectLevel2ComponentTemplate = `
+// <div class="selector-content" :class="{ 'no-more': !showMore }">
+//     <span class="action-button show-more" @click="showMore = !showMore" v-if="needShowMore">
+//         <span class="action-text">{{ showMore ? '收起' : '更多' }}</span>
+//         <span class="el-icon-arrow-down" :class="showMore ? 'rotate180' : ''"></span>
+//     </span>
+//     <div
+//         v-for="(item, index) in selectList"
+//         :key="index"
+//         class="select-group-container"
+//     >
+//         <button
+//             class="j-button-item bgc"
+//             ref="selectItem"
+//             :class="{
+//                 active: item.selected,
+//                 'button-level-0': item.level === 0,
+//                 'button-level-1': item.level === 1,
+//                 'all': item.level === 0
+//             }"
+//             @click="changeState(item)"
+//         >{{ item.label }}</button>
+//         <button
+//             v-for="(iitem, iindex) in item.children" :key="999-iindex"
+//             class="j-button-item bgc button-level-2"
+//             ref="selectItem"
+//             v-show="showMore"
+//             :class="{
+//                 active: iitem.selected
+//             }"
+//             @click="changeState(iitem)"
+//         >{{ iitem.label }}</button>
+//     </div>
+// </div>
+// `
+
+var selectLevel2ComponentTemplate = "\n<div class=\"selector-content\" :class=\"{ 'no-more': !showMore }\">\n    <span class=\"action-button show-more\" @click=\"showMore = !showMore\" v-if=\"needShowMore\">\n        <span class=\"action-text\">{{ showMore ? '\u6536\u8D77' : '\u66F4\u591A' }}</span>\n        <span class=\"el-icon-arrow-down\" :class=\"showMore ? 'rotate180' : ''\"></span>\n    </span>\n    <div\n        v-for=\"(item, index) in selectList\"\n        :key=\"index\"\n        class=\"select-group-container\"\n    >\n        <button\n            class=\"j-button-item bgc\"\n            ref=\"selectItem\"\n            :class=\"{\n                active: item.selected,\n                'button-level-0': item.level === 0,\n                'button-level-1': item.level === 1,\n                'all': item.level === 0\n            }\"\n            @click=\"changeState(item)\"\n        >{{ item.label }}</button>\n        <button\n            v-for=\"(iitem, iindex) in item.children\" :key=\"999-iindex\"\n            class=\"j-button-item bgc button-level-2\"\n            ref=\"selectItem\"\n            v-show=\"showMore\"\n            :class=\"{\n                active: iitem.selected\n            }\"\n            @click=\"changeState(iitem)\"\n        >{{ iitem.label }}</button>\n    </div>\n</div>\n";
+
+var selectLevel2Component = {
+    name: 'select-level2-pc',
+    template: selectLevel2ComponentTemplate,
+    props: {
+        map: {
+            type: Object,
+            default: function () {
+                return {
+                    // 'bbb': ['xxx', 'yyy']
+                }
+            }
+        },
+        // 是否需要显示更多按钮
+        useShowMore: {
+            type: Boolean,
+            default: false
+        }
+    },
+    watch: {
+        map: function (newVal, oldVal) {
+            // this.initData()
+        }
+    },
+    data: function () {
+        return {
+            selectList: [],
+            selectLItemExp: {
+                label: '全部',
+                selected: false,
+                level: 0,
+                children: []
+            },
+            needShowMore: false,
+            showMore: true
+        }
+    },
+    created: function () {
+        this.initData()
+    },
+    mounted: function () {
+        if (this.useShowMore) {
+            this.calcNeedShowMoreOrNot()
+        }
+    },
+    methods: {
+        // 整理数据列表
+        initData: function () {
+            var _this = this
+            var mapList = []
+      
+            // 全部
+            var all = JSON.parse(JSON.stringify(this.selectLItemExp))
+            all.selected = true
+            mapList.push(all)
+
+            for (var key in this.map) {
+                var level1 = JSON.parse(JSON.stringify(this.selectLItemExp))
+                level1.label = key
+                level1.level = 1
+      
+                var level2Arr = []
+                this.map[key].forEach(function (item) {
+                    var level2 = JSON.parse(JSON.stringify(_this.selectLItemExp))
+                    level2.label = item
+                    level2.level = 2
+                    level2Arr.push(level2)
+                })
+      
+                level1.children = level2Arr
+                mapList.push(level1)
+            }
+      
+            this.selectList = mapList
+        },
+        // 按钮点击事件
+        changeState: function (item) {
+            // 循环所有数据,判断并改变状态
+            switch (item.level) {
+                case 0: {
+                    this.setState()
+                    break
+                }
+                case 1: {
+                    item.selected = !item.selected
+            
+                    this.selectList[0].selected = false
+                    // 二级子按钮状态跟随一级按钮
+                    item.children.forEach(function (level2) {
+                        level2.selected = item.selected
+                    })
+                    break
+                }
+                case 2: {
+                  item.selected = !item.selected
+        
+                  // 找到当前点击的父级元素
+                  this.selectList.forEach(function (level1) {
+                    var selectedStateArr = []
+                    if (item.level !== 0) {
+                      level1.children.forEach(function (level2) {
+                        selectedStateArr.push(level2.selected)
+                      })
+                      if (selectedStateArr.indexOf(false) === -1) {
+                        level1.selected = true
+                      } else {
+                        level1.selected = false
+                      }
+                    }
+                  })
+        
+                  this.selectList[0].selected = false
+                  break
+                }
+                default: {
+                  console.log('未知level')
+                }
+              }
+        
+              if (item.level !== 0) {
+                var allSelected = this.checkAllSelectedState()
+                if (allSelected.allSelected || allSelected.allNotSelected) {
+                  this.setState()
+                }
+              }
+        
+              this.onChange()
+        },
+        // 检查是否全部选中了/全部不选中
+        checkAllSelectedState: function () {
+            // 一级标签选中状态(如果一级标签全部被选中,则说明,全部按钮被选中)
+            var level1StateArr = []
+            // 所有标签选中状态
+            var allSelectedArr = []
+
+            this.selectList.forEach(function (level1) {
+                if (level1.level !== 0) {
+                    level1StateArr.push(level1.selected)
+                    allSelectedArr.push(level1.selected)
+                    level1.children.forEach(function (level2) {
+                        allSelectedArr.push(level2.selected)
+                    })
+                }
+            })
+
+            return {
+                // 找不到false,就说明全部被选中
+                allSelected: level1StateArr.indexOf(false) === -1,
+                // 找不到true,就说明没有一个被选中
+                allNotSelected: allSelectedArr.indexOf(true) === -1
+            }
+        },
+        /**
+         * 初始化页面选中状态
+         * @param { Array | undefined } data 要恢复的数据
+         */
+        setState: function (data) {
+            // 设置全部按钮
+            if (!data || Object.keys(data).length === 0) {
+                // 其他全部设置不选中,全部按钮设置选中
+                this.selectList.forEach(function (item) {
+                    item.selected = false
+                    item.children.forEach(function (iitem) {
+                        iitem.selected = false
+                    })
+                })
+
+                this.selectList[0].selected = true
+            } else {
+                this.setState()
+                this.selectList[0].selected = false
+
+                this.selectList.forEach(function (item) {
+                if (data[item.label]) {
+                    // 如果恢复数组长度等于页面二级标签长度,则一级标签点亮
+                    if (data[item.label].length === item.children.length) {
+                        item.selected = true
+                    }
+                    item.children.forEach(function (iitem) {
+                        if (data[item.label].indexOf(iitem.label) !== -1) {
+                            iitem.selected = true
+                        }
+                    })
+                }
+                })
+            }
+        },
+        // 获取选中的数据
+        getSelected: function () {
+            var map = {}
+
+            this.selectList.forEach(function (item) {
+                var mapArr = []
+
+                if (item.level !== 0) {
+                    item.children.forEach(function (iitem) {
+                        if (iitem.selected) {
+                            mapArr.push(iitem.label)
+                        }
+                    })
+                }
+
+                if (mapArr.length !== 0) {
+                    map[item.label] = mapArr
+                }
+            })
+
+            return map
+        },
+        onChange: function () {
+            var selected = this.getSelected()
+            this.$emit('change', selected)
+        },
+        // 计算需不需要进行展开等操作
+        calcNeedShowMoreOrNot: function () {
+            var buttonListTop = []
+            var buttonDOMList = this.$refs.selectItem
+            buttonDOMList.forEach(function (vm) {
+                buttonListTop.push(vm.getBoundingClientRect().top)
+            })
+            // 数组去重
+            buttonListTop = utils.unique(buttonListTop)
+            this.needShowMore = buttonListTop.length > 1
+        }
+    }
+}

+ 195 - 0
src/web/staticres/js/selector/select-list-pc.js

@@ -0,0 +1,195 @@
+// var selectListComponentTemplate = `
+// <div class="selector-content select-list-content" ref="selectContainer">
+//     <span class="action-button show-more" @click="showMore = !showMore" v-if="needShowMore">
+//         <span class="action-text">{{ showMore ? '收起' : '更多' }}</span>
+//         <span class="el-icon-arrow-down" :class="showMore ? 'rotate180' : ''"></span>
+//     </span>
+//     <div class="select-group-container" v-if="selectButtonType === 'checkbox'">
+//         <el-checkbox
+//             v-for="(item, index) in selectList"
+//             :key="index"
+//             :name="item.value"
+//             ref="selectItem"
+//             v-model="item.selected"
+//             v-show="showAll(item)"
+//             @change="changeState(item)"
+//         >{{ item.label }}</el-checkbox>
+//     </div>
+//     <div class="select-group-container" v-else-if="selectButtonType === 'button'">
+//         <div
+//             v-for="(item, index) in selectList"
+//             :key="index"
+//             ref="selectItem"
+//             class="j-button-item bgc"
+//             v-show="showAll(item)"
+//             :class="{
+//                 active: item.selected,
+//                 all: item.label === selectItemExp.label
+//             }"
+//             @click="changeState(item)"
+//         >{{ item.label }}</div>
+//     </div>
+// </div>
+// `
+
+var selectListComponentTemplate = "\n<div class=\"selector-content select-list-content\" ref=\"selectContainer\">\n    <span class=\"action-button show-more\" @click=\"showMore = !showMore\" v-if=\"needShowMore\">\n        <span class=\"action-text\">{{ showMore ? '\u6536\u8D77' : '\u66F4\u591A' }}</span>\n        <span class=\"el-icon-arrow-down\" :class=\"showMore ? 'rotate180' : ''\"></span>\n    </span>\n    <div class=\"select-group-container\" v-if=\"selectButtonType === 'checkbox'\">\n        <el-checkbox\n            v-for=\"(item, index) in selectList\"\n            :key=\"index\"\n            :name=\"item.value\"\n            ref=\"selectItem\"\n            v-model=\"item.selected\"\n            v-show=\"showAll(item)\"\n            @change=\"changeState(item)\"\n        >{{ item.label }}</el-checkbox>\n    </div>\n    <div class=\"select-group-container\" v-else-if=\"selectButtonType === 'button'\">\n        <div\n            v-for=\"(item, index) in selectList\"\n            :key=\"index\"\n            ref=\"selectItem\"\n            class=\"j-button-item bgc\"\n            v-show=\"showAll(item)\"\n            :class=\"{\n                active: item.selected,\n                all: item.label === selectItemExp.label\n            }\"\n            @click=\"changeState(item)\"\n        >{{ item.label }}</div>\n    </div>\n</div>\n";
+
+var selectListComponent = {
+    name: 'select-list-pc',
+    template: selectListComponentTemplate,
+    props: {
+        selectButtonType: {
+            type: String,
+            default: 'button' // checkbox/button
+        },
+        // 多选或者单选
+        multi: {
+            type: Boolean,
+            default: true
+        },
+        // 是否显示全部按钮
+        showAllButton: {
+            type: Boolean,
+            default: true
+        },
+        // 是否需要显示更多按钮
+        useShowMore: {
+            type: Boolean,
+            default: false
+        },
+        list: {
+            type: Array,
+            default: function () {
+                return [
+                    // {
+                    //     label: '',
+                    //     value: ''
+                    // }
+                ]
+            }
+        },
+        initSelectedList: {
+            type: Array,
+            default: function () {
+                return [
+                    // 'value'
+                ]
+            }
+        }
+    },
+    watch: {
+        list: function () {
+            this.initData()
+        },
+        initSelectedList: function (newVal) {
+            this.setState(newVal)
+        }
+    },
+    data: function () {
+        return {
+            needShowMore: false,
+            showMore: false,
+            selectList: [],
+            selectItemExp: {
+                label: '全部',
+                value: '',
+                selected: true
+            }
+        }
+    },
+    created: function () {
+        this.initData()
+    },
+    mounted: function () {
+        if (this.useShowMore) {
+            this.calcNeedShowMoreOrNot()
+        }
+    },
+    methods: {
+        initData: function () {
+            var arr = []
+            arr.push(JSON.parse(JSON.stringify(this.selectItemExp)))
+            this.list.forEach(function (item) {
+                var t = JSON.parse(JSON.stringify(item))
+                t.selected = false
+                arr.push(t)
+            })
+            this.selectList = arr
+        },
+        setState: function (arr) {
+            if (!arr || arr.length === 0) {
+                this.selectList.forEach(function (item) {
+                    item.selected = false
+                })
+                this.selectList[0].selected = true
+            } else {
+                this.selectList.forEach(function (item) {
+                    if (arr.indexOf(item.value) !== -1) {
+                        item.selected = true
+                    } else {
+                        item.selected = false
+                    }
+                })
+            }
+        },
+        getState: function () {
+            var arr = []
+            if (this.selectList[0].selected) {
+                return arr
+            }
+            this.selectList.forEach(function (item) {
+                if (item.selected) {
+                    arr.push(item.value)
+                }
+            })
+            return arr
+        },
+        onChange: function () {
+            var state = this.getState()
+            this.$emit('change', state)
+        },
+        changeState: function (item) {
+            if (item.label === this.selectItemExp.label) {
+                this.setState()
+            } else {
+                if (this.multi) {
+                    // 如果是checkbox的多选则不需要做任何操做
+                    if (this.selectButtonType === 'button') {
+                        this.selectList[0].selected = false
+                        item.selected = !item.selected
+                    }
+                } else {
+                    this.selectList.forEach(function (c) {
+                        c.selected = false
+                    })
+                    item.selected = !item.selected
+                }
+            }
+            this.onChange()
+        },
+        showAll: function (item) {
+            var isAllButton = item.label === this.selectItemExp.label
+            if (isAllButton) {
+                return this.showAllButton
+            } else {
+                return true
+            }
+        },
+        // 计算需不需要进行展开等操作
+        calcNeedShowMoreOrNot: function () {
+            var selectButtonType = this.selectButtonType
+            var buttonListTop = []
+            var buttonDOMList = this.$refs.selectItem
+            buttonDOMList.forEach(function (vm) {
+                if (selectButtonType === 'checkbox') {
+                    buttonListTop.push(vm.$el.getBoundingClientRect().top)
+                } else {
+                    buttonListTop.push(vm.getBoundingClientRect().top)
+                }
+            })
+            // 数组去重
+            buttonListTop = utils.unique(buttonListTop)
+            this.needShowMore = buttonListTop.length > 1
+        }
+    }
+}

+ 271 - 1
src/web/templates/frontRouter/pc/collection/sess/index.html

@@ -1 +1,271 @@
-测试
+
+<html lang="zh-cn">
+	<head>
+		<title>招标收藏_{{Msg "seo" "qfw.swordfishsl.title"}}</title>
+		<meta name="Keywords" content="{{Msg "seo" "qfw.swordfishsl.key"}}"/>
+		<meta name="Description" content="{{Msg "seo" "qfw.swordfishsl.description"}}"/>
+		<meta name="renderer" content="webkit">
+		<meta content="telephone=no" name="format-detection"/>
+        <meta content="招标收藏" theme="light" name="enable-header"/>
+		{{include "/common/pnc.html"}}
+		<link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "version"}}" rel="stylesheet" />
+		<link href="{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}" rel="stylesheet" />
+		<link href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}" rel="stylesheet" />
+
+        <script src="{{Msg "seo" "cdn"}}/js/jquery.cookie.js"></script>
+		<script src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}"></script>
+        
+        <link href="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/theme-chalk/index.css" rel="stylesheet" />
+        <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/ele-reset.css?v={{Msg "seo" "version"}}'>
+        <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/css/selector/selector.css?v={{Msg "seo" "version"}}'>
+        <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/collection/css/index-pc.css?v={{Msg "seo" "version"}}'>
+        <style>
+            .collection-container {
+                line-height: 1;
+                padding-top: 64px;
+                min-height: calc(100vh - 364px);
+            }
+        </style>
+	</head>
+
+	<body>
+	{{include "/common/pchead.html"}}
+	<section class="collection-container" >
+        <div class="collection-header w">
+            <h3 class="tab-title">标讯收藏</h3>
+        </div>
+        <div class="search-content w" v-cloak>
+            <div class="selector-card-container search-filters" v-if="power">
+                <div class="selector-card">
+                    <div class="selector-card-header">个人标签:</div>
+                    <div class="selector-card-content tag-list-container">
+                        <select-list-component
+                            :init-selected-list="filterState.tags"
+                            :list="tagSelectList"
+                            @change="tagFilterChange"
+                        ></select-list-component>
+                        <div class="manage-tags" @click="openTagDrawer">标签管理</div>
+                    </div>
+                    <el-drawer
+                        :visible.sync="tagDrawer.show"
+                        :modal="false"
+                        custom-class="tag-drawer"
+                        :show-close="false"
+                        size="540"
+                        @close="drawerCancel">
+                        <template v-slot:title>
+                            <span class="tag-title">标签管理</span>
+                            <span class="tag-count" v-text="tagSelectList.length"></span>
+                        </template>
+                        <div class="tag-container">
+                            <div class="tag-main">
+                                <el-tag
+                                    :key="tag.value"
+                                    v-for="tag in tagSelectList"
+                                    closable
+                                    type="info"
+                                    :disable-transitions="false"
+                                    @close="delThisTag(tag)">
+                                    ${ tag.label } ( ${ tag.count } )
+                                </el-tag>
+                            </div>
+                            <div class="tag-footer">
+                                <button class="j-t-button confirm" @click="drawerConfirm">确定</button>
+                                <button class="j-t-button cancel" @click="drawerCancel">取消</button>
+                            </div>
+                        </div>
+                    </el-drawer>
+                </div>
+                <div class="selector-card">
+                    <div class="selector-card-header">收藏日期:</div>
+                    <div class="selector-card-content">
+                        <date-time-component
+                            :show-select-group="false"
+                            @change="dateTimeFilterChange"
+                        ></date-time-component>
+                    </div>
+                </div>
+                <div class="selector-card">
+                    <div class="selector-card-header">采购单位类型:</div>
+                    <div class="selector-card-content">
+                        <select-level2-component
+                            :map="buyclassMap"
+                            @change="buyerClassFilterChange"
+                        ></select-level2-component>
+                    </div>
+                </div>
+                <div class="selector-card">
+                    <div class="selector-card-header">其他筛选条件:</div>
+                    <div class="selector-card-content flex mini-select other-filter">
+                        <el-select v-model="filterState.buyerPhone" @change="otherFilterChange" clearable placeholder="采购单位联系方式">
+                            <el-option
+                                v-for="item in buyerPhoneOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                        <el-select v-model="filterState.bidPhone" @change="otherFilterChange" clearable placeholder="中标企业联系方式">
+                            <el-option
+                                v-for="item in buyerPhoneOptions"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select>
+                    </div>
+                </div>
+            </div>
+            <div class="collect-list-container">
+                <div class="collect-list-header">
+                    <div class="c-tab-container flex">
+                        <div class="left flex">
+                            <el-checkbox v-model="currentPageAllChecked" @change="allCheckboxChange"></el-checkbox>
+                            <div class="list-title">标讯收藏</div>
+                        </div>
+                        <div class="right flex">
+                            <div class="right-line flex">
+                                <div class="icon-box flex" @click="changeListType('line')" :class="listState.listType === 'line' ? 'active' : ''">
+                                    <span class="j-icon" :class="listState.listType === 'line' ? 'icon-list-active' : 'icon-list'"></span>
+                                    <span class="icon-text">列表</span>
+                                </div>
+                                <div class="icon-box flex" @click="changeListType('table')" :class="listState.listType === 'table' ? 'active' : ''">
+                                    <span class="j-icon" :class="listState.listType === 'table' ? 'icon-table-active' : 'icon-table'"></span>
+                                    <span class="icon-text">表格</span>
+                                </div>
+                            </div>
+                            <div class="icon-box flex right-line" @click="dataExport">
+                                <span class="j-icon icon-data-export"></span>
+                                <span class="icon-text">数据导出</span>
+                            </div>
+                            <div class="icon-box flex" @click="unStarSelected">
+                                <span class="j-icon icon-star"></span>
+                                <span class="icon-text">取消收藏</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="collect-list-content no-select">
+                    <div class="list collect-line-list" v-loading="listState.loading" v-show="listState.listType === 'line'">
+                        <div class="list-item flex" v-for="(item, index) in listState.list" :key="item._id">
+                            <div class="pre-container flex">
+                                <el-checkbox v-model="item.selected" @change="listItemCheckboxChange"></el-checkbox>
+                                <div class="list-index">${ item.index }. </div>
+                            </div>
+                            <article-item-component
+                                :title="item.title"
+                                :time="item.publishtime"
+                                :tags="calcArticleItemTags(item)"
+                                @click="toListDetail(item)"
+                            ></article-item-component>
+                            <div class="append-container">
+                                <span class="j-icon" :class="item.star ? 'icon-star-active' : 'icon-star'" @click.prevent.stop="unStarThis(item)"></span>
+                            </div>
+                        </div>
+                        <no-data style="display: none;" v-show="listState.list.length === 0 && listState.loaded" tip-text="暂未收藏标讯"></no-data>
+                    </div>
+                    <div class="list collect-table-list" v-loading="listState.loading" v-show="listState.listType === 'table'" style="display: none;">
+                        <table class="table">
+                            <thead class="thead">
+                                <tr>
+                                    <td width="48">序号</td>
+                                    <td width="315" class="deep-border">项目名称</td>
+                                    <td width="84">公告类型</td>
+                                    <td width="73" class="deep-border">预算<br />(万元)</td>
+                                    <td width="181">招标单位</td>
+                                    <td width="103" class="deep-border">开标日期</td>
+                                    <td width="174">中标单位</td>
+                                    <td width="76" class="deep-border">中标金额<br />(万元)</td>
+                                    <td width="103">发布日期</td>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr v-for="(item, index) in listState.list" :key="item._id" @click="toListDetail(item)">
+                                    <td width="48">${ item.index }</td>
+                                    <td width="315" class="tt-l">${ item.title }</td>
+                                    <td width="84">${ calcArticleType(item.type) }</td>
+                                    <td width="73" class="tt-r">${ calcMoney(item.budget) }</td>
+                                    <td width="181" class="tt-l">${ item.buyer }</td>
+                                    <td width="103">${ calcTime(item.bidopentime ? item.bidopentime * 1000 : null, 'yyyy-MM-dd HH:mm') }</td>
+                                    <td width="174" class="tt-l">${ item.s_winner }</td>
+                                    <td width="76" class="tt-r">${ calcMoney(item.bidamount) }</td>
+                                    <td width="103">${ calcTime(item.publishtime ? item.publishtime * 1000 : null, 'yyyy-MM-dd') }</td>
+                                </tr>
+                            </tbody>
+                        </table>
+                        <no-data style="display: none;" v-show="listState.list.length === 0 && listState.loaded" tip-text="暂未收藏标讯"></no-data>
+                    </div>
+                </div>
+            </div>
+            <div class="el-pagination-container">
+                <el-pagination
+                    background
+                    layout="prev, pager, next, ->"
+                    :hide-on-single-page="true"
+                    :current-page="listState.pageNum"
+                    :page-size="listState.pageSize"
+                    :total="listState.total"
+                    @current-change="onPageChange"
+                ></el-pagination>
+            </div>
+            <el-dialog
+                :modal="false"
+                top="0"
+                :lock-scroll="true"
+                custom-class="j-el-toast tag-del"
+                :close-on-click-modal="false"
+                :show-close="false"
+                :visible.sync="tagDrawer.toastShow"
+                width="30%"
+                center>
+                标签已删除
+            </el-dialog>
+            <el-dialog
+                :modal="false"
+                top="0"
+                :lock-scroll="true"
+                custom-class="j-el-toast"
+                :close-on-click-modal="false"
+                :show-close="false"
+                :visible.sync="toast.show"
+                width="30%"
+                center>
+                ${ toast.content }
+            </el-dialog>
+            <el-dialog
+                title="删除标签"
+                :visible.sync="tagDrawer.dialogShow"
+                custom-class="j-el-confirm"
+                :show-close="false"
+                top="25vh"
+                width="30%">
+                <span>确定删除该标签?</span>
+                <span slot="footer" class="dialog-footer">
+                    <button class="j-t-button confirm" @click="delThisTagConfirm">确 定</el-button>
+                    <button class="j-t-button cancel" @click="tagDrawer.dialogShow=false">取 消</button>
+                </span>
+            </el-dialog>
+        </div>
+        <div class="search-footer w"></div>
+    </section>
+
+    {{include "/common/pcbottom.html"}}
+    {{include "/common/baiducc.html"}}
+
+    <script src="//cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
+    <script src="//cdn.jsdelivr.net/npm/element-ui@2.13.2/lib/index.js"></script>
+    <script src="{{Msg "seo" "cdn"}}/big-member/js/utils.js?v={{Msg "seo" "version"}}"></script>
+    <script>
+        haslogin({{.T.logid}})
+    </script>
+    <script src='{{Msg "seo" "cdn"}}/common-module/selector/js/buyerClass.js'></script>
+    <script src='{{Msg "seo" "cdn"}}/js/selector/select-list-pc.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/js/selector/date-time-pc.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/js/selector/select-level2-pc.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/js/selector/article-item-pc.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/js/selector/no-data-pc.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Msg "seo" "cdn"}}/collection/js/index-pc.js?v={{Msg "seo" "version"}}'></script>
+</body>
+
+</html>
+

+ 114 - 0
src/web/templates/frontRouter/wx/collection/sess/index.html

@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport"
+        content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="format-detection" content="telephone=yes"/>
+    <meta name="apple-mobile-web-app-status-bar-style" content="black">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <meta http-equiv="X-UA-Compatible" content="ie=edge">
+    <title>标讯收藏</title>
+    <script src="/big-member/js/rem.js"></script>
+    <script src="/big-member/js/utils.js"></script>
+    <!--S-当前页面的css资源-->
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/reset-css@4.0.1/reset.min.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/index.css />
+    <link rel="stylesheet" href=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/icon/local.css />
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/public.css?v={{Msg "seo" "version"}}'>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
+</head>
+<style>
+  .list-mian{
+    height: 100%;
+    overflow: hidden;
+  }
+  .list-mian .van-list{
+    height: 100%;
+    overflow: auto;
+  }
+</style>
+<body>
+  <div class="j-container">
+    {{include "/big-member/header.html"}}
+    <div class="j-main collection" id="myCollection" v-cloak ref="main">
+      <div class="j-container">
+        <div class="j-main">
+          <div class="search-container van-fade-an" ref="searchContainer">
+            <div class="listaction">
+              <div class="action_editor" @click="screenBtn">筛选</div>
+              <div class="data_report">
+                <div class="collec_datareport" @click="dataReport">
+                  <span class="data_download"></span>
+                  <span class="data text">数据导出</span>
+                </div>
+              </div>
+            </div>
+          </div>
+          <van-dropdown-menu v-show="limitshow" :get-container="getContainer" :close-on-click-outside="false">
+            <van-dropdown-item  title="个人标签"  ref="tagItem">
+              <tags-component @confirm="confirm" @cancel="cancel" :taglist="tagList"></tags-component>
+            </van-dropdown-item>
+            <van-dropdown-item title="收藏日期" ref="dateItem">
+              <date-component @confirm="confirm" @cancel="cancel"></date-component>
+            </van-dropdown-item>
+            <van-dropdown-item title="采购单位类型" ref="cateItem">
+              <cate-component @confirm="confirm" @cancel="cancel"></cate-component>
+            </van-dropdown-item>
+            <van-dropdown-item ref="buyerItem" v-model="limitlist.buyerPhone" title="采购单位联系方式">
+              <phone-component :data="params.buyerData" @confirm="confirm"></phone-component>
+            </van-dropdown-item>
+            <van-dropdown-item ref="winnerItem" v-model="limitlist.winnerPhone"  title="中标企业联系方式">
+              <phone-component :data="params.winnerData" @confirm="confirm"></phone-component>
+            </van-dropdown-item>
+          </van-dropdown-menu>
+          <div class="list-mian">
+            <van-list
+              v-model="listState.loading"
+              :finished="listState.finished"
+              finished-text="没有更多了"
+              @load="getList"
+            >
+              <div class="collec_li" v-for="(item, index) in listState.list" :key="index" @click="linkRouter(item._id)">
+                <div class="collec_head">
+                  <div class="collec_title ellipsis-2">
+                    ${item.title}
+                  </div>
+                  <div class="collec_star" @click="collecClick(item._id)">
+                    <span class="shoucang" v-if="condition"></span>
+                    <!-- <span class="weishoucang" v-if="!condition"></span> -->
+                  </div>
+                </div>
+                <div class="collec_action">
+                  <ul class="collec_tags">
+                    <li class="tag_active" v-if="item.area&&item.area!==''">${item.area}</li>
+                    <li class="tag_active" v-if="item.buyerclass&&item.buyerclass!==''">${item.buyerclass}</li>
+                    <li class="tag_active" v-if="item.type&&item.type!==''">${item.type}</li>
+                    <li class="tag_active" v-if="item.bidamount&&item.bidamount!==''">${item.bidamount}</li>
+                  </ul>
+                  <div class="collec_time">${item.publishtime}</div>
+                </div>
+              </div>
+            </van-list>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <!--S-当前页面的资源-->
+  <script src=//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js></script>
+  <script src=//cdn.jsdelivr.net/npm/vant@2.11.1/lib/vant.min.js></script>
+  <script src=//cdn.jsdelivr.net/npm/zepto@1.2.0/dist/zepto.min.js></script>
+  <!--E-当前页面的资源-->
+  {{include "/big-member/commonjs.html"}}
+  <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/tags-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/phone-mobile.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/index-wx.js?v={{Msg "seo" "version"}}'></script>
+  {{include "/common/baiducc.html"}}
+</body>
+
+</html>