wzdxx1314@163.com %!s(int64=2) %!d(string=hai) anos
pai
achega
434a12dbff

+ 336 - 29
package-lock.json

@@ -9,17 +9,21 @@
       "version": "0.1.0",
       "dependencies": {
         "core-js": "^3.8.3",
+        "vant": "^2.12.54",
         "vue": "^2.6.14",
         "vue-router": "^3.5.1",
         "vuex": "^3.6.2"
       },
       "devDependencies": {
+        "@nutui/nutui": "^2.3.13",
         "@vue/cli-plugin-babel": "~5.0.0",
         "@vue/cli-plugin-router": "~5.0.0",
         "@vue/cli-plugin-vuex": "~5.0.0",
         "@vue/cli-service": "~5.0.0",
+        "axios": "^1.3.4",
         "less": "^4.0.0",
         "less-loader": "^8.0.0",
+        "qs": "^6.11.1",
         "vue-template-compiler": "^2.6.14"
       }
     },
@@ -1760,7 +1764,6 @@
       "version": "7.21.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@babel/runtime/-/runtime-7.21.0.tgz",
       "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "regenerator-runtime": "^0.13.11"
@@ -1984,6 +1987,21 @@
         "node": ">= 8"
       }
     },
+    "node_modules/@nutui/nutui": {
+      "version": "2.3.13",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@nutui/nutui/-/nutui-2.3.13.tgz",
+      "integrity": "sha512-vF067LAcMzAPIMQWzK4zSNkA8DBgAUj2oiAk9HPmJhDVKa2WFqshEzCZhsRxZBlDZPUcdXyyXveBmki8awyCnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "gsap": "^3.2.6",
+        "hammerjs": "^2.0.8",
+        "vue-lazyload": "^1.3.3"
+      },
+      "peerDependencies": {
+        "vue": "^2.6.10"
+      }
+    },
     "node_modules/@polka/url": {
       "version": "1.0.0-next.21",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@polka/url/-/url-1.0.0-next.21.tgz",
@@ -2341,11 +2359,22 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@vant/icons": {
+      "version": "1.8.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@vant/icons/-/icons-1.8.0.tgz",
+      "integrity": "sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg==",
+      "license": "MIT"
+    },
+    "node_modules/@vant/popperjs": {
+      "version": "1.3.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@vant/popperjs/-/popperjs-1.3.0.tgz",
+      "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==",
+      "license": "MIT"
+    },
     "node_modules/@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.4.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
       "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/@vue/babel-helper-vue-transform-on": {
@@ -3434,6 +3463,13 @@
         "lodash": "^4.17.14"
       }
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/at-least-node": {
       "version": "1.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -3478,6 +3514,18 @@
         "postcss": "^8.1.0"
       }
     },
+    "node_modules/axios": {
+      "version": "1.3.4",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/axios/-/axios-1.3.4.tgz",
+      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
     "node_modules/babel-loader": {
       "version": "8.3.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/babel-loader/-/babel-loader-8.3.0.tgz",
@@ -3691,6 +3739,22 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/body-parser/node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/bonjour-service": {
       "version": "1.1.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/bonjour-service/-/bonjour-service-1.1.1.tgz",
@@ -4180,6 +4244,19 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/commander": {
       "version": "8.3.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/commander/-/commander-8.3.0.tgz",
@@ -5005,6 +5082,16 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/depd": {
       "version": "2.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/depd/-/depd-2.0.0.tgz",
@@ -5503,6 +5590,22 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/express/node_modules/qs": {
+      "version": "6.11.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
+      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -5685,6 +5788,21 @@
         }
       }
     },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/forwarded/-/forwarded-0.2.0.tgz",
@@ -5898,6 +6016,13 @@
       "dev": true,
       "license": "ISC"
     },
+    "node_modules/gsap": {
+      "version": "3.11.5",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/gsap/-/gsap-3.11.5.tgz",
+      "integrity": "sha512-Q89nKCLgoX5xUjznh9LcaIUkz54k1voNucT1Rpf9SJNFIQznBwFqt5qUUQbeVInFyN/n18OUJkpeI6CNEDt74w==",
+      "dev": true,
+      "license": "Standard 'no charge' license: https://greensock.com/standard-license. Club GreenSock members get more: https://greensock.com/licensing/. Why GreenSock doesn't employ an MIT license: https://greensock.com/why-license/"
+    },
     "node_modules/gzip-size": {
       "version": "6.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/gzip-size/-/gzip-size-6.0.0.tgz",
@@ -5914,6 +6039,16 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/hammerjs": {
+      "version": "2.0.8",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/hammerjs/-/hammerjs-2.0.8.tgz",
+      "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
     "node_modules/handle-thing": {
       "version": "2.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/handle-thing/-/handle-thing-2.0.1.tgz",
@@ -8891,6 +9026,13 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/prr": {
       "version": "1.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/prr/-/prr-1.0.1.tgz",
@@ -8928,9 +9070,9 @@
       }
     },
     "node_modules/qs": {
-      "version": "6.11.0",
-      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
-      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "version": "6.11.1",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.1.tgz",
+      "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
       "dev": true,
       "license": "BSD-3-Clause",
       "dependencies": {
@@ -9106,7 +9248,6 @@
       "version": "0.13.11",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
       "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/regenerator-transform": {
@@ -10350,6 +10491,28 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
+    "node_modules/vant": {
+      "version": "2.12.54",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/vant/-/vant-2.12.54.tgz",
+      "integrity": "sha512-t7DCiLxNosDrg0Jm5EY9p0A5cAMo5OadmizbYtPEc0ru+OJKEa3kcfxtKIK5on7ZPqoOkyYJt8e6BQ1VDMPsrg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "7.x",
+        "@vant/icons": "^1.7.1",
+        "@vant/popperjs": "^1.1.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "vue-lazyload": "1.2.3"
+      },
+      "peerDependencies": {
+        "vue": ">= 2.6.0"
+      }
+    },
+    "node_modules/vant/node_modules/vue-lazyload": {
+      "version": "1.2.3",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
+      "integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g==",
+      "license": "MIT"
+    },
     "node_modules/vary": {
       "version": "1.1.2",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/vary/-/vary-1.1.2.tgz",
@@ -10377,6 +10540,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/vue-lazyload": {
+      "version": "1.3.4",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-lazyload/-/vue-lazyload-1.3.4.tgz",
+      "integrity": "sha512-K0frbPQJuvFHVpdl/ov5CqCR/CHWeLGs8E8V1d/09DIETqBjeGhC1fLMmwUy3Go2Yd/VX610AZ7Mdn4B54592Q==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/vue-loader": {
       "version": "17.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-loader/-/vue-loader-17.0.1.tgz",
@@ -12359,7 +12529,6 @@
       "version": "7.21.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@babel/runtime/-/runtime-7.21.0.tgz",
       "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
-      "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.11"
       }
@@ -12527,6 +12696,17 @@
         "fastq": "^1.6.0"
       }
     },
+    "@nutui/nutui": {
+      "version": "2.3.13",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@nutui/nutui/-/nutui-2.3.13.tgz",
+      "integrity": "sha512-vF067LAcMzAPIMQWzK4zSNkA8DBgAUj2oiAk9HPmJhDVKa2WFqshEzCZhsRxZBlDZPUcdXyyXveBmki8awyCnQ==",
+      "dev": true,
+      "requires": {
+        "gsap": "^3.2.6",
+        "hammerjs": "^2.0.8",
+        "vue-lazyload": "^1.3.3"
+      }
+    },
     "@polka/url": {
       "version": "1.0.0-next.21",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@polka/url/-/url-1.0.0-next.21.tgz",
@@ -12822,11 +13002,20 @@
         "@types/node": "*"
       }
     },
+    "@vant/icons": {
+      "version": "1.8.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@vant/icons/-/icons-1.8.0.tgz",
+      "integrity": "sha512-sKfEUo2/CkQFuERxvkuF6mGQZDKu3IQdj5rV9Fm0weJXtchDSSQ+zt8qPCNUEhh9Y8shy5PzxbvAfOOkCwlCXg=="
+    },
+    "@vant/popperjs": {
+      "version": "1.3.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/@vant/popperjs/-/popperjs-1.3.0.tgz",
+      "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="
+    },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.4.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
-      "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==",
-      "dev": true
+      "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA=="
     },
     "@vue/babel-helper-vue-transform-on": {
       "version": "1.0.2",
@@ -13055,7 +13244,8 @@
       "version": "5.0.8",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz",
       "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "@vue/cli-service": {
       "version": "5.0.8",
@@ -13487,7 +13677,8 @@
       "version": "1.8.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
       "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "acorn-walk": {
       "version": "8.2.0",
@@ -13546,7 +13737,8 @@
       "version": "3.5.2",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "ansi-escapes": {
       "version": "3.2.0",
@@ -13618,6 +13810,12 @@
         "lodash": "^4.17.14"
       }
     },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "dev": true
+    },
     "at-least-node": {
       "version": "1.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/at-least-node/-/at-least-node-1.0.0.tgz",
@@ -13638,6 +13836,17 @@
         "postcss-value-parser": "^4.2.0"
       }
     },
+    "axios": {
+      "version": "1.3.4",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/axios/-/axios-1.3.4.tgz",
+      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+      "dev": true,
+      "requires": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
     "babel-loader": {
       "version": "8.3.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/babel-loader/-/babel-loader-8.3.0.tgz",
@@ -13789,6 +13998,15 @@
           "resolved": "https://repo.ctbiyi.com/repository/npmall/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
+        },
+        "qs": {
+          "version": "6.11.0",
+          "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
+          "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+          "dev": true,
+          "requires": {
+            "side-channel": "^1.0.4"
+          }
         }
       }
     },
@@ -14118,6 +14336,15 @@
       "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
       "dev": true
     },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
     "commander": {
       "version": "8.3.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/commander/-/commander-8.3.0.tgz",
@@ -14325,7 +14552,8 @@
       "version": "6.3.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz",
       "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "css-loader": {
       "version": "6.7.3",
@@ -14511,7 +14739,8 @@
       "version": "3.1.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
       "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "csso": {
       "version": "4.2.0",
@@ -14663,6 +14892,12 @@
         "object-keys": "^1.1.1"
       }
     },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "dev": true
+    },
     "depd": {
       "version": "2.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/depd/-/depd-2.0.0.tgz",
@@ -15029,6 +15264,15 @@
           "resolved": "https://repo.ctbiyi.com/repository/npmall/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
+        },
+        "qs": {
+          "version": "6.11.0",
+          "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
+          "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+          "dev": true,
+          "requires": {
+            "side-channel": "^1.0.4"
+          }
         }
       }
     },
@@ -15163,6 +15407,17 @@
       "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
       "dev": true
     },
+    "form-data": {
+      "version": "4.0.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      }
+    },
     "forwarded": {
       "version": "0.2.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/forwarded/-/forwarded-0.2.0.tgz",
@@ -15305,6 +15560,12 @@
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
       "dev": true
     },
+    "gsap": {
+      "version": "3.11.5",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/gsap/-/gsap-3.11.5.tgz",
+      "integrity": "sha512-Q89nKCLgoX5xUjznh9LcaIUkz54k1voNucT1Rpf9SJNFIQznBwFqt5qUUQbeVInFyN/n18OUJkpeI6CNEDt74w==",
+      "dev": true
+    },
     "gzip-size": {
       "version": "6.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/gzip-size/-/gzip-size-6.0.0.tgz",
@@ -15314,6 +15575,12 @@
         "duplexer": "^0.1.2"
       }
     },
+    "hammerjs": {
+      "version": "2.0.8",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/hammerjs/-/hammerjs-2.0.8.tgz",
+      "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==",
+      "dev": true
+    },
     "handle-thing": {
       "version": "2.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/handle-thing/-/handle-thing-2.0.1.tgz",
@@ -15538,7 +15805,8 @@
       "version": "5.1.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/icss-utils/-/icss-utils-5.1.0.tgz",
       "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "ieee754": {
       "version": "1.2.1",
@@ -16939,25 +17207,29 @@
       "version": "5.1.2",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
       "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-discard-duplicates": {
       "version": "5.1.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
       "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-discard-empty": {
       "version": "5.1.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
       "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-discard-overridden": {
       "version": "5.1.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
       "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-loader": {
       "version": "6.2.1",
@@ -17062,7 +17334,8 @@
       "version": "3.0.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
       "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-modules-local-by-default": {
       "version": "4.0.0",
@@ -17097,7 +17370,8 @@
       "version": "5.1.0",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
       "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "postcss-normalize-display-values": {
       "version": "5.1.0",
@@ -17289,6 +17563,12 @@
         }
       }
     },
+    "proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "dev": true
+    },
     "prr": {
       "version": "1.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/prr/-/prr-1.0.1.tgz",
@@ -17319,9 +17599,9 @@
       "dev": true
     },
     "qs": {
-      "version": "6.11.0",
-      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.0.tgz",
-      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+      "version": "6.11.1",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/qs/-/qs-6.11.1.tgz",
+      "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==",
       "dev": true,
       "requires": {
         "side-channel": "^1.0.4"
@@ -17437,8 +17717,7 @@
     "regenerator-runtime": {
       "version": "0.13.11",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
-      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
-      "dev": true
+      "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
     },
     "regenerator-transform": {
       "version": "0.15.1",
@@ -18303,6 +18582,25 @@
         "spdx-expression-parse": "^3.0.0"
       }
     },
+    "vant": {
+      "version": "2.12.54",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/vant/-/vant-2.12.54.tgz",
+      "integrity": "sha512-t7DCiLxNosDrg0Jm5EY9p0A5cAMo5OadmizbYtPEc0ru+OJKEa3kcfxtKIK5on7ZPqoOkyYJt8e6BQ1VDMPsrg==",
+      "requires": {
+        "@babel/runtime": "7.x",
+        "@vant/icons": "^1.7.1",
+        "@vant/popperjs": "^1.1.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "vue-lazyload": "1.2.3"
+      },
+      "dependencies": {
+        "vue-lazyload": {
+          "version": "1.2.3",
+          "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
+          "integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g=="
+        }
+      }
+    },
     "vary": {
       "version": "1.1.2",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/vary/-/vary-1.1.2.tgz",
@@ -18324,6 +18622,12 @@
       "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
       "dev": true
     },
+    "vue-lazyload": {
+      "version": "1.3.4",
+      "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-lazyload/-/vue-lazyload-1.3.4.tgz",
+      "integrity": "sha512-K0frbPQJuvFHVpdl/ov5CqCR/CHWeLGs8E8V1d/09DIETqBjeGhC1fLMmwUy3Go2Yd/VX610AZ7Mdn4B54592Q==",
+      "dev": true
+    },
     "vue-loader": {
       "version": "17.0.1",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/vue-loader/-/vue-loader-17.0.1.tgz",
@@ -18439,7 +18743,8 @@
     "vuex": {
       "version": "3.6.2",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/vuex/-/vuex-3.6.2.tgz",
-      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
+      "requires": {}
     },
     "watchpack": {
       "version": "2.4.0",
@@ -18740,7 +19045,8 @@
           "version": "8.13.0",
           "resolved": "https://repo.ctbiyi.com/repository/npmall/ws/-/ws-8.13.0.tgz",
           "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
-          "dev": true
+          "dev": true,
+          "requires": {}
         }
       }
     },
@@ -18861,7 +19167,8 @@
       "version": "7.5.9",
       "resolved": "https://repo.ctbiyi.com/repository/npmall/ws/-/ws-7.5.9.tgz",
       "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
-      "dev": true
+      "dev": true,
+      "requires": {}
     },
     "y18n": {
       "version": "5.0.8",

+ 4 - 0
package.json

@@ -8,17 +8,21 @@
   },
   "dependencies": {
     "core-js": "^3.8.3",
+    "vant": "^2.12.54",
     "vue": "^2.6.14",
     "vue-router": "^3.5.1",
     "vuex": "^3.6.2"
   },
   "devDependencies": {
+    "@nutui/nutui": "^2.3.13",
     "@vue/cli-plugin-babel": "~5.0.0",
     "@vue/cli-plugin-router": "~5.0.0",
     "@vue/cli-plugin-vuex": "~5.0.0",
     "@vue/cli-service": "~5.0.0",
+    "axios": "^1.3.4",
     "less": "^4.0.0",
     "less-loader": "^8.0.0",
+    "qs": "^6.11.1",
     "vue-template-compiler": "^2.6.14"
   },
   "browserslist": [

+ 3 - 2
public/index.html

@@ -4,8 +4,9 @@
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title><%= htmlWebpackPlugin.options.title %></title>
+    <link rel="icon" href="http://121.5.58.50:8088/logo.png">
+      <link rel="stylesheet" href="//at.alicdn.com/t/font_2939460_fcaitngwfe8.css">
+    <title>业主之家</title>
   </head>
   <body>
     <noscript>

BIN=BIN
public/logo.png


+ 25 - 17
src/App.vue

@@ -1,32 +1,40 @@
 <template>
   <div id="app">
-    <nav>
-      <router-link to="/">Home</router-link> |
-      <router-link to="/about">About</router-link>
-    </nav>
     <router-view/>
   </div>
 </template>
 
 <style lang="less">
+*{
+  padding: 0;
+  margin: 0;
+}
+html,body{
+  width: 100%;
+  height: 100%;
+}
 #app {
   font-family: Avenir, Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
-  text-align: center;
+  //text-align: center;
   color: #2c3e50;
+  width: 100%;
+  height: 100%;
 }
-
-nav {
-  padding: 30px;
-
-  a {
-    font-weight: bold;
-    color: #2c3e50;
-
-    &.router-link-exact-active {
-      color: #42b983;
-    }
-  }
+.btn{
+  width: 319px;
+  height: 56px;
+  background: #6C5DD3;
+  border-radius: 16px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 16px;
+  font-family: PingFangSC-Medium, PingFang SC;
+  font-weight: 500;
+  color: #FFFFFF;
+  margin: 0 auto;
 }
+
 </style>

+ 161 - 0
src/api/api.js

@@ -0,0 +1,161 @@
+/*
+* chinanet 接口总文件
+* by wzdxx1314@163.com
+* 2021-6-1
+* */
+
+const axios = require('axios');
+const qs = require('qs')
+import router from "../router";
+import { Dialog ,Notify } from 'vant';
+const instance = axios.create({
+    // baseURL: 'api',
+    baseURL: '/api/',
+    timeout: 30000,
+});
+const instanceFormData = axios.create({
+    // baseURL: 'api',
+    baseURL: '/api/',
+    timeout: 30000,
+});
+
+/*
+*
+* 请求的预处理 by wzd
+* */
+instance.interceptors.request.use((config) => {
+    config.headers['Accept'] = '';
+    config.headers['X-Requested-With'] = 'XMLHttpRequest';
+    return config;
+}, (error) => {
+    return Promise.reject(error);
+});
+instanceFormData.interceptors.request.use((config) => {
+    config.headers['Accept'] = '';
+    config.headers['X-Requested-With'] = 'XMLHttpRequest';
+    config.headers['Content-Type'] = 'multipart/form-data';
+    return config;
+}, (error) => {
+    return Promise.reject(error);
+});
+
+/*
+*
+* 返回的预处理 by wzd
+* */
+instance.interceptors.response.use(function (response) {
+    // Do something with response data
+    return response.data;
+}, function (error) {
+    // console.log(error);
+    return Promise.reject(error);
+});
+instanceFormData.interceptors.response.use(function (response) {
+    // Do something with response data
+    return response.data;
+}, function (error) {
+    // console.log(error);
+    return Promise.reject(error);
+});
+
+function fetch(ourl, params = {}, methods = 'post') {
+    return new Promise((resolve, reject) => {
+        let url = ourl;
+        if (methods == 'get' && qs.stringify(params)) {
+            url = ourl + '?' + qs.stringify(params);
+        }
+        instance[methods](url, params).then(res => {
+            if(res.code == 1){
+                resolve(res)
+            }else if(res.code == 104){
+
+            }else if(res.code == 201){
+                Dialog.confirm({
+                    title: '未登录',
+                    message: '是否回到登录页',
+                })
+                    .then(() => {
+                        router.push({name:'login'})
+                    })
+                    .catch(() => {
+                        // on cancel
+                    });
+            }else{
+                Notify(res.message);
+                reject(err)
+            }
+
+        }).catch((err) => {
+            reject(err)
+        })
+    })
+}
+function fetchFormData(ourl, params = {}, methods = 'post') {
+    return new Promise((resolve, reject) => {
+        let url = ourl;
+        if (methods == 'get' && qs.stringify(params)) {
+            url = ourl + '?' + qs.stringify(params);
+        }
+        instanceFormData[methods](url, params).then(res => {
+            if(res.code==1){
+                resolve(res)
+            }else{
+                Notify(res.message);
+                reject(res)
+            }
+
+        }).catch((err) => {
+            reject(err)
+        })
+    })
+}
+
+export default {
+    login(params){
+        return fetch('passport/',params)
+    },
+    getUserInfo(params){
+        return fetch('passport/',params,'get')
+    },
+    verificationCode(params){
+        return fetch('verificationCode/',params,'get')
+    },
+    resiger(params){
+        return fetch('verificationCode/',params,'post')
+    },
+    getVote_activities(params){
+        return fetch('vote_activities/section',params,'get')
+    },
+    getVotes(params){
+        return fetch('votes',params,'get')
+    },
+    getNotices(params){
+        return fetch('/notices',params,'get')
+    },
+    getNotice(params){
+        return fetch('/notice',params,'get')
+    },
+    upload(params){
+        return fetchFormData('/house/cert',params,)
+    },
+    houseBlind(params){
+        return fetch('house/passport/',params,'put')
+    },
+    //投票 choice
+    voteItem(params){
+        return fetch('choice',params,'put')
+    },
+    getVoteResult(params){
+        return fetch('vote/result',params,'get')
+    },
+    getSuggestion(params){
+        return fetch('suggestion/s',params,'get')
+    },
+    getVoteOptions(params){
+        return fetch('option/s',params,'get')
+    },
+    getEstates(params){
+        return fetch('estates/',params,'get')
+    },
+
+}

BIN=BIN
src/assets/logo.png


BIN=BIN
src/assets/sport.png


+ 26 - 0
src/components/scrollBox.vue

@@ -0,0 +1,26 @@
+<template>
+<div class="scrollBox"
+     ref="scrollView"
+     @scroll="handleScroll"
+     id="scroll-view">
+      <slot></slot>
+</div>
+</template>
+
+<script>
+export default {
+  name: "scrollBox",
+  methods: {
+    handleScroll(e) {
+      const {scrollTop, clientHeight, scrollHeight} = e.target
+      if (scrollTop + clientHeight > scrollHeight){
+        this.$emit('touchBottom')
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 38 - 0
src/components/searchBox.vue

@@ -0,0 +1,38 @@
+<template>
+<div class="searchBox">
+  <i class="iconfont icon-search"></i>
+  <input type="text" class="input">
+</div>
+</template>
+
+<script>
+export default {
+  name: "searchBox"
+}
+</script>
+
+<style scoped lang="less">
+.searchBox{
+  width: 327px;
+  height: 48px;
+  background: #F4F5F6;
+  border-radius: 8px;
+  opacity: 0.8;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  .input{
+    border: none;
+    outline: none;
+    background-color:#F4F5F6;
+    width: 240px;
+    height: 40px;
+  }
+  i{
+    position: absolute;
+    top:15px;
+    left:15px;
+  }
+}
+</style>

+ 48 - 0
src/components/suggestionItem.vue

@@ -0,0 +1,48 @@
+<template>
+<div class="suggestionItem">
+  <span class="item-header">{{ params.passportName }}</span>
+  <span class="content">
+    {{ params.suggestion }}
+  </span>
+</div>
+</template>
+
+<script>
+export default {
+  name: "suggestionItem",
+  props:{
+    params:{
+      default:()=>{}
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.suggestionItem{
+  width: calc(100% - 40px);
+  background: #FFFFFF;
+  padding: 20px;
+  box-shadow: 0px 13px 40px 0px rgba(27,25,86,0.06);
+  border-radius: 16px;
+  display: flex;
+  flex-direction: column;
+  .item-header{
+    font-size: 16px;
+    font-family: PingFangSC-Regular, PingFang SC;
+    font-weight: 400;
+    color: #01040D;
+    line-height: 24px;
+    width: 100%;
+    margin-bottom: 5px;
+  }
+  .content{
+    font-size: 14px;
+    font-family: PingFangSC-Regular, PingFang SC;
+    font-weight: 400;
+    color: #01040D;
+    line-height: 22px;
+    width: 100%;
+  }
+}
+</style>

+ 5 - 1
src/main.js

@@ -2,9 +2,13 @@ import Vue from 'vue'
 import App from './App.vue'
 import router from './router'
 import store from './store'
+import api from "@/api/api";
+import Vant from 'vant';
+import 'vant/lib/index.css';
 
+Vue.use(Vant);
 Vue.config.productionTip = false
-
+Vue.prototype.$api = api
 new Vue({
   router,
   store,

+ 64 - 11
src/router/index.js

@@ -1,27 +1,80 @@
 import Vue from 'vue'
 import VueRouter from 'vue-router'
-import HomeView from '../views/HomeView.vue'
+import HomeView from '../views/Home/Home'
 
 Vue.use(VueRouter)
 
 const routes = [
   {
-    path: '/',
-    name: 'home',
-    component: HomeView
+    path: '/welcome',
+    name: 'welcome',
+    component: ()=>import('../views/signAndResiger/welcome')
   },
   {
-    path: '/about',
-    name: 'about',
-    // route level code-splitting
-    // this generates a separate chunk (about.[hash].js) for this route
-    // which is lazy-loaded when the route is visited.
-    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
-  }
+    path: '/login',
+    name: 'login',
+    component: ()=>import('../views/signAndResiger/login')
+  },{
+    path: '/resiger',
+    name: 'resiger',
+    component: ()=>import('../views/signAndResiger/resiger')
+  },{
+    path: '/voteDetial',
+    name: 'voteDetial',
+    component: ()=>import('../views/fuzhu/voteDetial')
+  },{
+    path: '/meetingDetial',
+    name: 'meetingDetial',
+    component: ()=>import('../views/fuzhu/meetingDetial')
+  },{
+    path: '/binding',
+    name: 'binding',
+    component: ()=>import('../views/signAndResiger/binding')
+  },{
+    path: '/newsPage',
+    name: 'newsPage',
+    component: ()=>import('../views/fuzhu/newsPage')
+  },{
+    path: '/announcementList',
+    name: 'announcementList',
+    component: ()=>import('../views/fuzhu/announcementList')
+  },{
+    path: '/meetingList',
+    name: 'meetingList',
+    component: ()=>import('../views/fuzhu/meetingList')
+  },{
+    path: '/voteModel',
+    name: 'voteModel',
+    component: ()=>import('../views/fuzhu/voteModel')
+  },
+  {
+    path: '/Main',
+    name: 'Main',
+    component: ()=>import('../views/Home/Main'),
+    children:[
+      {
+        path: '/home',
+        name: 'home',
+        component: HomeView
+      },
+      {
+        path: '/my',
+        name: 'my',
+        component: ()=>import('../views/Home/my')
+      },
+    ]
+  },
 ]
 
 const router = new VueRouter({
   routes
 })
+router.beforeEach((to,from,next)=>{
+  if(to.path=='/'){
+    next('/welcome')
+  }else{
+    next()
+  }
+})
 
 export default router

+ 0 - 5
src/views/AboutView.vue

@@ -1,5 +0,0 @@
-<template>
-  <div class="about">
-    <h1>This is an about page</h1>
-  </div>
-</template>

+ 40 - 0
src/views/Home/Home.vue

@@ -0,0 +1,40 @@
+<template>
+  <div class="home">
+    <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
+      <van-swipe-item>1</van-swipe-item>
+      <van-swipe-item>2</van-swipe-item>
+      <van-swipe-item>3</van-swipe-item>
+      <van-swipe-item>4</van-swipe-item>
+    </van-swipe>
+    <vote></vote>
+    <announcement></announcement>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+import announcement from "@/views/Home/module/announcement";
+import vote from "@/views/Home/module/vote";
+export default {
+  name: 'Home',
+  components:{
+    announcement,
+    vote
+  }
+
+}
+</script>
+<style scoped lang="less">
+.home{
+  .my-swipe{
+    margin: 0 auto;
+  }
+  .my-swipe .van-swipe-item {
+    color: #fff;
+    font-size: 20px;
+    line-height: 200px;
+    text-align: center;
+    background-color: #39a9ed;
+  }
+}
+</style>

+ 31 - 0
src/views/Home/Main.vue

@@ -0,0 +1,31 @@
+<template>
+<div class="Main">
+  <div class="router-view">
+    <router-view/>
+  </div>
+  <bottomMenu></bottomMenu>
+</div>
+</template>
+
+<script>
+import bottomMenu from "@/views/Home/module/bottomMenu";
+export default {
+  name: "Main",
+  components:{
+    bottomMenu
+  }
+}
+</script>
+
+<style scoped lang="less">
+.Main{
+  width: 100%;
+  height: 100%;
+  .router-view{
+    width: 100%;
+    height: calc(100% - 90px);
+    overflow: hidden;
+    overflow-y: auto;
+  }
+}
+</style>

+ 50 - 0
src/views/Home/module/announcement.vue

@@ -0,0 +1,50 @@
+<template>
+  <voteCard :title="'小区公告'" @click="goMore">
+    <van-skeleton  :row="3" :loading="loading">
+      <announcementItem v-for="(item,index) in list" :key="index" :params="item" class="announcementItem"></announcementItem>
+    </van-skeleton>
+
+  </voteCard>
+</template>
+
+<script>
+import voteCard from "@/views/Home/module/voteCard";
+import announcementItem from "@/views/Home/module/announcementItem";
+export default {
+  name: "announcement",
+  components:{
+    voteCard,announcementItem
+  },
+  data(){
+    return {
+      loading:true,
+      list:[],
+    }
+  },
+  mounted() {
+    this.getNotices();
+  },
+  methods:{
+    getNotices(){
+      let params = {
+        type:'1',
+        page:1,
+        pageCapacity:3
+      }
+      this.$api.getNotices(params).then(res=>{
+        this.loading = false
+        this.list = res.content.list
+      })
+    },
+    goMore(){
+      this.$router.push({name:'announcementList'})
+    },
+  }
+}
+</script>
+
+<style scoped>
+.announcementItem{
+  margin-top: 15px;
+}
+</style>

+ 88 - 0
src/views/Home/module/announcementItem.vue

@@ -0,0 +1,88 @@
+<template>
+  <div class="cardItem" @click="goDetial">
+    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+    <div class="right">
+      <span class="title">{{ params.title }}</span>
+      <span class="des">{{ params.secondTitle }}</span>
+      <span class="time">发布时间:{{params.publishTime }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "cardItem",
+  props:{
+    params:{
+      default:()=>{}
+    }
+  },
+  methods:{
+    goDetial(){
+      this.$router.push({name:'newsPage',query:{id:this.params.id}})
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+.cardItem{
+  width: 327px;
+  height: 95px;
+  background: #FFFFFF;
+  box-shadow: 0px 13px 40px 0px rgba(27,25,86,0.06);
+  border-radius: 10px;
+  display: flex;
+  align-items: center;
+  .img{
+    width: 60px;
+    height: 60px;
+    padding: 15px;
+    border-radius: 20px;
+  }
+  .right{
+    display: flex;
+    flex-direction: column;
+    text-align: left;
+    .title{
+      font-size: 18px;
+      font-family: PingFangSC-Medium, PingFang SC;
+      font-weight: 500;
+      color: #01040D;
+      white-space: nowrap;
+
+      word-break: break-all;
+      width: 200px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+    .des{
+      margin-top: 5px;
+      display: inline-block;
+      white-space: nowrap;
+
+      //display: -webkit-box;
+      //  overflow: hidden;
+      //  text-overflow:ellipsis;
+      //  white-space: nowrap;
+
+      word-break: break-all;
+      width: 200px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      font-size: 13px;
+      font-weight: 400;
+      color: #75818F;
+      text-shadow: 0px 13px 40px rgba(27,25,86,0.06);
+
+    }
+    .time{
+      font-size: 12px;
+      display: inline-block;
+      margin-top: 5px;
+      text-align: right;
+    }
+  }
+
+}
+</style>

+ 50 - 0
src/views/Home/module/bottomMenu.vue

@@ -0,0 +1,50 @@
+<template>
+<div class="bottomMenu">
+  <div :class="['btnbox',{active:routerName == 'home'}]" @click="$router.push({name:'home'})">
+    <van-icon name="gem"  size="25"/>
+    <span>首页</span>
+  </div>
+  <div :class="['btnbox',{active:routerName == 'my'}]" @click="$router.push({name:'my'})">
+    <van-icon name="map-marked" size="25"/>
+    <span>我的</span>
+  </div>
+</div>
+</template>
+
+<script>
+export default {
+  name: "bottomMenu",
+  computed:{
+    routerName(){
+      return this.$route.name
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.bottomMenu{
+  height: 89px;
+  border-top: 1px solid #F4F5F6;
+  display: flex;
+  justify-content: space-around;
+  align-items: center;
+  .btnbox{
+    display: flex;
+    flex-direction: column;
+    color:#75818F;
+    span{
+      font-size: 13px;
+      margin-top: 6px;
+    }
+  }
+  .active{
+    color:#6C5DD3;
+    font-weight: 600;
+    span{
+      color:black;
+
+    }
+  }
+}
+</style>

+ 87 - 0
src/views/Home/module/cardItem.vue

@@ -0,0 +1,87 @@
+<template>
+<div class="cardItem" @click="goDetial">
+  <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+  <div class="right">
+    <span class="title">{{ params.title }}</span>
+    <span class="des">{{ params.content }}</span>
+    <span class="time">截至日期: {{ params.deadline }}</span>
+  </div>
+</div>
+</template>
+
+<script>
+export default {
+  name: "cardItem",
+  props:{
+    params:{
+      default:()=>{}
+    }
+  },
+  methods:{
+    goDetial(){
+      this.$router.push({name:'meetingDetial',query:{id:this.params.id}})
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+.cardItem{
+  width: 327px;
+  height: 95px;
+  background: #FFFFFF;
+  box-shadow: 0px 13px 40px 0px rgba(27,25,86,0.06);
+  border-radius: 10px;
+  display: flex;
+  align-items: center;
+  .img{
+    width: 60px;
+    height: 60px;
+    padding: 15px;
+    border-radius: 20px;
+  }
+  .right{
+    display: flex;
+    flex-direction: column;
+    text-align: left;
+    .title{
+      font-size: 18px;
+      font-family: PingFangSC-Medium, PingFang SC;
+      font-weight: 500;
+      color: #01040D;
+      word-break: break-all;
+      width: 200px;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+    }
+    .des{
+      margin-top: 5px;
+      display: inline-block;
+      white-space: nowrap;
+
+      //display: -webkit-box;
+    //  overflow: hidden;
+    //  text-overflow:ellipsis;
+    //  white-space: nowrap;
+
+      word-break: break-all;
+      width: 200px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      font-size: 13px;
+      font-weight: 400;
+      color: #75818F;
+      text-shadow: 0px 13px 40px rgba(27,25,86,0.06);
+
+    }
+    .time{
+      font-size: 12px;
+      display: inline-block;
+      margin-top: 5px;
+      text-align: right;
+    }
+  }
+
+}
+</style>

+ 50 - 0
src/views/Home/module/vote.vue

@@ -0,0 +1,50 @@
+<template>
+  <voteCard :title="'会议决策'" @click="goMore">
+    <van-skeleton   :row="3" :loading="loading">
+      <cardItem v-for="(item,index) in list" :key="index" :params="item" class="cardItem"></cardItem>
+    </van-skeleton>
+  </voteCard>
+</template>
+
+<script>
+import voteCard from "@/views/Home/module/voteCard";
+import cardItem from "@/views/Home/module/cardItem";
+export default {
+  name: "vote",
+  components:{
+    voteCard,
+    cardItem
+  },
+  data(){
+    return {
+      list:[],
+      loading:true
+    }
+  },
+  mounted() {
+    this.getVote_activities();
+  },
+  methods:{
+    getVote_activities(){
+      let params = {
+        pageNum:1,
+        pageCapacity:3,
+        key:'',
+      }
+      this.$api.getVote_activities(params).then(res=>{
+        this.loading = false
+        this.list = res.content.voteActivityViewDtos
+      })
+    },
+    goMore(){
+      this.$router.push({name:'meetingList'})
+    },
+  }
+}
+</script>
+
+<style scoped>
+.cardItem{
+  margin-top: 15px;
+}
+</style>

+ 48 - 0
src/views/Home/module/voteCard.vue

@@ -0,0 +1,48 @@
+<template>
+  <div class="voteCard">
+    <div class="header">
+      <span class="title">{{ title }}</span>
+      <span class="more" @click="$emit('click')">查看全部</span>
+    </div>
+    <div class="slot">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "voteCard",
+  props:{
+    title:{
+      default:''
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.voteCard {
+  width: calc(100% - 70px);
+  padding: 35px;
+  .header{
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+  }
+  .title {
+    font-size: 18px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 24px;
+  }
+
+  .more {
+    font-size: 14px;
+    font-family: PingFangSC-Regular, PingFang SC;
+    font-weight: 400;
+    color: #6C5DD3;
+  }
+}
+</style>

+ 77 - 0
src/views/Home/module/voteItem.vue

@@ -0,0 +1,77 @@
+
+<template>
+  <div class="voteItem" @click="goDetial">
+    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+    <div class="right">
+      <span class="title">{{ params.title }}</span>
+      <span class="des">{{ params.content }}</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "voteItem",
+  props:{
+    params:{
+      default:()=>{}
+    }
+  },
+  methods:{
+    goDetial(){
+      this.$router.push({name:'voteDetial',query:{id:this.params.id,title:this.params.title,content:this.params.content}})
+    },
+  },
+}
+</script>
+
+<style scoped lang="less">
+.voteItem{
+  width: 327px;
+  height: 95px;
+  background: #FFFFFF;
+  box-shadow: 0px 13px 40px 0px rgba(27,25,86,0.06);
+  border-radius: 10px;
+  display: flex;
+  align-items: center;
+  .img{
+    width: 60px;
+    height: 60px;
+    padding: 15px;
+    border-radius: 20px;
+  }
+  .right{
+    display: flex;
+    flex-direction: column;
+    text-align: left;
+    .title{
+      font-size: 18px;
+      font-family: PingFangSC-Medium, PingFang SC;
+      font-weight: 500;
+      color: #01040D;
+    }
+    .des{
+      margin-top: 10px;
+      display: inline-block;
+      white-space: nowrap;
+
+      //display: -webkit-box;
+      //  overflow: hidden;
+      //  text-overflow:ellipsis;
+      //  white-space: nowrap;
+
+      word-break: break-all;
+      width: 200px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      height: 20px;
+      font-size: 13px;
+      font-weight: 400;
+      color: #75818F;
+      text-shadow: 0px 13px 40px rgba(27,25,86,0.06);
+
+    }
+  }
+
+}
+</style>

+ 147 - 0
src/views/Home/my.vue

@@ -0,0 +1,147 @@
+<template>
+<div class="my">
+  <div class="logo">
+    <img src="http://121.5.58.50:8088/logo.png" alt="">
+  </div>
+  <div class="header">
+    <div class="left">
+      <span class="title">{{ userInfo.mobile }}</span>
+      <span class="des">{{ userInfo.houseAddress || '未绑定房产信息'  }}</span>
+    </div>
+    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+  </div>
+  <div class="join" @click="goBinding">
+    <img class="img" src="http://121.5.58.50:8088/sport.png" alt="">
+    <div class="right">
+      <span class="title">绑定房屋信息,完善业主档案,参与业主委员会投票!</span>
+    </div>
+  </div>
+</div>
+</template>
+
+<script>
+export default {
+  name: "my",
+  data(){
+    return {
+      userInfo:{}
+    }
+  },
+  mounted() {
+    this.getUserInfo()
+  },
+  methods:{
+    getUserInfo(){
+      this.$api.getUserInfo().then(res=>{
+        this.userInfo = res.content
+      })
+    },
+    goBinding(){
+      this.$router.push({name:'binding'})
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.my{
+  .logo{
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin: 30px 0;
+    img{
+      width: 40px;
+      height: 40px;
+      border-radius: 100%;
+    }
+  }
+  .header{
+    display: flex;
+    margin: 36px;
+    justify-content: space-between;
+    align-items: center;
+    width: calc(100% - 72px);
+    .left{
+      display: flex;
+      flex-direction: column;
+      span{
+        display: inline-block;
+        width: 100%;
+        text-align: left;
+      }
+      .title{
+        font-size: 24px;
+        font-family: PingFangSC-Medium, PingFang SC;
+        font-weight: 500;
+        color: #01040D;
+        line-height: 32px;
+      }
+      .des{
+        font-size: 14px;
+        font-family: PingFangSC-Regular, PingFang SC;
+        font-weight: 400;
+        color: #75818F;
+        line-height: 22px;
+        margin-top: 10px;
+      }
+    }
+    .img{
+        width: 48px;
+      height: 48px;
+      border-radius: 20px;
+    }
+  }
+  .join{
+    width: 327px;
+    height: 95px;
+    background: #9586FB;
+    margin: 0 auto;
+    box-shadow: 0px 13px 40px 0px rgba(27,25,86,0.06);
+    border-radius: 10px;
+    display: flex;
+    align-items: center;
+    color: white;
+    .img{
+      width: 60px;
+      height: 60px;
+      padding: 15px;
+      border-radius: 20px;
+    }
+    .right{
+      display: flex;
+      flex-direction: column;
+      .title{
+        font-size: 16px;
+        font-family: PingFangSC-Medium, PingFang SC;
+        font-weight: 500;
+        color: white;
+        text-align: left;
+      }
+      .des{
+        margin-top: 10px;
+        display: inline-block;
+        white-space: nowrap;
+
+        //display: -webkit-box;
+        //  overflow: hidden;
+        //  text-overflow:ellipsis;
+        //  white-space: nowrap;
+
+        word-break: break-all;
+        width: 200px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        height: 40px;
+        font-size: 13px;
+        font-weight: 400;
+        color: #75818F;
+        text-shadow: 0px 13px 40px rgba(27,25,86,0.06);
+
+      }
+    }
+  }
+
+}
+</style>

+ 0 - 18
src/views/HomeView.vue

@@ -1,18 +0,0 @@
-<template>
-  <div class="home">
-    <img alt="Vue logo" src="../assets/logo.png">
-    <HelloWorld msg="Welcome to Your Vue.js App"/>
-  </div>
-</template>
-
-<script>
-// @ is an alias to /src
-import HelloWorld from '@/components/HelloWorld.vue'
-
-export default {
-  name: 'HomeView',
-  components: {
-    HelloWorld
-  }
-}
-</script>

+ 80 - 0
src/views/fuzhu/announcementList.vue

@@ -0,0 +1,80 @@
+<template>
+<div class="announcementList">
+  <searchBox class="searchBox"></searchBox>
+    <scrollBox class="announcementBox" @touchBottom="touchBottom">
+      <announcementItem class="announcementItem" v-for="(item,index) in list" :key="index" :params="item"></announcementItem>
+    </scrollBox>
+</div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import announcementItem from "@/views/Home/module/announcementItem";
+import scrollBox from "@/components/scrollBox";
+export default {
+  name: "announcementList",
+  components:{
+    searchBox,
+    announcementItem,
+    scrollBox
+  },
+  mounted() {
+    this.getNotices();
+  },
+  data(){
+    return {
+      list:[],
+      page:1,
+      hasNext:true
+    }
+  },
+  methods:{
+    touchBottom(){
+      this.page ++
+      this.getNotices()
+    },
+    getNotices(){
+      if(!this.hasNext) return
+      let params = {
+        type:'0',
+        pageNum:this.page,
+        pageCapacity:10
+      }
+      this.$api.getNotices(params).then(res=>{
+        this.loading = false
+        if(res.content.list.length<10){
+          this.hasNext = false
+        }
+        this.list = [...this.list,...res.content.list]
+      })
+    },
+
+  }
+}
+</script>
+
+<style scoped lang="less">
+.announcementList{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  .announcementBox{
+    height: calc(100% - 78px);
+    overflow-y: auto;
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+  }
+
+  .searchBox{
+    margin: 30px 0;
+  }
+  .announcementItem{
+    margin-bottom: 15px;
+  }
+}
+
+</style>

+ 62 - 0
src/views/fuzhu/meetingDetial.vue

@@ -0,0 +1,62 @@
+
+<template>
+  <div class="meetingDetial">
+    <div class="header">
+
+    </div>
+    <div class="voteBox">
+      <voteItem class="voteItem" v-for="(item,index) in list" :key="index" :params="item"></voteItem>
+    </div>
+  </div>
+</template>
+
+<script>
+import voteItem from "@/views/Home/module/voteItem";
+export default {
+  name: "meetingDetial",
+  components:{
+    voteItem
+  },
+  data(){
+    return {
+      list:[]
+    }
+  },
+  mounted() {
+    this.getVotes();
+  },
+  methods:{
+    getVotes(){
+      this.$api.getVotes({activityId:this.$route.query.id}).then(res=>{
+        this.list = res.content
+      })
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+.meetingDetial{
+  width: 100%;
+  height: 100%;
+  .header{
+    background: url("http://121.5.58.50:8088/sport.png");
+    background-size: 100%;
+    height: 300px;
+    border-bottom-left-radius: 20px;
+    border-bottom-right-radius: 20px;
+  }
+  .voteBox{
+    margin-top: -50px;
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    height: calc(100% - 250px);
+    overflow-y: auto;
+    .voteItem{
+      margin-bottom: 15px;
+    }
+  }
+}
+</style>

+ 81 - 0
src/views/fuzhu/meetingList.vue

@@ -0,0 +1,81 @@
+
+<template>
+  <div class="meetingList">
+    <searchBox class="searchBox"></searchBox>
+      <scrollBox class="announcementBox">
+        <cardItem v-for="(item,index) in list" :key="index" :params="item" class="cardItem"></cardItem>
+      </scrollBox>
+  </div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import cardItem from "@/views/Home/module/cardItem";
+import scrollBox from "@/components/scrollBox";
+export default {
+  name: "announcementList",
+  components:{
+    searchBox,
+    cardItem,
+    scrollBox
+  },
+  data(){
+    return {
+      list:[],
+      page:1,
+      hasNext:true,
+      loading:false,
+    }
+  },
+  mounted() {
+    this.getVote_activities()
+  },
+  methods:{
+    touchBottom(){
+      this.page ++
+      this.getNotices()
+    },
+    getVote_activities(){
+      if(!this.hasNext) return
+      this.loading = true
+      let params = {
+        pageNum:this.page,
+        pageCapacity:10,
+        key:'',
+      }
+      this.$api.getVote_activities(params).then(res=>{
+        this.loading = false
+        if(res.content.voteActivityViewDtos.length<10){
+          this.hasNext = false
+        }
+        this.list = [...this.list,...res.content.voteActivityViewDtos]
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.meetingList{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  .searchBox{
+    margin: 30px 0;
+  }
+  .cardItem{
+    margin-bottom: 15px;
+  }
+  .announcementBox{
+    height: calc(100% - 78px);
+    overflow-y: auto;
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+  }
+}
+
+</style>

+ 100 - 0
src/views/fuzhu/newsPage.vue

@@ -0,0 +1,100 @@
+<template>
+<div class="newsPage">
+  <div class="header">
+    <span class="title">{{ info.title }}</span>
+    <span class="des">{{ info.secondTitle }}</span>
+  </div>
+  <div class="content">
+    <span class="tip">业主委员会  &nbsp;   |  &nbsp;  {{ info.publishTime }}</span>
+    <p v-html="info.content"></p>
+  </div>
+
+
+</div>
+</template>
+
+<script>
+export default {
+  name: "newsPage",
+  mounted() {
+    this.getNotice()
+  },
+  methods:{
+    getNotice(){
+      this.$api.getNotice({noticeId:this.$route.query.id}).then(res=>{
+        this.info = res.content
+      })
+    },
+  },
+  data(){
+    return {
+      info:{
+
+      }
+    }
+  },
+}
+</script>
+
+<style scoped lang="less">
+.newsPage{
+  .header{
+    width: 100%;
+    height: 371px;
+    background-image: url("http://121.5.58.50:8088/sport.png");
+    background-size: 100% 100%;
+    position: relative;
+    .title{
+      padding: 24px;
+      display: inline-block;
+      font-size: 28px;
+      font-family: PingFangSC-Medium, PingFang SC;
+      font-weight: 500;
+      color: #FFFFFF;
+      line-height: 36px;
+      text-shadow: 0px 5px 15px rgba(31,19,120,0.15);
+      position: absolute;
+      bottom: 70px;
+    }
+    .des{
+      display: inline-block;
+      font-size: 14px;
+      font-family: PingFangSC-Regular, PingFang SC;
+      font-weight: 400;
+      color: #FFFFFF;
+      line-height: 22px;
+      height: 45px;
+      text-shadow: 0px 5px 15px rgba(31,19,120,0.15);
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      -webkit-line-clamp: 3;
+      overflow: hidden;
+      padding: 24px;
+      position: absolute;
+      bottom: 10px;
+
+    }
+  }
+  .content{
+    padding: 24px;
+    .tip{
+      font-size: 14px;
+      font-family: PingFangSC-Regular, PingFang SC;
+      font-weight: 400;
+      color: #75818F;
+      line-height: 22px;
+      margin-bottom: 30px;
+      display: inline-block;
+    }
+    p{font-size: 16px;
+      font-family: PingFangSC-Regular, PingFang SC;
+      font-weight: 400;
+      color: #01040D;
+      line-height: 24px;
+
+    }
+  }
+
+
+}
+</style>

+ 128 - 0
src/views/fuzhu/voteDetial.vue

@@ -0,0 +1,128 @@
+<template>
+  <div class="voteDetial">
+    <span class="title">投票:{{ $route.query.title }}?</span>
+    <span class="des">{{ $route.query.content }}</span>
+    <div class="voteBox">
+      <van-skeleton  :row="3" :loading="loading">
+        <van-radio-group v-model="radio" :label-position="'left'" >
+          <van-radio  class="van-radio" :name="item.id" checked-color="#5DD8D0" v-for="(item,index) in list" :key="index">{{ item.value }}</van-radio>
+        </van-radio-group>
+        <input class="input" type="text" placeholder="意见和建议" v-model="suggestion" >
+      </van-skeleton>
+
+
+    </div>
+    <div class="btn" @click="goSubmit" >进行投票</div>
+    <div class="btn btn1" @click="goSee">查看投票情况</div>
+  </div>
+</template>
+
+<script>
+import { Dialog,Notify  } from 'vant';
+export default {
+  name: "voteDetial",
+  data(){
+    return {
+      radio:'',
+      suggestion:'',
+      list:[],
+      loading:false
+    }
+  },
+  mounted() {
+    this.getVoteOptions()
+  },
+  methods:{
+    getVoteOptions(){
+      this.loading = true
+      this.$api.getVoteOptions({voteId:this.$route.query.id}).then(res=>{
+        this.loading = false
+        this.list = res.content
+      })
+    },
+    goSee(){
+      this.$router.push({name:'voteModel',query:{id:this.$route.query.id}})
+    },
+    goSubmit(){
+      if(this.radio == ''){
+        return;
+      }
+      Dialog.confirm({
+        title: '提示',
+        message: '确认提交?提交后无法再修改提交结果。',
+      })
+          .then(() => {
+            let params = {
+              optionId:this.radio,
+              suggestion:this.suggestion
+            }
+            this.$api.voteItem(params).then(res=>{
+              Notify({ type: 'success', message: '提交成功' });
+            })
+          })
+          .catch(() => {
+            // on cancel
+          });
+
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+input{
+  width: 299px;
+  padding: 0 10px;
+  height: 48px;
+  background: #F4F5F6;
+  border-radius: 8px;
+  opacity: 0.8;
+  border: none;
+  outline: none;
+}
+.voteDetial{
+  width: 100%;
+  .title{
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+    font-size: 28px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 36px;
+    text-align: left;
+    margin-bottom: 20px;
+    margin-top: 20px;
+  }
+  .des{
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+    text-align: left;
+    margin-bottom: 50px;
+  }
+  .voteBox{
+    width: 319px;
+    margin: 0 auto;
+    .van-radio{
+      //width: 319px;
+      height: 48px;
+      background: #F4F5F6;
+      border-radius: 8px;
+      opacity: 0.8;
+      padding: 0 30px;
+      margin-bottom: 15px;
+    }
+    margin-bottom: 50px;
+  }
+}
+.btn1{
+  background-color: white;
+  color: #6C5DD3;
+  border-color: #6C5DD3;
+  margin-top: 20px;
+  box-shadow:  0 0 3px #6C5DD3;
+}
+
+</style>

+ 167 - 0
src/views/fuzhu/voteModel.vue

@@ -0,0 +1,167 @@
+<template>
+
+    <div class="voteModel">
+    <span class="title">
+        投票详情:{{info.title}}
+    </span>
+      <span class="des">
+        {{info.content}}
+    </span>
+      <div class="voteBox">
+        <div class="label" v-for="(item,index) in options" :key="index">
+          <van-circle v-model="item.percent" layer-color="#ebedf0" :rate="item.percent" :speed="100" color="#5DD8D0" :text="item.percent.toFixed(0) + '%'" />
+          <span>{{ item.value }}</span>
+        </div>
+      </div>
+      <van-cell class="van-cell" :title="item.value" icon="shop-o" v-for="(item,index) in options">
+        <!-- 使用 right-icon 插槽来自定义右侧图标 -->
+        <span>{{item.quantity}}票</span>
+      </van-cell>
+<!--      <div class="suggestions">-->
+<!--        <div class="sHeader">-->
+<!--          <span>意见箱</span>-->
+<!--        </div>-->
+<!--        <div class="body">-->
+<!--          <suggestionItem class="suggestionItem" v-for="(item,index) in suggestions" :key="index" :params="item"></suggestionItem>-->
+<!--        </div>-->
+<!--      </div>-->
+      <van-popup v-model="show" round position="bottom" :style="{ height: '30%' }" >
+        <div class="avatorBox">
+          <img v-for="item in new Array(29)" class="avator" src="http://121.5.58.50:8088/sport.png" alt="">
+        </div>
+      </van-popup>
+    </div>
+
+
+</template>
+
+<script>
+import suggestionItem from "@/components/suggestionItem";
+import scrollBox from "@/components/scrollBox";
+export default {
+  name: "voteModel",
+  components:{
+    suggestionItem,scrollBox
+  },
+  data() {
+    return {
+      currentRate: 33,
+      show:false,
+      options:[],
+      info:{},
+      page:1,
+      pageCapacity:10,
+      suggestions:[],
+      hasNext:true,
+      loading:false,
+    };
+  },
+  mounted() {
+    this.getVoteResult()
+    // this.getSuggestion()
+  },
+  methods: {
+    touchBottom(){
+      this.page ++
+      this.getSuggestion()
+    },
+    getSuggestion(){
+      // if(!this.hasNext) return
+      // this.loading = true
+      // let params = {
+      //   voteId:this.$route.query.id,
+      //   page:this.page,
+      //   pageCapacity:this.pageCapacity,
+      // }
+      // this.$api.getSuggestion(params).then(res=>{
+      //   this.loading = false
+      //   if(res.content.suggestions.length<10){
+      //     this.hasNext = false
+      //   }
+      //   this.suggestions = [...this.suggestions,...res.content.suggestions]
+      // })
+    },
+    getVoteResult(){
+      this.$api.getVoteResult({voteId:this.$route.query.id}).then(res=>{
+        this.options = res.content.items
+        this.info = res.content
+      })
+    },
+    text() {
+      return this.currentRate.toFixed(0) + '%';
+    },
+  },
+
+}
+</script>
+
+<style scoped lang="less">
+.scroll{
+  //height: calc(100% - 48px);
+  height: 100%;
+  overflow-y: auto;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.voteModel/deep/.van-cell{
+  //overflow: auto!important;
+  overflow: visible;
+}
+.suggestions{
+  //margin-top: 30px;
+  width: calc(100% - 48px);
+  padding: 24px;
+  .suggestionItem{
+    margin-top: 15px;
+  }
+}
+
+.voteModel{
+  //padding: 24px;
+  height: 100%;
+  .title{
+    font-size: 24px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 32px;
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 24px;
+  }
+  .des{
+    display: inline-block;
+    margin-bottom: 30px;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+  }
+  .voteBox{
+    display: flex;
+    justify-content: space-around;
+    padding: 24px;
+    width: calc(100% - 48px);
+    flex-wrap: wrap;
+    .label{
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      margin-bottom: 20px;
+    }
+    margin-bottom: 30px;
+  }
+  .avatorBox{
+    padding: 30px;
+    display: flex;
+    justify-content: space-around;
+    flex-wrap: wrap;
+    .avator{
+      width: 50px;
+      height: 50px;
+      border-radius: 100%;
+      margin-bottom: 10px;
+    }
+  }
+}
+</style>

+ 213 - 0
src/views/signAndResiger/binding.vue

@@ -0,0 +1,213 @@
+<template>
+<div class="binding">
+  <span class="title">完善业主信息</span>
+  <div class="label">
+    <span class="small-title">业主基本信息</span>
+    <input type="text" placeholder="姓名" class="input" v-model="form.name">
+  </div>
+  <div class="label">
+    <span class="small-title">房屋信息</span>
+    <input type="text" placeholder="房产证号码" class="input" v-model="form.certificateNo">
+    <van-field
+        class="input-a"
+        v-model="fieldValue"
+        is-link
+        readonly
+        label="具体房屋信息"
+        placeholder="请选择具体位置"
+        @click="show = true"
+    />
+    <van-popup v-model="show" round position="bottom">
+      <van-cascader
+          :field-names="fieldNames"
+          v-model="cascaderValue"
+          title="请选择具体位置"
+          :options="options"
+          @change="onChange"
+          @close="show = false"
+          @finish="onFinish"
+      />
+    </van-popup>
+  </div>
+  <div class="label">
+    <span class="small-title">产证信息</span>
+    <van-uploader :max-count="1"  v-model="fileList" :after-read="afterRead" />
+  </div>
+  <div class="btn" @click="submit">提交信息</div>
+</div>
+</template>
+
+<script>
+import { Dialog } from 'vant';
+export default {
+  name: "binding",
+  data() {
+    return {
+      form:{
+        certificateNo:'',
+        certificatePhoto:'',
+        houseId:'',
+        name:''
+      },
+      fileList:[],
+      show: false,
+      fieldValue: '',
+      cascaderValue: '',
+      fieldNames:{
+        text:'name',
+        value:'id',
+        children:'children'
+      },
+      // 选项列表,children 代表子选项,支持多级嵌套
+      options: [
+      ],
+    };
+  },
+  mounted() {
+    this.getEstates();
+  },
+  methods: {
+    onChange(target){
+      if(target.selectedOptions[target.tabIndex].leaf == true){
+        this.form.houseId = String(target.value)
+      }else{
+        let params = {
+          estateUnitId:target.value
+        }
+        this.$api.getEstates(params).then(res=>{
+          target.selectedOptions[target.tabIndex].children = res.content.subs.map(x=>{
+            if(!x.leaf){
+              return {
+                ...x,
+                name:x.name+(x.exp?x.exp:''),
+                children:[]
+              }
+            }else{
+              return {
+                ...x,
+                name:x.name+(x.exp?x.exp:''),
+              }
+            }
+          })
+        })
+      }
+
+    },
+
+    getEstates(){
+      let params = {
+        estateUnitId:1
+      }
+      this.$api.getEstates(params).then(res=>{
+        console.log(res)
+        this.options = res.content.subs.map(x=>{
+          if(!x.leaf){
+            return {
+              ...x,
+              name:x.name+(x.exp?x.exp:''),
+              children:[]
+            }
+          }else{
+            return {
+              ...x,
+              name:x.name+(x.exp?x.exp:''),
+            }
+          }
+        })
+      })
+    },
+    submit(){
+
+      this.$api.houseBlind(this.form).then(res=>{
+        Dialog.alert({
+          title: '提交成功',
+          message: '请等待管理员审核通过后,参能参与实名后的活动',
+          theme: 'round-button',
+        })
+        this.$router.go(-1)
+      })
+    },
+    afterRead(file) {
+      let formData = new FormData()
+      formData.append('file',file.file)
+      this.$api.upload(formData).then(res=>{
+        this.form.certificatePhoto = res.content
+      })
+    },
+    // 全部选项选择完毕后,会触发 finish 事件
+    onFinish({ selectedOptions }) {
+      this.show = false;
+      this.fieldValue = selectedOptions.map((option) => option.name).join('/');
+    },
+  },
+}
+</script>
+
+<style scoped lang="less">
+/deep/.van-cell__right-icon{
+  margin-top: 12px;
+}
+.binding{
+  text-align: center;
+  .title{
+    display: inline-block;
+    width: calc(100% - 48px);
+    padding: 0 24px;
+    font-size: 28px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 36px;
+    text-align: left;
+    margin-bottom: 20px;
+    margin-top: 20px;
+  }
+  .label{
+    margin-bottom: 30px;
+
+    .small-title{
+      display: inline-block;
+      width: calc(100% - 48px);
+      padding: 0 24px;
+      font-size: 16px;
+      font-family: PingFangSC-Medium, PingFang SC;
+      font-weight: 500;
+      color: #01040D;
+      line-height: 36px;
+      text-align: left;
+      margin-bottom: 10px;
+    }
+  }
+  .input{
+    width: 310px;
+    padding: 0 15px;
+    height: 48px;
+    //display: flex;
+    //justify-content: center;
+    //align-items: center;
+    margin: 0 auto;
+    background: #F4F5F6;
+    border-radius: 8px;
+    opacity: 0.8;
+    border: none;
+    outline: none;
+    line-height: 50px;
+    margin-bottom: 15px;
+  }
+  .input-a{
+    width: 340px;
+    padding: 0 15px;
+    height: 48px;
+    //display: flex;
+    //justify-content: center;
+    //align-items: center;
+    margin: 0 auto;
+    background: #F4F5F6;
+    border-radius: 8px;
+    opacity: 0.8;
+    border: none;
+    outline: none;
+    line-height: 50px;
+  }
+}
+</style>

+ 151 - 0
src/views/signAndResiger/login.vue

@@ -0,0 +1,151 @@
+<template>
+  <div class="login">
+    <span class="title">欢迎回来!</span>
+    <div class="inputLabel">
+      <van-icon name="manager" class="icon"/>
+
+      <input type="text" placeholder="手机号码" v-model="form.mobile">
+    </div>
+    <div class="inputLabel" v-if="type == '1'">
+      <van-icon name="lock" class="icon"/>
+      <input type="password" placeholder="密码" v-model="password1" >
+    </div>
+    <div class="inputLabel" v-if="type == '2'">
+      <van-icon name="lock" class="icon"/>
+      <input type="text" placeholder="手机验证码" v-model="password2">
+      <div class="code" @click="goTimeOver">{{ over?'获取验证码':number }}</div>
+    </div>
+    <span class="change" @click="changeType" v-if="type == '1'">手机验证码登录</span>
+    <span class="change" @click="changeType"v-if="type == '2'">密码登录</span>
+    <div class="btn" @click="goLogin">
+      <span>登录</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "login",
+  methods:{
+    changeType(){
+      this.type = this.type == '1'?'2':'1'
+    },
+    goLogin(){
+      let params = {
+        ...this.form,
+        securityCode:this.type == '1'?this.password1:this.password2,
+        type:this.type
+      }
+      this.$api.login(params).then(res=>{
+        console.log(res)
+        this.$router.push({name:'home'})
+      })
+
+    },
+    goTimeOver(){
+      if(this.over){
+
+        this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
+          this.number = 60
+          this.over = false
+          this.timer = setInterval(()=>{
+            this.number --
+            if(this.number == 0){
+              this.over = true
+              clearInterval(this.timer)
+            }
+          },1000)
+        })
+      }else{
+
+      }
+
+    },
+  },
+  data(){
+    return {
+      form:{
+        mobile:'',
+        securityCode:''
+      },
+      password1:'',
+      password2:'',
+      type:'1',
+      timer:null,
+      over:true,
+      number:60
+    }
+  },
+}
+</script>
+
+<style scoped lang="less">
+.login{
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .inputLabel{
+    margin-bottom: 20px;
+    position: relative;
+    .icon{
+      position: absolute;
+      left:15px;top:12px;
+      font-size: 22px;
+    }
+    input{
+      width: 219px;
+      padding: 0 50px;
+      height: 48px;
+      background: #F4F5F6;
+      border-radius: 8px;
+      opacity: 0.8;
+      border: none;
+      outline: none;
+    }
+    .code{
+      position: absolute;
+      background-color: #6C5DD3;
+      color: white;
+      right: 0;top:0;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 30px;
+      padding: 10px 20px;
+      border-radius: 8px;
+    }
+  }
+  .change{
+    margin-bottom: 20px;
+    display: inline-block;
+    width: 90%;
+    text-align: right;
+    margin-right: 10%;
+  }
+  .btn{
+    width: 319px;
+    height: 56px;
+    background: #6C5DD3;
+    border-radius: 16px;
+    text-align: center;
+    line-height: 56px;
+    color: white;
+  }
+  .title{
+    width: 90%;
+    display: inline-block;
+    text-align: left;
+    height: 36px;
+    font-size: 28px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 36px;
+    margin-left: 10%;
+    margin-bottom: 60px;
+    margin-top: 30px;
+  }
+}
+</style>

+ 133 - 0
src/views/signAndResiger/resiger.vue

@@ -0,0 +1,133 @@
+
+<template>
+  <div class="login">
+    <span class="title">欢迎业主注册!</span>
+    <div class="inputLabel">
+      <input type="text" placeholder="请输入手机号码" v-model="form.mobile">
+    </div>
+    <div class="inputLabel">
+      <input type="text" placeholder="请输入密码" v-model="form.password">
+    </div>
+    <div class="inputLabel">
+      <input type="text" v-model="form.verificationCode" placeholder="请输入短信验证码">
+      <div class="code" @click="goTimeOver">{{ over?'获取验证码':number }}</div>
+    </div>
+    <div class="btn" @click="resiger">
+      <span>注册</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "resiger",
+  methods:{
+    resiger(){
+      let params = {
+        ...this.form
+      }
+        this.$api.resiger(params).then(res=>{
+          this.$router.push({name:'home'})
+        })
+    },
+    goTimeOver(){
+      if(this.over){
+
+        this.$api.verificationCode({mobile:this.form.mobile}).then(res=>{
+          this.number = 60
+          this.over = false
+          this.timer = setInterval(()=>{
+            this.number --
+            if(this.number == 0){
+              this.over = true
+              clearInterval(this.timer)
+            }
+          },1000)
+        })
+      }else{
+
+      }
+
+    },
+  },
+  data(){
+    return {
+      form:{
+        mobile:'',
+        password:'',
+        verificationCode:''
+      },
+      timer:null,
+      over:true,
+      number:60
+
+    }
+  },
+}
+</script>
+
+<style scoped lang="less">
+.login{
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .inputLabel{
+    margin-bottom: 20px;
+    position: relative;
+    input{
+      width: 299px;
+      padding: 0 10px;
+      height: 48px;
+      background: #F4F5F6;
+      border-radius: 8px;
+      opacity: 0.8;
+      border: none;
+      outline: none;
+    }
+    .code{
+      position: absolute;
+      background-color: #6C5DD3;
+      color: white;
+      right: 0;top:0;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 30px;
+      padding: 10px 20px;
+      border-radius: 8px;
+    }
+  }
+  .change{
+    margin-bottom: 20px;
+    display: inline-block;
+    width: 90%;
+    text-align: right;
+    margin-right: 10%;
+  }
+  .btn{
+    width: 319px;
+    height: 56px;
+    background: #6C5DD3;
+    border-radius: 16px;
+    text-align: center;
+    line-height: 56px;
+    color: white;
+  }
+  .title{
+    width: 90%;
+    display: inline-block;
+    text-align: left;
+    height: 36px;
+    font-size: 28px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #01040D;
+    line-height: 36px;
+    margin-left: 10%;
+    margin-bottom: 60px;
+    margin-top: 30px;
+  }
+}
+</style>

+ 90 - 0
src/views/signAndResiger/welcome.vue

@@ -0,0 +1,90 @@
+<template>
+<div class="welcome">
+  <div class="color1"></div>
+  <div class="color2"></div>
+  <div class="btn btn2" @click="goLogin">登录</div>
+  <div class="btn btn1" @click="goResiger">注册账号</div>
+  <span class="title2">欢迎来到 业主委员会</span>
+  <span class="title1">Welcome Owner's Committee</span>
+</div>
+</template>
+
+<script>
+export default {
+  name: "welcome",
+  methods:{
+    goLogin(){
+      this.$router.push({name:'login'})
+    },
+    goResiger(){
+      this.$router.push({name:'resiger'})
+    },
+  }
+}
+</script>
+
+<style scoped lang="less">
+.welcome{
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(180deg, #1E0D48 0%, #110531 100%);
+  position: relative;
+  display: flex;
+  flex-direction: column-reverse;
+  align-items: center;
+  .color1{
+    width: 359px;
+    height: 346px;
+    background: #7441F0;
+    opacity: 0.5;
+    filter: blur(100px);
+    position: absolute;
+    top:0;
+    left:0;
+  }
+  .color2{
+    width: 162px;
+    height: 389px;
+    background: #BF1A99;
+    opacity: 0.6;
+    filter: blur(100px);
+    position: absolute;
+    right: 0;
+    top:129px;
+  }
+  .btn{
+    width: 319px;
+    height: 56px;
+    border-radius: 16px;
+    color: white;
+    text-align: center;
+    line-height: 56px;
+    margin-bottom: 20px;
+  }
+  .btn1{
+    background: #6C5DD3;
+  }
+  .btn2{
+    background: rgba(255,255,255,0.1);
+    margin-bottom: 60px;
+  }
+  span{
+    color: white;
+  }
+  .title1{
+    margin-bottom: 20px;
+    display: inline-block;
+  }
+  .title2{
+    display: inline-block;
+    width: 180px;
+    height: 92px;
+    font-size: 36px;
+    font-family: PingFangSC-Medium, PingFang SC;
+    font-weight: 500;
+    color: #FFFFFF;
+    line-height: 46px;
+    margin-bottom: 40px;
+  }
+}
+</style>

+ 15 - 1
vue.config.js

@@ -1,4 +1,18 @@
 const { defineConfig } = require('@vue/cli-service')
 module.exports = defineConfig({
-  transpileDependencies: true
+  transpileDependencies: true,
+  productionSourceMap: false,
+  devServer: {
+    proxy: {
+      '/api': {     //这里最好有一个 /
+        target: 'http://121.5.58.50:8080',  // 后台接口域名
+        ws: true,        //如果要代理 websockets,配置这个参数
+        secure: false,  // 如果是https接口,需要配置这个参数
+        changeOrigin: true,  //是否跨域
+        pathRewrite: {
+          '^/api': ''
+        }
+      }
+    }
+  },
 })