Selaa lähdekoodia

Merge branch 'master' of https://git.dev.advichcloud.com/feixiang/xinkeaboard

feix0518 17 tuntia sitten
vanhempi
commit
29996cb555
100 muutettua tiedostoa jossa 2345 lisäystä ja 547 poistoa
  1. 2 2
      xinkeaboard-admin/config/config.js
  2. 8 1
      xinkeaboard-admin/config/router.config.js
  3. 1 0
      xinkeaboard-admin/package.json
  4. 103 8
      xinkeaboard-admin/pnpm-lock.yaml
  5. BIN
      xinkeaboard-admin/src/assets/bigscreen/head.png
  6. BIN
      xinkeaboard-admin/src/assets/bigscreen/screen-bg.jpg
  7. 4 2
      xinkeaboard-admin/src/components/GlobalHeader/RightContent.js
  8. 15 15
      xinkeaboard-admin/src/components/MDiyItemEdit/index.js
  9. 5 4
      xinkeaboard-admin/src/components/PageLoading/index.js
  10. 32 0
      xinkeaboard-admin/src/components/SiteSelector/index.js
  11. 0 0
      xinkeaboard-admin/src/components/SiteSelector/index.less
  12. 2 2
      xinkeaboard-admin/src/components/SldComHeader/index.js
  13. 1 0
      xinkeaboard-admin/src/components/SldModal/SldModal.less
  14. 4 4
      xinkeaboard-admin/src/components/SldSelMoreLeftRightActivityGoods/index.js
  15. 4 4
      xinkeaboard-admin/src/components/SldSelMoreLeftRightCategoryAndGoods/index.js
  16. 4 4
      xinkeaboard-admin/src/components/SldSelMoreLeftRightGoods/index.js
  17. 4 4
      xinkeaboard-admin/src/components/SldSelMoreLeftRightLive/index.js
  18. 4 4
      xinkeaboard-admin/src/components/SldSelMoreLeftRightStore/index.js
  19. 3 4
      xinkeaboard-admin/src/components/SldSeleTpl/SldSeleTpl.js
  20. 30 14
      xinkeaboard-admin/src/components/SldTableEdit/SldTableEdit.js
  21. 56 0
      xinkeaboard-admin/src/components/WordCloud/index.js
  22. 13 13
      xinkeaboard-admin/src/components/point/MDiyItemEdit/index.js
  23. 4 4
      xinkeaboard-admin/src/components/point/SldSelMoreLeftRightGoods/index.js
  24. 15 15
      xinkeaboard-admin/src/components/spreader/MDiyItemEdit/index.js
  25. 4 4
      xinkeaboard-admin/src/components/spreader/SldSelMoreLeftRightGoods/index.js
  26. 28 0
      xinkeaboard-admin/src/global.less
  27. 1 13
      xinkeaboard-admin/src/layouts/BasicLayout.js
  28. 47 0
      xinkeaboard-admin/src/layouts/index.js
  29. 6 2
      xinkeaboard-admin/src/locales/en-US/content.js
  30. 5 2
      xinkeaboard-admin/src/locales/zh-CN/content.js
  31. 33 0
      xinkeaboard-admin/src/models/global.js
  32. 1 2
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_05.js
  33. 2 2
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_06.js
  34. 2 2
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_07.js
  35. 2 2
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_08.js
  36. 3 3
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_09.js
  37. 3 3
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_10.js
  38. 3 3
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_11.js
  39. 5 5
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_12.js
  40. 7 7
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_13.js
  41. 7 7
      xinkeaboard-admin/src/pages/decorate/pc/home/adv_14.js
  42. 4 4
      xinkeaboard-admin/src/pages/decorate/pc/home/diy_page_lists.js
  43. 12 12
      xinkeaboard-admin/src/pages/decorate/pc/home/edit_diy_page_head.js
  44. 4 4
      xinkeaboard-admin/src/pages/decorate/pc/home/main_banner_pc.js
  45. 4 4
      xinkeaboard-admin/src/pages/decorate/pc/topic/topic_diy_page_lists.js
  46. 39 3
      xinkeaboard-admin/src/pages/manage/store/apply_store_detail.js
  47. 4 3
      xinkeaboard-admin/src/pages/manage/store/own_list.js
  48. 1 1
      xinkeaboard-admin/src/pages/member/recharge_setting.js
  49. 75 15
      xinkeaboard-admin/src/pages/statistics/realtime.js
  50. 22 0
      xinkeaboard-admin/src/pages/statistics/realtime.less
  51. 53 39
      xinkeaboard-admin/src/pages/sysset/agreement/edit.js
  52. 2 1
      xinkeaboard-admin/src/pages/sysset/agreement/lists.js
  53. 2 2
      xinkeaboard-admin/src/pages/sysset/base/about_us.js
  54. 73 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/components/DataShow.js
  55. 43 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/components/HeadContent.js
  56. 24 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/components/PanelBlock.js
  57. 11 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/components/PanelNav.js
  58. 43 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/components/RadioButtonGroup.js
  59. 166 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/index.js
  60. 78 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/index.less
  61. 69 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/styles/data_show.less
  62. 31 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/styles/header_content.less
  63. 18 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/styles/panel_block.less
  64. 11 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/styles/panel_nav.less
  65. 37 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/styles/radio_button_group.less
  66. 6 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/theme.less
  67. 113 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getBarChartOptions.js
  68. 87 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getLineChartOptions.js
  69. 75 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getPieChartOptions.js
  70. 1 0
      xinkeaboard-admin/src/pages/sysset/bigscreen/utils/tableColumn.js
  71. 78 6
      xinkeaboard-admin/src/pages/sysset/home/basic.js
  72. 19 0
      xinkeaboard-admin/src/pages/sysset/home/basic.less
  73. 26 0
      xinkeaboard-admin/src/pages/sysset/models/bigscreen.js
  74. 2 1
      xinkeaboard-admin/src/pages/sysset/notice_set/email.js
  75. 2 1
      xinkeaboard-admin/src/pages/sysset/notice_set/sms.js
  76. 4 4
      xinkeaboard-admin/src/utils/util_data.js
  77. 19 6
      xinkeaboard-admin/src/utils/utils.js
  78. 3 3
      xinkeaboard-seller/config/config.js
  79. 2 2
      xinkeaboard-seller/config/router.config.js
  80. 6 2
      xinkeaboard-seller/src/components/GlobalHeader/RightContent.js
  81. 5 4
      xinkeaboard-seller/src/components/PageLoading/index.js
  82. 2 3
      xinkeaboard-seller/src/components/SiteSelector/index.js
  83. 1 1
      xinkeaboard-seller/src/components/SldTableRowThree/index.js
  84. 5 0
      xinkeaboard-seller/src/components/SldTableRowThree/index.less
  85. 12 1
      xinkeaboard-seller/src/global.less
  86. 4 17
      xinkeaboard-seller/src/layouts/BasicLayout.js
  87. 62 0
      xinkeaboard-seller/src/layouts/index.js
  88. 3 3
      xinkeaboard-seller/src/models/global.js
  89. 12 2
      xinkeaboard-seller/src/models/project.js
  90. 20 4
      xinkeaboard-seller/src/pages/User/Login.js
  91. 21 3
      xinkeaboard-seller/src/pages/goods/add_goods.js
  92. 93 71
      xinkeaboard-seller/src/pages/settledManage/baseInfo/index.js
  93. 283 146
      xinkeaboard-seller/src/pages/settledManage/businessInfo/index.js
  94. 1 0
      xinkeaboard-seller/src/pages/settledManage/businessInfo/index.less
  95. 1 1
      xinkeaboard-seller/src/pages/settledManage/models/settled.js
  96. 58 14
      xinkeaboard-seller/src/pages/settledManage/openUp/open_up.js
  97. 10 3
      xinkeaboard-seller/src/utils/utils.js
  98. 4 0
      xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/WebUtil.java
  99. 3 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/goods/dto/GoodsAttributeAddDTO.java
  100. 3 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/goods/dto/GoodsAttributeUpdateDTO.java

+ 2 - 2
xinkeaboard-admin/config/config.js

@@ -75,8 +75,8 @@ export default {
   },
   proxy: {
     "/api/": {
-      target: "http://54.46.9.88:8001/",
-      // target: 'http://192.168.0.158:8001/',
+      // target: "http://54.46.9.88:8001/",
+      target: 'http://192.168.0.158:8001/',
       changeOrigin: true,
       pathRewrite: { "^/api": "" },
     },

+ 8 - 1
xinkeaboard-admin/config/router.config.js

@@ -54,7 +54,7 @@ export default [
   // app
   {
     path: '/',
-    component: '../layouts/BasicLayout',
+    component: '../layouts/index',
     Routes: ['src/pages/CheckLogin'],
     routes: [
       { path: '/', redirect: '/sysset_home/basic' },
@@ -64,6 +64,13 @@ export default [
         icon: 'home',
         name: 'home',
         routes: [
+          // 大屏管理
+          { 
+            path: '/sysset_home/bigscreen',
+            icon: 'home',
+            name: 'bigscreen',
+            component: './sysset/bigscreen/index',
+          },
           //概况页
           {
             path: '/sysset_home/basic',

+ 1 - 0
xinkeaboard-admin/package.json

@@ -73,6 +73,7 @@
     "react-resizable": "1.7.5",
     "react-router-dom": "^4.3.1",
     "react-slick": "^0.27.11",
+    "react-wordcloud": "^1.2.7",
     "slick-carousel": "^1.8.1",
     "umi-plugin-locale": "^2.11.7"
   },

+ 103 - 8
xinkeaboard-admin/pnpm-lock.yaml

@@ -140,6 +140,9 @@ importers:
       react-slick:
         specifier: ^0.27.11
         version: 0.27.14(react-dom@16.14.0(react@16.14.0))(react@16.14.0)
+      react-wordcloud:
+        specifier: ^1.2.7
+        version: 1.2.7(react@16.14.0)
       slick-carousel:
         specifier: ^1.8.1
         version: 1.8.1(jquery@3.7.1)
@@ -252,9 +255,6 @@ importers:
       umi-plugin-react:
         specifier: ^1.2.0
         version: 1.15.9(@babel/core@7.28.0)(react-dom@16.14.0(react@16.14.0))(react-router@5.1.2(react@16.14.0))(react@16.14.0)(redbox-react@1.6.0(react-dom@16.14.0(react@16.14.0))(react@16.14.0))
-      vue-cli-plugin-style-resources-loader:
-        specifier: ^0.1.5
-        version: 0.1.5
     optionalDependencies:
       puppeteer:
         specifier: ^1.10.0
@@ -1359,6 +1359,9 @@ packages:
   '@polka/url@1.0.0-next.29':
     resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
 
+  '@popperjs/core@2.11.8':
+    resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
+
   '@probe.gl/env@3.6.0':
     resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==}
 
@@ -3243,6 +3246,12 @@ packages:
   d3-array@1.2.4:
     resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==}
 
+  d3-array@2.12.1:
+    resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+
+  d3-cloud@1.2.7:
+    resolution: {integrity: sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w==}
+
   d3-collection@1.0.7:
     resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==}
 
@@ -3272,6 +3281,9 @@ packages:
   d3-force@2.1.1:
     resolution: {integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==}
 
+  d3-format@2.0.0:
+    resolution: {integrity: sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==}
+
   d3-geo-projection@2.1.2:
     resolution: {integrity: sha512-zft6RRvPaB1qplTodBVcSH5Ftvmvvg0qoDiqpt+fyNthGr/qr+DD30cizNDluXjW7jmo7EKUTjvFCAHofv08Ow==}
     hasBin: true
@@ -3313,12 +3325,24 @@ packages:
   d3-sankey@0.7.1:
     resolution: {integrity: sha512-KAyowBWtTLQxyXq1UhXcdCXKbuCQvL51FgqOS+fKlNTQ/4FfSWabRlWs2DezzwKyredAsOhBSQZN/i0XdeE2tQ==}
 
+  d3-scale-chromatic@1.5.0:
+    resolution: {integrity: sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==}
+
+  d3-scale@3.3.0:
+    resolution: {integrity: sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==}
+
   d3-selection@1.4.2:
     resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==}
 
   d3-shape@1.3.7:
     resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
 
+  d3-time-format@3.0.0:
+    resolution: {integrity: sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==}
+
+  d3-time@2.1.1:
+    resolution: {integrity: sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==}
+
   d3-timer@1.0.10:
     resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==}
 
@@ -5266,6 +5290,9 @@ packages:
     resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
     engines: {node: '>= 0.4'}
 
+  internmap@1.0.1:
+    resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
+
   interpret@1.4.0:
     resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
     engines: {node: '>= 0.10'}
@@ -6239,6 +6266,9 @@ packages:
   lodash.camelcase@4.3.0:
     resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
 
+  lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
   lodash.debounce@4.0.8:
     resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
 
@@ -8258,6 +8288,11 @@ packages:
   react-tween-state@0.1.5:
     resolution: {integrity: sha512-sJQpjsdn0wjlDIUpfpb7jQGnOG8hAEW2e8k0KPA+xmf5KFa6Xat2JldbmxBhaqP0S/uIXhVE5ymKyH/b9X8nYA==}
 
+  react-wordcloud@1.2.7:
+    resolution: {integrity: sha512-pyXvL8Iu2J258Qk2/kAwY23dIVhNpMC3dnvbXRkw5+Ert5EkJWwnwVjs9q8CmX38NWbfCKhGmpjuumBoQEtniw==}
+    peerDependencies:
+      react: ^16.13.0
+
   react@16.14.0:
     resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==}
     engines: {node: '>=0.10.0'}
@@ -8813,6 +8848,9 @@ packages:
   seamless-immutable@7.1.4:
     resolution: {integrity: sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A==}
 
+  seedrandom@3.0.5:
+    resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==}
+
   select-hose@2.0.0:
     resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
 
@@ -9594,6 +9632,9 @@ packages:
   tinycolor2@1.6.0:
     resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
 
+  tippy.js@6.3.7:
+    resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==}
+
   tldts-core@6.1.86:
     resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
 
@@ -10193,9 +10234,6 @@ packages:
   vm-browserify@1.1.2:
     resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
 
-  vue-cli-plugin-style-resources-loader@0.1.5:
-    resolution: {integrity: sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==}
-
   w3c-hr-time@1.0.2:
     resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
     deprecated: Use your platform's native performance.now() and performance.timeOrigin.
@@ -12591,6 +12629,8 @@ snapshots:
 
   '@polka/url@1.0.0-next.29': {}
 
+  '@popperjs/core@2.11.8': {}
+
   '@probe.gl/env@3.6.0':
     dependencies:
       '@babel/runtime': 7.27.6
@@ -15314,6 +15354,14 @@ snapshots:
 
   d3-array@1.2.4: {}
 
+  d3-array@2.12.1:
+    dependencies:
+      internmap: 1.0.1
+
+  d3-cloud@1.2.7:
+    dependencies:
+      d3-dispatch: 1.0.6
+
   d3-collection@1.0.7: {}
 
   d3-color@1.4.1: {}
@@ -15343,6 +15391,8 @@ snapshots:
       d3-quadtree: 2.0.0
       d3-timer: 2.0.0
 
+  d3-format@2.0.0: {}
+
   d3-geo-projection@2.1.2:
     dependencies:
       commander: 2.20.3
@@ -15389,12 +15439,33 @@ snapshots:
       d3-collection: 1.0.7
       d3-shape: 1.3.7
 
+  d3-scale-chromatic@1.5.0:
+    dependencies:
+      d3-color: 1.4.1
+      d3-interpolate: 1.4.0
+
+  d3-scale@3.3.0:
+    dependencies:
+      d3-array: 2.12.1
+      d3-format: 2.0.0
+      d3-interpolate: 1.4.0
+      d3-time: 2.1.1
+      d3-time-format: 3.0.0
+
   d3-selection@1.4.2: {}
 
   d3-shape@1.3.7:
     dependencies:
       d3-path: 1.0.9
 
+  d3-time-format@3.0.0:
+    dependencies:
+      d3-time: 2.1.1
+
+  d3-time@2.1.1:
+    dependencies:
+      d3-array: 2.12.1
+
   d3-timer@1.0.10: {}
 
   d3-timer@2.0.0: {}
@@ -17883,6 +17954,8 @@ snapshots:
       hasown: 2.0.2
       side-channel: 1.1.0
 
+  internmap@1.0.1: {}
+
   interpret@1.4.0: {}
 
   intl-format-cache@2.2.9: {}
@@ -19117,6 +19190,8 @@ snapshots:
 
   lodash.camelcase@4.3.0: {}
 
+  lodash.clonedeep@4.5.0: {}
+
   lodash.debounce@4.0.8: {}
 
   lodash.defaultsdeep@4.6.1: {}
@@ -21732,6 +21807,22 @@ snapshots:
       raf: 3.4.1
       tween-functions: 1.2.0
 
+  react-wordcloud@1.2.7(react@16.14.0):
+    dependencies:
+      d3-array: 2.12.1
+      d3-cloud: 1.2.7
+      d3-dispatch: 1.0.6
+      d3-scale: 3.3.0
+      d3-scale-chromatic: 1.5.0
+      d3-selection: 1.4.2
+      d3-transition: 1.3.2
+      lodash.clonedeep: 4.5.0
+      lodash.debounce: 4.0.8
+      react: 16.14.0
+      resize-observer-polyfill: 1.5.1
+      seedrandom: 3.0.5
+      tippy.js: 6.3.7
+
   react@16.14.0:
     dependencies:
       loose-envify: 1.4.0
@@ -22479,6 +22570,8 @@ snapshots:
 
   seamless-immutable@7.1.4: {}
 
+  seedrandom@3.0.5: {}
+
   select-hose@2.0.0: {}
 
   selfsigned@1.10.14:
@@ -23541,6 +23634,10 @@ snapshots:
 
   tinycolor2@1.6.0: {}
 
+  tippy.js@6.3.7:
+    dependencies:
+      '@popperjs/core': 2.11.8
+
   tldts-core@6.1.86: {}
 
   tldts@6.1.86:
@@ -24570,8 +24667,6 @@ snapshots:
 
   vm-browserify@1.1.2: {}
 
-  vue-cli-plugin-style-resources-loader@0.1.5: {}
-
   w3c-hr-time@1.0.2:
     dependencies:
       browser-process-hrtime: 1.0.0

BIN
xinkeaboard-admin/src/assets/bigscreen/head.png


BIN
xinkeaboard-admin/src/assets/bigscreen/screen-bg.jpg


+ 4 - 2
xinkeaboard-admin/src/components/GlobalHeader/RightContent.js

@@ -4,6 +4,7 @@ import { Tag, Menu, Icon, Tooltip } from 'antd';
 import moment from 'moment';
 import groupBy from 'lodash/groupBy';
 import HeaderDropdown from '../HeaderDropdown';
+import SiteSelector from '../SiteSelector';
 import styles from './index.less';
 import { sldComLanguage } from '@/utils/utils';
 import { specialFlag } from '@/utils/sldconfig';
@@ -101,7 +102,7 @@ export default class GlobalHeaderRight extends PureComponent {
 		}
 		return (
 			<div className={className}>
-				<Tooltip title={formatMessage({ id: `${sldComLanguage('同步')}` })}>
+				{/* <Tooltip title={formatMessage({ id: `${sldComLanguage('同步')}` })}>
 					<a
 						onClick={()=>this.handleSync()}
 						href={'javascript:void(0)'}
@@ -110,7 +111,8 @@ export default class GlobalHeaderRight extends PureComponent {
 					>
 						<Icon style={{ color: '#555', fontSize: 16 }} type="sync"/>
 					</a>
-				</Tooltip>
+				</Tooltip> */}
+				<SiteSelector></SiteSelector>
 				<HeaderDropdown overlay={menu}>
             <span className={`${styles.action} ${styles.account}`}>
               <span

+ 15 - 15
xinkeaboard-admin/src/components/MDiyItemEdit/index.js

@@ -1595,7 +1595,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#e3e5e9', 'color')}>重置</a>
+              <a onClick={(e) => { e.preventDefault(); this.onChange('#e3e5e9', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1657,7 +1657,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#fff', 'color')}>重置</a>
+              <a onClick={(e) => { e.preventDefault(); this.onChange('#fff', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1841,8 +1841,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => { e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 <span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>
               </div>
 
@@ -1989,8 +1989,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data)}}>+ 添加</a>
                 <span className={`${styles.tip}`}>最少添加1个</span>
               </div>
 
@@ -2082,8 +2082,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>视频添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreSvideo(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => { e.preventDefault(); this.selMoreSvideo(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加{this.sele_more_svideo.min_num}个</span>*/}
               </div>
 
@@ -2181,8 +2181,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>直播添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreLive(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreLive(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加30个</span>*/}
               </div>
 
@@ -2311,8 +2311,8 @@ export default class MDiyItem extends Component {
                  style={{ height: 70 }}>
               <span className={`${styles.required}`}>*</span>
               <span className={`${styles.title}`}>数据添加:</span>
-              <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                 onClick={() => this.selMoreTabData(data, more_tab_index)}>+ 添加</a>
+              <a className={`${styles.add_svideo_btn}`}
+                 onClick={(e) => {e.preventDefault(); this.selMoreTabData(data, more_tab_index) }}>+ 添加</a>
               <span className={`${styles.tip}`}>需要选择偶数个,最少2个</span>
             </div>
             {more_tab_item.info.length > 0 && this.renderMoreTabSeleData(more_tab_item.info, more_tab_item.data_type, more_tab_index)}
@@ -2367,7 +2367,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker2', true)}>
                 <span style={{ backgroundColor: data.tag_bg_color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('', 'tag_bg_color')}>默认</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('', 'tag_bg_color') }}>默认</a>
             </div>
 
             {showColorPicker2 && (
@@ -2413,8 +2413,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>*/}
               </div>
 

+ 5 - 4
xinkeaboard-admin/src/components/PageLoading/index.js

@@ -1,9 +1,10 @@
-import React from 'react';
-import { Spin } from 'antd';
+import React from "react";
+import { Spin } from "antd";
 
 // loading components from code split
 // https://umijs.org/plugin/umi-plugin-react.html#dynamicimport
 export default () => (
-  <div style={{ paddingTop: 100, textAlign: 'center' }}>
-  </div>
+  <Spin>
+    <div style={{ paddingTop: 100, textAlign: "center" }} />
+  </Spin>
 );

+ 32 - 0
xinkeaboard-admin/src/components/SiteSelector/index.js

@@ -0,0 +1,32 @@
+import { Select } from "antd";
+import { Menu, Dropdown } from 'antd';
+import { connect } from "dva";
+import router from 'umi/router';
+
+const SiteSelector = ({ siteList, currentSite, dispatch }) => {
+  const handleChange = (value) => {
+    dispatch({ type: "global/setCurrentSite", payload: value });
+    const targetSite = siteList.find(item => item.value === value);
+    dispatch({ type: "global/setCurrentSiteName", payload: targetSite.title });
+  };
+  return (
+    siteList.length ?  (
+      <Select
+        value={currentSite}
+        style={{ width: 150 }}
+        onChange={handleChange}
+      >
+        {siteList.map((site) => (
+          <Select.Option key={site.name} value={site.value}>
+            {site.title}
+          </Select.Option>
+        ))}
+      </Select>
+    ) : null
+  );
+};
+
+export default connect(({ global }) => ({
+  siteList: global.siteList,
+  currentSite: global.currentSite,
+}))(SiteSelector);

+ 0 - 0
xinkeaboard-admin/src/components/SiteSelector/index.less


+ 2 - 2
xinkeaboard-admin/src/components/SldComHeader/index.js

@@ -44,7 +44,7 @@ export default class SldComHeader extends Component {
 					<span style={{ backgroundColor: defaultSettings.primaryColor }} className={styles.left_border}/>
 					<span className={styles.title}>{title}</span>
           {commonSetting.operateTipSwitch&&
-          <a title={sld_show_tip?`${sldComLanguage("隐藏提示")}`:`${sldComLanguage("显示提示")}`} href={'javascript:void(0)'} className={styles.tip} onClick={() => this.toggleTip()}>
+          <a title={sld_show_tip?`${sldComLanguage("隐藏提示")}`:`${sldComLanguage("显示提示")}`} className={styles.tip} onClick={(e) => {e.preventDefault(); this.toggleTip() }}>
             <ALibbSvg fill={'#ff9864'} width={16} height={16} type={'ziyuan18'}/>
           </a>
           }
@@ -58,7 +58,7 @@ export default class SldComHeader extends Component {
               <span style={{ backgroundColor: defaultSettings.primaryColor }} className={styles.left_border}/>
               <span className={styles.title}>{title}</span>
               {commonSetting.operateTipSwitch&&
-              <a title={sld_show_tip?`${sldComLanguage("隐藏提示")}`:`${sldComLanguage("显示提示")}`} href={'javascript:void(0)'} className={styles.tip} onClick={() => this.toggleTip()}>
+              <a title={sld_show_tip?`${sldComLanguage("隐藏提示")}`:`${sldComLanguage("显示提示")}`} className={styles.tip} onClick={(e) => {e.preventDefault(); this.toggleTip() }}>
                 <ALibbSvg fill={'#ff9864'} width={16} height={16} type={'ziyuan18'}/>
               </a>
               }

+ 1 - 0
xinkeaboard-admin/src/components/SldModal/SldModal.less

@@ -15,6 +15,7 @@
 
   .ant-form-item-label {
     line-height: 32px;
+    white-space: initial;
   }
 
   .ant-modal-close-x .anticon svg {

+ 4 - 4
xinkeaboard-admin/src/components/SldSelMoreLeftRightActivityGoods/index.js

@@ -244,9 +244,9 @@ export default class SldSelMoreLeftRightActivityGoods extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.goods_image}/>
@@ -280,9 +280,9 @@ export default class SldSelMoreLeftRightActivityGoods extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 ?
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.goods_image}/>

+ 4 - 4
xinkeaboard-admin/src/components/SldSelMoreLeftRightCategoryAndGoods/index.js

@@ -275,9 +275,9 @@ export default class SldSelMoreLeftRightCategoryAndGoods extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>
@@ -312,9 +312,9 @@ export default class SldSelMoreLeftRightCategoryAndGoods extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 ?
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>

+ 4 - 4
xinkeaboard-admin/src/components/SldSelMoreLeftRightGoods/index.js

@@ -252,9 +252,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>
@@ -289,9 +289,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 ?
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>

+ 4 - 4
xinkeaboard-admin/src/components/SldSelMoreLeftRightLive/index.js

@@ -269,9 +269,9 @@ export default class SldSelMoreLeftRightLive extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.left_play_icon}
@@ -313,9 +313,9 @@ export default class SldSelMoreLeftRightLive extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0
                     ?selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.left_play_icon}

+ 4 - 4
xinkeaboard-admin/src/components/SldSelMoreLeftRightStore/index.js

@@ -252,9 +252,9 @@ export default class SldSelMoreLeftRightStore extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.storeLogo}/>
@@ -287,9 +287,9 @@ export default class SldSelMoreLeftRightStore extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 ?
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.storeLogo}/>

+ 3 - 4
xinkeaboard-admin/src/components/SldSeleTpl/SldSeleTpl.js

@@ -247,8 +247,7 @@ export default class SldSeleTpl extends Component {
             {tpl_type_list.length > 0 && tpl_type_list.map((item, index) => {
               return <a key={index}
                         style={{ borderBottomColor: sel_top_cat == item.type ? '#fff' : 'transparent' }}
-                        href='javascript:void(0)'
-                        onClick={() => this.sel_tpl(item.type)}>{item.typeName}</a>;
+                        onClick={(e) => {e.preventDefault(); this.sel_tpl(item.type) }}>{item.typeName}</a>;
             })
             }
           </div>
@@ -263,8 +262,8 @@ export default class SldSeleTpl extends Component {
                   return <a style={sel_left_tpl_id == item.tplPcId ? {
                     backgroundColor: defaultSettings.primaryColor,
                     color: '#fff',
-                  } : { backgroundColor: '#fff', color: '#333' }} key={index} href='javascript:void(0)'
-                            onClick={() => this.get_tpl_instance_data(item.tplPcId)}>{item.name.length > 6 ? item.name.substring(0, 6) : item.name}</a>;
+                  } : { backgroundColor: '#fff', color: '#333' }} key={index}
+                            onClick={(e) => {e.preventDefault(); this.get_tpl_instance_data(item.tplPcId) }}>{item.name.length > 6 ? item.name.substring(0, 6) : item.name}</a>;
                 })
                 }
               </Scrollbars>

+ 30 - 14
xinkeaboard-admin/src/components/SldTableEdit/SldTableEdit.js

@@ -34,7 +34,6 @@ let getEditorContentFlag;
 
 export default class SldTableEdit extends Component {
   constructor(props) {
-    console.log(props)
     super(props);
     sthis = this;
     const {
@@ -315,21 +314,37 @@ export default class SldTableEdit extends Component {
                     onCancel={this.props.tip!=undefined&&this.props.tip.cancle!=undefined?this.props.tip.cancle:null}
                     okText={'确定'}
                     cancelText={'取消'}>
-                     <a className={index.save_btn} href="javascript:void(0)">保&nbsp;存</a>
+                      <a className={index.save_btn} onClick={(e) => e.preventDefault()}>{sldComLanguage('保存并更新')}</a>
 
                   </Popconfirm>
-                  :<span className={'display-none'}><a className={index.save_btn} href="javascript:void(0)" onClick={this.sldConfirm}>保&nbsp;存</a></span>
+                  : <span className={'display-none'}>
+                    <Button 
+                        type="primary" 
+                        loading={this.props.submiting}
+                        onClick={this.sldConfirm}
+                      >
+                        {sldComLanguage('保存并更新')}
+                      </Button>
+                    </span>
                 }
                 {this.props.showOtherBtn != undefined &&
-                <Button style={{ marginLeft: 8,}} loading={this.props.submiting_sec}
-                        onClick={this.otherBtnClick}>
+                <Button 
+                 style={{ marginLeft: 8,}} 
+                 loading={this.props.submiting_sec}
+                 onClick={this.otherBtnClick}
+                 type='primary'
+                >
                   {this.props.showOtherBtn.text}
                 </Button>
                 }
 
-                {this.props.showAboutUsUeditor != undefined &&
-                <Button style={{ marginLeft: 8,}} loading={this.props.submiting_sec}
-                        onClick={this.getEditorContentFlag}>
+                { this.props.showAboutUsUeditor != undefined &&
+                <Button 
+                  style={{ marginLeft: 8,}} 
+                  loading={this.props.submiting_sec}
+                  onClick={this.getEditorContentFlag}
+                  type='primary'
+                >
                   {this.props.showAboutUsUeditor.text}
                 </Button>
                 }
@@ -583,12 +598,13 @@ export default class SldTableEdit extends Component {
         {getSldEmptyH(50)}
         <div className={global.m_diy_bottom_wrap}
              style={{ position: 'fixed', left: this.props.global.collapsed ? 90 : 160 }}>
-          <Button className={global.btn_fixed_bottom} key="submit" style={{
-            width: 80, height: 32, borderRadius: 3,
-          }}
-                  type="primary" loading={this.props.submiting}
-                  onClick={this.sldConfirm}>
-            {sldComLanguage('保存')}
+          <Button  
+           key="submit"
+           type="primary" 
+           loading={this.props.submiting}
+           onClick={this.sldConfirm}
+          >
+            {sldComLanguage('保存并更新')}
           </Button>
         </div>
 

+ 56 - 0
xinkeaboard-admin/src/components/WordCloud/index.js

@@ -0,0 +1,56 @@
+import React, { Component } from "react";
+import ReactWordCloud from "react-wordcloud";
+
+class WordCloud extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      words: props.words ?? [
+        { text: "Apparel", value: 1000 },
+        { text: "Fashion", value: 800 },
+        { text: "Style", value: 700 },
+        { text: "Trend", value: 600 },
+        { text: "Wear", value: 500 },
+        { text: "Outfit", value: 400 },
+        { text: "Clothing", value: 300 },
+        { text: "Textile", value: 200 },
+      ],
+      options: props.options ?? {
+        // deterministic: true,
+        spiral: "archimedean",
+        fontFamily: "sans-serif",
+        fontSizes: [30, 80], // 字体范围
+        // deterministic: true, // 尝试保持一致
+        // enableOptimizations: true, // 优化性能,避免重新布局
+        rotations: 0, // 不旋转
+        // rotationAngles: [0, 90], // 旋转角度范围
+        scale: "sqrt", // 字体缩放方式:linear、sqrt、log
+        // spiral: "rectangular", // 词云排列方式:archimedean 或 rectangular
+        padding: 20, // 单词之间的间距
+        colors: ["#fff"],
+        // colors: [
+        //   "#f87171",
+        //   "#fb923c",
+        //   "#facc15",
+        //   "#4ade80",
+        //   "#38bdf8",
+        //   "#a78bfa",
+        //   "#f472b6",
+        // ], // 多彩渐变
+        enableTooltip: false, // 鼠标悬停提示
+      },
+    };
+  }
+
+  render() {
+    const { words, options } = this.state;
+
+    return (
+      <div style={{ width: "100%", height: "100%" }}>
+        <ReactWordCloud words={words} options={options} />
+      </div>
+    );
+  }
+}
+
+export default WordCloud;

+ 13 - 13
xinkeaboard-admin/src/components/point/MDiyItemEdit/index.js

@@ -1257,7 +1257,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#e3e5e9', 'color')}>重置</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('#e3e5e9', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1319,7 +1319,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#fff', 'color')}>重置</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('#fff', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1525,8 +1525,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 <span className={`${styles.tip}`}>最少添加1个</span>
               </div>
 
@@ -1618,8 +1618,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>视频添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreSvideo(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreSvideo(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加{this.sele_more_svideo.min_num}个</span>*/}
               </div>
 
@@ -1717,8 +1717,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>直播添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreLive(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreLive(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加30个</span>*/}
               </div>
 
@@ -1814,8 +1814,8 @@ export default class MDiyItem extends Component {
                  style={{ height: 70 }}>
               <span className={`${styles.required}`}>*</span>
               <span className={`${styles.title}`}>数据添加:</span>
-              <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                 onClick={() => this.selMoreTabData(data, more_tab_index)}>+ 添加</a>
+              <a className={`${styles.add_svideo_btn}`}
+                 onClick={(e) => {e.preventDefault(); this.selMoreTabData(data, more_tab_index) }}>+ 添加</a>
               <span className={`${styles.tip}`}>需要选择偶数个,最少2个</span>
             </div>
             {more_tab_item.info.length > 0 && this.renderMoreTabSeleData(more_tab_item.info, more_tab_item.data_type, more_tab_index)}
@@ -1870,7 +1870,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker2', true)}>
                 <span style={{ backgroundColor: data.tag_bg_color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('', 'tag_bg_color')}>默认</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('', 'tag_bg_color') }}>默认</a>
             </div>
 
             {showColorPicker2 && (
@@ -1916,8 +1916,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>*/}
               </div>
 

+ 4 - 4
xinkeaboard-admin/src/components/point/SldSelMoreLeftRightGoods/index.js

@@ -251,9 +251,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>
@@ -283,9 +283,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 &&
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.mainImage}/>

+ 15 - 15
xinkeaboard-admin/src/components/spreader/MDiyItemEdit/index.js

@@ -1435,7 +1435,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#e3e5e9', 'color')}>重置</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('#e3e5e9', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1497,7 +1497,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker', true)}>
                 <span style={{ backgroundColor: data.color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('#fff', 'color')}>重置</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('#fff', 'color') }}>重置</a>
             </div>
 
             {showColorPicker && (
@@ -1681,8 +1681,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 <span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>
               </div>
 
@@ -1813,8 +1813,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 <span className={`${styles.tip}`}>最少添加1个</span>
               </div>
 
@@ -1906,8 +1906,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>视频添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreSvideo(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreSvideo(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加{this.sele_more_svideo.min_num}个</span>*/}
               </div>
 
@@ -2005,8 +2005,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>直播添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreLive(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreLive(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最多添加30个</span>*/}
               </div>
 
@@ -2102,8 +2102,8 @@ export default class MDiyItem extends Component {
                  style={{ height: 70 }}>
               <span className={`${styles.required}`}>*</span>
               <span className={`${styles.title}`}>数据添加:</span>
-              <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                 onClick={() => this.selMoreTabData(data, more_tab_index)}>+ 添加</a>
+              <a className={`${styles.add_svideo_btn}`}
+                 onClick={(e) => {e.preventDefault(); this.selMoreTabData(data, more_tab_index) }}>+ 添加</a>
               <span className={`${styles.tip}`}>需要选择偶数个,最少2个</span>
             </div>
             {more_tab_item.info.length > 0 && this.renderMoreTabSeleData(more_tab_item.info, more_tab_item.data_type, more_tab_index)}
@@ -2158,7 +2158,7 @@ export default class MDiyItem extends Component {
               <div className={styles.show_color} onClick={() => this.showColorPicker('showColorPicker2', true)}>
                 <span style={{ backgroundColor: data.tag_bg_color }}></span>
               </div>
-              <a href={'javascript:void(0)'} onClick={() => this.onChange('', 'tag_bg_color')}>默认</a>
+              <a onClick={(e) => {e.preventDefault(); this.onChange('', 'tag_bg_color') }}>默认</a>
             </div>
 
             {showColorPicker2 && (
@@ -2204,8 +2204,8 @@ export default class MDiyItem extends Component {
               <div className={`${styles.add_svideo_wrap} ${global.flex_row_start_center}`}>
                 <span className={`${styles.required}`}>*</span>
                 <span className={`${styles.title}`}>商品添加:</span>
-                <a href={'javascript:void(0)'} className={`${styles.add_svideo_btn}`}
-                   onClick={() => this.selMoreGoods(data)}>+ 添加</a>
+                <a className={`${styles.add_svideo_btn}`}
+                   onClick={(e) => {e.preventDefault(); this.selMoreGoods(data) }}>+ 添加</a>
                 {/*<span className={`${styles.tip}`}>最少添加3个,最多添加9个</span>*/}
               </div>
 

+ 4 - 4
xinkeaboard-admin/src/components/spreader/SldSelMoreLeftRightGoods/index.js

@@ -252,9 +252,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.left} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {data.list != undefined && data.list.length > 0 &&
                   data.list.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleLeftItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleLeftItem(item) }}
                               style={{ marginBottom: index == data.list.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.goodsImage}/>
@@ -288,9 +288,9 @@ export default class SldSelMoreLeftRightGoods extends Component {
                 <div className={`${styles.right} ${global.flex_row_start_start}`} style={{ height: height }}>
                   {selectedRows.length > 0 ?
                   selectedRows.map((item, index) => {
-                    return <a key={index} href={'javascript:void(0)'}
+                    return <a key={index}
                               className={`${styles.item} ${global.flex_row_start_start}`}
-                              onClick={() => this.handleRightItem(item)}
+                              onClick={(e) => {e.preventDefault(); this.handleRightItem(item) }}
                               style={{ marginBottom: index == selectedRows.length - 1 ? 10 : 0 }}>
                       <div className={`${styles.item_left} ${global.flex_row_center_center}`}>
                         <img className={styles.live_img} src={item.goodsImage}/>

+ 28 - 0
xinkeaboard-admin/src/global.less

@@ -2313,3 +2313,31 @@ body {
   }
 }
 
+.site_list {
+  display: flex;
+  align-items: center;
+  width: 100%;
+  height: 50px;
+  margin-top: 10px;
+  // overflow-x: auto;
+
+  .site_item {
+    width: 120px;
+    height: 35px;
+    text-align: center;
+    line-height: 35px;
+    border: 1px solid #d9d9d9;
+    border-radius: 5px;
+    margin-right: 10px;
+    color: #AAAAAA;
+    font-weight: bold;
+    cursor: pointer;
+  }
+
+  .site_active {
+    border-color: @theme-color;
+    background-color: @theme-color;
+    color: #fff;
+  }
+}
+

+ 1 - 13
xinkeaboard-admin/src/layouts/BasicLayout.js

@@ -3,11 +3,9 @@ import { Layout } from 'antd';
 import DocumentTitle from 'react-document-title';
 import isEqual from 'lodash/isEqual';
 import memoizeOne from 'memoize-one';
-import { connect } from 'dva';
 import { ContainerQuery } from 'react-container-query';
 import classNames from 'classnames';
 import pathToRegexp from 'path-to-regexp';
-import Media from 'react-media';
 import { formatMessage } from 'umi/locale';
 import Authorized from '@/utils/Authorized';
 import Footer from './Footer';
@@ -216,14 +214,4 @@ class BasicLayout extends React.PureComponent {
   }
 }
 
-export default connect(({ global, setting, menu }) => ({
-  collapsed: global.collapsed,
-  layout: setting.layout,
-  menuData: menu.menuData,
-  breadcrumbNameMap: menu.breadcrumbNameMap,
-  ...setting,
-}))(props => (
-  <Media query="(max-width: 599px)">
-    {isMobile => <BasicLayout {...props} isMobile={isMobile} />}
-  </Media>
-));
+export default BasicLayout;

+ 47 - 0
xinkeaboard-admin/src/layouts/index.js

@@ -0,0 +1,47 @@
+import React from 'react';
+import Media from 'react-media';
+import { connect } from 'dva';
+import PageLoading from '@/components/PageLoading';
+import BasicLayout from './BasicLayout';
+
+class LayoutWrapper extends React.PureComponent {
+  componentDidMount() {
+    const { dispatch, currentSite } = this.props;
+    dispatch({ type: 'global/get_site_list_data', payload: { isAll: true } });
+  }
+
+  render() {
+    const { currentSite } = this.props;
+
+    if (!currentSite) {
+      // 非 apply 页且未初始化完成 → Loading
+      return (
+        <div style={{ height: '100vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
+          <PageLoading />
+        </div>
+      );
+    }
+
+    //currentSite 已有值 → 渲染 BasicLayout(key 确保切换站点强制刷新)
+    return (
+      <Media query="(max-width: 599px)">
+        {isMobile => (
+          <BasicLayout
+            key={currentSite}
+            {...this.props}
+            isMobile={isMobile}
+          />
+        )}
+      </Media>
+    );
+  }
+}
+
+export default connect(({ global, setting, menu }) => ({
+  collapsed: global.collapsed,
+  currentSite: global.currentSite,
+  layout: setting.layout,
+  menuData: menu.menuData,
+  breadcrumbNameMap: menu.breadcrumbNameMap,
+  ...setting,
+}))(LayoutWrapper);

+ 6 - 2
xinkeaboard-admin/src/locales/en-US/content.js

@@ -421,9 +421,9 @@
  '企业注册地址':'Registered address',
  '企业曾用名':'Enterprise formerly known as',
  '所在地域':'The geographical location',
- '修改配置成功后,需点击右上角更新配置按钮更新配置才可生效':'Modify the configuration is successful, need to click the top right button to update the configuration update configuration to become effective',
+ '修改配置成功后,需点击下方保存并更新按钮更新配置才可生效':'After successfully modifying the configuration, you need to click the Save and Update button below to update the configuration for it to take effect',
  '域名更改一定要确保正确,否则将影响该系统的使用':'Be sure to change the domain name correctly, otherwise it will affect the use of the system',
- '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击右上角更新配置按钮更新配置才可生效':'Select the fields to export the data at the time of export orders, the modified configuration, and you need to update the upper right corner click the Configure button to update the configuration to become effective',
+ '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击下方保存并更新按钮更新配置才可生效':'Select the fields to export the data at the time of export orders, the modified configuration, and you need to update the upper right corner click the Configure button to update the configuration to become effective',
  '周日':'Sunday',
  '周一':'on Monday',
  '周二':'on Tuesday',
@@ -558,6 +558,9 @@
 
   //src/pages/sysset/home/basic.js
  '金额(元)':'Amount (yuan)',
+ '待办事项':'To do',
+ '全部站点待办事项': 'All site to-do list',
+ '当前站点待办事项': 'Current site to-do list',
 
   //src/pages/sysset/notice_set/email.js
  '请输入测试邮件':'Please enter a test message',
@@ -871,6 +874,7 @@
 
   //src/pages/pcdecorate/home/edit_diy_page.js
  '保 存':'Save',
+ '保存并更新': 'Save and update',
 
   //src/pages/pcdecorate/home/edit_diy_page_head.js
  '您好,欢迎来到':'Hello, welcome to',

+ 5 - 2
xinkeaboard-admin/src/locales/zh-CN/content.js

@@ -430,9 +430,9 @@ export default {
   '企业注册地址': '企业注册地址',
   '企业曾用名': '企业曾用名',
   '所在地域': '所在地域',
-  '修改配置成功后,需点击右上角更新配置按钮更新配置才可生效': '修改配置成功后,需点击右上角更新配置按钮更新配置才可生效',
+  '修改配置成功后,需点击下方保存并更新按钮更新配置才可生效': '修改配置成功后,需点击下方保存并更新按钮更新配置才可生效',
   '域名更改一定要确保正确,否则将影响该系统的使用': '域名更改一定要确保正确,否则将影响该系统的使用',
-  '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击右上角更新配置按钮更新配置才可生效': '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击右上角更新配置按钮更新配置才可生效',
+  '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击下方保存并更新按钮更新配置才可生效': '选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击下方保存并更新按钮更新配置才可生效',
   '周日': '周日',
   '周一': '周一',
   '周二': '周二',
@@ -937,6 +937,7 @@ export default {
 
   // src/pages/pcdecorate/home/edit_diy_page.js
   '保 存': '保 存',
+  '保存并更新': '保存并更新',
 
   // src/pages/pcdecorate/home/edit_diy_page_head.js
   '您好,欢迎来到': '您好,欢迎来到',
@@ -2258,6 +2259,8 @@ export default {
   '待确认退款单':'待确认退款单',
   '待处理结算单':'待处理结算单',
   '待办事项':'待办事项',
+  '全部站点待办事项': '全部站点办事项',
+  '当前站点待办事项': '当前站点待办事项',
   '待分配询盘':'待分配询盘',
   '支付/下单金额趋势':'支付/下单金额趋势',
   '流量趋势':'流量趋势',

+ 33 - 0
xinkeaboard-admin/src/models/global.js

@@ -6,6 +6,9 @@ export default {
   state: {
     collapsed: false,
     notices: [],
+    siteList: [],
+    currentSite: '',
+    currentSiteName: ''
   },
 
   effects: {
@@ -70,9 +73,39 @@ export default {
         },
       });
     },
+    // 获取站点列表
+    * get_site_list_data({ payload, callback }, { call, put, select }) {
+      const siteList = yield select(state => state.global.siteList);
+      const response = siteList.length ? {data: siteList, state: 200} : yield call(sldCommonService, payload, 'get', 'v3/system/seller/setting/getSiteSettingList');
+      if (callback) callback(response);
+      yield put({ type: 'saveSiteList', payload: response.data });
+      const currentSite = yield select(state => state.global.currentSite);
+      if (!currentSite) {
+        yield put({type: 'setCurrentSite', payload: response.data[0]?.value})
+        yield put({type: 'setCurrentSiteName', payload: response.data[0]?.title})
+      }
+    },
   },
 
   reducers: {
+    saveSiteList(state, action) {
+      return {
+        ...state,
+        siteList: action.payload,
+      };
+    },
+    setCurrentSite(state, { payload }) {
+      return {
+        ...state,
+        currentSite: payload,
+      };
+    },
+    setCurrentSiteName(state, { payload }) {
+      return {
+        ...state,
+        currentSiteName: payload,
+      };
+    },
     changeLayoutCollapsed(state, { payload }) {
       return {
         ...state,

+ 1 - 2
xinkeaboard-admin/src/pages/decorate/pc/home/adv_05.js

@@ -371,8 +371,7 @@ export default class Adv_05 extends Component {
                         className={styles.sub_title}>{data.title_info.sub_title.initialValue != '' ? data.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</span>
                     </h2>
                     <div className={styles.right_action}>
-                      <a
-                        href="javascript:void(0)">{sldComLanguage('查看更多')}<i>&gt;&gt;</i></a>
+                      <a onClick={(e) => e.preventDefault()} >{sldComLanguage('查看更多')}<i>&gt;&gt;</i></a>
                     </div>
                   </div>
                   <div className={styles.floor_content}>

+ 2 - 2
xinkeaboard-admin/src/pages/decorate/pc/home/adv_06.js

@@ -137,10 +137,10 @@ export default class Adv_06 extends Component {
 							{data.data.map((item,index)=>{
 							  return <div key={index} className={styles.item}>
                     {item.imgUrl
-                      ?<a className={`${item.imgUrl?null:styles.show_tip}`} href="javascript:void(0);">
+                      ?<a className={`${item.imgUrl?null:styles.show_tip}`} onClick={(e) => e.preventDefault()}>
                         <img src={item.imgUrl}/>
                       </a>
-                      :<a className={`${item.imgUrl?null:styles.show_tip}`} href="javascript:void(0);" style={{height:350}}>
+                      :<a className={`${item.imgUrl?null:styles.show_tip}`} onClick={(e) => e.preventDefault()} style={{height:350}}>
                         <span>{sldComLanguage('此处添加【302*高度不限】图片')}</span>
                       </a>
                     }

+ 2 - 2
xinkeaboard-admin/src/pages/decorate/pc/home/adv_07.js

@@ -128,10 +128,10 @@ export default class Adv_07 extends Component {
               {data.data.map((item, index) => (
                 <div key={index} className={styles.item}>
                   {item.imgUrl
-                    ?<a className={`${item.imgUrl ? null : styles.show_tip}`} href="javascript:void(0);">
+                    ?<a className={`${item.imgUrl ? null : styles.show_tip}`} onClick={(e) => e.preventDefault()}>
                       <img src={item.imgUrl}/>
                     </a>
-                    :<a className={`${item.imgUrl ? null : styles.show_tip}`} href="javascript:void(0);" style={{height:100}}>
+                    :<a className={`${item.imgUrl ? null : styles.show_tip}`} onClick={(e) => e.preventDefault()} style={{height:100}}>
                       <span>{sldComLanguage('此处添加【403*高度不限】图片')}</span>
                     </a>
                   }

+ 2 - 2
xinkeaboard-admin/src/pages/decorate/pc/home/adv_08.js

@@ -143,10 +143,10 @@ export default class Adv_08 extends Component {
               {data.data.map((item, index) => (
                 <div key={index} className={styles.item}>
                   {item.imgUrl
-                    ?<a className={`${item.imgUrl ? null : styles.show_tip}`} href="javascript:void(0);">
+                    ?<a className={`${item.imgUrl ? null : styles.show_tip}`} onClick={(e) => e.preventDefault()}>
                       <img src={item.imgUrl}/>
                     </a>
-                    :<a className={`${item.imgUrl ? null : styles.show_tip}`} href="javascript:void(0);" style={{height:350}}>
+                    :<a className={`${item.imgUrl ? null : styles.show_tip}`} onClick={(e) => e.preventDefault()} style={{height:350}}>
                       <span>{sldComLanguage('此处添加【242*高度不限】图片')}</span>
                     </a>
                   }

+ 3 - 3
xinkeaboard-admin/src/pages/decorate/pc/home/adv_09.js

@@ -337,7 +337,7 @@ export default class Adv_09 extends Component {
                   {data.left.data.map((item, index) => (
                     <a key={index}
                        className={`${index % 2 == 0 ? styles.first : null} ${styles.show_tip} ${index > data.left.data.length - 3 ? styles.sld_no_border_bottom : null}`}
-                       href="javascript:void(0);">
+                       onClick={(e) => e.preventDefault()}>
                       {item.imgUrl
                         ? <img src={item.imgUrl}/>
                         : <span>{sldComLanguage('此处添加【187*123】图片')}</span>
@@ -368,7 +368,7 @@ export default class Adv_09 extends Component {
                   {data.center.data.map((item, index) => (
                     <a key={index}
                        className={`${styles.show_tip} ${index == data.center.data.length - 1 ? styles.sld_no_border_bottom : null}`}
-                       href="javascript:void(0);">
+                       onClick={(e) => e.preventDefault()}>
                       {item.imgUrl
                         ? <img src={item.imgUrl}/>
                         : <span>{sldComLanguage('此处添加【376*123】图片')}</span>
@@ -399,7 +399,7 @@ export default class Adv_09 extends Component {
                   {data.right.data.map((item, index) => (
                     <a key={index}
                        className={`${index % 3 == 0 ? styles.first : null} ${styles.show_tip}  ${index > data.right.data.length - 4 ? styles.sld_no_border_bottom : null}`}
-                       href="javascript:void(0);">
+                       onClick={(e) => e.preventDefault()}>
                       {item.imgUrl
                         ? <img src={item.imgUrl}/>
                         : <span>{sldComLanguage('此处添加【124*185】图片')}</span>

+ 3 - 3
xinkeaboard-admin/src/pages/decorate/pc/home/adv_10.js

@@ -187,7 +187,7 @@ export default class Adv_10 extends Component {
                   <span>{sldComLanguage('编辑')}</span>
                 </div>
                 {data.row_one.data.map((item, index) => (
-                  <a key={index} href="javascript:void(0);">
+                  <a key={index} onClick={(e) => e.preventDefault()}>
                     {item.imgUrl
                       ? <img src={item.imgUrl}/>
                       : <span>{sldComLanguage('此处添加【1210*30】图片')}</span>
@@ -202,7 +202,7 @@ export default class Adv_10 extends Component {
                   <span>{sldComLanguage('编辑')}</span>
                 </div>
                 {data.row_four.data.map((item, index) => (
-                  <a key={index} href="javascript:void(0);">
+                  <a key={index} onClick={(e) => e.preventDefault()}>
                     {item.imgUrl
                       ? <img src={item.imgUrl}/>
                       : <span>{sldComLanguage('此处添加【295*220】图片')}</span>
@@ -217,7 +217,7 @@ export default class Adv_10 extends Component {
                   <span>{sldComLanguage('编辑')}</span>
                 </div>
                 {data.row_five.data.map((item, index) => (
-                  <a key={index} href="javascript:void(0);">
+                  <a key={index} onClick={(e) => e.preventDefault()}>
                     {item.imgUrl
                       ? <img src={item.imgUrl}/>
                       : <span>{sldComLanguage('此处添加【234*130】图片')}</span>

+ 3 - 3
xinkeaboard-admin/src/pages/decorate/pc/home/adv_11.js

@@ -186,7 +186,7 @@ export default class Adv_11 extends Component {
                 </div>
                 {data.row_left.data.map((item, index) => (
                   <a className={`${index % 2 == 1 ? styles.lb_margin : null}`} key={index}
-                     href="javascript:void(0);">
+                     onClick={(e) => e.preventDefault()}>
                     {item.imgUrl
                       ? <img src={item.imgUrl}/>
                       : <span>{sldComLanguage('此处添加【400*170】图片')}</span>
@@ -202,7 +202,7 @@ export default class Adv_11 extends Component {
                   </div>
                   {data.row_right.top.data.map((item, index) => (
                     <a className={`${index % 2 == 1 ? styles.lb_margin : null}`} key={index}
-                       href="javascript:void(0);">
+                       onClick={(e) => e.preventDefault()}>
                       {item.imgUrl
                         ? <img src={item.imgUrl}/>
                         : <span>{sldComLanguage('此处添加【400*350】图片')}</span>
@@ -217,7 +217,7 @@ export default class Adv_11 extends Component {
                   </div>
                   {data.row_right.bottom.data.map((item, index) => (
                     <a className={`${index % 2 == 1 ? styles.lb_margin : null}`} key={index}
-                       href="javascript:void(0);">
+                       onClick={(e) => e.preventDefault()}>
                       {item.imgUrl
                         ? <img src={item.imgUrl}/>
                         : <span>{sldComLanguage('此处添加【400*170】图片')}</span>

+ 5 - 5
xinkeaboard-admin/src/pages/decorate/pc/home/adv_12.js

@@ -232,7 +232,7 @@ export default class Adv_12 extends Component {
 									</div>
 									{data.left.data.map((item,index) => (
 										<a key={index} className={`${styles.l_img}`}
-										   href="javascript:void(0);">
+										   onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【396*450】图片')}</span>
@@ -248,7 +248,7 @@ export default class Adv_12 extends Component {
 									{data.center.data.map((item, index) => (
 										<a key={index}
 										   className={`${index % 2 == 1 ? styles.l_b_margin : null}`}
-										   href="javascript:void(0);">
+										   onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【183*210】图片')}</span>
@@ -265,7 +265,7 @@ export default class Adv_12 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										<a className={`${styles.title}`}
-										   href="javascript:void(0);">{data.right.title_info.title.initialValue ? data.right.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
+										   onClick={(e) => e.preventDefault()}>{data.right.title_info.title.initialValue ? data.right.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
 										<span>》</span>
 										<a className={`${styles.subtitle}`}>{data.right.title_info.title.initialValue ? data.right.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</a>
 									</div>
@@ -275,7 +275,7 @@ export default class Adv_12 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.right.top.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【376*180】图片')}</span>
@@ -289,7 +289,7 @@ export default class Adv_12 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.right.bottom.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【183*180】图片')}</span>

+ 7 - 7
xinkeaboard-admin/src/pages/decorate/pc/home/adv_13.js

@@ -251,7 +251,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										<a className={`${styles.title}`}
-										   href="javascript:void(0);">{data.left.title_info.title.initialValue ? data.left.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
+										   onClick={(e) => e.preventDefault()}>{data.left.title_info.title.initialValue ? data.left.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
 										<span>》</span>
 										<a className={`${styles.subtitle}`}>{data.left.title_info.title.initialValue ? data.left.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</a>
 									</div>
@@ -261,7 +261,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.left.top.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【376*180】图片')}</span>
@@ -275,7 +275,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.left.bottom.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【183*180】图片')}</span>
@@ -291,7 +291,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										<a className={`${styles.title}`}
-										   href="javascript:void(0);">{data.center.title_info.title.initialValue ? data.center.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
+										   onClick={(e) => e.preventDefault()}>{data.center.title_info.title.initialValue ? data.center.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
 										<span>》</span>
 										<a className={`${styles.subtitle}`}>{data.center.title_info.title.initialValue ? data.center.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</a>
 									</div>
@@ -301,7 +301,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.center.top.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【376*180】图片')}</span>
@@ -315,7 +315,7 @@ export default class Adv_13 extends Component {
 											<span>{sldComLanguage('编辑')}</span>
 										</div>
 										{data.center.bottom.data.map((item, index) => (
-											<a key={index} href="javascript:void(0);">
+											<a key={index} onClick={(e) => e.preventDefault()}>
 												{item.imgUrl
 													? <img src={item.imgUrl}/>
 													: <span>{sldComLanguage('此处添加【183*180】图片')}</span>
@@ -331,7 +331,7 @@ export default class Adv_13 extends Component {
 									</div>
 									{data.right.data.map((item,index) => (
 										<a key={index} className={`${styles.l_img}`}
-										   href="javascript:void(0);">
+										   onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【396*450】图片')}</span>

+ 7 - 7
xinkeaboard-admin/src/pages/decorate/pc/home/adv_14.js

@@ -251,7 +251,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									<a className={`${styles.title}`}
-									   href="javascript:void(0);">{data.left.title_info.title.initialValue ? data.left.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
+									   onClick={(e) => e.preventDefault()}>{data.left.title_info.title.initialValue ? data.left.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
 									<span>》</span>
 									<a className={`${styles.subtitle}`}>{data.left.title_info.title.initialValue ? data.left.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</a>
 								</div>
@@ -261,7 +261,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									{data.left.top.data.map((item, index) => (
-										<a key={index} href="javascript:void(0);">
+										<a key={index} onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【376*180】图片')}</span>
@@ -275,7 +275,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									{data.left.bottom.data.map((item, index) => (
-										<a key={index} href="javascript:void(0);">
+										<a key={index} onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【183*180】图片')}</span>
@@ -291,7 +291,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									<a className={`${styles.title}`}
-									   href="javascript:void(0);">{data.center.title_info.title.initialValue ? data.center.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
+									   onClick={(e) => e.preventDefault()}>{data.center.title_info.title.initialValue ? data.center.title_info.title.initialValue : `${sldComLanguage('添加标题')}`}</a>
 									<span>》</span>
 									<a className={`${styles.subtitle}`}>{data.center.title_info.title.initialValue ? data.center.title_info.sub_title.initialValue : `${sldComLanguage('添加子标题')}`}</a>
 								</div>
@@ -301,7 +301,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									{data.center.top.data.map((item, index) => (
-										<a key={index} href="javascript:void(0);">
+										<a key={index} onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【376*180】图片')}</span>
@@ -315,7 +315,7 @@ export default class Adv_14 extends Component {
 										<span>{sldComLanguage('编辑')}</span>
 									</div>
 									{data.center.bottom.data.map((item, index) => (
-										<a key={index} href="javascript:void(0);">
+										<a key={index} onClick={(e) => e.preventDefault()}>
 											{item.imgUrl
 												? <img src={item.imgUrl}/>
 												: <span>{sldComLanguage('此处添加【183*180】图片')}</span>
@@ -331,7 +331,7 @@ export default class Adv_14 extends Component {
 								</div>
 								{data.right.data.map((item,index) => (
 									<a key={index} className={`${styles.l_img}`}
-									   href="javascript:void(0);">
+									   onClick={(e) => e.preventDefault()}>
 										{item.imgUrl
 											? <img src={item.imgUrl}/>
 											: <span>{sldComLanguage('此处添加【396*450】图片')}</span>

+ 4 - 4
xinkeaboard-admin/src/pages/decorate/pc/home/diy_page_lists.js

@@ -99,12 +99,12 @@ export default class Diy_page_lists extends Component {
                   : <span>{text}</span>
                 }
                 {record.is_edit_name != undefined && record.is_edit_name
-                  ? <a className={global.flex_com_column} href={'javascript:void(0)'}
+                  ? <a className={global.flex_com_column}
                        style={{ marginLeft: 7 }}
-                       onClick={() => this.save_edit_filed(record, 'decoName', text)}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'xuanzhong')}</a>
-                  : <a className={global.flex_com_column} href={'javascript:void(0)'}
+                       onClick={(e) => {e.preventDefault(); this.save_edit_filed(record, 'decoName', text) }}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'xuanzhong')}</a>
+                  : <a className={global.flex_com_column}
                        style={{ marginLeft: 7 }}
-                       onClick={() => this.edit_filed(record.decoId, 'is_edit_name', 'true')}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'edit')}</a>
+                       onClick={(e) => {e.preventDefault(); this.edit_filed(record.decoId, 'is_edit_name', 'true') }}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'edit')}</a>
                 }
               </div>
             </Fragment>

+ 12 - 12
xinkeaboard-admin/src/pages/decorate/pc/home/edit_diy_page_head.js

@@ -96,9 +96,9 @@ export default class EditDdiyPageHead extends Component {
                   <div className={`${styles.has_more} ${styles.li_item}`}>
                     {sldComLanguage('我的订单')}
                     <div className={styles.li_item_more}>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('待支付订单')}</a>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('待收货订单')}</a>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('待评价订单')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('待支付订单')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('待收货订单')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('待评价订单')}</a>
                     </div>
                   </div>
                 </li>
@@ -109,9 +109,9 @@ export default class EditDdiyPageHead extends Component {
                   <div className={`${styles.has_more} ${styles.li_item}`}>
                     {sldComLanguage('我的收藏')}
                     <div className={styles.li_item_more}>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('商品收藏')}</a>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('店铺收藏')}</a>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('我的足迹')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('商品收藏')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('店铺收藏')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('我的足迹')}</a>
                     </div>
                   </div>
                 </li>
@@ -119,8 +119,8 @@ export default class EditDdiyPageHead extends Component {
                   <div className={`${styles.has_more} ${styles.li_item}`}>
                     {sldComLanguage('我的账户')}
                     <div className={styles.li_item_more}>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('我的优惠券')}</a>
-                      <a href="javascript:void(0)" className={styles.li_item_more_item}>{sldComLanguage('我的余额')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('我的优惠券')}</a>
+                      <a onClick={(e) => e.preventDefault()} className={styles.li_item_more_item}>{sldComLanguage('我的余额')}</a>
                     </div>
                   </div>
                 </li>
@@ -150,7 +150,7 @@ export default class EditDdiyPageHead extends Component {
               <div className={styles.hot_search_wrap}>
                 <div>
                   {hot_search_words.length && hot_search_words.map((item, index) => {
-                    return <a key={index} href="javascript:void(0)">{item}</a>;
+                    return <a key={index} onClick={(e) => e.preventDefault()}>{item}</a>;
                   })
                   }
                 </div>
@@ -162,7 +162,7 @@ export default class EditDdiyPageHead extends Component {
               <dt className={`${styles.ld} ${styles.cart_icon_text_wrap}`}
                   style={{ borderBottom: '1px solid rgb(239, 239, 239)' }}>
                 <span className={styles.iconfont}>{sldSvgIcon('#e2231a',16,16,'youxiang')}</span>
-                <a href="javascript:void(0)">{sldComLanguage('发布需求')}</a>
+                <a onClick={(e) => e.preventDefault()}>{sldComLanguage('发布需求')}</a>
                 {/*<div className={styles.cart_goods_num}>0</div>*/}
               </dt>
             </dl>
@@ -178,9 +178,9 @@ export default class EditDdiyPageHead extends Component {
               <span className={styles.sort}>{sldComLanguage('产品分类')}</span>
             </div>
             <nav>
-              <li><a href="javascript:void(0)">{sldComLanguage('首页')}</a></li>
+              <li><a onClick={(e) => e.preventDefault()}>{sldComLanguage('首页')}</a></li>
               {nav_list.length && nav_list.map((item, index) => {
-                return <li key={index}><a href="javascript:void(0)">{item.navName}</a></li>;
+                return <li key={index}><a onClick={(e) => e.preventDefault()}>{item.navName}</a></li>;
               })}
             </nav>
           </div>

+ 4 - 4
xinkeaboard-admin/src/pages/decorate/pc/home/main_banner_pc.js

@@ -319,7 +319,7 @@ export default class MainBannerPc extends Component {
                     <ul className={`${styles.menu_wrap}`}>
                       {cat_nav.map((item, index) => (
                         <li className={`${styles.menu_item}`}>
-                          <a key={index} className={`${styles.first_cat}`} href="javascript:void(0);">
+                          <a key={index} className={`${styles.first_cat}`} onClick={(e) => e.preventDefault()}>
                             {item.categoryName}
                           </a>
                         </li>
@@ -372,11 +372,11 @@ export default class MainBannerPc extends Component {
                     </p>
                   </div>
 
-                  <p className={`${styles.link}`}><a href={'javascript:void(0)'}><span>Sign in</span></a></p>
+                  <p className={`${styles.link}`}><a onClick={(e) => e.preventDefault()}><span>Sign in</span></a></p>
 
-                  <p className={`${styles.link}`}><a href={'javascript:void(0)'}><span>Join Free</span></a></p>
+                  <p className={`${styles.link}`}><a onClick={(e) => e.preventDefault()}><span>Join Free</span></a></p>
 
-                  <p className={`${styles.link}`}><a href={'javascript:void(0)'}><span>For Supplier</span></a>
+                  <p className={`${styles.link}`}><a onClick={(e) => e.preventDefault()}><span>For Supplier</span></a>
                   </p>
 
                   <div className={`${styles.cr_user_card}`} style={{ marginTop: '15px' }}>

+ 4 - 4
xinkeaboard-admin/src/pages/decorate/pc/topic/topic_diy_page_lists.js

@@ -99,12 +99,12 @@ export default class TopicDiyPageLists extends Component {
                   : <span>{text}</span>
                 }
                 {record.is_edit_name != undefined && record.is_edit_name
-                  ? <a className={global.flex_com_column} href={'javascript:void(0)'}
+                  ? <a className={global.flex_com_column}
                        style={{ marginLeft: 7 }}
-                       onClick={() => this.save_edit_filed(record, 'decoName', text)}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'xuanzhong')}</a>
-                  : <a className={global.flex_com_column} href={'javascript:void(0)'}
+                       onClick={(e) => {e.preventDefault(); this.save_edit_filed(record, 'decoName', text) }}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'xuanzhong')}</a>
+                  : <a className={global.flex_com_column}
                        style={{ marginLeft: 7 }}
-                       onClick={() => this.edit_filed(record.decoId, 'is_edit_name', 'true')}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'edit')}</a>
+                       onClick={(e) => {e.preventDefault(); this.edit_filed(record.decoId, 'is_edit_name', 'true') }}>{sldSvgIcon(defaultSettings.primaryColor, 16, 16, 'edit')}</a>
                 }
               </div>
             </Fragment>

+ 39 - 3
xinkeaboard-admin/src/pages/manage/store/apply_store_detail.js

@@ -42,6 +42,8 @@ export default class ApplyStoreDetail extends Component {
       battchVal: '',//批量设置里面的值
       query: props.location.query,
       store_detail: {},
+      siteList: [],
+      currentSite: {}, // 当前站点
       store_base_info: [{ //店铺信息
         type: 'show_text',
         label: `${sldComLanguage('入驻类型')}`,
@@ -336,6 +338,24 @@ export default class ApplyStoreDetail extends Component {
           });
           //店铺经营信息-end
 
+          // 店铺经营类型区分站点--start
+          const { storeGoodsCateVOList } = store_detail;
+          const siteListData = [];
+          storeGoodsCateVOList?.forEach(item => {
+            if (!siteListData.find(site => site.webSite === item.webSite)) {
+              siteListData.push({
+                webSite: item.webSite,
+                webSiteName: item.webSiteName
+              })
+            }
+          });
+          if (siteListData.length) {
+            const sortSiteList = siteListData.sort((a, b) => Number(a.webSite) - Number(b.webSite));
+            this.setState({siteList: sortSiteList});
+            this.setState({currentSite: siteListData[0]})
+          }
+          // 店铺经营类型区分站点--end
+
           this.setState({
             store_base_info,
             store_detail,
@@ -479,9 +499,14 @@ export default class ApplyStoreDetail extends Component {
 
   };
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    this.setState({ currentSite: site })
+  }
+
   render() {
     const {
-      store_base_info, submiting, show_foot, modal_width, modalVisible, operateData, card_data, store_business_info,store_business_info_chakan, columns, store_detail, battchVal, business_data, more_qualification_data,
+      siteList, currentSite, store_base_info, submiting, show_foot, modal_width, modalVisible, operateData, card_data, store_business_info,store_business_info_chakan, columns, store_detail, battchVal, business_data, more_qualification_data,
     } = this.state;
     return (
       <div className={global.common_page}
@@ -520,6 +545,17 @@ export default class ApplyStoreDetail extends Component {
                             data={more_qualification_data}/>
           </Fragment>
           }
+          <div className={global.site_list}>
+            {siteList.map((site) => (
+              <div
+                key={site.webSite}
+                onClick={() => this.setCurrentSite(site)}
+                className={`${global.site_item} ${site.webSite === currentSite.webSite ? global.site_active : ''}`}
+              >
+                {site.webSiteName}
+              </div>
+            ))}
+          </div>
           {sldCommonTitle(`${sldComLanguage('店铺经营信息')}`, '#333', 5, 15, 15)}
           {store_detail.state == 1 &&
           <SldTableRowTwo r_color={'#333'} l_color={'#999'} l_fontw={500} r_fontw={600} form={this.props.form}
@@ -553,12 +589,12 @@ export default class ApplyStoreDetail extends Component {
           {/*  </Popconfirm>*/}
           {/*</div>*/}
           {/*}*/}
-
+          {/* 站点tab列表 */}
           <div style={{ width: '98%', maxHeight: 300 }}>
             <Scrollbars autoHeight
                         autoHeightMax={300}>
               <Table rowKey={'bindId'} pagination={false} columns={columns}
-                     dataSource={store_detail.storeGoodsCateVOList} size={'small'}/>
+                     dataSource={store_detail.storeGoodsCateVOList?.filter(item => item.webSite === currentSite.webSite)} size={'small'}/>
             </Scrollbars>
           </div>
           {getSldEmptyH(40)}

+ 4 - 3
xinkeaboard-admin/src/pages/manage/store/own_list.js

@@ -26,8 +26,8 @@ import areaData from '@/assets/area.json';
 import defaultSettings from '@/defaultSettings';
 
 let pageSize = list_com_page_size_10;
-@connect(({ store }) => ({
-  store,
+@connect(({ store, global }) => ({
+  store, global
 }))
 @Form.create()
 export default class OwnList extends Component {
@@ -61,7 +61,7 @@ export default class OwnList extends Component {
       operateData: [],//操作数据
       addData: [{
         type: 'input',
-        label: `${sldComLanguage('店铺名称')}`,
+        label: `${props.global.currentSiteName}${sldComLanguage('店铺名称')}`,
         name: 'storeName',
         extra: `${sldComLanguage('最多输入50个字')}`,
         placeholder: `${sldComLanguage('请输入店铺名称')}`,
@@ -299,6 +299,7 @@ export default class OwnList extends Component {
             } else {
               if(item.name == 'storeName'){
                 item.disable = true;
+                item.extra = '';
               }
               item.initialValue = res.data[item.name];
             }

+ 1 - 1
xinkeaboard-admin/src/pages/member/recharge_setting.js

@@ -90,7 +90,7 @@ export default class RechargeSetting extends Component {
     return (
       <Spin spinning={initLoading}>
         <div className={global.common_page} style={{padding:'10px 0 0 0'}}>
-          {showMoreHelpTip(``, ['修改配置成功后,需点击右上角更新配置按钮更新配置才可生效'], 0)}{/*操作提示*/}
+          {showMoreHelpTip(``, ['修改配置成功后,需点击下方保存并更新按钮更新配置才可生效'], 0)}{/*操作提示*/}
           {getSldEmptyH(10)}
           {flag == 1 &&
           <SldTableEdit

+ 75 - 15
xinkeaboard-admin/src/pages/statistics/realtime.js

@@ -7,6 +7,7 @@ import {
   formatNum,
 } from '@/utils/utils';
 import global from '@/global.less';
+import styles from './realtime.less';
 import RealtimeOther from './realtime_other';
 import stat from '@/assets/css/stat.less';
 import SldScrollbars from '@/components/SldScrollbars';
@@ -29,6 +30,7 @@ export default class StatisticsRealtime extends Component {
       refreshTime: '',//更新时间
       initLoading: false,
       detailData: {},//页面数据
+      currentSiteName: props.global.currentSiteName,
       realTimeData1: {
         icon: require('@/assets/real_icon_1.png'),
         title: `${sldComLanguage('平台汇总')}`,
@@ -267,8 +269,74 @@ export default class StatisticsRealtime extends Component {
     });
   };
 
+  realtimeAnalysis = () => {
+    const { refreshTime } = this.state;
+    return (
+      <>
+        <div className={`${stat.label_panel} ${global.flex_row_start_center}`}>
+            {sldLlineRtextAddGoodsAddMargin(defaultSettings.primaryColor, `${sldComLanguage('实时分析')}`, 10, 0, 0)}
+            <Tooltip placement="right" title={`${sldComLanguage('今日实时数据的统计时间均为今日零时至当前更新时间。点击刷新按钮可强制更新。')}`}>
+              <img style={{ display: 'inline-block', marginLeft: '10px' }}
+                    src={require('@/assets/home_basic/help_icon.png')}></img>
+            </Tooltip>
+            <div className={`${stat.update_time_panel} ${global.flex_row_start_center}`}>
+              <span>{`${sldComLanguage('更新时间:')}`}{refreshTime}</span>
+              <i onClick={() => this.initData(true)} className={`${stat.reload_icon}`}></i>
+            </div>
+        </div>
+      </>
+    )
+  }
+
+  platformSummary = (type) => {
+    const { currentSiteName, realTimeData2, realTimeData1, initLoading, refreshTime, screenW, loadedFlag, detailData } = this.state;
+    const leftW = this.props.global != undefined && this.props.global.collapsed != undefined && this.props.global.collapsed ? 90 : 150;
+    let itemW = (screenW * 1 - leftW - 20 - 100 - 30 - 80) / 5;
+    return (
+      <>
+        {this.realtimeAnalysis()}
+        <div className={`${stat.num_stat_item} ${global.flex_row_start_center} ${global.no_border}`}>
+          <div className={`${stat.left_slide} ${global.flex_column_center_center}`}>
+            <img src={realTimeData1.icon} className={`${stat.slide_icon}`}></img>
+            <span className={`${stat.slide_title}`}>{realTimeData1.title}</span>
+          </div>
+          <div className={`${stat.right_main}`}>
+            <ul className={`${global.flex_row_start_center}`}>
+              {realTimeData1.list.map((item, index) => (
+                <li key={index} className={`${global.flex_column_center_start}`} style={{ width: itemW }}>
+                  <div className={`${stat.up_desc}`}>
+                    <span>{item.name}</span>
+
+                    {item.isHelpIcon ? <Tooltip placement="right" title={item.tip}>
+                      <img src={require('@/assets/home_basic/help_icon.png')}></img>
+                    </Tooltip> : ''}
+                  </div>
+                  <div className={`${stat.down_num}`} title={item.value}>
+                    <span>
+                    {loadedFlag && (
+                      item.value > 10000
+                        ? formatNum(item.value, item.isMoney ? 2 : 0)
+                        : <TweenOne animation={{
+                          Children: {
+                            value: item.value, floatLength: item.isMoney ? 2 : 0,
+                            formatMoney: true,
+                          },
+                          duration: 1000,
+                        }}/>
+                    )}
+                  </span>
+                  </div>
+                </li>
+              ))}
+            </ul>
+          </div>
+        </div>
+      </>
+    )
+  }
+
   render() {
-    const { realTimeData2, realTimeData1, initLoading, refreshTime, screenW, loadedFlag, detailData } = this.state;
+    const { currentSiteName, realTimeData2, realTimeData1, initLoading, refreshTime, screenW, loadedFlag, detailData } = this.state;
     const leftW = this.props.global != undefined && this.props.global.collapsed != undefined && this.props.global.collapsed ? 90 : 150;
     let itemW = (screenW * 1 - leftW - 20 - 100 - 30 - 80) / 5;
     return (
@@ -281,19 +349,11 @@ export default class StatisticsRealtime extends Component {
         >
           <Spin spinning={initLoading}>
             <div className={`${stat.module_item}`}>
-              <div className={`${stat.label_panel} ${global.flex_row_start_center}`}>
-                {sldLlineRtextAddGoodsAddMargin(defaultSettings.primaryColor, `${sldComLanguage('实时分析')}`, 10, 0, 0)}
-                <Tooltip placement="right" title={`${sldComLanguage('今日实时数据的统计时间均为今日零时至当前更新时间。点击刷新按钮可强制更新。')}`}>
-                  <img style={{ display: 'inline-block', marginLeft: '10px' }}
-                       src={require('@/assets/home_basic/help_icon.png')}></img>
-                </Tooltip>
-                <div className={`${stat.update_time_panel} ${global.flex_row_start_center}`}>
-                  <span>{`${sldComLanguage('更新时间:')}`}{refreshTime}</span>
-                  <i onClick={() => this.initData(true)} className={`${stat.reload_icon}`}></i>
-                </div>
-              </div>
-              <div className={`${stat.real_num_panel}`}>
-                <div className={`${stat.num_stat_item} ${global.flex_row_start_center}`}>
+              {currentSiteName && this.platformSummary()}
+              {currentSiteName && <div className={ styles.current_site }>{ currentSiteName }</div> }
+              <div className={`${stat.real_num_panel} ${styles.current_site_stat}`}>
+                {this.realtimeAnalysis()}
+                <div className={`${stat.num_stat_item} ${global.flex_row_start_center} ${styles.no_border}`}>
                   <div className={`${stat.left_slide} ${global.flex_column_center_center}`}>
                     <img src={realTimeData1.icon} className={`${stat.slide_icon}`}></img>
                     <span className={`${stat.slide_title}`}>{realTimeData1.title}</span>
@@ -331,7 +391,7 @@ export default class StatisticsRealtime extends Component {
                   </div>
                 </div>
                 <div>
-                  <div className={`${stat.num_stat_item} ${global.flex_row_start_start}`}>
+                  <div className={`${stat.num_stat_item} ${global.flex_row_start_start} ${styles.no_border}`}>
                     <div
                       className={`${stat.left_slide} ${global.flex_column_center_center}`}>
                       <img src={realTimeData2.icon} className={`${stat.slide_icon}`}></img>

+ 22 - 0
xinkeaboard-admin/src/pages/statistics/realtime.less

@@ -0,0 +1,22 @@
+.current_site {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 50px;
+  font-size: 25px;
+  font-weight: bold;
+  margin: 10px 0;
+  background-color: #fff;
+}
+
+.current_site_stat {
+    padding: 0 20px;
+}
+
+.no_pointer {
+  cursor: initial !important;
+}
+
+.no_border {
+  border: none !important;
+}

+ 53 - 39
xinkeaboard-admin/src/pages/sysset/agreement/edit.js

@@ -1,6 +1,6 @@
 import { connect } from 'dva/index';
 import React, { Component } from 'react';
-import { Form } from 'antd';
+import { Form, Spin, Button } from 'antd';
 import {
   sldLlineRtextAddGoods,
   failTip,
@@ -25,6 +25,8 @@ export default class Edit extends Component {
   constructor(props) {
     super(props);
     this.state = {
+      initDataLoading: false, // 整体加载loading
+      submitLoading: false,
       initEditorFlag: false,//加载百度编辑器
       getEditorContentFlag: false,//获取百度编辑器内容标识
       initEditorContent: '',//百度编辑器内容
@@ -60,6 +62,7 @@ export default class Edit extends Component {
   get_detail = () => {
     const { dispatch } = this.props;
     let { operate_data, query } = this.state;
+    this.setState({initDataLoading: true})
     dispatch({
       type: 'agreement/get_agreement_detail',
       payload: { agreementCode: query.agreementCode },
@@ -69,7 +72,7 @@ export default class Edit extends Component {
             operate_data[i].initialValue = res.data.title;
           }
         }
-        this.setState({ operate_data, initEditorContent: quillEscapeToHtml(res.data.content), initEditorFlag: true });
+        this.setState({ initDataLoading: false, operate_data, initEditorContent: quillEscapeToHtml(res.data.content), initEditorFlag: true });
       },
     });
   };
@@ -88,6 +91,7 @@ export default class Edit extends Component {
         const { query } = this.state;
         values.agreementCode = query.agreementCode;
         let dis_type = 'agreement/update_agreement';
+        this.setState({submitLoading: true})
         dispatch({
           type: dis_type,
           payload: values,
@@ -98,6 +102,7 @@ export default class Edit extends Component {
             } else {
               failTip(res.msg);
             }
+            this.setState({submitLoading: false})
           },
         });
       }
@@ -111,53 +116,62 @@ export default class Edit extends Component {
   };
 
   render() {
-    const { operate_data, initEditorFlag, getEditorContentFlag, initEditorContent } = this.state;
+    const { submitLoading, operate_data, initDataLoading, initEditorFlag, getEditorContentFlag, initEditorContent } = this.state;
 
     return (
       <div className={global.common_page_20}
            style={{ display: 'flex', flexDirection: 'column', justifyContent: 'flex-start' }}>
+      <Spin spinning={initDataLoading}>
         <Scrollbars
-          autoHeight
-          autoHeightMin={100}
-          autoHeightMax={document.body.clientHeight - 120}
-        >
-          <div className={global.flex_row_start_start}>
-            <div className={global.flex_column_start_start} style={{ flex: 1 }}>
-              {sldLlineRtextAddGoods(defaultSettings.primaryColor, `${sldComLanguage('基本信息')}`)}
-              <div style={{ marginTop: 20 }} className={global.tableListFormAdd}>
-                <div style={{ display: 'flex', flexDirection: 'column' }}>
-                  <Form onSubmit={() => this.handleSaveAllData()} layout="inline">
-                    <SldEditFormCom form={this.props.form} search_data={operate_data}/>
-                    {getSldEmptyH(15)}
-                    {sldLlineRtextAddGoods(defaultSettings.primaryColor, `${sldComLanguage('内容编辑')}`)}
-                    <div className={`${global.goods_sku_tab} ${global.flex_column_start_start}`} style={{
-                      marginTop: 20,
-                      width: document.body.clientWidth - (this.props.global.collapsed ? 90 : 160) - 60,
-                    }}>
-                      {initEditorFlag &&
-                      <SldUEditor id={'agreement'} getContentFlag={getEditorContentFlag}
-                                  getEditorContent={this.getEditorContent} initEditorContent={initEditorContent}/>
-                      }
-                      {getSldEmptyH(30)}
-                    </div>
-
-                    <div className={global.m_diy_bottom_wrap}
-                         style={{ position: 'fixed', left: this.props.global.collapsed ? 90 : 160 }}>
-                      <div onClick={() => this.props.history.goBack()} className={global.add_goods_bottom_btn}>
-                        {sldComLanguage('返回')}
+            autoHeight
+            autoHeightMin={100}
+            autoHeightMax={document.body.clientHeight - 120}
+          >
+            <div className={global.flex_row_start_start}>
+              <div className={global.flex_column_start_start} style={{ flex: 1 }}>
+                {sldLlineRtextAddGoods(defaultSettings.primaryColor, `${sldComLanguage('基本信息')}`)}
+                <div style={{ marginTop: 20 }} className={global.tableListFormAdd}>
+                  <div style={{ display: 'flex', flexDirection: 'column' }}>
+                    <Form onSubmit={() => this.handleSaveAllData()} layout="inline">
+                      <SldEditFormCom form={this.props.form} search_data={operate_data}/>
+                      {getSldEmptyH(15)}
+                      {sldLlineRtextAddGoods(defaultSettings.primaryColor, `${sldComLanguage('内容编辑')}`)}
+                      <div className={`${global.goods_sku_tab} ${global.flex_column_start_start}`} style={{
+                        marginTop: 20,
+                        width: document.body.clientWidth - (this.props.global.collapsed ? 90 : 160) - 60,
+                      }}>
+                        {initEditorFlag &&
+                        <SldUEditor id={'agreement'} getContentFlag={getEditorContentFlag}
+                                    getEditorContent={this.getEditorContent} initEditorContent={initEditorContent}/>
+                        }
+                        {getSldEmptyH(30)}
                       </div>
-                      <div onClick={() => this.handleSaveAllData()}
-                           className={`${global.add_goods_bottom_btn} ${global.add_goods_bottom_btn_sel}`}>
-                        {sldComLanguage('保存并返回')}
+
+                      <div className={global.m_diy_bottom_wrap}
+                          style={{ position: 'fixed', left: this.props.global.collapsed ? 90 : 160 }}>
+                        <Button 
+                          onClick={() => this.props.history.goBack()}
+                          style={{ width: '100px', borderRadius: '0', marginRight: '20px' }}
+                        >
+                          {sldComLanguage('返回')}
+                        </Button>
+                        <Button 
+                          type='primary'
+                          loading={submitLoading}
+                          style={{ minWidth: '100px', borderRadius: '0' }}
+                          onClick={() => this.handleSaveAllData()}
+                        >
+                          {sldComLanguage('保存并返回')}
+                        </Button>
                       </div>
-                    </div>
-                  </Form>
+                    </Form>
+                  </div>
                 </div>
               </div>
+              <div style={{ height: 100, width: 6, flexShrink: 0 }}/>
             </div>
-            <div style={{ height: 100, width: 6, flexShrink: 0 }}/>
-          </div>
-        </Scrollbars>
+          </Scrollbars>
+        </Spin>
       </div>
     );
   }

+ 2 - 1
xinkeaboard-admin/src/pages/sysset/agreement/lists.js

@@ -84,12 +84,12 @@ export default class Lists extends Component {
 
 	//获取数据列表
 	get_list = (params) => {
+		this.setState({ loading: true });
 		const { dispatch } = this.props;
 		dispatch({
 			type: 'agreement/get_agreement_lists',
 			payload: params,
 			callback: (res) => {
-				this.setState({ loading: false });
 				if (res.state == 200) {
 					if (res.data.length == 0 && this.state.params.current > 1) {
 						params.current = params.current - 1;
@@ -101,6 +101,7 @@ export default class Lists extends Component {
 						});
 					}
 				}
+			    this.setState({ loading: false });
 			},
 		});
 	};

+ 2 - 2
xinkeaboard-admin/src/pages/sysset/base/about_us.js

@@ -155,7 +155,7 @@ export default class SiteInfo extends Component {
           <div className={'about_wrap'}>
             {flag == 1 &&
             <SldTableEdit
-              submiting={submitting}
+              submiting_sec={submitting}
               width={1000}
               data={info_data}
               handleSubmit={this.handleSubmit}
@@ -163,7 +163,7 @@ export default class SiteInfo extends Component {
                 flag:false
               }}
               showAboutUsUeditor={{
-                text:`${sldComLanguage('保存')}`,
+                text:`${sldComLanguage('保存并更新')}`,
               }}
             />
             }

+ 73 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/components/DataShow.js

@@ -0,0 +1,73 @@
+import React from 'react';
+import styles from '../styles/data_show.less';
+
+class DataShow extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      animatedValues: [],
+    };
+  }
+
+  componentDidMount() {
+    this.startAnimation(this.props.options);
+  }
+
+  componentDidUpdate(prevProps) {
+    if (prevProps.options !== this.props.options) {
+      this.startAnimation(this.props.options);
+    }
+  }
+
+  startAnimation(data) {
+    this.setState({ animatedValues: data.map(() => 0) });
+
+    data.forEach((item, index) => {
+      this.animateNumber(item.value, 3000, 0, (val) => {
+        this.setState((prevState) => {
+          const newValues = [...prevState.animatedValues];
+          newValues[index] = val;
+          return { animatedValues: newValues };
+        });
+      });
+    });
+  }
+
+  animateNumber(target, duration = 2000, decimals = 0, onUpdate) {
+    const startTime = performance.now();
+
+    const step = (now) => {
+      const progress = Math.min((now - startTime) / duration, 1);
+      const current = +(progress * target).toFixed(decimals);
+      if (onUpdate) onUpdate(current);
+
+      if (progress < 1) {
+        requestAnimationFrame(step);
+      } else {
+        onUpdate(target);
+      }
+    };
+
+    requestAnimationFrame(step);
+  }
+
+  render() {
+    const { options } = this.props;
+    const { animatedValues } = this.state;
+
+    return (
+      <div className={styles.data_show}>
+        {options.map((item, index) => (
+          <div className={styles.dataCard} key={index}>
+            <div className={styles.data_value}>
+              {Number(animatedValues[index] || 0).toLocaleString()}
+            </div>
+            <div className={styles.data_label}>{item.label}</div>
+          </div>
+        ))}
+      </div>
+    );
+  }
+}
+
+export default DataShow;

+ 43 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/components/HeadContent.js

@@ -0,0 +1,43 @@
+import React from "react";
+import { connect } from "dva";
+import styles from "../styles/header_content.less";
+
+class HeaderContent extends React.Component {
+  componentDidMount() {
+    this.updateTime();
+    this.timeInterval = setInterval(this.updateTime, 1000);
+    // this.props.dispatch({ type: 'header/fetchWeather' });
+  }
+
+  componentWillUnmount() {
+    clearInterval(this.timeInterval);
+  }
+
+  updateTime = () => {
+    const now = new Date();
+    const pad = (n) => n.toString().padStart(2, "0");
+    const currentTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(
+      now.getDate()
+    )} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(
+      now.getSeconds()
+    )}`;
+    this.setState({ currentTime });
+  };
+
+  state = {
+    currentTime: "",
+  };
+
+  render() {
+    const { currentTime } = this.state;
+    const { weatherData } = this.props;
+    return (
+      <div className={styles.headerContent}>
+        <div className={styles.headerContentTitle}>这是一个大屏</div>
+        <div className={styles.headerContentTime}>{currentTime}</div>
+      </div>
+    );
+  }
+}
+
+export default connect(() => ({}))(HeaderContent);

+ 24 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/components/PanelBlock.js

@@ -0,0 +1,24 @@
+import React from "react";
+import PanelNav from "./PanelNav";
+import styles from "../styles/panel_block.less";
+
+class PanelBlock extends React.Component {
+  render() {
+    const { title, flexDirection, height, children } = this.props;
+
+    const style = {
+      height: height || undefined,
+      flex: height ? "unset" : 1,
+      flexDirection: flexDirection ?? 'column'
+    };
+
+    return (
+      <div className={`${styles.panel} ${styles.block}`} style={style}>
+        {title && <PanelNav title={title} />}
+        {children}
+      </div>
+    );
+  }
+}
+
+export default PanelBlock;

+ 11 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/components/PanelNav.js

@@ -0,0 +1,11 @@
+import React from 'react';
+import styles from '../styles/panel_nav.less';
+
+class PanelNav extends React.Component {
+  render() {
+    const { title } = this.props;
+    return <div className={styles.panel_nav}>{title}</div>;
+  }
+}
+
+export default PanelNav;

+ 43 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/components/RadioButtonGroup.js

@@ -0,0 +1,43 @@
+import React from 'react';
+import styles from './index.module.less';
+
+class RadioButtonGroup extends React.Component {
+  static defaultProps = {
+    options: [
+      { label: '日', value: 'day' },
+      { label: '月', value: 'month' },
+      { label: '年', value: 'year' },
+    ],
+    value: 'day',
+    onChange: () => {},
+  };
+
+  handleSelect = (val) => {
+    const { value, onChange } = this.props;
+    if (val !== value) {
+      onChange(val);
+    }
+  };
+
+  render() {
+    const { options, value } = this.props;
+
+    return (
+      <div className={styles.screenRadioGroup}>
+        {options.map((item, index) => (
+          <div
+            key={index}
+            className={`${styles.customRadioButton} ${
+              value === item.value ? styles.checked : ''
+            }`}
+            onClick={() => this.handleSelect(item.value)}
+          >
+            {item.label}
+          </div>
+        ))}
+      </div>
+    );
+  }
+}
+
+export default RadioButtonGroup;

+ 166 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/index.js

@@ -0,0 +1,166 @@
+import React from "react";
+import styles from "./index.less";
+import PanelBlock from "./components/PanelBlock";
+import HeaderContent from "./components/HeadContent";
+import WordCloud from "@/components/WordCloud";
+
+class BigScreen extends React.Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      isFullScreen: false,
+      startTime: performance.now(),
+    };
+    this.resizeHandler = null;
+    this.timer = null;
+    this.htmlOverflow = null;
+    this.bodyOverflow = null;
+  }
+
+  componentDidMount() {
+    this.setScale();
+    window.addEventListener("resize", this.debounceSetScale);
+
+    this.showRenderTime();
+    this.htmlOverflow = document.documentElement.style.overflow;
+    this.bodyOverflow = document.body.style.overflow;
+
+    document.documentElement.style.overflow = "hidden";
+    document.body.style.overflow = "hidden";
+
+    // 全屏事件监听
+    [
+      "fullscreenchange",
+      "webkitfullscreenchange",
+      "mozfullscreenchange",
+      "MSFullscreenChange",
+    ].forEach((event) =>
+      document.addEventListener(event, this.onFullScreenChange)
+    );
+  }
+
+  componentWillUnmount() {
+    window.removeEventListener("resize", this.debounceSetScale);
+
+    document.documentElement.style.overflow = this.htmlOverflow || "";
+    document.body.style.overflow = this.bodyOverflow || "";
+
+    [
+      "fullscreenchange",
+      "webkitfullscreenchange",
+      "mozfullscreenchange",
+      "MSFullscreenChange",
+    ].forEach((event) =>
+      document.removeEventListener(event, this.onFullScreenChange)
+    );
+  }
+
+  // 全屏切换
+  toggleFullScreen = () => {
+    const elem = document.querySelector(`.${styles.screenWrapper}`);
+    if (!this.state.isFullScreen) {
+      if (elem.requestFullscreen) elem.requestFullscreen();
+      else if (elem.webkitRequestFullscreen) elem.webkitRequestFullscreen();
+      else if (elem.mozRequestFullScreen) elem.mozRequestFullScreen();
+      else if (elem.msRequestFullscreen) elem.msRequestFullscreen();
+    } else {
+      if (document.exitFullscreen) document.exitFullscreen();
+      else if (document.webkitExitFullscreen) document.webkitExitFullscreen();
+      else if (document.mozCancelFullScreen) document.mozCancelFullScreen();
+      else if (document.msExitFullscreen) document.msExitFullscreen();
+    }
+  };
+
+  onFullScreenChange = () => {
+    this.setState({
+      isFullScreen: !!(
+        document.fullscreenElement ||
+        document.webkitFullscreenElement ||
+        document.mozFullScreenElement ||
+        document.msFullscreenElement
+      ),
+    });
+  };
+
+  debounceSetScale = () => {
+    clearTimeout(this.resizeHandler);
+    this.resizeHandler = setTimeout(() => {
+      this.setScale();
+    }, 200);
+  };
+
+  setScale = () => {
+    const baseWidth = 3840;
+    const baseHeight = 2160;
+    const wrapper = document.querySelector(`.${styles.screenWrapper}`);
+    const ww = wrapper ? wrapper.clientWidth : window.innerWidth;
+    const wh = wrapper ? wrapper.clientHeight : window.innerHeight;
+    const scale = Math.min(ww / baseWidth, wh / baseHeight);
+
+    const screenContainer = document.querySelector(
+      `.${styles.screenContainer}`
+    );
+    if (screenContainer) {
+      screenContainer.style.transform = `scale(${scale}) translate(-50%, -50%)`;
+      screenContainer.style.transformOrigin = "0 0";
+      screenContainer.style.left = "50%";
+      screenContainer.style.top = "50%";
+      screenContainer.style.margin = "0";
+    }
+  };
+
+  showRenderTime = () => {
+    const timeUsed = (performance.now() - this.state.startTime).toFixed(2);
+    console.log(`页面渲染完成耗时:${timeUsed} ms`);
+  };
+
+  render() {
+    const { isFullScreen } = this.state;
+
+    return (
+      <div className={styles.screenWrapper}>
+        <button
+          className={styles.fullscreenBtn}
+          onClick={this.toggleFullScreen}
+        >
+          {isFullScreen ? "退出全屏" : "全屏"}
+        </button>
+        <div className={styles.screenContainer}>
+          {/* 顶部 */}
+          <div className={styles.headPanel}>
+            <HeaderContent />
+          </div>
+          <div className={styles.contentPanel}>
+            {/* 左侧 */}
+            <div className={styles.contentPanelLeft}>
+              {/* <PanelBlock height="200px" /> */}
+              <PanelBlock />
+              <PanelBlock />
+              <PanelBlock height="400px" />
+            </div>
+
+            {/* 中间 */}
+            <div className={styles.contentPanelCenter}>
+              <PanelBlock height="350px" />
+              <PanelBlock />
+              <PanelBlock height="500px" flexDirection="row">
+                <PanelBlock />
+                <PanelBlock />
+              </PanelBlock>
+            </div>
+
+            {/* 右侧 */}
+            <div className={styles.contentPanelRight}>
+              <PanelBlock title='sdsdsd'>
+                <WordCloud />
+              </PanelBlock>
+              <PanelBlock />
+            </div>
+          </div>
+        </div>
+      </div>
+    );
+  }
+}
+
+export default BigScreen;

+ 78 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/index.less

@@ -0,0 +1,78 @@
+@import "./theme.less";
+.screenWrapper {
+  width: 100%;
+  height: calc(100vh - 60px);
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  position: relative;
+  background: url("../../../assets/bigscreen/screen-bg.jpg") no-repeat center center;
+  background-size: cover;
+
+  .fullscreenBtn {
+    position: absolute;
+    top: 0;
+    right: 0;
+    z-index: 10000;
+    background: rgba(0, 0, 0, 0.7);
+    color: #00ff88;
+    border: none;
+    border-radius: 4px;
+    padding: 8px 18px;
+    font-size: 16px;
+    cursor: pointer;
+    transition: background 0.2s;
+
+    &:hover {
+      background: rgba(0, 0, 0, 0.9);
+    }
+  }
+}
+
+.screenContainer {
+  width: 3840px;
+  height: 2160px;
+  padding: 24px;
+  display: flex;
+  flex-direction: column;
+  box-sizing: border-box;
+  overflow: hidden;
+  gap: @gap-size;
+  position: absolute;
+  left: 0;
+  top: 0;
+}
+
+.headPanel {
+  height: 200px;
+  gap: @gap-size;
+}
+
+.contentPanel {
+  display: flex;
+  flex: 1;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  gap: @gap-size;
+
+  &Left,
+  &Center,
+  &Right {
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+  }
+
+  &Left {
+    width: 25%;
+  }
+
+  &Center {
+    width: 50%;
+  }
+
+  &Right {
+    width: 25%;
+  }
+}

+ 69 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/styles/data_show.less

@@ -0,0 +1,69 @@
+@import '../theme.less';
+
+.data_show {
+  display: flex;
+  justify-content: space-between;
+  gap: @gap-size;
+  border-radius: 20px;
+}
+
+.data_card {
+  flex: 1;
+  background: rgba(20, 40, 80, 0.85);
+  border: 2px solid rgba(0, 255, 255, 0.25);
+  border-radius: 16px;
+  padding: 25px 0;
+  text-align: center;
+  position: relative;
+  overflow: hidden;
+  transition: transform 0.2s, box-shadow 0.2s;
+  cursor: pointer;
+}
+
+.data_card::before {
+  content: '';
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  width: 200%;
+  height: 200%;
+  background: radial-gradient(circle, rgba(0, 255, 255, 0.15) 0%, transparent 70%);
+  z-index: 0;
+  pointer-events: none;
+  animation: shine 3s linear infinite;
+}
+
+.data_card:hover {
+  transform: translateY(-8px) scale(1.04);
+}
+
+.data_value {
+  color: #00fff7;
+  font-size: @font-title-sub;
+  font-weight: bold;
+  letter-spacing: 3px;
+  margin-bottom: 12px;
+  text-shadow: 0 0 12px #00fff7, 0 0 24px #0ff;
+  position: relative;
+  z-index: 1;
+  animation: glow 2s ease-in-out infinite alternate;
+}
+
+@keyframes glow {
+  from {
+    text-shadow: 0 0 12px #00fff7, 0 0 24px #0ff;
+  }
+  to {
+    text-shadow: 0 0 24px #00fff7, 0 0 48px #0ff;
+  }
+}
+
+.data_label {
+  color: #fff;
+  font-weight: bold;
+  font-size: @font-body;
+  letter-spacing: 2px;
+  opacity: 0.85;
+  position: relative;
+  z-index: 1;
+}

+ 31 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/styles/header_content.less

@@ -0,0 +1,31 @@
+@import '../theme.less';
+
+.headerContent {
+  background-image: url("../../../../assets/bigscreen/head.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center;
+  text-align: center;
+  font-size: @font-title-main;
+  position: relative;
+
+  .headerContentTitle {
+    line-height: 200px;
+    font-size: @font-title-main;
+    font-weight: bold;
+    color: #00c6ff;
+    text-shadow: 0 2px 8px rgba(0, 198, 255, 0.3);
+  }
+
+  .headerContentTime {
+    position: absolute;
+    bottom: 0px;
+    right: 100px;
+    font-size: @font-title-sub;
+    background: linear-gradient(90deg, #00c6ff, #0072ff);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+    color: transparent;
+  }
+}

+ 18 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/styles/panel_block.less

@@ -0,0 +1,18 @@
+.panel {
+  border-radius: 28px;
+  width: 100%;
+  font-size: 40px;
+  letter-spacing: 1px;
+  padding: 10px;
+}
+
+.block {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+  box-sizing: border-box;
+  margin-top: 10px;
+  border: 4px dashed #fff;
+}

+ 11 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/styles/panel_nav.less

@@ -0,0 +1,11 @@
+
+@import '../theme.less';
+
+.panel_nav {
+  font-size: @font-title-sub;
+  font-weight: bold;
+  color: #00c6ff;
+  margin-bottom: 10px;
+  width: 100%;
+  text-shadow: 0 2px 8px rgba(30, 200, 255, 0.2);
+}

+ 37 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/styles/radio_button_group.less

@@ -0,0 +1,37 @@
+.screenRadioGroup {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin-top: 20px;
+}
+
+.customRadioButton {
+  width: 100px;
+  height: 50px;
+  line-height: 50px;
+  text-align: center;
+  font-size: 30px;
+  color: #fff;
+  background-color: #1a1a1a;
+  border: 1px solid #4fd2dd;
+  border-right: none;
+  cursor: pointer;
+  user-select: none;
+  transition: background 0.2s, border 0.2s;
+
+  &:hover {
+    background-color: #333;
+    border-color: #4fd2dd;
+  }
+}
+
+.checked {
+  background-color: #4fd2dd;
+  color: #fff;
+  border-color: #4fd2dd;
+}
+
+.customRadioButton:last-child {
+  margin-right: 0;
+  border-right: 1px solid #4fd2dd;
+}

+ 6 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/theme.less

@@ -0,0 +1,6 @@
+@font-title-main: 72px; /* 主标题(H1),建议60~80px */
+@font-title-sub: 42px; /* 副标题(H2/H3),建议36~48px */
+@font-body: 32px; /* 普通正文/数据,建议28~36px */
+@font-label: 20px; /* 次要说明、标签,建议18~24px */
+@font-helper: 16px; /* 辅助性单位、备注,建议≥16px */
+@gap-size: 25px;

+ 113 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getBarChartOptions.js

@@ -0,0 +1,113 @@
+export default function ({ xAxisData, seriesData }) {
+  return {
+    backgroundColor: "transparent",
+    xAxis: {
+      type: "category",
+      data: xAxisData,
+      axisLabel: {
+        fontSize: 22,
+        color: "#4fd2dd",
+        fontWeight: "bold",
+        shadowColor: "#000",
+        shadowBlur: 4,
+      },
+      axisLine: {
+        lineStyle: {
+          color: "#4fd2dd",
+          width: 2,
+        },
+      },
+      axisTick: {
+        show: false,
+      },
+    },
+    yAxis: {
+      type: "value",
+      axisLabel: {
+        fontSize: 22,
+        color: "#4fd2dd",
+        fontWeight: "bold",
+        shadowColor: "#000",
+        shadowBlur: 4,
+      },
+      splitLine: {
+        lineStyle: {
+          color: "rgba(79,210,221,0.2)",
+          type: "dashed",
+        },
+      },
+      axisLine: {
+        show: true,
+        lineStyle: {
+          color: "#4fd2dd",
+          width: 2,
+        },
+      },
+      axisTick: {
+        show: false,
+      },
+      interval: 50,
+    },
+    tooltip: {
+      trigger: "axis",
+      backgroundColor: "rgba(34,34,34,0.95)",
+      borderColor: "#4fd2dd",
+      borderWidth: 2,
+      textStyle: { color: "#fff", fontSize: 26, fontWeight: "bold" },
+      axisPointer: {
+        type: "shadow",
+        shadowStyle: {
+          color: "rgba(79,210,221,0.15)",
+        },
+      },
+    },
+    grid: {
+      left: "4%",
+      right: "4%",
+      bottom: "8%",
+      top: "10%",
+      containLabel: true,
+    },
+    series: [
+      {
+        data: seriesData,
+        type: "bar",
+        barWidth: 28,
+        itemStyle: {
+          color: {
+            type: "linear",
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+              { offset: 0, color: "#4fd2dd" },
+              { offset: 1, color: "#235fa7" },
+            ],
+          },
+          shadowColor: "#4fd2dd",
+          shadowBlur: 10,
+          borderRadius: [8, 8, 0, 0],
+        },
+        emphasis: {
+          itemStyle: {
+            color: "#fff",
+            borderColor: "#4fd2dd",
+            borderWidth: 3,
+            shadowColor: "#4fd2dd",
+            shadowBlur: 20,
+          },
+        },
+        label: {
+          show: true,
+          position: "top",
+          color: "#fff",
+          fontSize: 20,
+          fontWeight: "bold",
+          shadowColor: "#4fd2dd",
+          shadowBlur: 6,
+        },
+      },
+    ],
+  };
+}

+ 87 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getLineChartOptions.js

@@ -0,0 +1,87 @@
+export default function ({ xAxisData, seriesData }, $echarts) {
+  return {
+    xAxis: {
+      type: "category",
+      data: xAxisData,
+      axisLine: { lineStyle: { color: "#00ffe7", width: 2 } },
+      axisLabel: {
+        color: "#00ffe7",
+        fontSize: 22,
+        fontWeight: "bold",
+        shadowColor: "#00ffe7",
+        shadowBlur: 10,
+      },
+      splitLine: { show: false },
+    },
+    yAxis: {
+      type: "value",
+      axisLine: { lineStyle: { color: "#00ffe7", width: 2 } },
+      axisLabel: {
+        color: "#00ffe7",
+        fontSize: 22,
+        fontWeight: "bold",
+        shadowColor: "#00ffe7",
+        shadowBlur: 10,
+      },
+      splitLine: { lineStyle: { color: "rgba(0,255,231,0.1)" } },
+    },
+    series: [
+      {
+        data: seriesData,
+        type: "line",
+        smooth: true,
+        symbol: "circle",
+        symbolSize: 16,
+        lineStyle: {
+          color: {
+            type: "linear",
+            x: 0,
+            y: 0,
+            x2: 1,
+            y2: 0,
+            colorStops: [
+              { offset: 0, color: "#00ffe7" },
+              { offset: 1, color: "#0078ff" },
+            ],
+          },
+          width: 5,
+          shadowColor: "#00ffe7",
+          shadowBlur: 20,
+        },
+        itemStyle: {
+          color: "#00ffe7",
+          borderColor: "#fff",
+          borderWidth: 4,
+          shadowColor: "#00ffe7",
+          shadowBlur: 10,
+        },
+        areaStyle: {
+          color: new $echarts.graphic.LinearGradient(0, 0, 0, 1, [
+            { offset: 0, color: "rgba(0,255,231,0.5)" },
+            { offset: 1, color: "rgba(0,120,255,0.1)" },
+          ]),
+        },
+      },
+    ],
+    tooltip: {
+      trigger: "axis",
+      backgroundColor: "rgba(0,34,51,0.9)",
+      borderColor: "#00ffe7",
+      borderWidth: 2,
+      textStyle: { color: "#00ffe7", fontSize: 26, fontWeight: "bold" },
+      axisPointer: {
+        lineStyle: {
+          color: "#00ffe7",
+          width: 3,
+          type: "dashed",
+        },
+      },
+    },
+    grid: {
+      left: "3%",
+      right: "4%",
+      bottom: "3%",
+      containLabel: true,
+    },
+  };
+}

+ 75 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/utils/getPieChartOptions.js

@@ -0,0 +1,75 @@
+export default function ({ seriesData }) {
+  return {
+    tooltip: {
+      trigger: "item",
+      backgroundColor: "rgba(0,0,0,0.8)",
+      borderColor: "#00ffe7",
+      textStyle: {
+        color: "#fff",
+        fontSize: 25,
+      },
+    },
+    legend: {
+      show: false, // 隐藏左侧标签列表
+    },
+    series: [
+      {
+        name: "Access From",
+        type: "pie",
+        radius: ["40%", "70%"],
+        avoidLabelOverlap: false,
+        itemStyle: {
+          borderRadius: 10,
+          borderColor: "#222",
+          borderWidth: 4,
+          // shadowBlur: 20,
+          // shadowColor: "rgba(0,255,231,0.5)",
+        },
+        label: {
+          position: "outside",
+          show: true,
+          fontSize: 20,
+          color: "#fff",
+          fontWeight: "bold",
+          textShadowColor: "#00ffe7",
+          textShadowBlur: 10,
+          overflow: "break", // 支持换行
+          width: 100, // 设置宽度以便换行生效,可根据实际调整
+          formatter: function (params) {
+            // 自动换行
+            const maxLength = 8; // 每行最大字符数,可根据需要调整
+            let name = params.name;
+            let result = "";
+            while (name.length > maxLength) {
+              result += name.substring(0, maxLength) + "\n";
+              name = name.substring(maxLength);
+            }
+            result += name;
+            return result;
+          },
+        },
+        labelLine: {
+          length: 10,
+          length2: 10,
+          lineStyle: {
+            color: "#00ffe7",
+            width: 3,
+          },
+        },
+        data: seriesData,
+        emphasis: {
+          itemStyle: {
+            shadowBlur: 30,
+            shadowOffsetX: 0,
+            shadowColor: "rgba(0,255,231,0.8)",
+          },
+          label: {
+            fontSize: 24,
+            color: "#00ffe7",
+            fontWeight: "bolder",
+          },
+        },
+      },
+    ],
+  };
+}

+ 1 - 0
xinkeaboard-admin/src/pages/sysset/bigscreen/utils/tableColumn.js

@@ -0,0 +1 @@
+export default {};

+ 78 - 6
xinkeaboard-admin/src/pages/sysset/home/basic.js

@@ -32,6 +32,35 @@ export default class Basic extends Component {
     this.state = {
       loadedFlag: false,//顶部数据是否加载完成
       waitDealLoading: false,//顶部待办事项数据是否加载完成
+      currentWaitDealLoading: false, // 当前站点待办事项数据是否加载完成
+      // 当前站点
+      current_site_goods_data: [
+        {
+          icon: require('@/assets/stat_item_icon_2.png'),
+          label: `${sldComLanguage('待审核商品')}`,
+          tip: ``,
+          mapKey: 'webSiteAuditGoodsNum',
+          num: '',
+          path: '/manage_product/goods_list?tab=check',
+        },
+        {
+          icon: require('@/assets/stat_item_icon_3.png'),
+          label: `${sldComLanguage('待审核品牌')}`,
+          tip: ``,
+          mapKey: 'webSiteAuditBrandNum',
+          num: '',
+          path: '/manage_product/brand?tab=check',
+        },
+        {
+          icon: require('@/assets/stat_item_icon_1.png'),
+          label: `${sldComLanguage('待分配询盘')}`,
+          tip: ``,
+          mapKey: 'webSiteEnquiryToBeAssignNum',
+          num: '',
+          path: '/manage_order/enquiry',
+        }
+      ],
+      // 所有站点
       goods_data_one: [{
         icon: require('@/assets/stat_item_icon_1.png'),
         label: `${sldComLanguage('待审核店铺')}`,
@@ -250,6 +279,7 @@ export default class Basic extends Component {
           },
         ],
       },//今日询盘概况
+      currentSiteName: props.global.currentSiteName
     };
   }
 
@@ -273,11 +303,14 @@ export default class Basic extends Component {
       type: 'sldsetting/get_home_basic_wait_deal_stat_info',
       callback: (res) => {
         if (res.state === 200) {
-          let { goods_data_one } = this.state;
+          let { goods_data_one, current_site_goods_data } = this.state;
           goods_data_one.map(item => {
             item.num = res.data[item.mapKey];
           });
-          this.setState({ goods_data_one });
+          current_site_goods_data.map(item => {
+            item.num = res.data[item.mapKey];
+          });
+          this.setState({ goods_data_one, current_site_goods_data });
         }
         this.setState({ waitDealLoading: false, loadedFlag: true });
       },
@@ -395,7 +428,7 @@ export default class Basic extends Component {
   };
 
   render() {
-    const { goods_data_one, loadedFlag, waitDealLoading, /*todayTradeData,*/ todayFlowData, todayGoodsData, todayMemberData, todayTradeLoadedFlag, todayFlowLoadedFlag, todayGoodsLoadedFlag, todayMemberLoadedFlag, todayTradeLoading, todayFlowLoading, todayGoodsLoading, todayMemberLoading,todayEnquiryData,todayEnquiryLoadedFlag,todayEnquiryLoading } = this.state;
+    const { currentSiteName, current_site_goods_data, goods_data_one, loadedFlag, waitDealLoading, /*todayTradeData,*/ todayFlowData, todayGoodsData, todayMemberData, todayTradeLoadedFlag, todayFlowLoadedFlag, todayGoodsLoadedFlag, todayMemberLoadedFlag, todayTradeLoading, todayFlowLoading, todayGoodsLoading, todayMemberLoading,todayEnquiryData,todayEnquiryLoadedFlag,todayEnquiryLoading } = this.state;
     const todayData = [
       /*{ ...todayTradeData },*/
       { ...todayFlowData },
@@ -412,13 +445,51 @@ export default class Basic extends Component {
           autoHeightMax={document.body.clientHeight - 60}
         >
           <div className={`${styles.module_item}`}>
-            <div className={`${stat.label_panel}`}>
+            <div className={`${stat.label_panel} ${styles.label_panel}`}>
+              {sldLlineRtextAddGoodsAddMargin(defaultSettings.primaryColor, `${sldComLanguage('待办事项')}`, 10, 0, 0)}
+              <span className={ styles.site_tip }>{ `( ${sldComLanguage('全部站点待办事项')} )` }</span>
+            </div>
+            <Spin spinning={waitDealLoading}>
+              <div className={`${styles.stat_amount_new} ${global.flex_com_row_space_around_center}`}>
+                {goods_data_one.map((item) => (
+                  <div key={item.bg}
+                       className={`${styles.item} ${styles.goods} ${global.flex_com_row_start_start} ${global.no_pointer}`}
+                  >
+                    <div className={`${styles.left_pending_icon}`}>
+                      <img src={item.icon} alt=""/>
+                    </div>
+                    <div className={`${styles.item_desc}`}>
+                      <div className={`${styles.item_title}`}>{item.label}</div>
+                      <div title={item.num} className={`${styles.item_num}`}>
+                        {loadedFlag && (
+                          item.num > 10000
+                            ? formatNum(item.num)
+                            : <TweenOne animation={{
+                              Children: {
+                                value: item.num, floatLength: 0,
+                                formatMoney: true,
+                              },
+                              duration: 1000,
+                            }}/>
+                        )}
+                      </div>
+                    </div>
+                  </div>
+                ))}
+              </div>
+            </Spin>
+          </div>
+          <div className={styles.current_site}>{ currentSiteName }</div>
+          {/* 当前站点的待办事项--start*/}
+          <div className={`${styles.module_item}`}>
+            <div className={`${stat.label_panel} ${styles.label_panel}`}>
               {sldLlineRtextAddGoodsAddMargin(defaultSettings.primaryColor, `${sldComLanguage('待办事项')}`, 10, 0, 0)}
+              <span className={ styles.site_tip }>{ `( ${sldComLanguage('当前站点待办事项')} )` }</span>
             </div>
             <Spin spinning={waitDealLoading}>
               <div className={`${styles.stat_amount_new} ${global.flex_com_row_space_around_center}`}>
-                {goods_data_one.map((item, index) => (
-                  <div key={index} onClick={() => (this.menuItemGoPage(item.path))} key={item.bg}
+                {current_site_goods_data.map((item) => (
+                  <div onClick={() => (this.menuItemGoPage(item.path))} key={item.bg}
                        className={`${styles.item} ${styles.goods} ${global.flex_com_row_start_start}`}
                   >
                     <div className={`${styles.left_pending_icon}`}>
@@ -445,6 +516,7 @@ export default class Basic extends Component {
               </div>
             </Spin>
           </div>
+          {/* 当前站点的待办事项--end*/}
           <div className={`${styles.today_info_panel} ${global.flex_com_space_between}`}>
             {todayData.map((item, index) => (
               <div key={index} className={`${styles.today_info_item}`}>

+ 19 - 0
xinkeaboard-admin/src/pages/sysset/home/basic.less

@@ -371,6 +371,8 @@
   }
 
   .label_panel {
+    display: flex;
+    align-items: center;
     border-bottom: 1px solid #D8D8D8;
   }
 
@@ -437,3 +439,20 @@
 .saling_stat{
   background-color: #f0f2f5;
 }
+
+.current_site {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 80px;
+  font-size: 25px;
+  font-weight: bold;
+  margin: 10px 0;
+  background-color: #fff;
+}
+
+.site_tip {
+  font-size: 13px;
+  color: rgb(153, 153, 153);
+  margin-left: 5px;
+}

+ 26 - 0
xinkeaboard-admin/src/pages/sysset/models/bigscreen.js

@@ -0,0 +1,26 @@
+import { sldCommonService } from "@/utils/utils";
+export default {
+  namespace: "bigscreen",
+
+  state: {},
+
+  effects: {
+    // *change_manager_pwd({ payload, callback }, { call }) {
+    //   const response = yield call(sldCommonService, payload,'post','v3/system/admin/adminUser/updatePwd');
+    //   if (callback) callback(response);
+    // },
+  },
+
+  reducers: {},
+
+  subscriptions: {
+    setup({ history }) {
+      // Subscribe history(url) change, trigger `load` action if pathname is `/`
+      return history.listen(({ pathname, search }) => {
+        if (typeof window.ga !== "undefined") {
+          window.ga("send", "pageview", pathname + search);
+        }
+      });
+    },
+  },
+};

+ 2 - 1
xinkeaboard-admin/src/pages/sysset/notice_set/email.js

@@ -43,6 +43,7 @@ export default class Sms extends Component {
 	get_email_info = () => {
 		const { dispatch } = this.props;
 		let { info_data } = this.state;
+		this.setState({initLoading: true})
 		dispatch({
 			type: 'sldsetting/get_email_info',
 			callback: (res) => {
@@ -79,7 +80,7 @@ export default class Sms extends Component {
 						});
 					}
 				}
-				this.setState({ info_data, flag: 1 });
+				this.setState({ info_data, flag: 1, initLoading: false });
 			},
 		});
 	};

+ 2 - 1
xinkeaboard-admin/src/pages/sysset/notice_set/sms.js

@@ -41,6 +41,7 @@ export default class Sms extends Component {
   get_sms_info = () => {
     const { dispatch } = this.props;
     let { info_data } = this.state;
+    this.setState({initLoading: true})
     dispatch({
       type: 'sldsetting/get_sms_info',
       callback: (res) => {
@@ -78,7 +79,7 @@ export default class Sms extends Component {
             });
           }
         }
-        this.setState({ info_data, flag: 1 });
+        this.setState({ info_data, flag: 1, initLoading: false});
       },
     });
   };

+ 4 - 4
xinkeaboard-admin/src/utils/util_data.js

@@ -880,10 +880,10 @@ export const sld_m_diy_tpzh_style = [{
 }];
 
 /*
-* 修改配置成功后,需点击右上角更新配置按钮更新配置才可生效
+* 修改配置成功后,需点击下方保存并更新按钮更新配置才可生效
 * */
 export function sld_need_update_setting() {
-  return [`${sldComLanguage('修改配置成功后,需点击右上角更新配置按钮更新配置才可生效')}`];
+  return [`${sldComLanguage('修改配置成功后,需点击下方保存并更新按钮更新配置才可生效')}`];
 }
 
 /*
@@ -898,7 +898,7 @@ export function sld_domain_manage_tip() {
 * */
 
 export function sld_order_export_tip() {
-  return [`${sldComLanguage('选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击右上角更新配置按钮更新配置才可生效')}`];
+  return [`${sldComLanguage('选中的字段将在订单导出的时候导出该数据,修改配置成功后,需点击下方保存并更新按钮更新配置才可生效')}`];
 }
 
 /*
@@ -919,7 +919,7 @@ export function week_day() {
 * */
 
 export function sld_sys_amount_tip() {
-  return [`${sldComLanguage('填写平台收款账号的信息,相关信息会出现在需要向平台汇款的页面')}`, `${sldComLanguage('修改配置成功后,需点击右上角更新配置按钮更新配置才可生效')}`];
+  return [`${sldComLanguage('填写平台收款账号的信息,相关信息会出现在需要向平台汇款的页面')}`, `${sldComLanguage('修改配置成功后,需点击下方保存并更新按钮更新配置才可生效')}`];
 }
 
 //TAB切换购物车图标

+ 19 - 6
xinkeaboard-admin/src/utils/utils.js

@@ -14,6 +14,7 @@ import request from './request';
 import fetch from 'dva/fetch';
 import { getLocale } from 'umi/locale';
 import defaultSettings from '@/defaultSettings';
+import isEmpty from "lodash/isEmpty"
 
 const Search = Input.Search;
 
@@ -665,7 +666,7 @@ export function sldPopConfirm(position, title, callback, okText, cancleText, sho
     okText={okText}
     cancelText={cancleText}>
     <a style={{ paddingLeft: paddingL, paddingRight: paddingR, color: color }}
-       href="javascript:void(0)">{showText}</a>
+       onClick={(e) => e.preventDefault()}>{showText}</a>
   </Popconfirm>;
 }
 
@@ -681,7 +682,7 @@ export function sldPopConfirm(position, title, callback, okText, cancleText, sho
 export function sldPopConfirmMenu(position, title, callback, okText, cancleText, showText, paddingL = 0, paddingR = 0, color = '#555') {
   return <Popconfirm placement={position} title={title}
                      onConfirm={callback} okText={okText} cancelText={cancleText}>
-    <a style={{ color: color, fontSize: 12 }} href="javascript:void(0)">{showText}</a>
+    <a style={{ color: color, fontSize: 12 }} onClick={(e) => e.preventDefault()}>{showText}</a>
   </Popconfirm>;
 }
 
@@ -1244,7 +1245,7 @@ export function sldtbaleOpeBtn(text, svg, callback, svgW = 14, svgH = 14) {
     ? <span title={text} style={{ marginRight: 3 }}>
 			<ALibbSvg fill={defaultSettings.primaryColor} width={svgW} height={svgH} type={svg}/>
 		</span>
-    : <a href='javascript:void(0)' onClick={callback} title={text} style={{ marginRight: 3 }}>
+    : <a onClick={(e) => {e.preventDefault(); callback(e) }} title={text} style={{ marginRight: 3 }}>
       <ALibbSvg fill={defaultSettings.primaryColor} width={svgW} height={svgH} type={svg}/>
     </a>;
 }
@@ -1299,7 +1300,7 @@ export function getSldImgSet(name) {
  * @params svgColor 图标颜色
  * */
 export function getOSvgMDiy(callback, svg, svgColor, svgW = 15, svgH = 15) {
-  return <div href={'javascript:void(0)'} onClick={callback}
+  return <div onClick={(e) => {e.preventDefault(); callback(e) }}
               className={`${styles.mdiy_operate_a} ${styles.flex_row_center_center}`} style={{ height: 30 }}>
     <ALibbSvg fill={svgColor} width={svgW} height={svgH} type={svg} extra={{ marginLeft: 15 }}/>
   </div>;
@@ -1327,9 +1328,21 @@ export function getSldStatYTitle() {
  * data_type json json格式 默认是表单提交
  * */
 export function sldComRequest(method, url, params, data_type = '') {
+  const state = window.g_app._store.getState();
+  const currentSite = state.global.currentSite;
+  const currentPath = state.routing.location.pathname;
+  if (!currentPath.includes('/user/login')) {
+    params = Object.assign({}, params ?? {}, { webSite: currentSite })
+  }
+
+  if (params && params.isAll) {
+    delete params.isAll;
+    delete params.webSite;
+  }
+
   if (method == 'get') {
     let tmp_url = apiUrl + `${url}`;
-    if (params != undefined) {
+    if (params != undefined && !isEmpty(params)) {
       tmp_url += `?${stringify(params)}`;
     }
     return request(tmp_url);
@@ -1485,7 +1498,7 @@ export function sldtbaleOpeBtnText(text, callback, svgW = 14, svgH = 14) {
     ? <span className={styles.tableOperateText} style={{ marginRight: 3 }}>
 			{text}
 		</span>
-    : <a className={styles.tableOperateText} href='javascript:void(0)' onClick={callback} title={text}
+    : <a className={styles.tableOperateText} onClick={(e) => {e.preventDefault(); callback(e) }} title={text}
          style={{ marginRight: 3 }}>
       {text}
     </a>;

+ 3 - 3
xinkeaboard-seller/config/config.js

@@ -78,17 +78,17 @@ export default {
       changeOrigin: true,
       pathRewrite: { "^/api": "" },
     },
-    // '/api/v3/system/seller/setting/getSiteSettingList': {
+    // '/api/v3/seller/seller/apply/saveApply': {
     //   target: 'http://192.168.0.158:8001/',
     //   changeOrigin: true,
     //   pathRewrite: { "^/api": "" },
     // },
-    // '/api/v3/statistics/seller/overview/analysis/source/presentData': {
+    // '/api/v3/seller/seller/apply/applyDetail': {
     //   target: 'http://192.168.0.158:8001/',
     //   changeOrigin: true,
     //   pathRewrite: { "^/api": "" },
     // },
-    // '/api/v3/goods/seller/goods/list': {
+    // '/api/v3/seller/seller/apply/process': {
     //   target: 'http://192.168.0.158:8001/',
     //   changeOrigin: true,
     //   pathRewrite: { "^/api": "" },

+ 2 - 2
xinkeaboard-seller/config/router.config.js

@@ -31,7 +31,7 @@ export default [
   // 商户入驻路由
   {
     path: '/apply',
-    component: '../layouts/BasicLayout',
+    component: '../layouts/index',
     Routes: ['src/pages/CheckSettle'],
     routes: [
       // { path: '/apply', redirect: '/user/login' },
@@ -102,7 +102,7 @@ export default [
   // app
   {
     path: '/',
-    component: '../layouts/BasicLayout',
+    component: '../layouts/index',
     Routes: ['src/pages/CheckLogin'],
     routes: [
       { path: '/', redirect: '/basic/simple_stat' },

+ 6 - 2
xinkeaboard-seller/src/components/GlobalHeader/RightContent.js

@@ -4,12 +4,16 @@ import { Tag, Menu, Icon } from 'antd';
 import moment from 'moment';
 import groupBy from 'lodash/groupBy';
 import HeaderDropdown from '../HeaderDropdown';
-// import SiteSelector from '../SiteSelector';
+import SiteSelector from '../SiteSelector';
 import styles from './index.less';
 import { sldComLanguage } from '@/utils/utils';
 import { specialFlag } from '@/utils/sldconfig';
 
 export default class GlobalHeaderRight extends PureComponent {
+	constructor(props) {
+		super(props);
+		this.isApplyPage = props.location.pathname.includes('/apply');
+	}
 
 	getNoticeData() {
 		const { notices = [] } = this.props;
@@ -94,7 +98,7 @@ export default class GlobalHeaderRight extends PureComponent {
 		}
 		return (
 			<div className={className}>
-				{/* <SiteSelector></SiteSelector> */}
+				{ !this.isApplyPage && <SiteSelector></SiteSelector> }
 				<HeaderDropdown overlay={menu}>
 					<span className={`${styles.action} ${styles.account}`}>
 						<span className={styles.name} style={{color:'#fff'}}>

+ 5 - 4
xinkeaboard-seller/src/components/PageLoading/index.js

@@ -1,9 +1,10 @@
-import React from 'react';
-import { Spin } from 'antd';
+import React from "react";
+import { Spin } from "antd";
 
 // loading components from code split
 // https://umijs.org/plugin/umi-plugin-react.html#dynamicimport
 export default () => (
-  <div style={{ paddingTop: 100, textAlign: 'center' }}>
-  </div>
+  <Spin>
+    <div style={{ paddingTop: 100, textAlign: "center" }} />
+  </Spin>
 );

+ 2 - 3
xinkeaboard-seller/src/components/SiteSelector/index.js

@@ -5,10 +5,9 @@ import router from 'umi/router';
 const SiteSelector = ({ siteList, currentSite, dispatch }) => {
   const handleChange = (value) => {
     dispatch({ type: "global/setCurrentSite", payload: value });
-    // window.location.reload(); // 页面刷新
   };
   return (
-    siteList.length && (
+    siteList.length ?  (
       <Select
         value={currentSite}
         style={{ width: 150 }}
@@ -20,7 +19,7 @@ const SiteSelector = ({ siteList, currentSite, dispatch }) => {
           </Select.Option>
         ))}
       </Select>
-    )
+    ) : null
   );
 };
 

+ 1 - 1
xinkeaboard-seller/src/components/SldTableRowThree/index.js

@@ -74,7 +74,7 @@ export default class SldTableRowTwo extends PureComponent {
     //普通输入框
     item_width = item_width != undefined ? item_width : 'auto';
     const uploadButton = (
-      <div>
+      <div key="upload-button">
         <Icon type="plus"/>
         <div className="ant-upload-text">{sldComLanguage('上传图片')}</div>
       </div>

+ 5 - 0
xinkeaboard-seller/src/components/SldTableRowThree/index.less

@@ -3,6 +3,11 @@
     .ant-form-item-control-wrapper{
       width: 100%;
     }
+
+    .ant-upload.ant-upload-select-picture-card {
+      margin-bottom: 2px !important;
+      margin-right: 0 !important;
+    }
   }
 }
 .sld_det_lr_wrap {

+ 12 - 1
xinkeaboard-seller/src/global.less

@@ -34,6 +34,13 @@ ol {
   padding: 10px;
   background-color: #fff;
   width: 100%;
+
+  :global {
+    .ant-upload.ant-upload-select-picture-card {
+      margin-bottom: 2px !important;
+      margin-right: 0 !important;
+    }
+  }
 }
 
 .common_page_20 {
@@ -262,7 +269,11 @@ body {
 
     .ant-form-explain, .ant-form-extra {
       font-size: 12px;
-      line-height: 15px;
+      // height: 15px !important;
+      // min-height: unset !important;
+      // margin-top: 2px !important;
+      // line-height: 15px !important;
+      // padding-top: 0;
     }
 
     .ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th {

+ 4 - 17
xinkeaboard-seller/src/layouts/BasicLayout.js

@@ -3,11 +3,9 @@ import { Layout } from 'antd';
 import DocumentTitle from 'react-document-title';
 import isEqual from 'lodash/isEqual';
 import memoizeOne from 'memoize-one';
-import { connect } from 'dva';
 import { ContainerQuery } from 'react-container-query';
 import classNames from 'classnames';
 import pathToRegexp from 'path-to-regexp';
-import Media from 'react-media';
 import { formatMessage } from 'umi/locale';
 import Authorized from '@/utils/Authorized';
 import Footer from './Footer';
@@ -55,6 +53,7 @@ class BasicLayout extends React.PureComponent {
     super(props);
     this.getPageTitle = memoizeOne(this.getPageTitle);
     this.matchParamsPath = memoizeOne(this.matchParamsPath, isEqual);
+    this.isApplyPage = props.location.pathname.includes("/apply");
   }
 
   componentDidMount() {
@@ -62,7 +61,6 @@ class BasicLayout extends React.PureComponent {
       dispatch,
       route: { routes, authority },
     } = this.props;
-    // dispatch({ type: 'global/get_site_list_data' });
     dispatch({
       type: 'menu/getMenuData',
       payload: { routes, authority },
@@ -70,8 +68,8 @@ class BasicLayout extends React.PureComponent {
   }
 
   componentDidUpdate(preProps) {
-
-	  // After changing to phone mode,
+  
+    // After changing to phone mode,
     // if collapsed is true, you need to click twice to display
     const { collapsed, isMobile } = this.props;
     if (isMobile && !preProps.isMobile && !collapsed) {
@@ -212,15 +210,4 @@ class BasicLayout extends React.PureComponent {
   }
 }
 
-export default connect(({ global, setting, menu }) => ({
-  collapsed: global.collapsed,
-  // currentSite: global.currentSite,
-  layout: setting.layout,
-  menuData: menu.menuData,
-  breadcrumbNameMap: menu.breadcrumbNameMap,
-  ...setting,
-}))(props => (
-   <Media query="(max-width: 599px)">
-    {isMobile => <BasicLayout  {...props} isMobile={isMobile} />}
-  </Media> 
-));
+export default BasicLayout;

+ 62 - 0
xinkeaboard-seller/src/layouts/index.js

@@ -0,0 +1,62 @@
+import React from 'react';
+import Media from 'react-media';
+import { connect } from 'dva';
+import PageLoading from '@/components/PageLoading';
+import BasicLayout from './BasicLayout';
+
+class LayoutWrapper extends React.PureComponent {
+  componentDidMount() {
+    const { dispatch, currentSite, location } = this.props;
+    const isApplyPage = location.pathname.includes('/apply');
+
+    // 非 apply 页 & currentSite 为空,初始化请求
+    if (!isApplyPage) {
+      dispatch({ type: 'global/get_site_list_data' });
+    }
+  }
+
+  render() {
+    const { currentSite, location } = this.props;
+    const isApplyPage = location.pathname.includes('/apply');
+
+    if (isApplyPage) {
+      // apply 页直接加载 BasicLayout
+      return (
+        <Media query="(max-width: 599px)">
+          {isMobile => <BasicLayout {...this.props} isMobile={isMobile} />}
+        </Media>
+      );
+    }
+
+    if (!currentSite) {
+      // 非 apply 页且未初始化完成 → Loading
+      return (
+        <div style={{ height: '100vh', display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
+          <PageLoading />
+        </div>
+      );
+    }
+
+    // 非 apply 页 & currentSite 已有值 → 渲染 BasicLayout(key 确保切换站点强制刷新)
+    return (
+      <Media query="(max-width: 599px)">
+        {isMobile => (
+          <BasicLayout
+            key={currentSite}
+            {...this.props}
+            isMobile={isMobile}
+          />
+        )}
+      </Media>
+    );
+  }
+}
+
+export default connect(({ global, setting, menu }) => ({
+  collapsed: global.collapsed,
+  currentSite: global.currentSite,
+  layout: setting.layout,
+  menuData: menu.menuData,
+  breadcrumbNameMap: menu.breadcrumbNameMap,
+  ...setting,
+}))(LayoutWrapper);

+ 3 - 3
xinkeaboard-seller/src/models/global.js

@@ -7,7 +7,7 @@ export default {
     collapsed: false,
     notices: [],
     siteList: [],
-    currentSite: localStorage.getItem('CURRENT_SITE') || null,
+    currentSite: '',
   },
 
   effects: {
@@ -79,7 +79,8 @@ export default {
       const response = siteList.length ? {data: siteList, state: 200} : yield call(sldCommonService, payload, 'get', 'v3/system/seller/setting/getSiteSettingList');
       if (callback) callback(response);
       yield put({ type: 'saveSiteList', payload: response.data });
-      if (!localStorage.getItem('CURRENT_SITE')) {
+      const currentSite = yield select(state => state.global.currentSite);
+      if (!currentSite) {
         yield put({type: 'setCurrentSite', payload: response.data[0]?.value})
       }
     },
@@ -93,7 +94,6 @@ export default {
       };
     },
     setCurrentSite(state, { payload }) {
-      localStorage.setItem('CURRENT_SITE', payload);
       return {
         ...state,
         currentSite: payload,

+ 12 - 2
xinkeaboard-seller/src/models/project.js

@@ -5,6 +5,7 @@ export default {
 
   state: {
     notice: [],
+    cateListData: {}
   },
 
   effects: {
@@ -45,9 +46,12 @@ export default {
       if (callback) callback(response);
     },
     //获取平台商品分类树——有三级的才显示,没有的不显示
-    * get_system_cat_tree_grade3({ payload, callback }, { call }) {
-      const response = yield call(sldCommonService, payload, 'get', 'v3/goods/seller/goodsCategory/getCateList');
+    * get_system_cat_tree_grade3({ payload, callback }, { call, put, select }) {
+      const { webSite } = payload;
+      const cateList = yield select(state => state.project.cateListData[webSite]);
+      const response = cateList?.length ? {data: cateList, state: 200} : yield call(sldCommonService, payload, 'get', 'v3/goods/seller/goodsCategory/getCateList');
       if (callback) callback(response);
+      yield put({ type: 'saveCateList', payload: { [webSite]: response.data } });
     },
     //推手——获取店铺商品列表用于导入推手商品
     * get_goods_list_to_import_spreader({ payload, callback }, { call }) {
@@ -68,5 +72,11 @@ export default {
         notice: action.payload,
       };
     },
+    saveCateList(state, action) {
+      return {
+        ...state,
+        cateListData: Object.assign({}, state.cateListData, action.payload),
+      };
+    }
   },
 };

+ 20 - 4
xinkeaboard-seller/src/pages/User/Login.js

@@ -70,7 +70,9 @@ export default class LoginPage extends Component {
     is_show_comfirepwd_err:false,
     comfirepwd_error_info:'',
     // 提交注册按钮加载loading
-    loading: false
+    loading: false,
+    // 登录按钮加载loading
+    loginLoading: false
   };
 
   register_captcha = '';//注册——图形验证码key
@@ -149,6 +151,7 @@ export default class LoginPage extends Component {
         //用户登录
         values.verifyKey = this.login_captcha;
         const { dispatch } = this.props;
+        this.setState({loginLoading: true})
         dispatch({
           type: 'login/login',
           payload: { ...values },
@@ -178,6 +181,7 @@ export default class LoginPage extends Component {
               failTip(res.msg);
               this.getCaptcha('login_captcha');
             }
+            this.setState({loginLoading: false})
           },
         });
       }
@@ -695,6 +699,8 @@ export default class LoginPage extends Component {
             this.setState({
               countDownM: 60,
               countDownC: false,
+              is_show_phonecode_err: false,
+              phonecode_error_info: '',
             }, () => {
               _this.countDown();
             });
@@ -725,7 +731,8 @@ export default class LoginPage extends Component {
       register_error_info, 
       is_show_registe_err, 
       countDownM,
-      loading
+      loading,
+      loginLoading
     } = this.state;
     return (
       <div className={styles.full_screen}
@@ -792,10 +799,18 @@ export default class LoginPage extends Component {
                 </FormItem>
 
                 <div className={`${styles.sld_login_btn_wrap} ${global.flex_column_start_start}`}>
-                  <div className={`${styles.sld_login_btn} ${global.flex_row_center_center}`}
+                    <Button 
+                      className={`${styles.sld_login_btn} ${global.flex_row_center_center}`} 
+                      type="primary" 
+                      loading={loginLoading} 
+                      onClick={() => this.props.form.submit(this.handleSubmits)}
+                    >
+                      {sldComLanguage('立即登录')}
+                    </Button>
+                  {/* <div className={`${styles.sld_login_btn} ${global.flex_row_center_center}`}
                        onClick={() => this.props.form.submit(this.handleSubmits)}>
                     {sldComLanguage('立即登录')}
-                  </div>
+                  </div> */}
                   <div className={`${global.flex_row_between_center} ${styles.operate}`}>
                     <a onClick={this.handleForgetPwd}>{sldComLanguage('忘记密码')}</a>
                     <a onClick={this.handleRegister}>{sldComLanguage('立即注册')}</a>
@@ -814,6 +829,7 @@ export default class LoginPage extends Component {
         <Modal
           title={title}
           visible={visibleModal}
+          maskClosable={false}
           footer={false}
           onCancel={this.handleCancelModal}
           width={450}

+ 21 - 3
xinkeaboard-seller/src/pages/goods/add_goods.js

@@ -753,7 +753,24 @@ export default class AddGoods extends Component {
           whitespace: true,
           message: `${sldComLanguage('请输入商品名称')}`,
         }],
-      }, {
+      }, 
+      {
+        type: 'input',
+        label: `${sldComLanguage('商品中文名称')}`,
+        name: 'goodsNameCn',
+        extra: `${sldComLanguage('最多输入200个字')}`,
+        placeholder: `${sldComLanguage('请输入商品中文名称')}`,
+        hide: props.global.currentSite === '2',
+        initialValue: '',
+        required: true,
+        maxLength: 200,
+        rules: [{
+          required: true,
+          whitespace: true,
+          message: `${sldComLanguage('请输入商品中文名称')}`,
+        }],
+      },
+      {
         type: 'input',
         label: `${sldComLanguage('商品广告语')}`,
         name: 'goodsBrief',
@@ -2712,6 +2729,7 @@ export default class AddGoods extends Component {
           params.brandId = values.brandId;//品牌ID
           params.goodsName = values.goodsName;
           params.goodsBrief = values.goodsBrief;//商品广告语
+          params.goodsNameCn = values.goodsNameCn || values.goodsName;//商品中文名称
           params.sellNow = values.sellNow;//发布类型,false-放入仓库(待售);true-立即售卖(在售)
           params.storeIsRecommend = values.storeIsRecommend;//商品推荐,0-不推荐;1-推荐(店铺内是否推荐)
           params.isVatInvoice = values.isVatInvoice;//是否可以开具增值税发票0-不可以;1-可以
@@ -3210,8 +3228,8 @@ export default class AddGoods extends Component {
                       {sldCommonTitleByBg(`${sldComLanguage('基本信息')}`)}
                       {getSldEmptyH(10)}
                       {show_radio_flag &&
-                      <SldTableRowTwo part_width={100} lwidth={10} rwidth={90} form={this.props.form}
-                                      data={goods_base_data}/>
+                      <SldTableRowTwo part_width={100} lwidth={12} rwidth={90} form={this.props.form}
+                                      data={goods_base_data.filter(item => !item.hide)}/>
                       }
                     </div>
 

+ 93 - 71
xinkeaboard-seller/src/pages/settledManage/baseInfo/index.js

@@ -327,9 +327,9 @@ export default class BaseInfo extends Component {
   }
 
   componentDidUpdate(prevProps, prevState) {
-    if (prevState.cur_apply_type !== this.state.cur_apply_type) {
-      this.initData()
-    }
+    // if (prevState.cur_apply_type !== this.state.cur_apply_type) {
+    //   this.initData()
+    // }
   }
 
 
@@ -342,7 +342,8 @@ export default class BaseInfo extends Component {
   };
 
   handleApplyType = (val) => {
-    this.setState({ cur_apply_type: val });
+    this.initData(val)
+    // this.setState({ cur_apply_type: val });
   };
 
   //上传图片 key  name ,info
@@ -360,13 +361,14 @@ export default class BaseInfo extends Component {
   };
 
   //初始化页面数据
-  initData = async () => {
+  initData = (curApplyType) => {
     let { cur_apply_type, apply_type, personal_base_info, personal_front_card_img, personal_back_card_img, company_base_info, business_license_img, legal_front_card_img, legal_back_card_img, replenish_1_img, replenish_2_img, replenish_3_img, show_apply_type_flag } = this.state;
     let tmp_data = getSettleData('baseInfo');
+    const new_cur_apply_type = curApplyType ?? tmp_data.enterType ?? cur_apply_type;
     const localVendorMobile = getSettleData('user_info')?.vendorMobile || getSettleData('vendorMobile');
     if (!tmp_data) {
-      this.setState({ show_apply_type_flag: true });
-      if (cur_apply_type === 0) {
+      this.setState({ show_apply_type_flag: true, cur_apply_type: new_cur_apply_type });
+      if (new_cur_apply_type === 0) {
         personal_base_info.forEach(item => {
           if (item.name === 'contactPhone') {
             item.initialValue = localVendorMobile;
@@ -379,96 +381,116 @@ export default class BaseInfo extends Component {
           }
         });
       }
-
       return false;
     }
-    cur_apply_type = tmp_data.enterType;
-    apply_type[0].initialValue = cur_apply_type;
-    if (cur_apply_type == 0) {
+    apply_type[0].initialValue = new_cur_apply_type;
+    if (new_cur_apply_type == 0) {
       //个人入驻
-      personal_base_info.map(item => {
+      personal_base_info.forEach(item => {
         item.initialValue = tmp_data[item.name];
+        if (item.name === 'contactPhone') {
+            item.initialValue = localVendorMobile;
+        }
       });
+      
 
       //身份证正面图片
-      personal_front_card_img[0].fileList.push({
-        response: {
-          data: {
-            path: tmp_data.personCardUp,
-            url: tmp_data.personCardUpUrl,
+      if (!personal_front_card_img[0].fileList.length) {
+        personal_front_card_img[0].fileList.push({
+          response: {
+            data: {
+              path: tmp_data.personCardUp,
+              url: tmp_data.personCardUpUrl,
+            },
           },
-        },
-        name: tmp_data.personCardUp,
-        uid: tmp_data.personCardUp,
-        status: 'done',
-        thumbUrl: tmp_data.personCardUpUrl,
-      });
+          name: tmp_data.personCardUp,
+          uid: tmp_data.personCardUp,
+          status: 'done',
+          thumbUrl: tmp_data.personCardUpUrl,
+        });
+      }
+      
 
       //身份证反面图片
-      personal_back_card_img[0].fileList.push({
-        response: {
-          data: {
-            path: tmp_data.personCardDown,
-            url: tmp_data.personCardDownUrl,
+      if (!personal_back_card_img[0].fileList.length) {
+        personal_back_card_img[0].fileList.push({
+          response: {
+            data: {
+              path: tmp_data.personCardDown,
+              url: tmp_data.personCardDownUrl,
+            },
           },
-        },
-        name: tmp_data.personCardDown,
-        uid: tmp_data.personCardDown,
-        status: 'done',
-        thumbUrl: tmp_data.personCardDownUrl,
-      });
+          name: tmp_data.personCardDown,
+          uid: tmp_data.personCardDown,
+          status: 'done',
+          thumbUrl: tmp_data.personCardDownUrl,
+        });
+      }
+      
 
     } else {
       //企业入驻
 
       company_base_info.map(item => {
         item.initialValue = tmp_data[item.name];
+        if (item.name === 'contactPhone') {
+          item.initialValue = localVendorMobile;
+        }
       });
 
       //营业执照图片
-      business_license_img[0].fileList.push({
-        response: {
-          data: {
-            path: tmp_data.businessLicenseImage,
-            url: tmp_data.businessLicenseImageUrl,
+      if (!business_license_img[0].fileList.length && tmp_data.businessLicenseImage) {
+        business_license_img[0].fileList.push({
+          response: {
+            data: {
+              path: tmp_data.businessLicenseImage,
+              url: tmp_data.businessLicenseImageUrl,
+            },
           },
-        },
-        name: tmp_data.businessLicenseImage,
-        uid: tmp_data.businessLicenseImage,
-        status: 'done',
-        thumbUrl: tmp_data.businessLicenseImageUrl,
-      });
+          name: tmp_data.businessLicenseImage,
+          uid: tmp_data.businessLicenseImage,
+          status: 'done',
+          thumbUrl: tmp_data.businessLicenseImageUrl,
+        });
+      }
+      
 
       //法人身份证正面图片
-      legal_front_card_img[0].fileList.push({
-        response: {
-          data: {
-            path: tmp_data.personCardUp,
-            url: tmp_data.personCardUpUrl,
+      if (!legal_front_card_img[0].fileList.length && tmp_data.personCardUp) {
+        legal_front_card_img[0].fileList.push({
+          response: {
+            data: {
+              path: tmp_data.personCardUp,
+              url: tmp_data.personCardUpUrl,
+            },
           },
-        },
-        name: tmp_data.personCardUp,
-        uid: tmp_data.personCardUp,
-        status: 'done',
-        thumbUrl: tmp_data.personCardUpUrl,
-      });
+          name: tmp_data.personCardUp,
+          uid: tmp_data.personCardUp,
+          status: 'done',
+          thumbUrl: tmp_data.personCardUpUrl,
+        });
+      }
+      
 
       //法人身份证反面图片
-      legal_back_card_img[0].fileList.push({
-        response: {
-          data: {
-            path: tmp_data.personCardDown,
-            url: tmp_data.personCardDownUrl,
+      if (!legal_back_card_img[0].fileList.length && tmp_data.personCardDown) {
+        legal_back_card_img[0].fileList.push({
+          response: {
+            data: {
+              path: tmp_data.personCardDown,
+              url: tmp_data.personCardDownUrl,
+            },
           },
-        },
-        name: tmp_data.personCardDown,
-        uid: tmp_data.personCardDown,
-        status: 'done',
-        thumbUrl: tmp_data.personCardDownUrl,
-      });
+          name: tmp_data.personCardDown,
+          uid: tmp_data.personCardDown,
+          status: 'done',
+          thumbUrl: tmp_data.personCardDownUrl,
+        });
+      }
+      
 
       //补充认证1图片
-      if (tmp_data.moreQualification1) {
+      if (tmp_data.moreQualification1 && !replenish_1_img[0].fileList.length) {
         replenish_1_img[0].fileList.push({
           response: {
             data: {
@@ -484,7 +506,7 @@ export default class BaseInfo extends Component {
       }
 
       //补充认证2图片
-      if (tmp_data.moreQualification2) {
+      if (tmp_data.moreQualification2 && !replenish_2_img[0].fileList.length) {
         replenish_2_img[0].fileList.push({
           response: {
             data: {
@@ -500,7 +522,7 @@ export default class BaseInfo extends Component {
       }
 
       //补充认证3图片
-      if (tmp_data.moreQualification3) {
+      if (tmp_data.moreQualification3 && !replenish_3_img[0].fileList.length) {
         replenish_3_img[0].fileList.push({
           response: {
             data: {
@@ -517,7 +539,7 @@ export default class BaseInfo extends Component {
 
     }
     this.setState({
-      cur_apply_type,
+      cur_apply_type: new_cur_apply_type,
       apply_type,
       personal_base_info,
       personal_front_card_img,

+ 283 - 146
xinkeaboard-seller/src/pages/settledManage/businessInfo/index.js

@@ -3,7 +3,7 @@
 * */
 import { connect } from 'dva/index';
 import React, { Component, Fragment } from 'react';
-import { Form, Button, message } from 'antd';
+import { Form, Button, message, Spin} from 'antd';
 import {
   sldComLanguage,
   sldLlineRtextAddGoodsAddMargin,
@@ -28,7 +28,7 @@ export default class BusinessInfo extends Component {
     super(props);
     this.state = {
       //经营信息
-      base_info: [
+      site_base_info: [
         {
           type: 'input',
           label: `${sldComLanguage('店铺名称')}`,
@@ -81,11 +81,14 @@ export default class BusinessInfo extends Component {
         placeholder: ``,
         tree_data: [],
         selected_keys:[],//选择的key数组
-        onCheck:this.handleCatCheck,
+        select_cat_id: [],
         required: true,
       }],//选择经营类目
       company_qualification: {},
-      loading: false
+      loading: false,
+      siteList: [],
+      siteListLoading: false, // 站点tab列表loading
+      selectCatLoading: false,
     };
   }
 
@@ -122,31 +125,144 @@ export default class BusinessInfo extends Component {
       width: 200,
     },
   ];
-  select_cat_id = [];//选择的分类id数组,格式:1级-2级-3级
   selectedRows = [];
   selectedRowKeys = [];
 
-  async componentDidMount () {
+  componentDidMount () {
     // this.getStoreGrade();
     // this.getStoreOpenTime();
-    await this.getSystemCat()
-    this.initData();
+    this.getSiteList();
   }
 
-  //选择分类事件
-  handleCatCheck = (checkedKeys, e) => {
-    let {select_cat} = this.state;
-    this.select_cat_id = [];
-    if(e.checkedNodes.length>0){
-      e.checkedNodes.map(item_one=>{
-        if(item_one.props.grade == 3){
-          let tmp_data = item_one.props.path.split('/');
-          this.select_cat_id.push(`${tmp_data[1]}-${tmp_data[2]}-${item_one.props.categoryId}`);
+  //获取平台分类
+  getSystemCat = (webSite) => {
+    const { dispatch } = this.props;
+    return new Promise((resolve) => {
+      dispatch({
+      type: 'project/get_system_cat_tree_grade3',
+      payload: { webSite },
+      callback: (res) => {
+        if(res.state == 200){
+          if (res.data.length > 0) {
+            res.data.map(item => {
+              item.key = item.categoryId;
+              item.title = item.categoryName;
+              if (item.children != null&&item.children.length>0) {
+                item.children.map(second => {
+                  second.key = second.categoryId;
+                  second.title = second.categoryName;
+                  if (second.children != null&&second.children.length>0) {
+                    second.children.map(third => {
+                      third.key = third.categoryId;
+                      third.title = third.categoryName;
+                    });
+                  }else{
+                    second.disableCheckbox = true;
+                  }
+                });
+              }else{
+                item.disableCheckbox = true;
+              }
+            });
+            resolve({
+              webSite,
+              data: res.data
+            });
+          }
         }
-      })
-    }
-    select_cat[0].selected_keys = checkedKeys;
-    this.setState({select_cat})
+      },
+    });
+    })
+    
+  }
+
+  // 获取站点列表
+  getSiteList = () => {
+    this.setState({ siteListLoading: true });
+    const { dispatch } = this.props;
+    const { select_cat, site_base_info } = this.state;
+    dispatch({
+      type: "global/get_site_list_data",
+      callback: async (res) => {
+        if (res.state == 200) {
+          const siteListData = res.data;
+          const promiseList = siteListData.map(item => this.getSystemCat(item.value))
+          const result = await Promise.all(promiseList);
+          result.forEach(r => {
+              siteListData.forEach(siteInfo => {
+                if (siteInfo.value === r.webSite) {
+                  siteInfo.site_select_cat = [
+                    {
+                      ...select_cat[0],
+                      tree_data: r.data,
+                      onCheck: (checkedKeys, e) => this.handleCatCheck(checkedKeys, e, siteInfo.value)
+                    }
+                  ]
+                  siteInfo.site_base_info = [
+                    {
+                      ...site_base_info[0],
+                      name: `${siteInfo.value}_${site_base_info[0].name}` // ✅ 添加前缀
+                    }
+                  ]
+                }
+            })
+          })
+          this.setState({
+            siteList: siteListData,
+            siteListLoading: false,
+          });
+          this.initData(siteListData);
+        }
+      },
+    });
+  };
+
+  setCatCache = (siteList, values) => {
+    let params = { };
+    params.siteInfoList = siteList.map(site => ({
+      webSite: site.value,
+      storeName: values[`${site.value}_storeName`],
+      goodsCategoryIds: site.site_select_cat[0].select_cat_id.join(','),
+      selected_keys: site.site_select_cat[0].selected_keys,
+      id: site.id
+    }))
+    saveSettleData('bussinessInfo', JSON.stringify(params));//经营信息存缓存
+
+    return params
+  }
+
+
+  //选择分类事件
+  handleCatCheck = (checkedKeys, e, webSite) => {
+    const select_cat_id = [];
+    const { siteList } = this.state;
+    e.checkedNodes.map(item_one=>{
+      if(item_one.props.grade == 3){
+        let tmp_data = item_one.props.path.split('/');
+        select_cat_id.push(`${tmp_data[1]}-${tmp_data[2]}-${item_one.props.categoryId}`);
+      }
+    })
+    const newSiteList = siteList.map(site_info => {
+      if (site_info.value === webSite) {
+        const siteSelectCat = site_info.site_select_cat[0];
+        const newSelectCat = [
+          {
+            ...siteSelectCat,
+            selected_keys: checkedKeys,
+            select_cat_id,
+          }
+        ]
+        return {
+          ...site_info,
+          site_select_cat: newSelectCat
+        };
+      }
+      return site_info;
+    })
+    this.setState({siteList: newSiteList})
+    // 设置缓存
+    const values = this.props.form.getFieldsValue();
+    this.setCatCache(newSiteList, values)
   };
 
   //店铺等级选择
@@ -200,51 +316,34 @@ export default class BusinessInfo extends Component {
   //   });
   // }
 
-  //获取平台分类
-  getSystemCat = async() => {
-    let {select_cat} = this.state;
-    const { dispatch } = this.props;
-    await dispatch({
-      type: 'project/get_system_cat_tree_grade3',
-      callback: (res) => {
-        if(res.state == 200){
-          if (res.data.length > 0) {
-            res.data.map(item => {
-              item.key = item.categoryId;
-              item.title = item.categoryName;
-              if (item.children != null&&item.children.length>0) {
-                item.children.map(second => {
-                  second.key = second.categoryId;
-                  second.title = second.categoryName;
-                  if (second.children != null&&second.children.length>0) {
-                    second.children.map(third => {
-                      third.key = third.categoryId;
-                      third.title = third.categoryName;
-                    });
-                  }else{
-                    second.disableCheckbox = true;
-                  }
-                });
-              }else{
-                item.disableCheckbox = true;
-              }
-            });
-          }
-          select_cat[0].tree_data = res.data
-        }
-        this.setState({select_cat})
-      },
-    });
-  }
+  
 
   //初始化页面数据
-  initData = () => {
+  initData = (siteList) => {
     let tmp_data = getSettleData('bussinessInfo');
-    let { base_info,/* store_grade_data,*//* open_time_data,*/select_cat } = this.state;
+    const { siteInfoList } = tmp_data;
     if (tmp_data) {
-      base_info.map(item=>{
-        item.initialValue = tmp_data[item.name];
-      });
+      const newSiteList = siteList.map(site => {
+        const tempSiteData = siteInfoList.find(i => i.webSite === site.value);
+        const siteBaseInfo = site.site_base_info[0];
+        const siteSelectCat = site.site_select_cat[0];
+        site.site_base_info = [
+          {
+            ...siteBaseInfo,
+            initialValue: tempSiteData.storeName,
+          }
+        ];
+        site.site_select_cat  = [
+          {
+            ...siteSelectCat,
+            select_cat_id: tempSiteData.goodsCategoryIds?.split(','),
+            selected_keys: tempSiteData.selected_keys
+          }
+        ]
+        site.id = tempSiteData.id;
+
+        return site;
+      })
 
       // store_grade_data[0].selectedRowKeys = [tmp_data.storeGradeId];
       // store_grade_data[0].selectedRows =  store_grade_data[0].data.filter(item=>item.gradeId == tmp_data.storeGradeId);
@@ -252,114 +351,152 @@ export default class BusinessInfo extends Component {
       //   item.initialValue = tmp_data[item.name];
       // });
 
-      select_cat[0].selected_keys = tmp_data.sel_cat_id_array;
-      this.select_cat_id = tmp_data.goodsCategoryIds.split(',');
 
       this.setState({
-        base_info,
+        siteList: newSiteList
         // store_grade_data,
         // open_time_data,
-        select_cat,
       });
     }
   };
 
-  //下一步
-  handleNextStep = (e) => {
-    e.preventDefault();
-    let {/*store_grade_data,*/select_cat} = this.state;
+// 判断经营类型是否已选
+ isHaveCatNotChecked = () => {
+  const { siteList } = this.state;
+  let err = {
+    validate: true,
+    webSite: '',
+    msg: `${sldComLanguage('请选择经营类型~')}`
+  }
+  let breakFlag = false;
+
+  for(let i in siteList){
+     const site_info = siteList[i];
+     const { site_select_cat } = site_info;
+     const { select_cat_id } = site_select_cat[0]
+     if (!select_cat_id.length) {
+        err.webSite = site_info.title;
+        err.validate = false;
+        breakFlag = true;
+        break; // 跳出内层
+     }
+  }
+  return err;
+ }
+
+ handleNextStep = (e) => {
+    const { siteList } = this.state;
     const { dispatch } = this.props;
     this.props.form.validateFieldsAndScroll((err, values) => {
-      if (!err) {
-        let params = { ...values };
-
-        // if(store_grade_data[0].selectedRowKeys.length == 0){
-        //   failTip(`${sldComLanguage('请选择店铺等级~')}`);
-        //   return false;
-        // }
-        if(this.select_cat_id.length == 0){
-          failTip(`${sldComLanguage('请选择经营类型~')}`);
-          return false;
-        }
-        params.goodsCategoryIds = this.select_cat_id.join(',');//申请分类id字符串,例1级-2级-3级;1级-2级-3级
-      /*  params.storeGradeId = 1*//*store_grade_data[0].selectedRowKeys[0];//店铺等级*/
-        let base_info = JSON.parse(localStorage.getItem('baseInfo').replace(/&quot;/g,"\""));
-        saveSettleData('bussinessInfo', JSON.stringify({...params,sel_cat_id_array:select_cat[0].selected_keys}));//经营信息存缓存
-        let tar_params = {...params};
-        tar_params.companyAddress = base_info.companyAddress;//公司详细地址
-        tar_params.companyProvinceCode = base_info.companyProvinceCode;//企业注册省编码
-        tar_params.companyCityCode = base_info.companyCityCode;//	企业注册市编码
-        tar_params.companyAreaCode = base_info.companyAreaCode;//企业注册区编码
-        tar_params.areaInfo = base_info.areaInfo;//省市区名称
-        tar_params.contactName = base_info.contactName;//联系人姓名
-        tar_params.contactPhone = base_info.contactPhone;//联系人电话
-        tar_params.enterType = base_info.enterType;//入驻类型:0-个人入驻,1-企业入驻
-        tar_params.personCardDown = base_info.personCardDown;//身份证背面扫描件
-        tar_params.personCardUp = base_info.personCardUp;//身份证正面扫描件
-        if(tar_params.enterType == 1){
-          //企业入驻
-          tar_params.companyName = base_info.companyName;//公司名称
-          tar_params.businessLicenseImage = base_info.businessLicenseImage;//营业执照扫描件,企业入驻时必传
-          tar_params.moreQualification1 = base_info.moreQualification1?base_info.moreQualification1:'';//补充认证一
-          tar_params.moreQualification2 = base_info.moreQualification2?base_info.moreQualification2:'';//补充认证二
-          tar_params.moreQualification3 = base_info.moreQualification3?base_info.moreQualification3:'';//补充认证三
-        }
-        //只有小于当前的才需要更新
-        if(getSettleData('cur_step')*1 < 3){
-          saveSettleData('cur_step', 3);
-        }
-        this.setState({loading: true});
-        dispatch({
-          type: 'settled/save_apply',
-          payload: tar_params,
-          callback: res => {
-            if (res.state == 200) {
-              saveSettleData('cur_step', 3);
-              message.success(res.msg);
-              setTimeout(() => {
-                this.props.history.push('/apply/open_up');
-              }, 1500);
-            } else {
-              message.error(res.msg);
-            }
-            this.setState({loading: false});
-          },
-        });
-      }
-    });
-  };
+        if (!err) {
+          const { validate, msg, webSite } = this.isHaveCatNotChecked();
+          if(!validate){
+            failTip(`${webSite}${sldComLanguage('请选择经营类型~')}`);
+            return false;
+          }
+          let base_info = JSON.parse(localStorage.getItem('baseInfo').replace(/&quot;/g,"\""));
+          const params = this.setCatCache(siteList, values)
+          let tar_params = {...params};
+          tar_params.siteInfoList = tar_params.siteInfoList.map(item => ({
+            webSite: item.webSite,
+            storeName: item.storeName,
+            goodsCategoryIds: item.goodsCategoryIds,
+            id: item.id
+          }));
+          tar_params.companyAddress = base_info.companyAddress;//公司详细地址
+          tar_params.companyProvinceCode = base_info.companyProvinceCode;//企业注册省编码
+          tar_params.companyCityCode = base_info.companyCityCode;//	企业注册市编码
+          tar_params.companyAreaCode = base_info.companyAreaCode;//企业注册区编码
+          tar_params.areaInfo = base_info.areaInfo;//省市区名称
+          tar_params.contactName = base_info.contactName;//联系人姓名
+          tar_params.contactPhone = base_info.contactPhone;//联系人电话
+          tar_params.enterType = base_info.enterType;//入驻类型:0-个人入驻,1-企业入驻
+          tar_params.personCardDown = base_info.personCardDown;//身份证背面扫描件
+          tar_params.personCardUp = base_info.personCardUp;//身份证正面扫描件
+          if(tar_params.enterType == 1){
+            //企业入驻
+            tar_params.companyName = base_info.companyName;//公司名称
+            tar_params.businessLicenseImage = base_info.businessLicenseImage;//营业执照扫描件,企业入驻时必传
+            tar_params.moreQualification1 = base_info.moreQualification1?base_info.moreQualification1:'';//补充认证一
+            tar_params.moreQualification2 = base_info.moreQualification2?base_info.moreQualification2:'';//补充认证二
+            tar_params.moreQualification3 = base_info.moreQualification3?base_info.moreQualification3:'';//补充认证三
+          }
+          //只有小于当前的才需要更新
+          if(getSettleData('cur_step')*1 < 3){
+            saveSettleData('cur_step', 3);
+          }
+          this.setState({loading: true});
+          dispatch({
+            type: 'settled/save_apply',
+            payload: tar_params,
+            callback: res => {
+              if (res.state == 200) {
+                saveSettleData('cur_step', 3);
+                message.success(res.msg);
+                setTimeout(() => {
+                  this.props.history.push('/apply/open_up');
+                }, 1500);
+              } else {
+                message.error(res.msg);
+              }
+              this.setState({loading: false});
+            },
+          });
+          }
+    })
+ }
 
   render() {
+    
     const {
-      base_info,
       // open_time_data,
       // store_grade_data,
       select_cat,
-      loading
+      loading,
+      siteList,
+      siteListLoading,
+      selectCatLoading
     } = this.state;
+    
     return (
-      <div style={{ flex: 1 }}>
+      <div style={{ flex: 1, overflow: 'auto' }}>
         <div className={styles.title}>
           {sldLlineRtextAddGoodsAddMargin('#69A2F2', `${sldComLanguage('经营信息')}`, 0, 0, 5)}
         </div>
-        {getSldEmptyH(10)}
-        <Scrollbars
-          autoHeight
-          autoHeightMin={100}
-          autoHeightMax={document.body.clientHeight - 130}>
-          <div className={styles.commen_wrap}>
-            <SldTableRowThree form={this.props.form} data={base_info}/>
-            {/*<SldTableRowThree form={this.props.form} data={store_grade_data}/>*/}
-            {/*<SldTableRowThree form={this.props.form} data={open_time_data}/>*/}
-            <SldTableRowThree form={this.props.form} data={select_cat}/>
-            {((getSettleData('state')&&getSettleData('state')==3)||!getSettleData('state'))&&
+        {/* 站点tab列表 */}
+        <Spin spinning={siteListLoading}>
+          <div className={styles.site_list} style={{ paddingLeft: "85px" }}>
+            {siteList.length ? siteList.map((site) => (
+              <div className={ styles.site_item } key={site.name}>
+                <div className={ styles.site_item_title }>{ site.title }</div>
+                {getSldEmptyH(10)}
+                <Scrollbars
+                  autoHeight
+                  autoHeightMin={100}
+                  autoHeightMax={document.body.clientHeight - 130}
+                >
+                  <div className={styles.commen_wrap}>
+                    <SldTableRowThree form={this.props.form} data={site.site_base_info} />
+                    {/*<SldTableRowThree form={this.props.form} data={store_grade_data}/>*/}
+                    {/*<SldTableRowThree form={this.props.form} data={open_time_data}/>*/}
+                    <Spin spinning={selectCatLoading}>
+                      <SldTableRowThree
+                        form={this.props.form}
+                        data={site.site_select_cat}
+                      />
+                    </Spin>
+                  </div>
+                  {getSldEmptyH(10)}
+                </Scrollbars>
+              </div>
+            )) : null}
+          </div>
+          {((getSettleData('state')&&getSettleData('state')==3)||!getSettleData('state'))&&
               <div className={styles.commen_wrap} style={{borderTopRightRadius:0,borderTopLeftRadius:0,marginTop:-30,paddingBottom:20,textAlign:'center'}}>
                 <Button loading={loading} type='primary' onClick={this.handleNextStep} className={styles.next_step}>提交</Button>
               </div>
-            }
-          </div>
-          {getSldEmptyH(10)}
-        </Scrollbars>
+          }
+        </Spin>        
       </div>
     );
   }

+ 1 - 0
xinkeaboard-seller/src/pages/settledManage/businessInfo/index.less

@@ -40,6 +40,7 @@
 
 .site_list {
   display: flex;
+  min-height: 400px;
 
   .site_item {
     display: flex;

+ 1 - 1
xinkeaboard-seller/src/pages/settledManage/models/settled.js

@@ -28,7 +28,7 @@ export default {
     },
     //保存入驻信息
     *save_apply({ payload, callback }, { call }) {
-      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/seller/apply/saveApply');
+      const response = yield call(sldCommonService, payload, 'post', 'v3/seller/seller/apply/saveApply', 'json');
       if (callback) callback(response);
     },
     //slodon_获取入驻信息

+ 58 - 14
xinkeaboard-seller/src/pages/settledManage/openUp/open_up.js

@@ -35,7 +35,8 @@ export default class openUp extends Component {
       detail: {},//入驻详情
       pay_method: 'alipay',//支付方式
       apply_progress: {},//入驻进度
-
+      siteList: [],
+      currentSite: {}, // 当前站点
 
       store_pay_data: [{
         type: 'show_text',
@@ -90,7 +91,22 @@ export default class openUp extends Component {
           if (res.data.applyStep != 2) {
             modalVisible = false;
           }
-          saveSettleData('state', res.data.applyStep);//1 待审核  2 待付款 3 已拒绝 4已开通
+          const { storeGoodsCateVOList, applyStep } =  res.data;
+          const siteListData = [];
+          storeGoodsCateVOList?.forEach(item => {
+            if (!siteListData.find(site => site.webSite === item.webSite)) {
+              siteListData.push({
+                webSite: item.webSite,
+                webSiteName: item.webSiteName
+              })
+            }
+          });
+          if (siteListData.length) {
+            const sortSiteList = siteListData.sort((a, b) => Number(a.webSite) - Number(b.webSite));
+            this.setState({siteList: sortSiteList});
+            this.setState({currentSite: siteListData[0]})
+          }
+          saveSettleData('state', applyStep);//1 待审核  2 待付款 3 已拒绝 4已开通
           this.setState({ apply_progress: res.data, store_pay_data, modalVisible });
         }
       },
@@ -151,17 +167,28 @@ export default class openUp extends Component {
           //经营信息
           let business_info = {};
           business_info.applyYear = result.applyYear;
-          business_info.storeName = result.storeName;//店铺名称
+          // business_info.storeName = result.storeName;//店铺名称
           business_info.storeGradeId = result.storeGradeId;//店铺等级
-          //经营类目信息
-          let sel_cat_id_array = [];//选择的分类id
-          let select_cat_id_three = [];//选择的分类id,eg:1级-2级-3级
-          result.storeGoodsCateVOList.map(item => {
-            sel_cat_id_array.push(item.goodsCategoryId3);
-            select_cat_id_three.push(`${item.goodsCategoryId1}-${item.goodsCategoryId2}-${item.goodsCategoryId3}`);
-          });
-          business_info.goodsCategoryIds = select_cat_id_three.join(',');//申请分类id字符串,例1级-2级-3级;1级-2级-3级
-          business_info.sel_cat_id_array = sel_cat_id_array;//选择的分类id数组,用于选中分类tree
+          //经营类目信息 
+          const siteInfoList = [];     
+          result.storeGoodsCateVOList.forEach(item => {
+            const matchIndex = siteInfoList.findIndex(site => site.webSite === item.webSite)
+            const goodsCategoryId = `${item.goodsCategoryId1}-${item.goodsCategoryId2}-${item.goodsCategoryId3}`;
+            const selected_key = item.goodsCategoryId3;
+            if (matchIndex === -1) {
+              siteInfoList.push({
+                webSite: item.webSite,
+                storeName: item.storeName,
+                goodsCategoryIds: goodsCategoryId,
+                selected_keys: [selected_key],
+                id: item.id
+              })
+            } else {
+              siteInfoList[matchIndex].goodsCategoryIds = siteInfoList[matchIndex].goodsCategoryIds + `,${goodsCategoryId}`;
+              siteInfoList[matchIndex].selected_keys.push(selected_key);
+            }
+          })
+          business_info.siteInfoList = siteInfoList;
           saveSettleData('bussinessInfo', JSON.stringify(business_info));//经营信息存缓存
           this.setState({
             detail: result,
@@ -262,8 +289,13 @@ export default class openUp extends Component {
     this.setState({ modalVisible: false });
   };
 
+  // 切换站点
+  setCurrentSite = (site) => {
+    this.setState({ currentSite: site })
+  }
+
   render() {
-    const { detail, store_pay_data, pay_method, modalVisible, submiting, wx_pay_qrcode, apply_progress } = this.state;
+    const { siteList,currentSite, detail, store_pay_data, pay_method, modalVisible, submiting, wx_pay_qrcode, apply_progress } = this.state;
     return (
       <div style={{ flex: 1, background: '#FFF' }}>
         <div className={`${global.flex_column_star_start} ${styles.title}`}>
@@ -328,10 +360,22 @@ export default class openUp extends Component {
               </div>*/}
               <div>
                 <p className={`${global.flex_row_start_center} ${styles.table_title}`}>{sldComLanguage('经营类目列表')}</p>
+                {/* 站点tab列表 */}
+                <div className={global.site_list}>
+                  {siteList.map((site) => (
+                    <div
+                      key={site.webSite}
+                      onClick={() => this.setCurrentSite(site)}
+                      className={`${global.site_item} ${site.webSite === currentSite.webSite ? global.site_active : ''}`}
+                    >
+                      {site.webSiteName}
+                    </div>
+                  ))}
+                </div>
                 <div className={`${global.flex_row_center_center}`}>
                   <Table bordered style={{ width: '100%' }} rowKey={'goodsCategoryId3'} pagination={false}
                          columns={this.columns_apply_cat}
-                         dataSource={apply_progress.storeGoodsCateVOList} size={'small'}/>
+                         dataSource={apply_progress.storeGoodsCateVOList?.filter(item => item.webSite === currentSite.webSite)} size={'small'}/>
                 </div>
               </div>
             </div>

+ 10 - 3
xinkeaboard-seller/src/utils/utils.js

@@ -1377,11 +1377,18 @@ export function getSldStatYTitle() {
  * params 参数
  * data_type json json格式 默认是表单提交
  * */
-export function sldComRequest(method, url, params = {}, data_type = '') {
-  params = Object.assign({}, params, { distributionChannel: localStorage.getItem("CURRENT_SITE"), source: localStorage.getItem("CURRENT_SITE"), channel: localStorage.getItem("CURRENT_SITE")})
+export function sldComRequest(method, url, params, data_type = '') {
+  const state = window.g_app._store.getState();
+  const currentSite = state.global.currentSite;
+  const currentPath = state.routing.location.pathname;
+  if (!currentPath.includes('/apply') && !currentPath.includes('/user/login')) {
+    params = Object.assign({}, params ?? {}, { webSite: currentSite })
+  }
   if (method == 'get') {
     let tmp_url = apiUrl + `${url}`;
-    tmp_url += `?${stringify(params)}`;
+    if (params != undefined) {
+      tmp_url += `?${stringify(params)}`;
+    }
     return request(tmp_url);
   } else if (method == 'post') {
     if (data_type == 'json') {

+ 4 - 0
xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/WebUtil.java

@@ -23,6 +23,10 @@ public class WebUtil {
         }
         Map<String, String> postMap = new HashMap<>();
         for (Map.Entry<String, String[]> entry : params.entrySet()) {
+            // 排除 webSite 参数
+            if ("webSite".equals(entry.getKey())) {
+                continue;
+            }
             if (entry.getKey().length() == 0 || entry.getValue() == null || entry.getValue().length <= 0) {
                 continue;
             }

+ 3 - 0
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/goods/dto/GoodsAttributeAddDTO.java

@@ -13,6 +13,9 @@ public class GoodsAttributeAddDTO implements Serializable {
 
     private static final long serialVersionUID = 3423864674236761014L;
 
+    @ApiModelProperty(value ="站点",required = true)
+    private String webSite;
+
     @ApiModelProperty(value ="属性名称",required = true)
     private String attributeName;
 

+ 3 - 0
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/goods/dto/GoodsAttributeUpdateDTO.java

@@ -16,6 +16,9 @@ public class GoodsAttributeUpdateDTO implements Serializable {
     @ApiModelProperty(value ="属性id",required = true)
     private Integer attributeId;
 
+    @ApiModelProperty(value ="站点")
+    private String webSite;
+
     @ApiModelProperty(value ="属性名称")
     private String attributeName;
 

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä