panhui před 5 roky
rodič
revize
ede4d40227
47 změnil soubory, kde provedl 3202 přidání a 19457 odebrání
  1. 184 60
      package-lock.json
  2. 3 3
      package.json
  3. 22 3
      project.config.json
  4. 1 0
      src/App.vue
  5. 8 2
      src/components/ChangeText.vue
  6. 7 1
      src/components/ChatInfo.vue
  7. 107 0
      src/components/Cropper.vue
  8. 20 4
      src/components/FixedButton.vue
  9. 2 2
      src/components/Member.vue
  10. 25 8
      src/components/SortList.vue
  11. 8 1
      src/components/bar/CustomBar.vue
  12. 7 0
      src/components/bar/FilterSortBar.vue
  13. 8 1
      src/components/bar/SearchBar.vue
  14. 7 0
      src/components/bar/SearchBarWithValue.vue
  15. 6 2
      src/components/product/RowMini.vue
  16. 291 0
      src/components/select/Country.vue
  17. 249 0
      src/components/select/Industry.vue
  18. 256 0
      src/components/select/ProductCategory.vue
  19. 5 1
      src/main.js
  20. 0 0
      src/native/area.json
  21. 1187 0
      src/native/we-cropper/we-cropper.js
  22. 5 0
      src/native/we-cropper/we-cropper.min.js
  23. 17 0
      src/native/we-cropper/we-cropper.wxml
  24. 6 5
      src/pages/Classify.vue
  25. 1 1
      src/pages/Home.vue
  26. 16 10
      src/pages/My.vue
  27. 1 1
      src/pagesChat/ChatDetail.vue
  28. 89 0
      src/pagesChat/ChatForm.vue
  29. 4 2
      src/pagesHome/Brand.vue
  30. 130 11
      src/pagesHome/Edit.vue
  31. 3 1
      src/pagesHome/Product.vue
  32. 5 3
      src/pagesHome/ProductList.vue
  33. 5 1
      src/pagesMine/Activity.vue
  34. 9 1
      src/pagesMine/Collect.vue
  35. 161 0
      src/pagesMine/Order.vue
  36. 174 0
      src/pagesMine/Upload.vue
  37. 5 5
      src/pagesNews/News.vue
  38. 1 0
      src/pagesProduct/Contrast.vue
  39. 3 3
      src/pagesProduct/Detail.vue
  40. 11 4
      src/pagesVendor/Connect.vue
  41. 9 7
      src/pagesVendor/Detail.vue
  42. 95 0
      src/pagesVendor/News.vue
  43. 4 2
      src/pagesVendor/Product.vue
  44. 1 1
      src/plugins/http.js
  45. 21 1
      src/store/index.js
  46. 17 1
      src/utils/appState.js
  47. 6 19309
      src/utils/area.js

+ 184 - 60
package-lock.json

@@ -2713,6 +2713,23 @@
         "babel-types": "^6.24.1"
         "babel-types": "^6.24.1"
       }
       }
     },
     },
+    "babel-polyfill": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npm.taobao.org/babel-polyfill/download/babel-polyfill-6.23.0.tgz",
+      "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=",
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.10.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.10.5",
+          "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.10.5.tgz",
+          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+        }
+      }
+    },
     "babel-register": {
     "babel-register": {
       "version": "6.26.0",
       "version": "6.26.0",
       "resolved": "https://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz",
       "resolved": "https://registry.npm.taobao.org/babel-register/download/babel-register-6.26.0.tgz",
@@ -2743,7 +2760,6 @@
       "version": "6.26.0",
       "version": "6.26.0",
       "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
       "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz",
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "dev": true,
       "requires": {
       "requires": {
         "core-js": "^2.4.0",
         "core-js": "^2.4.0",
         "regenerator-runtime": "^0.11.0"
         "regenerator-runtime": "^0.11.0"
@@ -2752,8 +2768,7 @@
         "regenerator-runtime": {
         "regenerator-runtime": {
           "version": "0.11.1",
           "version": "0.11.1",
           "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz",
           "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz",
-          "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=",
-          "dev": true
+          "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk="
         }
         }
       }
       }
     },
     },
@@ -2906,6 +2921,11 @@
         }
         }
       }
       }
     },
     },
+    "base-64": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npm.taobao.org/base-64/download/base-64-0.1.0.tgz",
+      "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs="
+    },
     "base64-js": {
     "base64-js": {
       "version": "1.5.1",
       "version": "1.5.1",
       "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbase64-js%2Fdownload%2Fbase64-js-1.5.1.tgz",
       "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbase64-js%2Fdownload%2Fbase64-js-1.5.1.tgz",
@@ -3433,9 +3453,7 @@
     "chardet": {
     "chardet": {
       "version": "0.4.2",
       "version": "0.4.2",
       "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz?cache=0&sync_timestamp=1601032463282&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.4.2.tgz",
       "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz?cache=0&sync_timestamp=1601032463282&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.4.2.tgz",
-      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
     },
     },
     "check-types": {
     "check-types": {
       "version": "8.0.3",
       "version": "8.0.3",
@@ -3585,7 +3603,6 @@
       "version": "2.1.0",
       "version": "2.1.0",
       "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz",
       "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz",
       "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
       "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
-      "dev": true,
       "requires": {
       "requires": {
         "restore-cursor": "^2.0.0"
         "restore-cursor": "^2.0.0"
       }
       }
@@ -3787,8 +3804,7 @@
     "cli-width": {
     "cli-width": {
       "version": "2.2.1",
       "version": "2.2.1",
       "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.1.tgz",
       "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.1.tgz",
-      "integrity": "sha1-sEM9C06chH7xiGik7xb9X8gnHEg=",
-      "dev": true
+      "integrity": "sha1-sEM9C06chH7xiGik7xb9X8gnHEg="
     },
     },
     "clipboardy": {
     "clipboardy": {
       "version": "2.3.0",
       "version": "2.3.0",
@@ -4224,8 +4240,7 @@
     "core-js": {
     "core-js": {
       "version": "2.6.11",
       "version": "2.6.11",
       "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz?cache=0&sync_timestamp=1604675690423&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.11.tgz",
       "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz?cache=0&sync_timestamp=1604675690423&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.11.tgz",
-      "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=",
-      "dev": true
+      "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw="
     },
     },
     "core-js-compat": {
     "core-js-compat": {
       "version": "3.7.0",
       "version": "3.7.0",
@@ -4595,11 +4610,6 @@
         "assert-plus": "^1.0.0"
         "assert-plus": "^1.0.0"
       }
       }
     },
     },
-    "date-fns": {
-      "version": "2.16.1",
-      "resolved": "https://registry.npm.taobao.org/date-fns/download/date-fns-2.16.1.tgz?cache=0&sync_timestamp=1598884179081&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdate-fns%2Fdownload%2Fdate-fns-2.16.1.tgz",
-      "integrity": "sha1-BXdXksPzMx2oEq8lPhqTWFHTg0s="
-    },
     "dayjs": {
     "dayjs": {
       "version": "1.9.6",
       "version": "1.9.6",
       "resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.9.6.tgz",
       "resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.9.6.tgz",
@@ -5061,6 +5071,24 @@
       "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
       "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
       "dev": true
       "dev": true
     },
     },
+    "encoding": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npm.taobao.org/encoding/download/encoding-0.1.13.tgz",
+      "integrity": "sha1-VldK/deR9UqOmyeFwFgqLSYhD6k=",
+      "requires": {
+        "iconv-lite": "^0.6.2"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.6.2.tgz",
+          "integrity": "sha1-zhPRh1sMOmdL1qBLf3awGxtt7QE=",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        }
+      }
+    },
     "end-of-stream": {
     "end-of-stream": {
       "version": "1.4.4",
       "version": "1.4.4",
       "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz",
       "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz",
@@ -6148,8 +6176,6 @@
       "version": "2.2.0",
       "version": "2.2.0",
       "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz",
       "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz",
       "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=",
       "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=",
-      "dev": true,
-      "optional": true,
       "requires": {
       "requires": {
         "chardet": "^0.4.0",
         "chardet": "^0.4.0",
         "iconv-lite": "^0.4.17",
         "iconv-lite": "^0.4.17",
@@ -6282,7 +6308,6 @@
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz?cache=0&sync_timestamp=1600349107095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffigures%2Fdownload%2Ffigures-2.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz?cache=0&sync_timestamp=1600349107095&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffigures%2Fdownload%2Ffigures-2.0.0.tgz",
       "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
       "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
-      "dev": true,
       "requires": {
       "requires": {
         "escape-string-regexp": "^1.0.5"
         "escape-string-regexp": "^1.0.5"
       }
       }
@@ -6819,7 +6844,6 @@
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "dev": true,
       "requires": {
       "requires": {
         "ansi-regex": "^2.0.0"
         "ansi-regex": "^2.0.0"
       },
       },
@@ -6827,8 +6851,7 @@
         "ansi-regex": {
         "ansi-regex": {
           "version": "2.1.1",
           "version": "2.1.1",
           "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
           "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "dev": true
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
         }
         }
       }
       }
     },
     },
@@ -7198,7 +7221,6 @@
       "version": "0.4.24",
       "version": "0.4.24",
       "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184325364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
       "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184325364&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
       "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
       "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
-      "dev": true,
       "requires": {
       "requires": {
         "safer-buffer": ">= 2.1.2 < 3"
         "safer-buffer": ">= 2.1.2 < 3"
       }
       }
@@ -7592,8 +7614,7 @@
     "is-fullwidth-code-point": {
     "is-fullwidth-code-point": {
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
     },
     },
     "is-glob": {
     "is-glob": {
       "version": "4.0.1",
       "version": "4.0.1",
@@ -7698,8 +7719,7 @@
     "is-stream": {
     "is-stream": {
       "version": "1.1.0",
       "version": "1.1.0",
       "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz",
       "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "dev": true
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
     },
     },
     "is-string": {
     "is-string": {
       "version": "1.0.5",
       "version": "1.0.5",
@@ -8131,8 +8151,7 @@
     "lodash": {
     "lodash": {
       "version": "4.17.20",
       "version": "4.17.20",
       "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336147792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
       "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336147792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz",
-      "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=",
-      "dev": true
+      "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI="
     },
     },
     "lodash.clonedeep": {
     "lodash.clonedeep": {
       "version": "4.5.0",
       "version": "4.5.0",
@@ -8398,8 +8417,7 @@
     "mimic-fn": {
     "mimic-fn": {
       "version": "1.2.0",
       "version": "1.2.0",
       "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz",
       "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz?cache=0&sync_timestamp=1596095644798&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmimic-fn%2Fdownload%2Fmimic-fn-1.2.0.tgz",
-      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
-      "dev": true
+      "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI="
     },
     },
     "mini-css-extract-plugin": {
     "mini-css-extract-plugin": {
       "version": "0.6.0",
       "version": "0.6.0",
@@ -8517,6 +8535,14 @@
         "run-queue": "^1.0.3"
         "run-queue": "^1.0.3"
       }
       }
     },
     },
+    "mpvue-cropper": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npm.taobao.org/mpvue-cropper/download/mpvue-cropper-0.2.3.tgz",
+      "integrity": "sha1-X1qSqgVPcCE+yIbC4peAF2z2jLQ=",
+      "requires": {
+        "we-cropper": "^1.3.8"
+      }
+    },
     "ms": {
     "ms": {
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
@@ -8541,8 +8567,7 @@
     "mute-stream": {
     "mute-stream": {
       "version": "0.0.7",
       "version": "0.0.7",
       "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz",
       "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz",
-      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
-      "dev": true
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
     },
     },
     "mz": {
     "mz": {
       "version": "2.7.0",
       "version": "2.7.0",
@@ -8632,6 +8657,15 @@
         "lower-case": "^1.1.1"
         "lower-case": "^1.1.1"
       }
       }
     },
     },
+    "node-fetch": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npm.taobao.org/node-fetch/download/node-fetch-1.6.3.tgz?cache=0&sync_timestamp=1599309206591&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-fetch%2Fdownload%2Fnode-fetch-1.6.3.tgz",
+      "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=",
+      "requires": {
+        "encoding": "^0.1.11",
+        "is-stream": "^1.0.1"
+      }
+    },
     "node-forge": {
     "node-forge": {
       "version": "0.10.0",
       "version": "0.10.0",
       "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz?cache=0&sync_timestamp=1599010746318&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.10.0.tgz",
       "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.10.0.tgz?cache=0&sync_timestamp=1599010746318&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-forge%2Fdownload%2Fnode-forge-0.10.0.tgz",
@@ -8910,8 +8944,7 @@
     "object-assign": {
     "object-assign": {
       "version": "4.1.1",
       "version": "4.1.1",
       "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz",
       "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
     },
     "object-copy": {
     "object-copy": {
       "version": "0.1.0",
       "version": "0.1.0",
@@ -9084,11 +9117,104 @@
       "version": "2.0.1",
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz",
       "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz",
       "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
       "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
-      "dev": true,
       "requires": {
       "requires": {
         "mimic-fn": "^1.0.0"
         "mimic-fn": "^1.0.0"
       }
       }
     },
     },
+    "opencollective": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npm.taobao.org/opencollective/download/opencollective-1.0.3.tgz",
+      "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=",
+      "requires": {
+        "babel-polyfill": "6.23.0",
+        "chalk": "1.1.3",
+        "inquirer": "3.0.6",
+        "minimist": "1.2.0",
+        "node-fetch": "1.6.3",
+        "opn": "4.0.2"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz",
+          "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1592843133653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "requires": {
+            "ansi-styles": "^2.2.1",
+            "escape-string-regexp": "^1.0.2",
+            "has-ansi": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "supports-color": "^2.0.0"
+          }
+        },
+        "inquirer": {
+          "version": "3.0.6",
+          "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-3.0.6.tgz?cache=0&sync_timestamp=1595471874679&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-3.0.6.tgz",
+          "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=",
+          "requires": {
+            "ansi-escapes": "^1.1.0",
+            "chalk": "^1.0.0",
+            "cli-cursor": "^2.1.0",
+            "cli-width": "^2.0.0",
+            "external-editor": "^2.0.1",
+            "figures": "^2.0.0",
+            "lodash": "^4.3.0",
+            "mute-stream": "0.0.7",
+            "run-async": "^2.2.0",
+            "rx": "^4.1.0",
+            "string-width": "^2.0.0",
+            "strip-ansi": "^3.0.0",
+            "through": "^2.3.6"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        },
+        "opn": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npm.taobao.org/opn/download/opn-4.0.2.tgz",
+          "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
+          "requires": {
+            "object-assign": "^4.0.1",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1606205035829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+        }
+      }
+    },
+    "opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npm.taobao.org/opencollective-postinstall/download/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha1-eg//l49tv6TQBiOPusmO1BmMMlk="
+    },
     "opener": {
     "opener": {
       "version": "1.5.2",
       "version": "1.5.2",
       "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz",
       "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.2.tgz",
@@ -9166,8 +9292,7 @@
     "os-tmpdir": {
     "os-tmpdir": {
       "version": "1.0.2",
       "version": "1.0.2",
       "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
       "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
     },
     },
     "osenv": {
     "osenv": {
       "version": "0.1.5",
       "version": "0.1.5",
@@ -9415,14 +9540,12 @@
     "pinkie": {
     "pinkie": {
       "version": "2.0.4",
       "version": "2.0.4",
       "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
       "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
     },
     },
     "pinkie-promise": {
     "pinkie-promise": {
       "version": "2.0.1",
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
       "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz",
       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
       "requires": {
       "requires": {
         "pinkie": "^2.0.0"
         "pinkie": "^2.0.0"
       }
       }
@@ -10785,7 +10908,6 @@
       "version": "2.0.0",
       "version": "2.0.0",
       "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz",
       "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz",
       "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
       "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
-      "dev": true,
       "requires": {
       "requires": {
         "onetime": "^2.0.0",
         "onetime": "^2.0.0",
         "signal-exit": "^3.0.2"
         "signal-exit": "^3.0.2"
@@ -10837,8 +10959,7 @@
     "run-async": {
     "run-async": {
       "version": "2.4.1",
       "version": "2.4.1",
       "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz",
       "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz",
-      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=",
-      "dev": true
+      "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU="
     },
     },
     "run-queue": {
     "run-queue": {
       "version": "1.0.3",
       "version": "1.0.3",
@@ -10849,6 +10970,11 @@
         "aproba": "^1.1.1"
         "aproba": "^1.1.1"
       }
       }
     },
     },
+    "rx": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npm.taobao.org/rx/download/rx-4.1.0.tgz",
+      "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+    },
     "rx-lite": {
     "rx-lite": {
       "version": "4.0.8",
       "version": "4.0.8",
       "resolved": "https://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz",
       "resolved": "https://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz",
@@ -10893,8 +11019,7 @@
     "safer-buffer": {
     "safer-buffer": {
       "version": "2.1.2",
       "version": "2.1.2",
       "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
       "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
-      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=",
-      "dev": true
+      "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
     },
     },
     "sass-graph": {
     "sass-graph": {
       "version": "2.2.5",
       "version": "2.2.5",
@@ -11193,8 +11318,7 @@
     "signal-exit": {
     "signal-exit": {
       "version": "3.0.3",
       "version": "3.0.3",
       "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz",
       "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz",
-      "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=",
-      "dev": true
+      "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw="
     },
     },
     "simple-swizzle": {
     "simple-swizzle": {
       "version": "0.2.2",
       "version": "0.2.2",
@@ -11669,7 +11793,6 @@
       "version": "2.1.1",
       "version": "2.1.1",
       "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
       "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz",
       "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
       "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
-      "dev": true,
       "requires": {
       "requires": {
         "is-fullwidth-code-point": "^2.0.0",
         "is-fullwidth-code-point": "^2.0.0",
         "strip-ansi": "^4.0.0"
         "strip-ansi": "^4.0.0"
@@ -11678,14 +11801,12 @@
         "ansi-regex": {
         "ansi-regex": {
           "version": "3.0.0",
           "version": "3.0.0",
           "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
           "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
         },
         },
         "strip-ansi": {
         "strip-ansi": {
           "version": "4.0.0",
           "version": "4.0.0",
           "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
           "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz",
           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
           "requires": {
           "requires": {
             "ansi-regex": "^3.0.0"
             "ansi-regex": "^3.0.0"
           }
           }
@@ -12049,8 +12170,7 @@
     "through": {
     "through": {
       "version": "2.3.8",
       "version": "2.3.8",
       "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
       "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
-      "dev": true
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
     },
     },
     "through2": {
     "through2": {
       "version": "2.0.5",
       "version": "2.0.5",
@@ -12087,7 +12207,6 @@
       "version": "0.0.33",
       "version": "0.0.33",
       "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz",
       "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz",
       "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
       "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
-      "dev": true,
       "requires": {
       "requires": {
         "os-tmpdir": "~1.0.2"
         "os-tmpdir": "~1.0.2"
       }
       }
@@ -12643,11 +12762,6 @@
       "integrity": "sha1-D4eJrXGL5oyhhyYpgy7VM1icato=",
       "integrity": "sha1-D4eJrXGL5oyhhyYpgy7VM1icato=",
       "dev": true
       "dev": true
     },
     },
-    "vue-countup-v2": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npm.taobao.org/vue-countup-v2/download/vue-countup-v2-4.0.0.tgz",
-      "integrity": "sha1-BhoayO5Koge7nSPSvMHVOl98NnU="
-    },
     "vue-eslint-parser": {
     "vue-eslint-parser": {
       "version": "2.0.3",
       "version": "2.0.3",
       "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz",
       "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz",
@@ -12874,6 +12988,16 @@
         "defaults": "^1.0.3"
         "defaults": "^1.0.3"
       }
       }
     },
     },
+    "we-cropper": {
+      "version": "1.3.9",
+      "resolved": "https://registry.npm.taobao.org/we-cropper/download/we-cropper-1.3.9.tgz",
+      "integrity": "sha1-FtHbkMQ3OVovgTunkWg5POgSIfE=",
+      "requires": {
+        "base-64": "^0.1.0",
+        "opencollective": "^1.0.3",
+        "opencollective-postinstall": "^2.0.2"
+      }
+    },
     "webpack": {
     "webpack": {
       "version": "4.44.2",
       "version": "4.44.2",
       "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.44.2.tgz",
       "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.44.2.tgz",

+ 3 - 3
package.json

@@ -39,15 +39,15 @@
         "@megalo/vhtml-plugin": "latest",
         "@megalo/vhtml-plugin": "latest",
         "@vant/weapp": "^1.4.4",
         "@vant/weapp": "^1.4.4",
         "countup.js": "^2.0.7",
         "countup.js": "^2.0.7",
-        "date-fns": "^2.16.1",
         "dayjs": "^1.9.6",
         "dayjs": "^1.9.6",
         "megalo": "latest",
         "megalo": "latest",
+        "mpvue-cropper": "^0.2.3",
         "octoparse": "^0.4.2",
         "octoparse": "^0.4.2",
         "style-resources-loader": "^1.3.3",
         "style-resources-loader": "^1.3.3",
         "tslint": "^6.1.3",
         "tslint": "^6.1.3",
-        "vue-countup-v2": "^4.0.0",
         "vue-i18n": "^8.22.1",
         "vue-i18n": "^8.22.1",
         "vuex": "^3.1.0",
         "vuex": "^3.1.0",
-        "vuex-i18n": "^1.13.1"
+        "vuex-i18n": "^1.13.1",
+        "we-cropper": "^1.3.9"
     }
     }
 }
 }

+ 22 - 3
project.config.json

@@ -100,7 +100,7 @@
                 {
                 {
                     "id": -1,
                     "id": -1,
                     "name": "展商总览",
                     "name": "展商总览",
-                    "pathName": "pages/Brand",
+                    "pathName": "pagesHome/Brand",
                     "scene": null
                     "scene": null
                 },
                 },
                 {
                 {
@@ -112,7 +112,7 @@
                 {
                 {
                     "id": -1,
                     "id": -1,
                     "name": "全球产品",
                     "name": "全球产品",
-                    "pathName": "pages/Product",
+                    "pathName": "pagesHome/Product",
                     "scene": null
                     "scene": null
                 },
                 },
                 {
                 {
@@ -239,9 +239,28 @@
                 {
                 {
                     "id": -1,
                     "id": -1,
                     "name": "聊天详情",
                     "name": "聊天详情",
-                    "pathName": "pagesMine/ChatDetail",
+                    "pathName": "pagesChat/ChatDetail",
                     "query": "toUserId=6293",
                     "query": "toUserId=6293",
                     "scene": null
                     "scene": null
+                },
+                {
+                    "id": -1,
+                    "name": "咨询单详情",
+                    "pathName": "pagesChat/ChatForm",
+                    "scene": null
+                },
+                {
+                    "id": -1,
+                    "name": "上传图片",
+                    "pathName": "pagesMine/Upload",
+                    "query": "toUserId=6293",
+                    "scene": null
+                },
+                {
+                    "id": -1,
+                    "name": "需求成交单",
+                    "pathName": "pagesMine/Order",
+                    "scene": null
                 }
                 }
             ]
             ]
         }
         }

+ 1 - 0
src/App.vue

@@ -25,6 +25,7 @@ export default {
             },
             },
             fail() {}
             fail() {}
         });
         });
+        this.$store.dispatch('getBarHeight');
     },
     },
     onShow(options) {
     onShow(options) {
         // Do something when show.
         // Do something when show.

+ 8 - 2
src/components/ChangeText.vue

@@ -8,7 +8,7 @@
                     nowValue = $event.detail.value;
                     nowValue = $event.detail.value;
                 "
                 "
                 :value="value"
                 :value="value"
-                :focus="true"
+                :focus="focus"
                 placeholder="请输入..."
                 placeholder="请输入..."
                 confirm-type="done"
                 confirm-type="done"
             />
             />
@@ -33,12 +33,18 @@ export default {
     data() {
     data() {
         return {
         return {
             nowValue: '',
             nowValue: '',
-            change: false
+            change: false,
+            focus: false
         };
         };
     },
     },
     watch: {
     watch: {
         show() {
         show() {
             this.change = false;
             this.change = false;
+            if (this.show) {
+                setTimeout(() => {
+                    this.focus = true;
+                }, 500);
+            }
         }
         }
     },
     },
     methods: {
     methods: {

+ 7 - 1
src/components/ChatInfo.vue

@@ -3,7 +3,7 @@
         <div class="chatTime">
         <div class="chatTime">
             {{ info.time }}
             {{ info.time }}
         </div>
         </div>
-        <div class="chatInfo" :class="{ right: isMine }" v-if="isInquiry">
+        <div class="chatInfo" :class="{ right: isMine }" v-if="isInquiry" @click="goDetail">
             <van-image class="left-icon" :src="info.sendLogo" :width="36" :height="36" round fit="cover" />
             <van-image class="left-icon" :src="info.sendLogo" :width="36" :height="36" round fit="cover" />
 
 
             <div class="order">
             <div class="order">
@@ -70,6 +70,12 @@ export default {
                 return false;
                 return false;
             }
             }
         }
         }
+    },
+    methods: {
+        goDetail() {
+            this.$store.commit('updateChatForm', this.info.content);
+            this.navigateTo('/pagesChat/ChatForm');
+        }
     }
     }
 };
 };
 </script>
 </script>

+ 107 - 0
src/components/Cropper.vue

@@ -0,0 +1,107 @@
+<template>
+    <div>
+        <canvas
+            v-if="_canvasId"
+            canvas-id="cropper"
+            @touchstart="touchstart"
+            @touchmove="touchmove"
+            @touchend="touchend"
+            disable-scroll
+            :style="{ width: _width + 'px', height: _height + 'px', background: 'rgba(0, 0, 0, .8)' }"
+        >
+        </canvas>
+        <canvas
+            v-if="_targetId"
+            canvas-id="targetCropper"
+            disable-scroll
+            :style="{
+                position: 'fixed',
+                top: -_width * _pixelRatio + 'px',
+                left: -_height * _pixelRatio + 'px',
+                width: _width * _pixelRatio + 'px',
+                height: _height * _pixelRatio + 'px'
+            }"
+        >
+        </canvas>
+    </div>
+</template>
+
+<script>
+import WeCropper from 'we-cropper';
+
+export default {
+    name: 'mpvue-cropper',
+    props: {
+        option: {
+            type: Object
+        }
+    },
+    data() {
+        return {
+            cropper: null
+        };
+    },
+    computed: {
+        _canvasId() {
+            return this.option.id;
+        },
+        _targetId() {
+            return this.option.targetId;
+        },
+        _width() {
+            return this.option.width;
+        },
+        _height() {
+            return this.option.height;
+        },
+        _pixelRatio() {
+            return this.option.pixelRatio;
+        }
+    },
+    methods: {
+        touchstart($event) {
+            console.log($event);
+            this.cropper.touchStart($event);
+        },
+        touchmove($event) {
+            this.cropper.touchMove($event);
+        },
+        touchend($event) {
+            this.cropper.touchEnd($event.mp);
+        },
+        pushOrigin(src) {
+            this.cropper.pushOrign(src);
+        },
+        updateCanvas() {
+            this.cropper.updateCanvas();
+        },
+        getCropperBase64(fn) {
+            return this.cropper.getCropperBase64(fn);
+        },
+        getCropperImage(opt, fn) {
+            return this.cropper.getCropperImage(opt, fn);
+        },
+        init() {
+            this.cropper = new WeCropper(
+                Object.assign(this.option, {
+                    id: this._canvasId,
+                    targetId: this._targetId,
+                    pixelRatio: this._pixelRatio
+                })
+            )
+                .on('ready', (...args) => {
+                    this.$emit('ready', ...args);
+                })
+                .on('beforeImageLoad', (...args) => {
+                    this.$emit('beforeImageLoad', ...args);
+                })
+                .on('imageLoad', (...args) => {
+                    this.$emit('imageLoad', ...args);
+                })
+                .on('beforeDraw', (...args) => {
+                    this.$emit('beforeDraw', ...args);
+                });
+        }
+    }
+};
+</script>

+ 20 - 4
src/components/FixedButton.vue

@@ -6,6 +6,8 @@
         <div class="btn" v-else>
         <div class="btn" v-else>
             <slot></slot>
             <slot></slot>
         </div>
         </div>
+
+        <div class="fixe-info"></div>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
@@ -22,15 +24,16 @@ export default {
 
 
 <style lang="less">
 <style lang="less">
 .bottomFixed {
 .bottomFixed {
-    height: 60px;
-    z-index: 200;
+    .fixe-info {
+        height: 150px;
+    }
     .btn-list {
     .btn-list {
         position: fixed;
         position: fixed;
         background-color: #fff;
         background-color: #fff;
         left: 0;
         left: 0;
         right: 0;
         right: 0;
         bottom: 0;
         bottom: 0;
-        padding: 8px 10px;
+        // padding: 8px 10px;
         z-index: 200;
         z-index: 200;
         box-shadow: 0px -1px 2px 0px rgba(0, 0, 0, 0.04);
         box-shadow: 0px -1px 2px 0px rgba(0, 0, 0, 0.04);
         display: flex;
         display: flex;
@@ -43,6 +46,12 @@ export default {
         .van-button {
         .van-button {
             height: 40px;
             height: 40px;
         }
         }
+        padding-top: 8px;
+        padding-left: 10px;
+        padding-right: 10px;
+
+        padding-bottom: calc(8px + constant(safe-area-inset-bottom));
+        padding-bottom: calc(8px + env(safe-area-inset-bottom));
     }
     }
 
 
     .btn {
     .btn {
@@ -51,7 +60,14 @@ export default {
         left: 0;
         left: 0;
         right: 0;
         right: 0;
         bottom: 0;
         bottom: 0;
-        padding: 8px 68px;
+        // padding: 8px 68px;
+
+        padding-top: 8px;
+        padding-left: 68px;
+        padding-right: 68px;
+
+        padding-bottom: calc(8px + constant(safe-area-inset-bottom));
+        padding-bottom: calc(8px + env(safe-area-inset-bottom));
         z-index: 99;
         z-index: 99;
         box-shadow: 0px -1px 2px 0px rgba(0, 0, 0, 0.04);
         box-shadow: 0px -1px 2px 0px rgba(0, 0, 0, 0.04);
         .van-button {
         .van-button {

+ 2 - 2
src/components/Member.vue

@@ -80,10 +80,10 @@ export default {
     methods: {
     methods: {
         goDetail() {
         goDetail() {
             if (this.type === 'system') {
             if (this.type === 'system') {
-                this.navigateTo('/pagesMine/ChatDetail?type=system');
+                this.navigateTo('/pagesChat/ChatDetail?type=system');
             } else {
             } else {
                 this.navigateTo(
                 this.navigateTo(
-                    `/pagesMine/ChatDetail?toUserId=${this.info.otherUserId}${this.type ? '&type=' + this.type : ''}`
+                    `/pagesChat/ChatDetail?toUserId=${this.info.otherUserId}${this.type ? '&type=' + this.type : ''}`
                 );
                 );
             }
             }
         }
         }

+ 25 - 8
src/components/SortList.vue

@@ -1,11 +1,11 @@
 <template>
 <template>
-    <div class="list-row" :style="` min-height: calc(100vh - 172rpx - ${top || 0})`">
+    <div class="list-row" :style="`min-height: calc(100vh - ${barHeight}px - ${top || 0})`">
         <slot></slot>
         <slot></slot>
-        <van-empty
-            image="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/img_kong.png"
-            description="什么都没有哦~"
-            v-if="empty"
-        />
+        <van-empty :image="emptyImg" :description="emptyText" v-if="empty">
+            <div class="empty-button">
+                <slot name="emptyButton"></slot>
+            </div>
+        </van-empty>
         <div class="endText" v-else>
         <div class="endText" v-else>
             <van-loading size="24px" v-if="loading">加载中...</van-loading>
             <van-loading size="24px" v-if="loading">加载中...</van-loading>
             <p v-if="finish">没有更多了~</p>
             <p v-if="finish">没有更多了~</p>
@@ -13,6 +13,7 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+import { mapState } from 'vuex';
 export default {
 export default {
     props: {
     props: {
         empty: {
         empty: {
@@ -30,8 +31,19 @@ export default {
         top: {
         top: {
             type: String,
             type: String,
             default: ''
             default: ''
+        },
+        emptyImg: {
+            type: String,
+            default: 'http://imt.oss-cn-hangzhou.aliyuncs.com/micro/kong_img_default.png'
+        },
+        emptyText: {
+            type: String,
+            default: '什么都没有哦~'
         }
         }
     },
     },
+    computed: {
+        ...mapState(['barTop', 'barHeight'])
+    },
     data() {
     data() {
         return {};
         return {};
     },
     },
@@ -46,8 +58,8 @@ export default {
     box-sizing: border-box;
     box-sizing: border-box;
 
 
     .van-empty__image {
     .van-empty__image {
-        width: 180px;
-        height: 130px;
+        width: 240px;
+        height: 240px;
     }
     }
 
 
     .van-empty__description {
     .van-empty__description {
@@ -62,4 +74,9 @@ export default {
     display: flex;
     display: flex;
     justify-content: center;
     justify-content: center;
 }
 }
+
+.empty-button {
+    margin-top: 16px;
+    width: 240px;
+}
 </style>
 </style>

+ 8 - 1
src/components/bar/CustomBar.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div :style="{ height: fixed ? 0 : '71px' }">
+    <div :style="{ height: fixed ? 0 : fixedHieght + 'px' }">
         <div class="navBar" :style="narStyle" id="searchBar">
         <div class="navBar" :style="narStyle" id="searchBar">
             <van-icon name="arrow-left" @click="navigateBack" :size="24" :color="fontColor" />
             <van-icon name="arrow-left" @click="navigateBack" :size="24" :color="fontColor" />
 
 
@@ -47,6 +47,13 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
+        fixedHieght() {
+            if (this.menuButtonInfo.top) {
+                return this.menuButtonInfo.top + this.menuButtonInfo.height + 15;
+            } else {
+                return 71;
+            }
+        },
         narStyle() {
         narStyle() {
             let style = {};
             let style = {};
             if (this.sticky) {
             if (this.sticky) {

+ 7 - 0
src/components/bar/FilterSortBar.vue

@@ -69,6 +69,13 @@ export default {
         return {};
         return {};
     },
     },
     computed: {
     computed: {
+        fixedHieght() {
+            if (this.menuButtonInfo.top) {
+                return this.menuButtonInfo.top + this.menuButtonInfo.height + 15;
+            } else {
+                return 71;
+            }
+        },
         sortList() {
         sortList() {
             if (this.pageType === 'vendor') {
             if (this.pageType === 'vendor') {
                 return [...BrandSortType].map(item => {
                 return [...BrandSortType].map(item => {

+ 8 - 1
src/components/bar/SearchBar.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div style="height:71px">
+    <div :style="{ height: fixedHieght + 'px' }">
         <div class="navBar" :style="narStyle">
         <div class="navBar" :style="narStyle">
             <img class="logo" src="../../static/imgs/home_logo.png" alt="" />
             <img class="logo" src="../../static/imgs/home_logo.png" alt="" />
             <div class="search">
             <div class="search">
@@ -18,6 +18,13 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
+        fixedHieght() {
+            if (this.menuButtonInfo.top) {
+                return this.menuButtonInfo.top + this.menuButtonInfo.height + 15;
+            } else {
+                return 71;
+            }
+        },
         narStyle() {
         narStyle() {
             if (this.menuButtonInfo.top) {
             if (this.menuButtonInfo.top) {
                 return {
                 return {

+ 7 - 0
src/components/bar/SearchBarWithValue.vue

@@ -46,6 +46,13 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
+        fixedHieght() {
+            if (this.menuButtonInfo.top) {
+                return this.menuButtonInfo.top + this.menuButtonInfo.height + 15;
+            } else {
+                return 71;
+            }
+        },
         narStyle() {
         narStyle() {
             let style = {};
             let style = {};
             if (this.fixed && this.dark) {
             if (this.fixed && this.dark) {

+ 6 - 2
src/components/product/RowMini.vue

@@ -38,12 +38,16 @@ export default {
         hasCheck: {
         hasCheck: {
             type: Boolean,
             type: Boolean,
             default: true
             default: true
+        },
+        imgKey: {
+            type: String,
+            default: 'img'
         }
         }
     },
     },
     computed: {
     computed: {
         img() {
         img() {
-            if (this.getList(this.info.img)) {
-                return this.getList(this.info.img) + '?x-oss-process=image/resize,m_fill,h_300,w_300';
+            if (this.getList(this.info[this.imgKey])) {
+                return this.getList(this.info[this.imgKey]) + '?x-oss-process=image/resize,m_fill,h_300,w_300';
             } else {
             } else {
                 return '';
                 return '';
             }
             }

+ 291 - 0
src/components/select/Country.vue

@@ -0,0 +1,291 @@
+<template>
+    <div class="filterInfo" :class="`filter--${size}`" @click.stop="">
+        <div class="select" :class="{ noChoose: !valueInfo }" @click="show">
+            <h3 class="fontNormal">{{ valueInfo ? valueInfo : '未选择' }}</h3>
+        </div>
+
+        <van-popup :show="showPopup" round position="bottom" custom-style="height: 300px" @close="showPopup = false">
+            <div class="bar">
+                <div class="left-icon">
+                    <van-icon v-if="headerInfo" color="#5E636D" @click="back" :size="18" name="arrow-left" />
+                </div>
+                <h3>国家地区</h3>
+                <van-icon color="#5E636D" :size="18" name="cross" @click="showPopup = false" />
+            </div>
+            <van-cell-group :border="false">
+                <van-cell
+                    @click="backChoose(headerInfo.value)"
+                    v-if="headerInfo"
+                    :border="false"
+                    :custom-class="chooseId === headerInfo.value ? 'active' : ''"
+                    style="display:none"
+                >
+                    <h3 class="fontNormal" slot="title">全部{{ $t(headerInfo.label) }}地区</h3>
+                    <van-icon
+                        v-if="chooseId === headerInfo.value"
+                        slot="right-icon"
+                        :size="18"
+                        :color="$colors.warn"
+                        name="success"
+                    />
+                </van-cell>
+                <block v-for="item in showList" :key="item.value">
+                    <van-cell
+                        @click="chooseList(item)"
+                        :border="false"
+                        :custom-class="chooseId === item.value ? 'active' : ''"
+                    >
+                        <h3 class="fontNormal" slot="title">{{ $t(item.label) }}</h3>
+                        <van-icon
+                            v-if="chooseId === item.value"
+                            slot="right-icon"
+                            :size="18"
+                            :color="$colors.warn"
+                            name="success"
+                        />
+                    </van-cell>
+                </block>
+            </van-cell-group>
+        </van-popup>
+    </div>
+</template>
+<script>
+import { countrysSelect } from '../../utils/area';
+export default {
+    props: {
+        size: {
+            type: String,
+            default: 'big'
+        },
+        country: {
+            type: String,
+            default: ''
+        },
+        city: {
+            type: String,
+            default: ''
+        },
+        province: {
+            type: String,
+            default: ''
+        }
+    },
+    data() {
+        return {
+            showPopup: false,
+            list: [],
+            chooseId: 0,
+            main: null
+        };
+    },
+    computed: {
+        showList() {
+            const list = [...this.list];
+            if (this.isLeaf) {
+                return list.filter(item => {
+                    return item.parent === this.chooseInfo.parent && item.value !== this.chooseInfo.parent;
+                });
+            } else if (this.chooseId) {
+                return list.filter(item => {
+                    return item.parent === this.chooseId && item.value !== this.chooseId;
+                });
+            } else {
+                return list.filter(item => {
+                    return !item.parent;
+                });
+            }
+        },
+        isLeaf() {
+            if (this.chooseInfo && !this.chooseInfo.children) {
+                return true;
+            }
+            return false;
+        },
+        chooseInfo() {
+            const list = [...this.list];
+            return list.find(item => {
+                return item.value === this.chooseId;
+            });
+        },
+        valueInfo() {
+            const list = [this.country, this.province, this.city];
+
+            return list
+                .filter(item => {
+                    return !!item;
+                })
+                .join('/');
+        },
+        headerInfo() {
+            if (this.isLeaf) {
+                const list = [...this.list];
+                return list.find(item => {
+                    return item.value === this.chooseInfo.parent;
+                });
+            } else {
+                return this.chooseInfo;
+            }
+        },
+        valueList() {
+            return this.getParent(this.chooseId, []);
+        }
+    },
+    mounted() {
+        this.list = countrysSelect();
+    },
+    methods: {
+        chooseList(info) {
+            if (info.children && info.children.length > 0) {
+                this.chooseId = info.value;
+            } else {
+                this.chooseId = info.value;
+                this.backChoose();
+            }
+        },
+        back() {
+            if (this.headerInfo) {
+                this.chooseId = this.headerInfo.parent || 0;
+            }
+        },
+        backChoose(value) {
+            console.log(this.valueList);
+            if (this.valueList.length > 0) {
+                this.$emit('update:country', this.valueList[0]);
+            } else {
+                this.$emit('update:country', '');
+            }
+            if (this.valueList.length > 1) {
+                this.$emit('update:province', this.valueList[1]);
+            } else {
+                this.$emit('update:province', '');
+            }
+            if (this.valueList.length > 2) {
+                this.$emit('update:city', this.valueList[2]);
+            } else {
+                this.$emit('update:city', '');
+            }
+            // this.$emit('input', value || this.chooseId || '');
+            this.showPopup = false;
+        },
+        show() {
+            console.log(this.valueInfo);
+            this.chooseId = this.city || this.province || this.country;
+            this.showPopup = true;
+        },
+        clear() {
+            this.chooseId = 0;
+            this.backChoose();
+        },
+        getParent(id, list = []) {
+            const _list = [...this.list];
+            const chooseInfo = _list.find(item => {
+                return item.value === id;
+            });
+            if (chooseInfo.parent) {
+                return this.getParent(chooseInfo.parent, [...[id], ...list]);
+            } else {
+                return list;
+            }
+        }
+    }
+};
+</script>
+<style lang="less">
+.van-popup {
+    .bar {
+        position: sticky;
+        top: 0;
+        height: 48px;
+        background: #ffffff;
+        display: flex;
+        align-items: center;
+        padding: 0 16px;
+        margin-bottom: 6px;
+        z-index: 20;
+        .left-icon {
+            width: 18px;
+        }
+        h3 {
+            flex-grow: 1;
+            padding: 0 10px;
+            text-align: center;
+        }
+    }
+
+    .van-cell {
+        padding: 12px 40px;
+        h3 {
+            text-align: left;
+        }
+
+        &.active {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+.filterInfo {
+    &.filter--big {
+        padding: 0 16px 20px;
+        .filter-btn {
+            height: 44px;
+            padding: 0 16px;
+            h3 {
+                padding-right: 10px;
+            }
+            &.noChoose {
+                h3 {
+                    color: #bcc1cc;
+                }
+            }
+        }
+    }
+    &.filter--small {
+        .filter-btn {
+            height: 28px;
+            background-color: #fff;
+            h3 {
+                font-size: 14px;
+                color: #000000;
+                // padding-right: 2px;
+            }
+
+            &.noChoose {
+                h3 {
+                    color: @warn;
+                }
+            }
+        }
+    }
+    h4 {
+        padding: 14px 0;
+    }
+    .filter-btn {
+        // background: #f5f7fa;
+        background-color: #fff;
+
+        border-radius: 4px;
+        display: flex;
+        align-items: center;
+
+        h3 {
+            flex-grow: 1;
+        }
+    }
+
+    .select {
+        h3 {
+            font-size: 14px;
+            color: #000000;
+            // padding-right: 2px;
+        }
+
+        &.noChoose {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+</style>

+ 249 - 0
src/components/select/Industry.vue

@@ -0,0 +1,249 @@
+<template>
+    <div class="select" @click.stop="">
+        <div class="filter-btn" :class="{ noChoose: !valueInfo }" @click="show">
+            <h3 class="fontNormal">{{ valueInfo ? valueInfo : '未选择' }}</h3>
+        </div>
+
+        <van-popup :show="showPopup" round position="bottom" custom-style="height: 300px" @close="showPopup = false">
+            <div class="bar">
+                <div class="left-icon">
+                    <van-icon v-if="headerInfo" color="#5E636D" @click="back" :size="18" name="arrow-left" />
+                </div>
+                <h3>选择所属行业</h3>
+                <van-button :color="$colors.warn" size="small" plain @click="submit">确认</van-button>
+            </div>
+            <van-cell-group :border="false">
+                <block v-for="item in showList" :key="item.id">
+                    <van-cell
+                        @click="chooseList(item)"
+                        :border="false"
+                        :custom-class="nowChooseList.includes(item.id) ? 'active' : ''"
+                        :is-link="item.children && item.children.length > 0"
+                    >
+                        <h3 @click.stop="chooseList(item)" class="fontNormal" slot="title">{{ getName(item) }}</h3>
+                        <van-icon
+                            slot="right-icon"
+                            :size="18"
+                            :color="$colors.warn"
+                            v-if="nowChooseList.includes(item.id)"
+                            name="success"
+                        />
+                    </van-cell>
+                </block>
+            </van-cell-group>
+        </van-popup>
+    </div>
+</template>
+<script>
+import { getArray } from '../../utils/commont';
+export default {
+    props: {
+        value: {
+            type: [Array],
+            default: () => {
+                return [];
+            }
+        },
+        size: {
+            type: String,
+            default: 'big'
+        }
+    },
+    data() {
+        return {
+            showPopup: false,
+            list: [],
+            chooseId: 0,
+            main: null,
+            nowChooseList: []
+        };
+    },
+    computed: {
+        showList() {
+            const list = [...this.list];
+            if (this.isLeaf) {
+                return list.filter(item => {
+                    return item.parentId === this.chooseInfo.parentId;
+                });
+            } else if (this.chooseId) {
+                return list.filter(item => {
+                    return item.parentId === this.chooseId;
+                });
+            } else {
+                return list.filter(item => {
+                    return item.parentId === 300;
+                });
+            }
+        },
+        chooseInfo() {
+            const list = [...this.list];
+            return list.find(item => {
+                return item.id === this.chooseId;
+            });
+        },
+        isLeaf() {
+            if (this.chooseInfo && !this.chooseInfo.children) {
+                return true;
+            }
+            return false;
+        },
+        valueInfo() {
+            const list = [...this.list];
+            return list
+                .filter(item => {
+                    return [...this.value].includes(item.id);
+                })
+                .map(item => {
+                    return this.getName(item);
+                })
+                .join(',');
+        },
+        headerInfo() {
+            if (this.isLeaf) {
+                const list = [...this.list];
+                return list.find(item => {
+                    return item.id === this.chooseInfo.parentId;
+                });
+            } else {
+                return this.chooseInfo;
+            }
+        }
+    },
+    mounted() {
+        this.$http.get('/productTag/industry').then(res => {
+            this.list = getArray(res, '', 2);
+        });
+    },
+    methods: {
+        chooseList(info) {
+            if (this.nowChooseList.includes(info.id)) {
+                const _list = [...this.nowChooseList];
+                _list.splice(_list.indexOf(info.id), 1);
+                this.nowChooseList = _list;
+                return;
+            }
+            if (info.children && info.children.length > 0) {
+                this.chooseId = info.id;
+            } else {
+                this.nowChooseList.push(info.id);
+                // this.chooseId = info.id;
+                // this.backChoose();
+            }
+        },
+        back() {
+            if (this.headerInfo) {
+                this.chooseId = this.headerInfo.parent || 0;
+            }
+        },
+        submit() {
+            this.$emit('input', [...this.nowChooseList]);
+            this.showPopup = false;
+        },
+        backChoose(id) {
+            this.$emit('input', id || this.chooseId);
+            this.showPopup = false;
+        },
+        show() {
+            this.chooseId = 0;
+            this.nowChooseList = [...this.value];
+            this.showPopup = true;
+        }
+    }
+};
+</script>
+<style lang="less">
+.van-popup {
+    .bar {
+        position: sticky;
+        top: 0;
+        height: 48px;
+        background: #ffffff;
+        display: flex;
+        align-items: center;
+        padding: 0 16px;
+        margin-bottom: 6px;
+        z-index: 20;
+        h3 {
+            flex-grow: 1;
+            text-align: center;
+            padding: 0 10px;
+        }
+        .left-icon {
+            width: 18px;
+        }
+    }
+
+    .van-cell {
+        padding: 12px 40px;
+
+        &.active {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+.filterInfo {
+    &.filter--big {
+        padding: 0 16px 20px;
+        .filter-btn {
+            height: 44px;
+            padding: 0 16px;
+            h3 {
+                padding-right: 10px;
+            }
+            &.noChoose {
+                h3 {
+                    color: #bcc1cc;
+                }
+            }
+        }
+    }
+    &.filter--small {
+        .filter-btn {
+            height: 28px;
+            padding: 0 5px 0 10px;
+            background-color: #fff4e5;
+            h3 {
+                font-size: 12px;
+                color: @warn;
+                padding-right: 2px;
+            }
+
+            &.noChoose {
+                background: #f2f3f5;
+                h3 {
+                    color: #878d99;
+                }
+            }
+        }
+    }
+    h4 {
+        padding: 14px 0;
+    }
+    .filter-btn {
+        background: #f5f7fa;
+        border-radius: 4px;
+        display: flex;
+        align-items: center;
+
+        h3 {
+            flex-grow: 1;
+        }
+    }
+}
+
+.select {
+    .filter-btn {
+        h3 {
+            color: #000;
+        }
+
+        &.noChoose {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+</style>

+ 256 - 0
src/components/select/ProductCategory.vue

@@ -0,0 +1,256 @@
+<template>
+    <div class="select" @click.stop="">
+        <div class="filter-btn" :class="{ noChoose: !valueInfo }" @click="show">
+            <h3 class="fontNormal">{{ valueInfo ? valueInfo : '未选择' }}</h3>
+        </div>
+
+        <van-popup :show="showPopup" round position="bottom" custom-style="height: 300px" @close="showPopup = false">
+            <div class="bar">
+                <div class="left-icon">
+                    <van-icon v-if="headerInfo" color="#5E636D" @click="back" :size="18" name="arrow-left" />
+                </div>
+                <h3>选择感兴趣的产品</h3>
+                <van-button :color="$colors.warn" size="small" @click="submit">确认</van-button>
+            </div>
+            <van-cell-group :border="false">
+                <block v-for="item in showList" :key="item.id">
+                    <van-cell
+                        @click="chooseList(item)"
+                        :border="false"
+                        :custom-class="nowChooseList.includes(item.id) ? 'active' : ''"
+                        :is-link="item.children && item.children.length > 0"
+                    >
+                        <h3 @click.stop="chooseList(item)" class="fontNormal" slot="title">{{ getName(item) }}</h3>
+                        <van-icon
+                            slot="right-icon"
+                            :size="18"
+                            :color="$colors.warn"
+                            v-if="nowChooseList.includes(item.id)"
+                            name="success"
+                        />
+                    </van-cell>
+                </block>
+            </van-cell-group>
+        </van-popup>
+    </div>
+</template>
+<script>
+import { getArray } from '../../utils/commont';
+export default {
+    props: {
+        value: {
+            type: [Array],
+            default: () => {
+                return [];
+            }
+        },
+        size: {
+            type: String,
+            default: 'big'
+        }
+    },
+    data() {
+        return {
+            showPopup: false,
+            list: [],
+            chooseId: 0,
+            main: null,
+            nowChooseList: []
+        };
+    },
+    computed: {
+        showList() {
+            const list = [...this.list];
+            if (this.isLeaf) {
+                return list.filter(item => {
+                    return item.parentId === this.chooseInfo.parentId;
+                });
+            } else if (this.chooseId) {
+                return list.filter(item => {
+                    return item.parentId === this.chooseId;
+                });
+            } else {
+                return list.filter(item => {
+                    return !item.parentId;
+                });
+            }
+        },
+        chooseInfo() {
+            const list = [...this.list];
+            return list.find(item => {
+                return item.id === this.chooseId;
+            });
+        },
+        isLeaf() {
+            if (this.chooseInfo && !this.chooseInfo.children) {
+                return true;
+            }
+            return false;
+        },
+        valueInfo() {
+            const list = [...this.list];
+            return list
+                .filter(item => {
+                    return [...this.value].includes(item.id);
+                })
+                .map(item => {
+                    return this.getName(item);
+                })
+                .join(',');
+        },
+        headerInfo() {
+            if (this.isLeaf) {
+                const list = [...this.list];
+                return list.find(item => {
+                    return item.id === this.chooseInfo.parentId;
+                });
+            } else {
+                return this.chooseInfo;
+            }
+        }
+    },
+    mounted() {
+        this.$http.get('/productCategory/tree').then(res => {
+            this.list = getArray(res, '', 3);
+            this.$nextTick(() => {
+                console.log(this.list);
+            });
+        });
+    },
+    methods: {
+        chooseList(info) {
+            if (this.nowChooseList.includes(info.id)) {
+                const _list = [...this.nowChooseList];
+                _list.splice(_list.indexOf(info.id), 1);
+                this.nowChooseList = _list;
+                return;
+            }
+            if (info.children && info.children.length > 0) {
+                this.chooseId = info.id;
+            } else {
+                this.nowChooseList.push(info.id);
+                // this.chooseId = info.id;
+                // this.backChoose();
+            }
+        },
+        back() {
+            if (this.headerInfo) {
+                this.chooseId = this.headerInfo.parent || 0;
+            }
+        },
+        submit() {
+            this.$emit('input', [...this.nowChooseList]);
+            this.showPopup = false;
+        },
+        backChoose(id) {
+            this.$emit('input', id || this.chooseId);
+            this.showPopup = false;
+        },
+        show() {
+            this.chooseId = 0;
+            this.nowChooseList = [...this.value];
+            this.showPopup = true;
+            this.$nextTick(() => {
+                console.log(this.showList);
+            });
+        }
+    }
+};
+</script>
+<style lang="less">
+.van-popup {
+    .bar {
+        --button-border-width: 0px;
+        position: sticky;
+        top: 0;
+        height: 48px;
+        background: #ffffff;
+        display: flex;
+        align-items: center;
+        padding: 0 16px;
+        margin-bottom: 6px;
+        z-index: 20;
+        h3 {
+            flex-grow: 1;
+            text-align: center;
+            padding: 0 10px;
+        }
+        .left-icon {
+            width: 18px;
+        }
+    }
+
+    .van-cell {
+        padding: 12px 40px;
+
+        &.active {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+.filterInfo {
+    &.filter--big {
+        padding: 0 16px 20px;
+        .filter-btn {
+            height: 44px;
+            padding: 0 16px;
+            h3 {
+                padding-right: 10px;
+            }
+            &.noChoose {
+                h3 {
+                    color: #bcc1cc;
+                }
+            }
+        }
+    }
+    &.filter--small {
+        .filter-btn {
+            height: 28px;
+            padding: 0 5px 0 10px;
+            background-color: #fff4e5;
+            h3 {
+                font-size: 12px;
+                color: @warn;
+                padding-right: 2px;
+            }
+
+            &.noChoose {
+                background: #f2f3f5;
+                h3 {
+                    color: #878d99;
+                }
+            }
+        }
+    }
+    h4 {
+        padding: 14px 0;
+    }
+    .filter-btn {
+        background: #f5f7fa;
+        border-radius: 4px;
+        display: flex;
+        align-items: center;
+
+        h3 {
+            flex-grow: 1;
+        }
+    }
+}
+
+.select {
+    .filter-btn {
+        h3 {
+            color: #000;
+        }
+
+        &.noChoose {
+            h3 {
+                color: @warn;
+            }
+        }
+    }
+}
+</style>

+ 5 - 1
src/main.js

@@ -68,9 +68,13 @@ export default {
                 root: 'pagesImt',
                 root: 'pagesImt',
                 pages: ['Index', 'ServiceDetail']
                 pages: ['Index', 'ServiceDetail']
             },
             },
+            {
+                root: 'pagesChat',
+                pages: ['ChatDetail', 'ChatForm']
+            },
             {
             {
                 root: 'pagesMine',
                 root: 'pagesMine',
-                pages: ['Collect', 'ReadRecords', 'Activity', 'ChatDetail']
+                pages: ['Upload', 'Collect', 'ReadRecords', 'Activity', 'Order']
             },
             },
             {
             {
                 root: 'pagesProduct',
                 root: 'pagesProduct',

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
src/native/area.json


+ 1187 - 0
src/native/we-cropper/we-cropper.js

@@ -0,0 +1,1187 @@
+/**
+ * we-cropper v1.3.9
+ * (c) 2020 dlhandsome
+ * @license MIT
+ */
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+	typeof define === 'function' && define.amd ? define(factory) :
+	(global.WeCropper = factory());
+}(this, (function () { 'use strict';
+
+var device = void 0;
+var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended'];
+
+function firstLetterUpper (str) {
+  return str.charAt(0).toUpperCase() + str.slice(1)
+}
+
+function setTouchState (instance) {
+  var arg = [], len = arguments.length - 1;
+  while ( len-- > 0 ) arg[ len ] = arguments[ len + 1 ];
+
+  TOUCH_STATE.forEach(function (key, i) {
+    if (arg[i] !== undefined) {
+      instance[key] = arg[i];
+    }
+  });
+}
+
+function validator (instance, o) {
+  Object.defineProperties(instance, o);
+}
+
+function	getDevice () {
+  if (!device) {
+    device = wx.getSystemInfoSync();
+  }
+  return device
+}
+
+var tmp = {};
+
+var ref = getDevice();
+var pixelRatio = ref.pixelRatio;
+
+var DEFAULT = {
+  id: {
+    default: 'cropper',
+    get: function get () {
+      return tmp.id
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'string') {
+        console.error(("id:" + value + " is invalid"));
+      }
+      tmp.id = value;
+    }
+  },
+  width: {
+    default: 750,
+    get: function get () {
+      return tmp.width
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'number') {
+        console.error(("width:" + value + " is invalid"));
+      }
+      tmp.width = value;
+    }
+  },
+  height: {
+    default: 750,
+    get: function get () {
+      return tmp.height
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'number') {
+        console.error(("height:" + value + " is invalid"));
+      }
+      tmp.height = value;
+    }
+  },
+  pixelRatio: {
+    default: pixelRatio,
+    get: function get () {
+      return tmp.pixelRatio
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'number') {
+        console.error(("pixelRatio:" + value + " is invalid"));
+      }
+      tmp.pixelRatio = value;
+    }
+  },
+  scale: {
+    default: 2.5,
+    get: function get () {
+      return tmp.scale
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'number') {
+        console.error(("scale:" + value + " is invalid"));
+      }
+      tmp.scale = value;
+    }
+  },
+  zoom: {
+    default: 5,
+    get: function get () {
+      return tmp.zoom
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'number') {
+        console.error(("zoom:" + value + " is invalid"));
+      } else if (value < 0 || value > 10) {
+        console.error("zoom should be ranged in 0 ~ 10");
+      }
+      tmp.zoom = value;
+    }
+  },
+  src: {
+    default: '',
+    get: function get () {
+      return tmp.src
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'string') {
+        console.error(("src:" + value + " is invalid"));
+      }
+      tmp.src = value;
+    }
+  },
+  cut: {
+    default: {},
+    get: function get () {
+      return tmp.cut
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'object') {
+        console.error(("cut:" + value + " is invalid"));
+      }
+      tmp.cut = value;
+    }
+  },
+  boundStyle: {
+    default: {},
+    get: function get () {
+      return tmp.boundStyle
+    },
+    set: function set (value) {
+      if (typeof (value) !== 'object') {
+        console.error(("boundStyle:" + value + " is invalid"));
+      }
+      tmp.boundStyle = value;
+    }
+  },
+  onReady: {
+    default: null,
+    get: function get () {
+      return tmp.ready
+    },
+    set: function set (value) {
+      tmp.ready = value;
+    }
+  },
+  onBeforeImageLoad: {
+    default: null,
+    get: function get () {
+      return tmp.beforeImageLoad
+    },
+    set: function set (value) {
+      tmp.beforeImageLoad = value;
+    }
+  },
+  onImageLoad: {
+    default: null,
+    get: function get () {
+      return tmp.imageLoad
+    },
+    set: function set (value) {
+      tmp.imageLoad = value;
+    }
+  },
+  onBeforeDraw: {
+    default: null,
+    get: function get () {
+      return tmp.beforeDraw
+    },
+    set: function set (value) {
+      tmp.beforeDraw = value;
+    }
+  }
+};
+
+var ref$1 = getDevice();
+var windowWidth = ref$1.windowWidth;
+
+function prepare () {
+  var self = this;
+
+  // v1.4.0 版本中将不再自动绑定we-cropper实例
+  self.attachPage = function () {
+    var pages = getCurrentPages();
+    // 获取到当前page上下文
+    var pageContext = pages[pages.length - 1];
+    // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问
+    Object.defineProperty(pageContext, 'wecropper', {
+      get: function get () {
+        console.warn(
+          'Instance will not be automatically bound to the page after v1.4.0\n\n' +
+          'Please use a custom instance name instead\n\n' +
+          'Example: \n' +
+          'this.mycropper = new WeCropper(options)\n\n' +
+          '// ...\n' +
+          'this.mycropper.getCropperImage()'
+        );
+        return self
+      },
+      configurable: true
+    });
+  };
+
+  self.createCtx = function () {
+    var id = self.id;
+    var targetId = self.targetId;
+
+    if (id) {
+      self.ctx = self.ctx || wx.createCanvasContext(id);
+      self.targetCtx = self.targetCtx || wx.createCanvasContext(targetId);
+    } else {
+      console.error("constructor: create canvas context failed, 'id' must be valuable");
+    }
+  };
+
+  self.deviceRadio = windowWidth / 750;
+}
+
+var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+
+
+
+
+function createCommonjsModule(fn, module) {
+	return module = { exports: {} }, fn(module, module.exports), module.exports;
+}
+
+var tools = createCommonjsModule(function (module, exports) {
+/**
+ * String type check
+ */
+exports.isStr = function (v) { return typeof v === 'string'; };
+/**
+ * Number type check
+ */
+exports.isNum = function (v) { return typeof v === 'number'; };
+/**
+ * Array type check
+ */
+exports.isArr = Array.isArray;
+/**
+ * undefined type check
+ */
+exports.isUndef = function (v) { return v === undefined; };
+
+exports.isTrue = function (v) { return v === true; };
+
+exports.isFalse = function (v) { return v === false; };
+/**
+ * Function type check
+ */
+exports.isFunc = function (v) { return typeof v === 'function'; };
+/**
+ * Quick object check - this is primarily used to tell
+ * Objects from primitive values when we know the value
+ * is a JSON-compliant type.
+ */
+exports.isObj = exports.isObject = function (obj) {
+  return obj !== null && typeof obj === 'object'
+};
+
+/**
+ * Strict object type check. Only returns true
+ * for plain JavaScript objects.
+ */
+var _toString = Object.prototype.toString;
+exports.isPlainObject = function (obj) {
+  return _toString.call(obj) === '[object Object]'
+};
+
+/**
+ * Check whether the object has the property.
+ */
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+exports.hasOwn = function (obj, key) {
+  return hasOwnProperty.call(obj, key)
+};
+
+/**
+ * Perform no operation.
+ * Stubbing args to make Flow happy without leaving useless transpiled code
+ * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/)
+ */
+exports.noop = function (a, b, c) {};
+
+/**
+ * Check if val is a valid array index.
+ */
+exports.isValidArrayIndex = function (val) {
+  var n = parseFloat(String(val));
+  return n >= 0 && Math.floor(n) === n && isFinite(val)
+};
+});
+
+var tools_7 = tools.isFunc;
+var tools_10 = tools.isPlainObject;
+
+var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad'];
+
+function observer () {
+  var self = this;
+
+  self.on = function (event, fn) {
+    if (EVENT_TYPE.indexOf(event) > -1) {
+      if (tools_7(fn)) {
+        event === 'ready'
+          ? fn(self)
+          : self[("on" + (firstLetterUpper(event)))] = fn;
+      }
+    } else {
+      console.error(("event: " + event + " is invalid"));
+    }
+    return self
+  };
+}
+
+function wxPromise (fn) {
+  return function (obj) {
+    var args = [], len = arguments.length - 1;
+    while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
+
+    if ( obj === void 0 ) obj = {};
+    return new Promise(function (resolve, reject) {
+      obj.success = function (res) {
+        resolve(res);
+      };
+      obj.fail = function (err) {
+        reject(err);
+      };
+      fn.apply(void 0, [ obj ].concat( args ));
+    })
+  }
+}
+
+function draw (ctx, reserve) {
+  if ( reserve === void 0 ) reserve = false;
+
+  return new Promise(function (resolve) {
+    ctx.draw(reserve, resolve);
+  })
+}
+
+var getImageInfo = wxPromise(wx.getImageInfo);
+
+var canvasToTempFilePath = wxPromise(wx.canvasToTempFilePath);
+
+var base64 = createCommonjsModule(function (module, exports) {
+/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */
+(function(root) {
+
+	// Detect free variables `exports`.
+	var freeExports = 'object' == 'object' && exports;
+
+	// Detect free variable `module`.
+	var freeModule = 'object' == 'object' && module &&
+		module.exports == freeExports && module;
+
+	// Detect free variable `global`, from Node.js or Browserified code, and use
+	// it as `root`.
+	var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal;
+	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+		root = freeGlobal;
+	}
+
+	/*--------------------------------------------------------------------------*/
+
+	var InvalidCharacterError = function(message) {
+		this.message = message;
+	};
+	InvalidCharacterError.prototype = new Error;
+	InvalidCharacterError.prototype.name = 'InvalidCharacterError';
+
+	var error = function(message) {
+		// Note: the error messages used throughout this file match those used by
+		// the native `atob`/`btoa` implementation in Chromium.
+		throw new InvalidCharacterError(message);
+	};
+
+	var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+	// http://whatwg.org/html/common-microsyntaxes.html#space-character
+	var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g;
+
+	// `decode` is designed to be fully compatible with `atob` as described in the
+	// HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob
+	// The optimized base64-decoding algorithm used is based on @atk’s excellent
+	// implementation. https://gist.github.com/atk/1020396
+	var decode = function(input) {
+		input = String(input)
+			.replace(REGEX_SPACE_CHARACTERS, '');
+		var length = input.length;
+		if (length % 4 == 0) {
+			input = input.replace(/==?$/, '');
+			length = input.length;
+		}
+		if (
+			length % 4 == 1 ||
+			// http://whatwg.org/C#alphanumeric-ascii-characters
+			/[^+a-zA-Z0-9/]/.test(input)
+		) {
+			error(
+				'Invalid character: the string to be decoded is not correctly encoded.'
+			);
+		}
+		var bitCounter = 0;
+		var bitStorage;
+		var buffer;
+		var output = '';
+		var position = -1;
+		while (++position < length) {
+			buffer = TABLE.indexOf(input.charAt(position));
+			bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer;
+			// Unless this is the first of a group of 4 characters…
+			if (bitCounter++ % 4) {
+				// …convert the first 8 bits to a single ASCII character.
+				output += String.fromCharCode(
+					0xFF & bitStorage >> (-2 * bitCounter & 6)
+				);
+			}
+		}
+		return output;
+	};
+
+	// `encode` is designed to be fully compatible with `btoa` as described in the
+	// HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa
+	var encode = function(input) {
+		input = String(input);
+		if (/[^\0-\xFF]/.test(input)) {
+			// Note: no need to special-case astral symbols here, as surrogates are
+			// matched, and the input is supposed to only contain ASCII anyway.
+			error(
+				'The string to be encoded contains characters outside of the ' +
+				'Latin1 range.'
+			);
+		}
+		var padding = input.length % 3;
+		var output = '';
+		var position = -1;
+		var a;
+		var b;
+		var c;
+		var buffer;
+		// Make sure any padding is handled outside of the loop.
+		var length = input.length - padding;
+
+		while (++position < length) {
+			// Read three bytes, i.e. 24 bits.
+			a = input.charCodeAt(position) << 16;
+			b = input.charCodeAt(++position) << 8;
+			c = input.charCodeAt(++position);
+			buffer = a + b + c;
+			// Turn the 24 bits into four chunks of 6 bits each, and append the
+			// matching character for each of them to the output.
+			output += (
+				TABLE.charAt(buffer >> 18 & 0x3F) +
+				TABLE.charAt(buffer >> 12 & 0x3F) +
+				TABLE.charAt(buffer >> 6 & 0x3F) +
+				TABLE.charAt(buffer & 0x3F)
+			);
+		}
+
+		if (padding == 2) {
+			a = input.charCodeAt(position) << 8;
+			b = input.charCodeAt(++position);
+			buffer = a + b;
+			output += (
+				TABLE.charAt(buffer >> 10) +
+				TABLE.charAt((buffer >> 4) & 0x3F) +
+				TABLE.charAt((buffer << 2) & 0x3F) +
+				'='
+			);
+		} else if (padding == 1) {
+			buffer = input.charCodeAt(position);
+			output += (
+				TABLE.charAt(buffer >> 2) +
+				TABLE.charAt((buffer << 4) & 0x3F) +
+				'=='
+			);
+		}
+
+		return output;
+	};
+
+	var base64 = {
+		'encode': encode,
+		'decode': decode,
+		'version': '0.1.0'
+	};
+
+	// Some AMD build optimizers, like r.js, check for specific condition patterns
+	// like the following:
+	if (
+		typeof undefined == 'function' &&
+		typeof undefined.amd == 'object' &&
+		undefined.amd
+	) {
+		undefined(function() {
+			return base64;
+		});
+	}	else if (freeExports && !freeExports.nodeType) {
+		if (freeModule) { // in Node.js or RingoJS v0.8.0+
+			freeModule.exports = base64;
+		} else { // in Narwhal or RingoJS v0.7.0-
+			for (var key in base64) {
+				base64.hasOwnProperty(key) && (freeExports[key] = base64[key]);
+			}
+		}
+	} else { // in Rhino or a web browser
+		root.base64 = base64;
+	}
+
+}(commonjsGlobal));
+});
+
+function makeURI (strData, type) {
+  return 'data:' + type + ';base64,' + strData
+}
+
+function fixType (type) {
+  type = type.toLowerCase().replace(/jpg/i, 'jpeg');
+  var r = type.match(/png|jpeg|bmp|gif/)[0];
+  return 'image/' + r
+}
+
+function encodeData (data) {
+  var str = '';
+  if (typeof data === 'string') {
+    str = data;
+  } else {
+    for (var i = 0; i < data.length; i++) {
+      str += String.fromCharCode(data[i]);
+    }
+  }
+  return base64.encode(str)
+}
+
+/**
+ * 获取图像区域隐含的像素数据
+ * @param canvasId canvas标识
+ * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+ * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+ * @param width 将要被提取的图像数据矩形区域的宽度
+ * @param height 将要被提取的图像数据矩形区域的高度
+ * @param done 完成回调
+ */
+function getImageData (canvasId, x, y, width, height, done) {
+  wx.canvasGetImageData({
+    canvasId: canvasId,
+    x: x,
+    y: y,
+    width: width,
+    height: height,
+    success: function success (res) {
+      done(res, null);
+    },
+    fail: function fail (res) {
+      done(null, res);
+    }
+  });
+}
+
+/**
+ * 生成bmp格式图片
+ * 按照规则生成图片响应头和响应体
+ * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData
+ * @returns {*} base64字符串
+ */
+function genBitmapImage (oData) {
+  //
+  // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx
+  // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx
+  //
+  var biWidth = oData.width;
+  var biHeight	= oData.height;
+  var biSizeImage = biWidth * biHeight * 3;
+  var bfSize = biSizeImage + 54; // total header size = 54 bytes
+
+  //
+  //  typedef struct tagBITMAPFILEHEADER {
+  //  	WORD bfType;
+  //  	DWORD bfSize;
+  //  	WORD bfReserved1;
+  //  	WORD bfReserved2;
+  //  	DWORD bfOffBits;
+  //  } BITMAPFILEHEADER;
+  //
+  var BITMAPFILEHEADER = [
+    // WORD bfType -- The file type signature; must be "BM"
+    0x42, 0x4D,
+    // DWORD bfSize -- The size, in bytes, of the bitmap file
+    bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff,
+    // WORD bfReserved1 -- Reserved; must be zero
+    0, 0,
+    // WORD bfReserved2 -- Reserved; must be zero
+    0, 0,
+    // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.
+    54, 0, 0, 0
+  ];
+
+  //
+  //  typedef struct tagBITMAPINFOHEADER {
+  //  	DWORD biSize;
+  //  	LONG  biWidth;
+  //  	LONG  biHeight;
+  //  	WORD  biPlanes;
+  //  	WORD  biBitCount;
+  //  	DWORD biCompression;
+  //  	DWORD biSizeImage;
+  //  	LONG  biXPelsPerMeter;
+  //  	LONG  biYPelsPerMeter;
+  //  	DWORD biClrUsed;
+  //  	DWORD biClrImportant;
+  //  } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+  //
+  var BITMAPINFOHEADER = [
+    // DWORD biSize -- The number of bytes required by the structure
+    40, 0, 0, 0,
+    // LONG biWidth -- The width of the bitmap, in pixels
+    biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff,
+    // LONG biHeight -- The height of the bitmap, in pixels
+    biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff,
+    // WORD biPlanes -- The number of planes for the target device. This value must be set to 1
+    1, 0,
+    // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap
+    // has a maximum of 2^24 colors (16777216, Truecolor)
+    24, 0,
+    // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed
+    0, 0, 0, 0,
+    // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps
+    biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff,
+    // LONG biXPelsPerMeter, unused
+    0, 0, 0, 0,
+    // LONG biYPelsPerMeter, unused
+    0, 0, 0, 0,
+    // DWORD biClrUsed, the number of color indexes of palette, unused
+    0, 0, 0, 0,
+    // DWORD biClrImportant, unused
+    0, 0, 0, 0
+  ];
+
+  var iPadding = (4 - ((biWidth * 3) % 4)) % 4;
+
+  var aImgData = oData.data;
+
+  var strPixelData = '';
+  var biWidth4 = biWidth << 2;
+  var y = biHeight;
+  var fromCharCode = String.fromCharCode;
+
+  do {
+    var iOffsetY = biWidth4 * (y - 1);
+    var strPixelRow = '';
+    for (var x = 0; x < biWidth; x++) {
+      var iOffsetX = x << 2;
+      strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) +
+        fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) +
+        fromCharCode(aImgData[iOffsetY + iOffsetX]);
+    }
+
+    for (var c = 0; c < iPadding; c++) {
+      strPixelRow += String.fromCharCode(0);
+    }
+
+    strPixelData += strPixelRow;
+  } while (--y)
+
+  var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData);
+
+  return strEncoded
+}
+
+/**
+ * 转换为图片base64
+ * @param canvasId canvas标识
+ * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标
+ * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标
+ * @param width 将要被提取的图像数据矩形区域的宽度
+ * @param height 将要被提取的图像数据矩形区域的高度
+ * @param type 转换图片类型
+ * @param done 完成回调
+ */
+function convertToImage (canvasId, x, y, width, height, type, done) {
+  if ( done === void 0 ) done = function () {};
+
+  if (type === undefined) { type = 'png'; }
+  type = fixType(type);
+  if (/bmp/.test(type)) {
+    getImageData(canvasId, x, y, width, height, function (data, err) {
+      var strData = genBitmapImage(data);
+      tools_7(done) && done(makeURI(strData, 'image/' + type), err);
+    });
+  } else {
+    console.error('暂不支持生成\'' + type + '\'类型的base64图片');
+  }
+}
+
+var CanvasToBase64 = {
+  convertToImage: convertToImage,
+  // convertToPNG: function (width, height, done) {
+  //   return convertToImage(width, height, 'png', done)
+  // },
+  // convertToJPEG: function (width, height, done) {
+  //   return convertToImage(width, height, 'jpeg', done)
+  // },
+  // convertToGIF: function (width, height, done) {
+  //   return convertToImage(width, height, 'gif', done)
+  // },
+  convertToBMP: function (ref, done) {
+    if ( ref === void 0 ) ref = {};
+    var canvasId = ref.canvasId;
+    var x = ref.x;
+    var y = ref.y;
+    var width = ref.width;
+    var height = ref.height;
+    if ( done === void 0 ) done = function () {};
+
+    return convertToImage(canvasId, x, y, width, height, 'bmp', done)
+  }
+};
+
+function methods () {
+  var self = this;
+
+  var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+  var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度
+
+  var id = self.id;
+  var targetId = self.targetId;
+  var pixelRatio = self.pixelRatio;
+
+  var ref = self.cut;
+  var x = ref.x; if ( x === void 0 ) x = 0;
+  var y = ref.y; if ( y === void 0 ) y = 0;
+  var width = ref.width; if ( width === void 0 ) width = boundWidth;
+  var height = ref.height; if ( height === void 0 ) height = boundHeight;
+
+  self.updateCanvas = function (done) {
+    if (self.croperTarget) {
+      //  画布绘制图片
+      self.ctx.drawImage(
+        self.croperTarget,
+        self.imgLeft,
+        self.imgTop,
+        self.scaleWidth,
+        self.scaleHeight
+      );
+    }
+    tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self);
+
+    self.setBoundStyle(self.boundStyle); //	设置边界样式
+
+    self.ctx.draw(false, done);
+    return self
+  };
+
+  self.pushOrigin = self.pushOrign = function (src) {
+    self.src = src;
+
+    tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self);
+
+    return getImageInfo({ src: src })
+      .then(function (res) {
+        var innerAspectRadio = res.width / res.height;
+        var customAspectRadio = width / height;
+
+        self.croperTarget = res.path;
+
+        if (innerAspectRadio < customAspectRadio) {
+          self.rectX = x;
+          self.baseWidth = width;
+          self.baseHeight = width / innerAspectRadio;
+          self.rectY = y - Math.abs((height - self.baseHeight) / 2);
+        } else {
+          self.rectY = y;
+          self.baseWidth = height * innerAspectRadio;
+          self.baseHeight = height;
+          self.rectX = x - Math.abs((width - self.baseWidth) / 2);
+        }
+
+        self.imgLeft = self.rectX;
+        self.imgTop = self.rectY;
+        self.scaleWidth = self.baseWidth;
+        self.scaleHeight = self.baseHeight;
+
+        self.update();
+
+        return new Promise(function (resolve) {
+          self.updateCanvas(resolve);
+        })
+      })
+      .then(function () {
+        tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self);
+      })
+  };
+
+  self.removeImage = function () {
+    self.src = '';
+    self.croperTarget = '';
+    return draw(self.ctx)
+  };
+
+  self.getCropperBase64 = function (done) {
+    if ( done === void 0 ) done = function () {};
+
+    CanvasToBase64.convertToBMP({
+      canvasId: id,
+      x: x,
+      y: y,
+      width: width,
+      height: height
+    }, done);
+  };
+
+  self.getCropperImage = function (opt, fn) {
+    var customOptions = opt;
+
+    var canvasOptions = {
+      canvasId: id,
+      x: x,
+      y: y,
+      width: width,
+      height: height
+    };
+
+    var task = function () { return Promise.resolve(); };
+
+    if (
+      tools_10(customOptions) &&
+      customOptions.original
+    ) {
+      // original mode
+      task = function () {
+        self.targetCtx.drawImage(
+          self.croperTarget,
+          self.imgLeft * pixelRatio,
+          self.imgTop * pixelRatio,
+          self.scaleWidth * pixelRatio,
+          self.scaleHeight * pixelRatio
+        );
+
+        canvasOptions = {
+          canvasId: targetId,
+          x: x * pixelRatio,
+          y: y * pixelRatio,
+          width: width * pixelRatio,
+          height: height * pixelRatio
+        };
+
+        return draw(self.targetCtx)
+      };
+    }
+
+    return task()
+      .then(function () {
+        if (tools_10(customOptions)) {
+          canvasOptions = Object.assign({}, canvasOptions, customOptions);
+        }
+
+        if (tools_7(customOptions)) {
+          fn = customOptions;
+        }
+
+        var arg = canvasOptions.componentContext
+          ? [canvasOptions, canvasOptions.componentContext]
+          : [canvasOptions];
+
+        return canvasToTempFilePath.apply(null, arg)
+      })
+      .then(function (res) {
+        var tempFilePath = res.tempFilePath;
+
+        return tools_7(fn)
+          ? fn.call(self, tempFilePath, null)
+          : tempFilePath
+      })
+      .catch(function (err) {
+        if (tools_7(fn)) {
+          fn.call(self, null, err);
+        } else {
+          throw err
+        }
+      })
+  };
+}
+
+/**
+ * 获取最新缩放值
+ * @param oldScale 上一次触摸结束后的缩放值
+ * @param oldDistance 上一次触摸结束后的双指距离
+ * @param zoom 缩放系数
+ * @param touch0 第一指touch对象
+ * @param touch1 第二指touch对象
+ * @returns {*}
+ */
+var getNewScale = function (oldScale, oldDistance, zoom, touch0, touch1) {
+  var xMove, yMove, newDistance;
+  // 计算二指最新距离
+  xMove = Math.round(touch1.x - touch0.x);
+  yMove = Math.round(touch1.y - touch0.y);
+  newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+  return oldScale + 0.001 * zoom * (newDistance - oldDistance)
+};
+
+function update () {
+  var self = this;
+
+  if (!self.src) { return }
+
+  self.__oneTouchStart = function (touch) {
+    self.touchX0 = Math.round(touch.x);
+    self.touchY0 = Math.round(touch.y);
+  };
+
+  self.__oneTouchMove = function (touch) {
+    var xMove, yMove;
+    // 计算单指移动的距离
+    if (self.touchended) {
+      return self.updateCanvas()
+    }
+    xMove = Math.round(touch.x - self.touchX0);
+    yMove = Math.round(touch.y - self.touchY0);
+
+    var imgLeft = Math.round(self.rectX + xMove);
+    var imgTop = Math.round(self.rectY + yMove);
+
+    self.outsideBound(imgLeft, imgTop);
+
+    self.updateCanvas();
+  };
+
+  self.__twoTouchStart = function (touch0, touch1) {
+    var xMove, yMove, oldDistance;
+
+    self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2);
+    self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2);
+
+    // 计算两指距离
+    xMove = Math.round(touch1.x - touch0.x);
+    yMove = Math.round(touch1.y - touch0.y);
+    oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove));
+
+    self.oldDistance = oldDistance;
+  };
+
+  self.__twoTouchMove = function (touch0, touch1) {
+    var oldScale = self.oldScale;
+    var oldDistance = self.oldDistance;
+    var scale = self.scale;
+    var zoom = self.zoom;
+
+    self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1);
+
+    //  设定缩放范围
+    self.newScale <= 1 && (self.newScale = 1);
+    self.newScale >= scale && (self.newScale = scale);
+
+    self.scaleWidth = Math.round(self.newScale * self.baseWidth);
+    self.scaleHeight = Math.round(self.newScale * self.baseHeight);
+    var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2);
+    var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2);
+
+    self.outsideBound(imgLeft, imgTop);
+
+    self.updateCanvas();
+  };
+
+  self.__xtouchEnd = function () {
+    self.oldScale = self.newScale;
+    self.rectX = self.imgLeft;
+    self.rectY = self.imgTop;
+  };
+}
+
+var handle = {
+  //  图片手势初始监测
+  touchStart: function touchStart (e) {
+    var self = this;
+    var ref = e.touches;
+    var touch0 = ref[0];
+    var touch1 = ref[1];
+
+    if (!self.src) { return }
+
+    setTouchState(self, true, null, null);
+
+    // 计算第一个触摸点的位置,并参照改点进行缩放
+    self.__oneTouchStart(touch0);
+
+    // 两指手势触发
+    if (e.touches.length >= 2) {
+      self.__twoTouchStart(touch0, touch1);
+    }
+  },
+
+  //  图片手势动态缩放
+  touchMove: function touchMove (e) {
+    var self = this;
+    var ref = e.touches;
+    var touch0 = ref[0];
+    var touch1 = ref[1];
+
+    if (!self.src) { return }
+
+    setTouchState(self, null, true);
+
+    // 单指手势时触发
+    if (e.touches.length === 1) {
+      self.__oneTouchMove(touch0);
+    }
+    // 两指手势触发
+    if (e.touches.length >= 2) {
+      self.__twoTouchMove(touch0, touch1);
+    }
+  },
+
+  touchEnd: function touchEnd (e) {
+    var self = this;
+
+    if (!self.src) { return }
+
+    setTouchState(self, false, false, true);
+    self.__xtouchEnd();
+  }
+};
+
+function cut () {
+  var self = this;
+  var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度
+  var boundHeight = self.height;
+  // 裁剪框默认高度,即整个画布高度
+  var ref = self.cut;
+  var x = ref.x; if ( x === void 0 ) x = 0;
+  var y = ref.y; if ( y === void 0 ) y = 0;
+  var width = ref.width; if ( width === void 0 ) width = boundWidth;
+  var height = ref.height; if ( height === void 0 ) height = boundHeight;
+
+  /**
+	 * 设置边界
+	 * @param imgLeft 图片左上角横坐标值
+	 * @param imgTop 图片左上角纵坐标值
+	 */
+  self.outsideBound = function (imgLeft, imgTop) {
+    self.imgLeft = imgLeft >= x
+      ? x
+      : self.scaleWidth + imgLeft - x <= width
+        ? x + width - self.scaleWidth
+        :	imgLeft;
+
+    self.imgTop = imgTop >= y
+      ? y
+      : self.scaleHeight + imgTop - y <= height
+        ? y + height - self.scaleHeight
+        : imgTop;
+  };
+
+  /**
+	 * 设置边界样式
+	 * @param color	边界颜色
+	 */
+  self.setBoundStyle = function (ref) {
+    if ( ref === void 0 ) ref = {};
+    var color = ref.color; if ( color === void 0 ) color = '#04b00f';
+    var mask = ref.mask; if ( mask === void 0 ) mask = 'rgba(0, 0, 0, 0.3)';
+    var lineWidth = ref.lineWidth; if ( lineWidth === void 0 ) lineWidth = 1;
+
+    var half = lineWidth / 2;
+    var boundOption = [
+      {
+        start: { x: x - half, y: y + 10 - half },
+        step1: { x: x - half, y: y - half },
+        step2: { x: x + 10 - half, y: y - half }
+      },
+      {
+        start: { x: x - half, y: y + height - 10 + half },
+        step1: { x: x - half, y: y + height + half },
+        step2: { x: x + 10 - half, y: y + height + half }
+      },
+      {
+        start: { x: x + width - 10 + half, y: y - half },
+        step1: { x: x + width + half, y: y - half },
+        step2: { x: x + width + half, y: y + 10 - half }
+      },
+      {
+        start: { x: x + width + half, y: y + height - 10 + half },
+        step1: { x: x + width + half, y: y + height + half },
+        step2: { x: x + width - 10 + half, y: y + height + half }
+      }
+    ];
+
+    // 绘制半透明层
+    self.ctx.beginPath();
+    self.ctx.setFillStyle(mask);
+    self.ctx.fillRect(0, 0, x, boundHeight);
+    self.ctx.fillRect(x, 0, width, y);
+    self.ctx.fillRect(x, y + height, width, boundHeight - y - height);
+    self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight);
+    self.ctx.fill();
+
+    boundOption.forEach(function (op) {
+      self.ctx.beginPath();
+      self.ctx.setStrokeStyle(color);
+      self.ctx.setLineWidth(lineWidth);
+      self.ctx.moveTo(op.start.x, op.start.y);
+      self.ctx.lineTo(op.step1.x, op.step1.y);
+      self.ctx.lineTo(op.step2.x, op.step2.y);
+      self.ctx.stroke();
+    });
+  };
+}
+
+var version = "1.3.9";
+
+var WeCropper = function WeCropper (params) {
+  var self = this;
+  var _default = {};
+
+  validator(self, DEFAULT);
+
+  Object.keys(DEFAULT).forEach(function (key) {
+    _default[key] = DEFAULT[key].default;
+  });
+  Object.assign(self, _default, params);
+
+  self.prepare();
+  self.attachPage();
+  self.createCtx();
+  self.observer();
+  self.cutt();
+  self.methods();
+  self.init();
+  self.update();
+
+  return self
+};
+
+WeCropper.prototype.init = function init () {
+  var self = this;
+  var src = self.src;
+
+  self.version = version;
+
+  typeof self.onReady === 'function' && self.onReady(self.ctx, self);
+
+  if (src) {
+    self.pushOrign(src);
+  } else {
+    self.updateCanvas();
+  }
+  setTouchState(self, false, false, false);
+
+  self.oldScale = 1;
+  self.newScale = 1;
+
+  return self
+};
+
+Object.assign(WeCropper.prototype, handle);
+
+WeCropper.prototype.prepare = prepare;
+WeCropper.prototype.observer = observer;
+WeCropper.prototype.methods = methods;
+WeCropper.prototype.cutt = cut;
+WeCropper.prototype.update = update;
+
+return WeCropper;
+
+})));

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 5 - 0
src/native/we-cropper/we-cropper.min.js


+ 17 - 0
src/native/we-cropper/we-cropper.wxml

@@ -0,0 +1,17 @@
+<template name="we-cropper">
+  <canvas
+    class="cropper"
+    disable-scroll="true"
+    bindtouchstart="touchStart"
+    bindtouchmove="touchMove"
+    bindtouchend="touchEnd"
+    style="width:{{width}}px;height:{{height}}px;background-color: rgba(0, 0, 0, 0.8)"
+    canvas-id="{{id}}">
+  </canvas>
+  <canvas
+    class="cropper"
+    disable-scroll="true"
+    style="position: fixed; top: -{{width * pixelRatio}}px; left: -{{height * pixelRatio}}px; width:{{width * pixelRatio}}px;height:{{height * pixelRatio}}px;"
+    canvas-id="{{targetId}}">
+  </canvas>
+</template>

+ 6 - 5
src/pages/Classify.vue

@@ -14,7 +14,7 @@
 }
 }
 </config>
 </config>
 <template>
 <template>
-    <div class="container">
+    <div class="container" :style="{ paddingTop: barHeight + 'px' }">
         <van-sticky :offset-top="0">
         <van-sticky :offset-top="0">
             <div class="navBar" :style="narStyle">
             <div class="navBar" :style="narStyle">
                 <div class="title">产品分类</div>
                 <div class="title">产品分类</div>
@@ -23,7 +23,7 @@
         </van-sticky>
         </van-sticky>
         <div class="content">
         <div class="content">
             <div class="left" id="left">
             <div class="left" id="left">
-                <van-sticky offset-top="71" :container="left">
+                <van-sticky :offset-top="barHeight" :container="left">
                     <div class="left-side">
                     <div class="left-side">
                         <van-sidebar
                         <van-sidebar
                             :activeKey="activeKey"
                             :activeKey="activeKey"
@@ -35,7 +35,7 @@
                     </div>
                     </div>
                 </van-sticky>
                 </van-sticky>
             </div>
             </div>
-            <scroll-view style="height:calc(100vh - 71px)" :scroll-y="true" class="right">
+            <scroll-view :style="{ height: `calc(100vh - ${barHeight}px)` }" :scroll-y="true" class="right">
                 <div class="top" @click="navigateTo('/pagesHome/ProductList?categoryIds=' + firstLevelId)">
                 <div class="top" @click="navigateTo('/pagesHome/ProductList?categoryIds=' + firstLevelId)">
                     <van-image
                     <van-image
                         src="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/quanqiu_img_jixie.jpg"
                         src="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/quanqiu_img_jixie.jpg"
@@ -64,6 +64,7 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+import { mapState } from 'vuex';
 export default {
 export default {
     data() {
     data() {
         return {
         return {
@@ -75,6 +76,7 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         narStyle() {
         narStyle() {
             if (this.menuButtonInfo.top) {
             if (this.menuButtonInfo.top) {
                 return {
                 return {
@@ -98,7 +100,6 @@ export default {
     },
     },
     onShow() {
     onShow() {
         this.menuButtonInfo = wx.getMenuButtonBoundingClientRect();
         this.menuButtonInfo = wx.getMenuButtonBoundingClientRect();
-        console.log(wx.getMenuButtonBoundingClientRect());
     },
     },
     onLoad() {
     onLoad() {
         this.$http
         this.$http
@@ -141,7 +142,7 @@ export default {
     min-height: 100vh;
     min-height: 100vh;
     display: flex;
     display: flex;
     flex-direction: column;
     flex-direction: column;
-    padding-top: 71px;
+
     .content {
     .content {
         flex-grow: 1;
         flex-grow: 1;
 
 

+ 1 - 1
src/pages/Home.vue

@@ -148,7 +148,7 @@
         <div class="van-content" v-if="vendorInfos.length > 0">
         <div class="van-content" v-if="vendorInfos.length > 0">
             <div class="title">
             <div class="title">
                 <h1>合作伙伴</h1>
                 <h1>合作伙伴</h1>
-                <van-button size="small" :color="$colors.info" plain>
+                <van-button size="small" :color="$colors.info" plain @click="navigateTo('/pagesHome/Brand', false)">
                     查看更多
                     查看更多
                     <van-icon name="arrow" :color="$colors.info" />
                     <van-icon name="arrow" :color="$colors.info" />
                 </van-button>
                 </van-button>

+ 16 - 10
src/pages/My.vue

@@ -10,8 +10,13 @@
 <template>
 <template>
     <div class="my">
     <div class="my">
         <div class="top">
         <div class="top">
-            <van-image src="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/info_top_bg.jpg" fit="widthFix" />
-            <van-button class="btn1" color="#0F264D" plain @click="choose">
+            <van-image
+                width="100%"
+                :height="70 + barHeight + 'px'"
+                src="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/info_top_bg.jpg"
+                fit="cover"
+            />
+            <van-button class="btn1" color="#0F264D" plain @click="choose" :style="{ top: barTop + 'px' }">
                 {{ getName(language) }}
                 {{ getName(language) }}
                 <van-icon name="arrow-down" size="10px" color="#0F264D" />
                 <van-icon name="arrow-down" size="10px" color="#0F264D" />
             </van-button>
             </van-button>
@@ -82,12 +87,13 @@
                 is-link
                 is-link
             />
             />
 
 
-            <!-- <van-cell
+            <van-cell
                 custom-class="my-cell"
                 custom-class="my-cell"
                 title="产品需求/成交单"
                 title="产品需求/成交单"
+                @click="navigateTo('/pagesMine/Order')"
                 icon="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/info_icon_collect(3).png"
                 icon="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/info_icon_collect(3).png"
                 is-link
                 is-link
-            /> -->
+            />
 
 
             <!-- <van-cell
             <!-- <van-cell
                 custom-class="my-cell"
                 custom-class="my-cell"
@@ -119,7 +125,7 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
-        ...mapState(['userInfo']),
+        ...mapState(['userInfo', 'barTop', 'barHeight']),
         icon() {
         icon() {
             return this.userInfo && this.userInfo.avatar
             return this.userInfo && this.userInfo.avatar
                 ? this.userInfo.avatar
                 ? this.userInfo.avatar
@@ -194,7 +200,7 @@ export default {
 <style lang="less">
 <style lang="less">
 .top {
 .top {
     position: relative;
     position: relative;
-    padding-bottom: 15px;
+    // padding-bottom: 15px;
     .btn1 {
     .btn1 {
         position: absolute;
         position: absolute;
         top: 20px;
         top: 20px;
@@ -204,10 +210,10 @@ export default {
         }
         }
     }
     }
     .btn-content {
     .btn-content {
-        height: 38px;
-        .van-button--normal {
-            height: 38px;
-        }
+        --button-small-height: 38px;
+        // .van-button--normal {
+
+        // }
     }
     }
 }
 }
 .my-cell.van-cell {
 .my-cell.van-cell {

+ 1 - 1
src/pagesMine/ChatDetail.vue → src/pagesChat/ChatDetail.vue

@@ -89,7 +89,7 @@ export default {
             });
             });
         } else if (options.type === 'admin') {
         } else if (options.type === 'admin') {
             wx.setNavigationBarTitle({
             wx.setNavigationBarTitle({
-                title: '咨询管家'
+                title: '服务管家'
             });
             });
         }
         }
 
 

+ 89 - 0
src/pagesChat/ChatForm.vue

@@ -0,0 +1,89 @@
+<config>
+{
+'navigationBarTitleText': '咨询单详情',
+}
+</config>
+<template>
+    <div>
+        <van-cell-group :border="false">
+            <van-cell :border="false" title="姓名" :value="info.nickname" />
+            <van-cell :border="false" title="称呼" :value="sex" />
+            <van-cell :border="false" title="电话" :value="info.phone" />
+            <van-cell :border="false" title="邮箱" :value="info.email" />
+            <van-cell :border="false" title="公司名称" :value="info.chCompanyName" />
+            <van-cell :border="false" title="职位" :value="info.position" />
+            <van-cell
+                :border="false"
+                title="功能需求"
+                v-if="info.functionalRequirements"
+                :value="info.functionalRequirements"
+            />
+            <van-cell :border="false" title="计划加工" v-if="info.artifact" :value="info.artifact" />
+            <van-cell :border="false" title="需求描述" v-if="info.otherProblems" :value="info.otherProblems" />
+            <van-cell :border="false" title="意向产品">
+                <div class="product-list">
+                    <product-row
+                        v-for="(item, index) in info.products"
+                        :key="index"
+                        :info="item"
+                        :hasDel="false"
+                        :hasCheck="false"
+                        imgKey="mainPicture"
+                    ></product-row>
+                </div>
+            </van-cell>
+        </van-cell-group>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import { sexModels } from '../utils/appState';
+import ProductRow from '../components/product/RowMini';
+export default {
+    data() {
+        return {};
+    },
+    computed: {
+        ...mapState(['chatForm']),
+        info() {
+            if (this.chatForm) {
+                return JSON.parse(this.chatForm);
+            } else {
+                return {};
+            }
+        },
+        sex() {
+            return this.info.sex ? sexModels.get(this.info.sex).label : '';
+        }
+    },
+    components: {
+        ProductRow
+    }
+};
+</script>
+<style lang="less">
+.van-cell {
+    --cell-text-color: #a4a9b3;
+    --cell-vertical-padding: 12px;
+    --cell-horizontal-padding: 16px;
+    .van-cell__title {
+        flex-grow: 0;
+        width: 60px;
+        flex-shrink: 0;
+        min-width: 60px;
+    }
+    .van-cell__value {
+        text-align: left;
+        margin-left: 12px;
+        font-size: 16px;
+        color: #000000;
+        line-height: 26px;
+    }
+
+    .product-list {
+        .product + .product {
+            margin-top: 12px;
+        }
+    }
+}
+</style>

+ 4 - 2
src/pagesHome/Brand.vue

@@ -35,7 +35,7 @@
             <h1>全部展商</h1>
             <h1>全部展商</h1>
         </div>
         </div>
         <div class="main" id="main">
         <div class="main" id="main">
-            <van-sticky :container="main" :offset-top="71">
+            <van-sticky :container="main" :offset-top="barHeight">
                 <filter-sort-bar
                 <filter-sort-bar
                     :sort="sort"
                     :sort="sort"
                     :showType="showType"
                     :showType="showType"
@@ -63,7 +63,7 @@
                     </span>
                     </span>
                 </filter-sort-bar>
                 </filter-sort-bar>
             </van-sticky>
             </van-sticky>
-            <sort-list :empty="empty" :loading="loading" :finish="finish" top="71px">
+            <sort-list :empty="empty" :loading="loading" :finish="finish" top="172rpx">
                 <div>
                 <div>
                     <div class="grid-list" v-if="showType === 'grid'">
                     <div class="grid-list" v-if="showType === 'grid'">
                         <div class="col-2" v-for="item in list" :key="item.id">
                         <div class="col-2" v-for="item in list" :key="item.id">
@@ -93,6 +93,7 @@ import { EnterpriseType } from '../utils/appState';
 import EnterpriseTypeFilter from '../components/filter/EnterpriseType';
 import EnterpriseTypeFilter from '../components/filter/EnterpriseType';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import CountryFilter from '../components/filter/Country';
 import CountryFilter from '../components/filter/Country';
+import { mapState } from 'vuex';
 export default {
 export default {
     data() {
     data() {
         return {
         return {
@@ -110,6 +111,7 @@ export default {
         };
         };
     },
     },
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         listQuery() {
         listQuery() {
             return {
             return {
                 vendorSort: this.sort,
                 vendorSort: this.sort,

+ 130 - 11
src/pagesHome/Edit.vue

@@ -5,8 +5,12 @@
 </config>
 </config>
 <template>
 <template>
     <div>
     <div>
-        <van-cell-group>
-            <van-cell title="头像" is-link value-class="cellValue">
+        <div class="takePhoto" @click="choosePhoto">
+            <van-icon name="photograph" :color="$colors.warn" :size="34" />
+            <div class="text">拍摄名片照片</div>
+        </div>
+        <van-cell-group class="edit">
+            <van-cell title="头像" is-link value-class="cellValue" @click="chooseImg">
                 <van-image :src="myInfo.logo" :width="36" :height="36" fit="cover" :radius="4" />
                 <van-image :src="myInfo.logo" :width="36" :height="36" fit="cover" :radius="4" />
             </van-cell>
             </van-cell>
             <van-cell title="昵称" is-link :value="myInfo.nickname" @click="change('nickname')" />
             <van-cell title="昵称" is-link :value="myInfo.nickname" @click="change('nickname')" />
@@ -31,10 +35,32 @@
                 :value-class="myInfo.userPosition ? '' : 'noValue'"
                 :value-class="myInfo.userPosition ? '' : 'noValue'"
                 @click="change('userPosition')"
                 @click="change('userPosition')"
             />
             />
-            <!-- <van-cell title="地址" is-link :value="myInfo.nickname" />
-            <van-cell title="所属行业" is-link :value="myInfo.nickname" />
-            <van-cell title="感兴趣的产品" is-link :value="myInfo.nickname" />
-            <van-cell title="交流语言" is-link :value="myInfo.position" /> -->
+            <van-cell title="地址" is-link @click="$refs.country.show()">
+                <country-select
+                    size="small"
+                    ref="country"
+                    :country.sync="myInfo.country"
+                    :city.sync="myInfo.city"
+                    :province.sync="myInfo.province"
+                ></country-select>
+            </van-cell>
+            <van-cell title="所属行业" is-link @click="$refs.industry.show()">
+                <industry-select ref="industry" v-model="myInfo.industryId"></industry-select>
+            </van-cell>
+
+            <van-cell title="感兴趣的产品" is-link @click="$refs.interestedProCateId.show()">
+                <product-category-select
+                    ref="interestedProCateId"
+                    v-model="myInfo.interestedProCateId"
+                ></product-category-select>
+            </van-cell>
+            <van-cell
+                title="交流语言"
+                is-link
+                :value="languageOfCommunication || '未选择'"
+                :value-class="languageOfCommunication ? '' : 'noValue'"
+                @click="chooseLanguage"
+            />
             <van-cell
             <van-cell
                 title="邮箱"
                 title="邮箱"
                 :border="false"
                 :border="false"
@@ -48,7 +74,6 @@
         <fixed-button>
         <fixed-button>
             <van-button :color="$colors.warn" block @click="save">保存</van-button>
             <van-button :color="$colors.warn" block @click="save">保存</van-button>
         </fixed-button>
         </fixed-button>
-
         <change-text :show.sync="show" v-model="changeValue" @input="changeSubmit"></change-text>
         <change-text :show.sync="show" v-model="changeValue" @input="changeSubmit"></change-text>
     </div>
     </div>
 </template>
 </template>
@@ -56,18 +81,26 @@
 import { mapState } from 'vuex';
 import { mapState } from 'vuex';
 import ChangeText from '../components/ChangeText.vue';
 import ChangeText from '../components/ChangeText.vue';
 import FixedButton from '../components/FixedButton.vue';
 import FixedButton from '../components/FixedButton.vue';
-import { sexModels } from '../utils/appState';
+import { sexModels, languageModels } from '../utils/appState';
+import CountrySelect from '../components/select/Country.vue';
+import IndustrySelect from '../components/select/Industry.vue';
+import ProductCategorySelect from '../components/select/ProductCategory.vue';
 export default {
 export default {
     components: {
     components: {
         ChangeText,
         ChangeText,
-        FixedButton
+        FixedButton,
+        CountrySelect,
+        IndustrySelect,
+        ProductCategorySelect
     },
     },
     data() {
     data() {
         return {
         return {
             myInfo: {},
             myInfo: {},
             show: false,
             show: false,
             changeValue: '',
             changeValue: '',
-            changeKey: ''
+            changeKey: '',
+            option: {},
+            countries: ''
         };
         };
     },
     },
     computed: {
     computed: {
@@ -78,12 +111,24 @@ export default {
             } else {
             } else {
                 return '';
                 return '';
             }
             }
+        },
+        languageOfCommunication() {
+            if (this.myInfo.languageOfCommunication && languageModels.has(this.myInfo.languageOfCommunication)) {
+                return languageModels.get(this.myInfo.languageOfCommunication);
+            } else {
+                return '';
+            }
         }
         }
     },
     },
     methods: {
     methods: {
+        getbase64Data(file) {
+            console.log(file);
+        },
         loginMethods() {
         loginMethods() {
             this.$store.dispatch('getUserInfo').then(res => {
             this.$store.dispatch('getUserInfo').then(res => {
                 res.logo = res.logo || this.userInfo.avatar;
                 res.logo = res.logo || this.userInfo.avatar;
+                res.languageOfCommunication = res.languageOfCommunication || '';
+                res.userSex = res.userSex || '';
                 this.myInfo = { ...res };
                 this.myInfo = { ...res };
             });
             });
         },
         },
@@ -101,6 +146,20 @@ export default {
                 }
                 }
             });
             });
         },
         },
+        chooseLanguage() {
+            const _list = [...languageModels.values()].map(item => {
+                return item;
+            });
+            wx.showActionSheet({
+                itemList: _list,
+                success: res => {
+                    this.myInfo.languageOfCommunication = [...languageModels.keys()][res.tapIndex];
+                },
+                fail: res => {
+                    console.log(res.errMsg);
+                }
+            });
+        },
         changeSubmit(e) {
         changeSubmit(e) {
             this.changeValue = e;
             this.changeValue = e;
             this.myInfo[this.changeKey] = e;
             this.myInfo[this.changeKey] = e;
@@ -125,12 +184,50 @@ export default {
                         this.navigateBack();
                         this.navigateBack();
                     });
                     });
                 });
                 });
+        },
+        chooseImg() {
+            wx.chooseImage({
+                count: 1, // 默认9
+                sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
+                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
+                success: res => {
+                    const src = res.tempFilePaths[0];
+                    this.navigateTo('/pagesMine/Upload?src=' + src);
+                }
+            });
+        },
+        choosePhoto() {
+            wx.chooseImage({
+                count: 1, // 默认9
+                sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
+                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
+                success: res => {
+                    const src = res.tempFilePaths[0];
+                    this.$http.uploadFile(src).then(res => {
+                        this.$http
+                            .post('/auth/businessCard', {
+                                url: res
+                            })
+                            .then(res => {
+                                const result = res.words_result || {};
+                                this.myInfo.nickname = result.NAME[0];
+                                this.myInfo.userEmail = result.EMAIL[0];
+                                this.myInfo.chCompanyName = result.COMPANY[0];
+                                this.myInfo.userPosition = result.TITLE[0];
+                            });
+                    });
+                }
+            });
+        },
+        setImg(src) {
+            console.log(src);
+            this.myInfo.logo = src;
         }
         }
     }
     }
 };
 };
 </script>
 </script>
 <style lang="less">
 <style lang="less">
-.van-cell-group {
+.edit {
     --cell-vertical-padding: 17px;
     --cell-vertical-padding: 17px;
     --cell-line-height: 24px;
     --cell-line-height: 24px;
     --cell-text-color: #000;
     --cell-text-color: #000;
@@ -152,4 +249,26 @@ export default {
 
 
     --cell-value-color: #000;
     --cell-value-color: #000;
 }
 }
+
+.takePhoto {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 38px 0 25px;
+    margin: 10px;
+
+    border-radius: 4px;
+    border: 1px dashed #ffa526;
+
+    .text {
+        font-size: 14px;
+        color: #ffa526;
+        line-height: 20px;
+        margin-top: 8px;
+    }
+
+    &:active {
+        background-color: darken(#fff, 5);
+    }
+}
 </style>
 </style>

+ 3 - 1
src/pagesHome/Product.vue

@@ -54,7 +54,7 @@
                 </filter-sort-bar>
                 </filter-sort-bar>
             </van-sticky>
             </van-sticky>
 
 
-            <sort-list :empty="empty" :loading="loading" :finish="finish" top="44px">
+            <sort-list :empty="empty" :loading="loading" :finish="finish" :top="`44px - 172rpx + ${barHeight}px`">
                 <div class="product-list" v-if="showType === 'grid'">
                 <div class="product-list" v-if="showType === 'grid'">
                     <div class="clo-2" v-for="item in list" :key="item.id">
                     <div class="clo-2" v-for="item in list" :key="item.id">
                         <product-grid :info="item"></product-grid>
                         <product-grid :info="item"></product-grid>
@@ -74,6 +74,7 @@ import ProductGrid from '../components/product/GridNormal';
 import ProductTagsFilter from '../components/filter/ProductTags';
 import ProductTagsFilter from '../components/filter/ProductTags';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import CountryFilter from '../components/filter/Country';
 import CountryFilter from '../components/filter/Country';
+import { mapState } from 'vuex';
 export default {
 export default {
     data() {
     data() {
         return {
         return {
@@ -90,6 +91,7 @@ export default {
     },
     },
     mixins: [searchList],
     mixins: [searchList],
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         firstLevels() {
         firstLevels() {
             const list = [...this.productCategories];
             const list = [...this.productCategories];
             return list.filter(item => {
             return list.filter(item => {

+ 5 - 3
src/pagesHome/ProductList.vue

@@ -9,11 +9,11 @@
 </config>
 </config>
 <template>
 <template>
     <div>
     <div>
-        <div style="height:71px">
+        <div :style="{ height: barHeight + 'px' }">
             <search-bar v-model="searchKey" :dark="false" :ratio="ratio" @search="submitSearch"></search-bar>
             <search-bar v-model="searchKey" :dark="false" :ratio="ratio" @search="submitSearch"></search-bar>
         </div>
         </div>
         <div class="main" id="main">
         <div class="main" id="main">
-            <van-sticky :container="main" :offset-top="71">
+            <van-sticky :container="main" :offset-top="barHeight">
                 <filter-sort-bar
                 <filter-sort-bar
                     :sort="sort"
                     :sort="sort"
                     :showType="showType"
                     :showType="showType"
@@ -37,7 +37,7 @@
                 </filter-sort-bar>
                 </filter-sort-bar>
             </van-sticky>
             </van-sticky>
 
 
-            <sort-list :empty="empty" :loading="loading" :finish="finish" top="71px">
+            <sort-list :empty="empty" :loading="loading" :finish="finish" top="172rpx">
                 <div class="product-list" v-if="showType === 'grid'">
                 <div class="product-list" v-if="showType === 'grid'">
                     <div class="clo-2" v-for="item in list" :key="item.id">
                     <div class="clo-2" v-for="item in list" :key="item.id">
                         <product-grid :info="item"></product-grid>
                         <product-grid :info="item"></product-grid>
@@ -56,6 +56,7 @@ import ProductGrid from '../components/product/GridNormal';
 import ProductTagsFilter from '../components/filter/ProductTags';
 import ProductTagsFilter from '../components/filter/ProductTags';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import ProductCategoryFilter from '../components/filter/ProductCategory';
 import CountryFilter from '../components/filter/Country';
 import CountryFilter from '../components/filter/Country';
+import { mapState } from 'vuex';
 export default {
 export default {
     data() {
     data() {
         return {
         return {
@@ -73,6 +74,7 @@ export default {
     },
     },
     mixins: [searchList],
     mixins: [searchList],
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         firstLevels() {
         firstLevels() {
             const list = [...this.productCategories];
             const list = [...this.productCategories];
             return list.filter(item => {
             return list.filter(item => {

+ 5 - 1
src/pagesMine/Activity.vue

@@ -22,7 +22,11 @@ export default {
     data() {
     data() {
         return {
         return {
             url: '/eventRegistration/all',
             url: '/eventRegistration/all',
-            formType: { body: 'json' },
+            formType: {
+                header: {
+                    'Content-Type': 'application/json'
+                }
+            },
             isEnd: '0'
             isEnd: '0'
         };
         };
     },
     },

+ 9 - 1
src/pagesMine/Collect.vue

@@ -24,7 +24,13 @@
                 <van-button size="small" :color="$colors.warn" plain>编辑</van-button>
                 <van-button size="small" :color="$colors.warn" plain>编辑</van-button>
             </div>
             </div>
         </van-sticky>
         </van-sticky>
-        <sort-list :empty="empty" :loading="loading" :finish="finish" top="88rpx">
+        <sort-list
+            emptyImg="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/kong_img_shouchang.png"
+            :empty="empty"
+            :loading="loading"
+            :finish="finish"
+            :top="`88rpx + ${barHeight} px`"
+        >
             <div class="product-list" v-if="type === 'PRODUCT'">
             <div class="product-list" v-if="type === 'PRODUCT'">
                 <product-row v-for="item in list" :info="item" :key="item.id"></product-row>
                 <product-row v-for="item in list" :info="item" :key="item.id"></product-row>
             </div>
             </div>
@@ -40,6 +46,7 @@ import searchList from '../mixins/searchList';
 import SortList from '../components/SortList.vue';
 import SortList from '../components/SortList.vue';
 import ProductRow from '../components/product/RowNormal.vue';
 import ProductRow from '../components/product/RowNormal.vue';
 import VendorRow from '../components/vendor/Row.vue';
 import VendorRow from '../components/vendor/Row.vue';
+import { mapState } from 'vuex';
 export default {
 export default {
     components: { SortList, ProductRow, VendorRow },
     components: { SortList, ProductRow, VendorRow },
     data() {
     data() {
@@ -51,6 +58,7 @@ export default {
     },
     },
     mixins: [searchList],
     mixins: [searchList],
     computed: {
     computed: {
+        ...mapState(['barHeight']),
         collectType() {
         collectType() {
             return [...collectType].map(item => {
             return [...collectType].map(item => {
                 return {
                 return {

+ 161 - 0
src/pagesMine/Order.vue

@@ -0,0 +1,161 @@
+<config>
+{
+'navigationBarTitleText': '产品需求/成交单',
+'backgroundColorTop': '#fff',
+'backgroundColor':'#F5F7FA'
+}
+</config>
+<template>
+    <div>
+        <van-sticky>
+            <div class="top">
+                <div class="tabs">
+                    <div
+                        class="tab"
+                        @click="chooseTab(item.key)"
+                        :class="{ active: type === item.key }"
+                        v-for="item in productListType"
+                        :key="item.key"
+                    >
+                        {{ $t(item.name) }}
+                    </div>
+                </div>
+
+                <!-- <van-button size="small" :color="$colors.warn" plain>编辑</van-button> -->
+            </div>
+        </van-sticky>
+        <sort-list
+            emptyImg="http://imt.oss-cn-hangzhou.aliyuncs.com/micro/kong_img_qingdan.png"
+            :empty="empty"
+            :loading="loading"
+            :finish="finish"
+            :top="`88rpx + ${barHeight} px`"
+            emptyText="当前暂无相关记录哦~"
+        >
+            <template slot="emptyButton">
+                <van-button block :color="$colors.warn">
+                    新增
+                </van-button>
+            </template>
+        </sort-list>
+    </div>
+</template>
+<script>
+import { productListType } from '../utils/appState';
+import searchList from '../mixins/searchList';
+import SortList from '../components/SortList.vue';
+import { mapState } from 'vuex';
+export default {
+    components: { SortList },
+    data() {
+        return {
+            url: '/productList/all',
+            type: 'OWN_PRODUCT',
+            formType: {
+                header: {
+                    'Content-Type': 'application/json'
+                }
+            }
+        };
+    },
+    mixins: [searchList],
+    computed: {
+        ...mapState(['barHeight', 'userInfo']),
+        productListType() {
+            return [...productListType].map(item => {
+                return {
+                    key: item[0],
+                    name: item[1]
+                };
+            });
+        },
+        listQuery() {
+            return {
+                query: {
+                    userId: this.userInfo ? this.userInfo.id : '',
+                    type: this.type
+                }
+            };
+        },
+        typeName() {
+            return productListType.get(this.type);
+        }
+    },
+    methods: {
+        loginMethods() {
+            this.getData();
+        },
+        chooseTab(type) {
+            if (type !== this.type) {
+                this.type = type;
+                this.refreash();
+            }
+        }
+    },
+    onReachBottom() {
+        if (!this.loading && !this.finish) {
+            this.page++;
+            this.getData();
+        }
+    }
+};
+</script>
+
+<style lang="less">
+.top {
+    display: flex;
+    height: 44px;
+    background: #ffffff;
+    align-items: center;
+    justify-content: space-between;
+
+    .tabs {
+        display: flex;
+
+        font-size: 14px;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: #292c33;
+        line-height: 24px;
+
+        .tab {
+            padding: 0 20px;
+            position: relative;
+
+            &.active {
+                color: @warn;
+                &::after {
+                    content: '';
+                    width: 24px;
+                    height: 2px;
+                    background-color: @warn;
+                    position: absolute;
+                    left: 50%;
+                    bottom: -4px;
+                    transform: translateX(-50%);
+                }
+            }
+        }
+    }
+
+    .van-button {
+        border-width: 0px;
+    }
+}
+
+page {
+    background-color: #f5f7fa;
+}
+
+.product-list {
+    padding: 16px;
+
+    .product + .product {
+        margin-top: 12px;
+    }
+
+    .vendor + .vendor {
+        margin-top: 12px;
+    }
+}
+</style>

+ 174 - 0
src/pagesMine/Upload.vue

@@ -0,0 +1,174 @@
+<config>
+{
+'navigationBarBackgroundColor':'#000',
+'navigationBarTitleText': '裁切图片',
+'disableScroll': true,
+'navigationBarTextStyle':'white'
+}
+</config>
+<template>
+    <div>
+        <cropper
+            ref="cropper"
+            :option="cropperOpt"
+            @ready="cropperReady"
+            @beforeDraw="cropperBeforeDraw"
+            @beforeImageLoad="cropperBeforeImageLoad"
+            @beforeLoad="cropperLoad"
+        ></cropper>
+        <div class="cropper-buttons" :style="{ color: cropperOpt.boundStyle.color }">
+            <div class="upload btn" @tap="navigateBack">
+                取消
+            </div>
+            <div
+                class="getCropperImage btn"
+                :style="{ backgroundColor: cropperOpt.boundStyle.color }"
+                @tap="getCropperImage"
+            >
+                生成图片
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import Cropper from '../components/Cropper';
+
+const device = wx.getSystemInfoSync();
+const width = device.windowWidth;
+const height = device.windowHeight - 50;
+
+export default {
+    data() {
+        return {
+            cropperOpt: {
+                id: 'cropper',
+                targetId: 'targetCropper',
+                pixelRatio: 3,
+                width,
+                height,
+                scale: 2.5,
+                zoom: 8,
+                cut: {
+                    x: (width - 300) / 2,
+                    y: (height - 300) / 2,
+                    width: 300,
+                    height: 300
+                },
+                boundStyle: {
+                    color: '#FFA526',
+                    mask: 'rgba(0,0,0,0.8)',
+                    lineWidth: 1
+                },
+                src: ''
+            },
+            wecropper: null
+        };
+    },
+    components: {
+        Cropper
+    },
+    methods: {
+        cropperReady(...args) {
+            console.log('cropper ready!');
+        },
+        cropperBeforeImageLoad(...args) {
+            console.log('before image load');
+        },
+        cropperLoad(...args) {
+            console.log('image loaded');
+        },
+        cropperBeforeDraw(...args) {
+            // Todo: 绘制水印等等
+        },
+        uploadTap() {
+            wx.chooseImage({
+                count: 1, // 默认9
+                sizeType: ['original'], // 可以指定是原图还是压缩图,默认二者都有
+                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
+                success: res => {
+                    const src = res.tempFilePaths[0];
+                    //  获取裁剪图片资源后,给data添加src属性及其值
+                    this.cropperOpt.src = src;
+                    this.wecropper.init();
+                }
+            });
+        },
+        getCropperImage() {
+            this.wecropper
+                .getCropperImage({ original: true })
+                .then(src => {
+                    this.$loading('加载中...');
+                    this.$http.uploadFile(src).then(res => {
+                        this.$loading.close();
+                        const pages = getCurrentPages();
+                        pages[pages.length - 2].rootVM.setImg(res);
+                        this.navigateBack();
+                    });
+                })
+                .catch(e => {
+                    console.error('获取图片失败');
+                });
+        }
+    },
+    mounted() {
+        this.wecropper = this.$refs.cropper;
+        console.log(this.$mp.options);
+        if (this.$mp.options.src) {
+            this.cropperOpt.src = this.$mp.options.src;
+            this.wecropper.init();
+        }
+    }
+};
+</script>
+
+<style>
+.cropper-wrapper {
+    position: relative;
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+    justify-content: center;
+    height: 100%;
+    background-color: #e5e5e5;
+}
+
+.cropper-buttons {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 50px;
+    padding: 0 20rpx;
+    box-sizing: border-box;
+    line-height: 50px;
+}
+
+.cropper-buttons .upload,
+.cropper-buttons .getCropperImage {
+    text-align: center;
+}
+
+.cropper {
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+
+.cropper-buttons {
+    background-color: rgba(0, 0, 0, 0.95);
+}
+
+.btn {
+    height: 30px;
+    line-height: 30px;
+    padding: 0 24rpx;
+    border-radius: 2px;
+    color: #ffffff;
+}
+</style>

+ 5 - 5
src/pagesNews/News.vue

@@ -13,7 +13,7 @@
         <custom-bar :pre="0" :title="title" :barTop="140"></custom-bar>
         <custom-bar :pre="0" :title="title" :barTop="140"></custom-bar>
         <banner :banners="banners" fixed :height="140" :radius="0"></banner>
         <banner :banners="banners" fixed :height="140" :radius="0"></banner>
         <div class="main" id="main">
         <div class="main" id="main">
-            <van-sticky :offset-top="71" :z-index="100" :container="main">
+            <van-sticky :offset-top="barHeight" :z-index="100" :container="main">
                 <div class="tab-content">
                 <div class="tab-content">
                     <van-tabs
                     <van-tabs
                         :active="hotActive"
                         :active="hotActive"
@@ -27,7 +27,7 @@
                 </div>
                 </div>
             </van-sticky>
             </van-sticky>
 
 
-            <sort-list :empty="empty" :loading="loading" :finish="finish" top="115px + 172rpx">
+            <sort-list :empty="empty" :loading="loading" :finish="finish" top="44px">
                 <div class="list">
                 <div class="list">
                     <template v-if="pageType === 'bigImg'">
                     <template v-if="pageType === 'bigImg'">
                         <block v-for="item in list" :key="item.id">
                         <block v-for="item in list" :key="item.id">
@@ -53,6 +53,7 @@ import searchList from '../mixins/searchList';
 import SortList from '../components/SortList.vue';
 import SortList from '../components/SortList.vue';
 import NewsGrid from '../components/News/Grid.vue';
 import NewsGrid from '../components/News/Grid.vue';
 import NewsRow from '../components/News/Row.vue';
 import NewsRow from '../components/News/Row.vue';
+import { mapState } from 'vuex';
 export default {
 export default {
     components: { Banner, CustomBar, SortList, NewsGrid, NewsRow },
     components: { Banner, CustomBar, SortList, NewsGrid, NewsRow },
     data() {
     data() {
@@ -63,13 +64,13 @@ export default {
             main: null,
             main: null,
             url: '/information/typeList',
             url: '/information/typeList',
             httpType: 'get',
             httpType: 'get',
-            barTop: 0,
             noPage: true,
             noPage: true,
             scrollTop: 0
             scrollTop: 0
         };
         };
     },
     },
     mixins: [searchList],
     mixins: [searchList],
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         informations() {
         informations() {
             return [...InformationType].map(item => {
             return [...InformationType].map(item => {
                 return {
                 return {
@@ -115,8 +116,7 @@ export default {
         this.main = wx.createSelectorQuery().select('#main');
         this.main = wx.createSelectorQuery().select('#main');
         this.main
         this.main
             .boundingClientRect(rect => {
             .boundingClientRect(rect => {
-                this.searchTop = rect.top - 61;
-                this.barTop = rect.top - 71;
+                this.searchTop = rect.top - this.barHeight;
             })
             })
             .exec();
             .exec();
     }
     }

+ 1 - 0
src/pagesProduct/Contrast.vue

@@ -122,6 +122,7 @@ export default {
     methods: {
     methods: {
         loginMethods() {
         loginMethods() {
             this.chooseIds = [this.productId];
             this.chooseIds = [this.productId];
+            console.log(this.chooseIds);
             this.$store
             this.$store
                 .dispatch('getContrastInfo')
                 .dispatch('getContrastInfo')
                 .then(() => {
                 .then(() => {

+ 3 - 3
src/pagesProduct/Detail.vue

@@ -76,7 +76,7 @@
                     :line-width="22"
                     :line-width="22"
                     :line-height="3"
                     :line-height="3"
                     sticky
                     sticky
-                    :offset-top="71"
+                    :offset-top="barHeight"
                 >
                 >
                     <van-tab title="图文详情">
                     <van-tab title="图文详情">
                         <div class="detail-content">
                         <div class="detail-content">
@@ -148,7 +148,7 @@ export default {
     },
     },
     mixins: [collection],
     mixins: [collection],
     computed: {
     computed: {
-        ...mapState(['intentionList']),
+        ...mapState(['intentionList', 'barHeight']),
         banners() {
         banners() {
             if (this.productInfo.img) {
             if (this.productInfo.img) {
                 return this.productInfo.img.split(',').map((item, index) => {
                 return this.productInfo.img.split(',').map((item, index) => {
@@ -301,7 +301,7 @@ export default {
         goConnect() {
         goConnect() {
             this.$store.commit('updateChooseList', [this.productInfo]);
             this.$store.commit('updateChooseList', [this.productInfo]);
             console.log(this.$store.state.chooseList);
             console.log(this.$store.state.chooseList);
-            this.navigateTo('/pagesVendor/Connect?productId=' + this.productId);
+            this.navigateTo('/pagesVendor/Connect?productId=' + this.productId + '&userId=' + this.vendorInfo.userId);
         }
         }
     }
     }
 };
 };

+ 11 - 4
src/pagesVendor/Connect.vue

@@ -27,7 +27,7 @@
             <h2>计划加工</h2>
             <h2>计划加工</h2>
             <textarea
             <textarea
                 class="textarea"
                 class="textarea"
-                @input="artifact = $event.detail.value"
+                @blur="artifact = $event.detail.value"
                 auto-height
                 auto-height
                 placeholder="请输入计划加工的工件名称"
                 placeholder="请输入计划加工的工件名称"
                 placeholder-class="pla-textarea"
                 placeholder-class="pla-textarea"
@@ -37,7 +37,7 @@
             <h2>需求描述</h2>
             <h2>需求描述</h2>
             <textarea
             <textarea
                 class="textarea"
                 class="textarea"
-                @input="otherProblems = $event.detail.value"
+                @blur="otherProblems = $event.detail.value"
                 auto-height
                 auto-height
                 placeholder="请简要描述您的问题需求,100字以内"
                 placeholder="请简要描述您的问题需求,100字以内"
                 placeholder-class="pla-textarea"
                 placeholder-class="pla-textarea"
@@ -64,7 +64,7 @@ export default {
             artifact: '',
             artifact: '',
             otherProblems: '',
             otherProblems: '',
             productId: '',
             productId: '',
-            vendorId: 0
+            toUserId: 0
         };
         };
     },
     },
     computed: {
     computed: {
@@ -117,6 +117,10 @@ export default {
         if (options.vendorId) {
         if (options.vendorId) {
             this.vendorId = options.vendorId;
             this.vendorId = options.vendorId;
         }
         }
+
+        if (options.userId) {
+            this.toUserId = options.userId;
+        }
     },
     },
     methods: {
     methods: {
         submit() {
         submit() {
@@ -142,12 +146,15 @@ export default {
                 })
                 })
                 .then(res => {
                 .then(res => {
                     wx.redirectTo({
                     wx.redirectTo({
-                        url: '/pagesMine/ChatDetail?toUserId=' + this.vendorId
+                        url: '/pagesChat/ChatDetail?toUserId=' + this.toUserId
                     });
                     });
                 })
                 })
                 .catch(e => {
                 .catch(e => {
                     this.$toast(e.error);
                     this.$toast(e.error);
                 });
                 });
+        },
+        changeValue(e) {
+            console.log(e);
         }
         }
     },
     },
     components: {
     components: {

+ 9 - 7
src/pagesVendor/Detail.vue

@@ -14,14 +14,14 @@
 </config>
 </config>
 <template>
 <template>
     <div>
     <div>
-        <div style="height:71px">
+        <div :style="{ height: barHeight + 'px' }">
             <search-bar v-model="searchKey" :ratio="ratio" @search="submitSearch"> </search-bar>
             <search-bar v-model="searchKey" :ratio="ratio" @search="submitSearch"> </search-bar>
         </div>
         </div>
-        <div class="fixed-top"></div>
+        <div class="fixed-top" :style="{ top: barHeight + 'px' }"></div>
         <scroll-view
         <scroll-view
             id="scroller"
             id="scroller"
             @scroll="onScroll"
             @scroll="onScroll"
-            style="height:calc(100vh - 71px)"
+            :style="{ height: `calc(100vh - ${barHeight}px)` }"
             :scroll-y="true"
             :scroll-y="true"
             class="scrollView"
             class="scrollView"
             efresher-background="#0F264D"
             efresher-background="#0F264D"
@@ -45,21 +45,22 @@
             </div>
             </div>
             <div class="main" id="main">
             <div class="main" id="main">
                 <van-sticky :scroll-top="scrollTop" :offset-top="offsetTop">
                 <van-sticky :scroll-top="scrollTop" :offset-top="offsetTop">
-                    <van-tabs :sticky="false" :line-height="0" @change="active = $event.detail.index">
+                    <van-tabs :sticky="false" :active="active" :line-height="0" @change="active = $event.detail.index">
                         <van-tab title="关于展商"> </van-tab>
                         <van-tab title="关于展商"> </van-tab>
                         <van-tab title="产品"> </van-tab>
                         <van-tab title="产品"> </van-tab>
-                        <!-- <van-tab title="新闻资讯"> </van-tab> -->
+                        <van-tab title="新闻资讯"> </van-tab>
                     </van-tabs>
                     </van-tabs>
                 </van-sticky>
                 </van-sticky>
                 <about v-if="active === 0" :vendorInfo="vendorInfo" :showConnect="showConnect"></about>
                 <about v-if="active === 0" :vendorInfo="vendorInfo" :showConnect="showConnect"></about>
                 <product v-else-if="active === 1" :vendorInfo="vendorInfo" :fixedTop="searchTop"></product>
                 <product v-else-if="active === 1" :vendorInfo="vendorInfo" :fixedTop="searchTop"></product>
+                <news v-else-if="active === 2" :vendorInfo="vendorInfo"></news>
             </div>
             </div>
         </scroll-view>
         </scroll-view>
         <fixed-button v-if="showConnect && active === 0">
         <fixed-button v-if="showConnect && active === 0">
             <van-button
             <van-button
                 :color="$colors.warn"
                 :color="$colors.warn"
                 block
                 block
-                @click="navigateTo('/pagesVendor/Connect?vendorId=' + vendorInfo.id)"
+                @click="navigateTo('/pagesVendor/Connect?vendorId=' + vendorInfo.id + '&userId=' + vendorInfo.userId)"
                 >咨询展商</van-button
                 >咨询展商</van-button
             >
             >
         </fixed-button>
         </fixed-button>
@@ -71,9 +72,10 @@ import FixedButton from '../components/FixedButton.vue';
 import collection from '../mixins/collection';
 import collection from '../mixins/collection';
 import About from './About.vue';
 import About from './About.vue';
 import Product from './Product.vue';
 import Product from './Product.vue';
+import News from './News.vue';
 
 
 export default {
 export default {
-    components: { SearchBar, About, Product, FixedButton },
+    components: { SearchBar, About, Product, FixedButton, News },
     data() {
     data() {
         return {
         return {
             ratio: 1,
             ratio: 1,

+ 95 - 0
src/pagesVendor/News.vue

@@ -0,0 +1,95 @@
+<config>
+{
+'navigationBarTitleText': '',
+'navigationStyle':'custom',
+'navigationBarTextStyle':'white',
+'backgroundColorTop': '#fff',
+'backgroundColorBottom': '#f5f7fa',
+'enablePullDownRefresh':false
+}
+</config>
+<template>
+    <div>
+        <sort-list :empty="empty" :loading="loading" :finish="finish" top="115px + 172rpx">
+            <div class="list">
+                <block v-for="item in list" :key="item.id">
+                    <news-grid :info="item"></news-grid>
+                </block>
+            </div>
+        </sort-list>
+    </div>
+</template>
+<script>
+import { InformationType } from '../utils/appState';
+import searchList from '../mixins/searchList';
+import SortList from '../components/SortList.vue';
+import NewsGrid from '../components/News/Grid.vue';
+export default {
+    components: { SortList, NewsGrid },
+    data() {
+        return {
+            banners: [],
+            ratio: 0,
+            hotActive: 0,
+            main: null,
+            url: '/information/all',
+            formType: {
+                header: {
+                    'Content-Type': 'application/json'
+                }
+            },
+            barTop: 0,
+            scrollTop: 0
+        };
+    },
+    mixins: [searchList],
+    props: {
+        vendorInfo: {
+            type: Object,
+            default: () => {
+                return {};
+            }
+        }
+    },
+    computed: {
+        listQuery() {
+            return {
+                query: JSON.stringify({
+                    vendorInfoId: this.vendorInfo.id
+                })
+            };
+        }
+    },
+    mounted() {
+        this.getData();
+    }
+};
+</script>
+<style lang="less" scoped>
+.list {
+    padding: 16px;
+    .news + .news {
+        margin-top: 16px;
+    }
+}
+.list-row {
+    background-color: #f5f7fa;
+}
+</style>
+<style lang="less">
+.tab-content {
+    .van-tabs__scroll {
+        .van-tab {
+            color: #292c33;
+            &.van-tab--active {
+                color: @warn;
+            }
+        }
+
+        .van-tabs__line {
+            bottom: 8px;
+            left: 7.5px;
+        }
+    }
+}
+</style>

+ 4 - 2
src/pagesVendor/Product.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div class="productPage" style="min-height: calc(100vh - 71px - 44px);">
+    <div class="productPage" :style="{ minHeight: ` calc(100vh - ${barHeight}px - 44px)` }">
         <scroll-view :scroll-top="scrollTop" :scroll-y="true" class="left-side" v-if="menus.length > 0">
         <scroll-view :scroll-top="scrollTop" :scroll-y="true" class="left-side" v-if="menus.length > 0">
             <van-sidebar :active-key="activeKey" @change="changeCustomCate">
             <van-sidebar :active-key="activeKey" @change="changeCustomCate">
                 <van-sidebar-item :title="getName(item)" :key="item.id" v-for="item in menus" />
                 <van-sidebar-item :title="getName(item)" :key="item.id" v-for="item in menus" />
@@ -19,6 +19,7 @@
 import searchList from '../mixins/searchList';
 import searchList from '../mixins/searchList';
 import ProductRow from '../components/product/Row';
 import ProductRow from '../components/product/Row';
 import SortList from '../components/SortList.vue';
 import SortList from '../components/SortList.vue';
+import { mapState } from 'vuex';
 export default {
 export default {
     name: 'product',
     name: 'product',
     data() {
     data() {
@@ -38,6 +39,7 @@ export default {
         }
         }
     },
     },
     computed: {
     computed: {
+        ...mapState(['barTop', 'barHeight']),
         listQuery() {
         listQuery() {
             return {
             return {
                 productSort: this.sort,
                 productSort: this.sort,
@@ -56,7 +58,7 @@ export default {
         }
         }
     },
     },
     mounted() {
     mounted() {
-        this.searchTop = 71 + 44;
+        this.searchTop = this.barHeight + 44;
         this.$http
         this.$http
             .get('/customCategory/my', {
             .get('/customCategory/my', {
                 vendorId: this.$mp.options.id
                 vendorId: this.$mp.options.id

+ 1 - 1
src/plugins/http.js

@@ -102,7 +102,7 @@ const http = {
                 success(res) {
                 success(res) {
                     if (res && res.statusCode === 200) {
                     if (res && res.statusCode === 200) {
                         try {
                         try {
-                            resolve(JSON.parse(res.data));
+                            resolve(res.data);
                         } catch (e) {
                         } catch (e) {
                             reject(e);
                             reject(e);
                         }
                         }

+ 21 - 1
src/store/index.js

@@ -12,7 +12,11 @@ export default new Vuex.Store({
         productCategories: [],
         productCategories: [],
         intentionList: [],
         intentionList: [],
         contrastInfo: {},
         contrastInfo: {},
-        chooseList: []
+        chooseList: [],
+        barHeight: 71,
+        barTop: 0,
+        chatForm:
+            '{"phone":"13365135976","sex":"male","nickname":"蒋耀忠","position":"总经理","chCompanyName":"NE洛阳新能轴承制造有限公司","email":"11@qq.com.cn","products":[{"chName":"MS22-8多轴数控机床","enName":"MultiLine MS22-8","id":6296,"mainPicture":"https://imt.oss-cn-hangzhou.aliyuncs.com/image/2020-11-26-18-08-34MaKXCzxH.png"}]}'
     },
     },
     mutations: {
     mutations: {
         setSafeAreaTop(state, val) {
         setSafeAreaTop(state, val) {
@@ -47,6 +51,15 @@ export default new Vuex.Store({
         },
         },
         updateChooseList(state, chooseList) {
         updateChooseList(state, chooseList) {
             state.chooseList = chooseList;
             state.chooseList = chooseList;
+        },
+        updateBarHeight(state, barHeight) {
+            state.barHeight = barHeight;
+        },
+        updateBarTop(state, barTop) {
+            state.barTop = barTop;
+        },
+        updateChatForm(state, chatForm) {
+            state.chatForm = chatForm;
         }
         }
     },
     },
     actions: {
     actions: {
@@ -105,6 +118,13 @@ export default new Vuex.Store({
             return http.http.get('/intentionList/myCompared').then(res => {
             return http.http.get('/intentionList/myCompared').then(res => {
                 context.commit('updateContrastInfo', res || {});
                 context.commit('updateContrastInfo', res || {});
             });
             });
+        },
+        getBarHeight(context) {
+            var info = wx.getMenuButtonBoundingClientRect();
+            if (info.height) {
+                context.commit('updateBarHeight', info.top + info.height + 15);
+                context.commit('updateBarTop', info.top);
+            }
         }
         }
     }
     }
 });
 });

+ 17 - 1
src/utils/appState.js

@@ -9,6 +9,11 @@ const EnterpriseType = new Map([
     ['TECHNICAL_SERVICE_PROVIDER', 'ji-shu-fu-wu-shang']
     ['TECHNICAL_SERVICE_PROVIDER', 'ji-shu-fu-wu-shang']
 ]);
 ]);
 
 
+const productListType = new Map([
+    ['OWN_PRODUCT', 'zi-shen-chan-pin-lei-xing-qing-dan'],
+    ['REQUIRED_PRODUCT', 'xu-yao-de-chan-pin-qing-dan']
+]);
+
 const sexModels = new Map([
 const sexModels = new Map([
     [
     [
         'male',
         'male',
@@ -26,6 +31,8 @@ const sexModels = new Map([
     ]
     ]
 ]);
 ]);
 
 
+const languageModels = new Map([['ch', '中文'], ['en', '英文'], ['both', '中/英'], ['other', '其他']]);
+
 const InformationType = new Map([
 const InformationType = new Map([
     [
     [
         'NEW_PRODUCT_RELEASE',
         'NEW_PRODUCT_RELEASE',
@@ -61,4 +68,13 @@ const InformationType = new Map([
         }
         }
     ]
     ]
 ]);
 ]);
-export { collectType, BrandSortType, ProductSortType, EnterpriseType, InformationType, sexModels };
+export {
+    collectType,
+    productListType,
+    BrandSortType,
+    ProductSortType,
+    EnterpriseType,
+    InformationType,
+    sexModels,
+    languageModels
+};

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 6 - 19309
src/utils/area.js


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů