Browse Source

前台提交

panhui 7 years ago
parent
commit
c8ef24d314
48 changed files with 2791 additions and 779 deletions
  1. 1 1
      src/main/java/com/izouma/awesomeadmin/web/BannerInfoController.java
  2. 1 1
      src/main/java/com/izouma/awesomeadmin/web/DistrictInfoController.java
  3. 1 1
      src/main/java/com/izouma/awesomeadmin/web/ProductInfoController.java
  4. 6 7
      src/main/vue/build/webpack.base.conf.js
  5. 13 18
      src/main/vue/build/webpack.dev.conf.js
  6. 7 539
      src/main/vue/package-lock.json
  7. 1 0
      src/main/vue/package.json
  8. BIN
      src/main/vue/src/assetsPre/Star.png
  9. BIN
      src/main/vue/src/assetsPre/contact1.png
  10. BIN
      src/main/vue/src/assetsPre/contact2.png
  11. BIN
      src/main/vue/src/assetsPre/contact3.png
  12. BIN
      src/main/vue/src/assetsPre/contact4.png
  13. BIN
      src/main/vue/src/assetsPre/contact5.png
  14. BIN
      src/main/vue/src/assetsPre/fankui1.png
  15. BIN
      src/main/vue/src/assetsPre/fankui2.png
  16. BIN
      src/main/vue/src/assetsPre/fankui3.png
  17. BIN
      src/main/vue/src/assetsPre/join.png
  18. BIN
      src/main/vue/src/assetsPre/kefu.png
  19. BIN
      src/main/vue/src/assetsPre/location.png
  20. BIN
      src/main/vue/src/assetsPre/location_pre.png
  21. BIN
      src/main/vue/src/assetsPre/newInfo.png
  22. BIN
      src/main/vue/src/assetsPre/newShop.png
  23. BIN
      src/main/vue/src/assetsPre/quckmenu.png
  24. BIN
      src/main/vue/src/assetsPre/quckmenu_sanjiao.png
  25. 153 0
      src/main/vue/src/components/GoodsLarge.vue
  26. 15 9
      src/main/vue/src/components/GoodsLittle.vue
  27. 99 0
      src/main/vue/src/components/MiniHead.vue
  28. 30 0
      src/main/vue/src/emUI.less
  29. 11 0
      src/main/vue/src/entries/index.html
  30. 6 1
      src/main/vue/src/entries/index.js
  31. 108 0
      src/main/vue/src/pagesPre/About.vue
  32. 185 59
      src/main/vue/src/pagesPre/App.vue
  33. 551 16
      src/main/vue/src/pagesPre/Business.vue
  34. 167 0
      src/main/vue/src/pagesPre/Contact.vue
  35. 404 45
      src/main/vue/src/pagesPre/Index.vue
  36. 140 0
      src/main/vue/src/pagesPre/Join.vue
  37. 6 1
      src/main/vue/src/pagesPre/Login.vue
  38. 3 3
      src/main/vue/src/pagesPre/LogoFoot.vue
  39. 16 14
      src/main/vue/src/pagesPre/LogoHead.vue
  40. 48 0
      src/main/vue/src/pagesPre/Main.vue
  41. 1 1
      src/main/vue/src/pagesPre/MenuFoot.vue
  42. 0 22
      src/main/vue/src/pagesPre/Periphery.vue
  43. 371 2
      src/main/vue/src/pagesPre/Product.vue
  44. 0 22
      src/main/vue/src/pagesPre/Sale.vue
  45. 392 0
      src/main/vue/src/pagesPre/Shop.vue
  46. 39 12
      src/main/vue/src/routerPre/index.js
  47. 15 4
      src/main/vue/src/vuexPre/index.js
  48. 1 1
      src/main/vue/static/weather_icons/font/weathericons-regular-webfont.svg

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/BannerInfoController.java

@@ -30,7 +30,7 @@ public class BannerInfoController {
     /**
     * <p>获取全部记录。</p>
     */
-    @RequiresAuthentication
+//    @RequiresAuthentication
     @RequestMapping(value = "/all", method = RequestMethod.GET)
     @ResponseBody
     public Result all(BannerInfo record) {

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/DistrictInfoController.java

@@ -30,7 +30,7 @@ public class DistrictInfoController {
     /**
     * <p>获取全部记录。</p>
     */
-    @RequiresAuthentication
+//    @RequiresAuthentication
     @RequestMapping(value = "/all", method = RequestMethod.GET)
     @ResponseBody
     public Result all(DistrictInfo record) {

+ 1 - 1
src/main/java/com/izouma/awesomeadmin/web/ProductInfoController.java

@@ -30,7 +30,7 @@ public class ProductInfoController {
     /**
     * <p>获取全部记录。</p>
     */
-    @RequiresAuthentication
+//    @RequiresAuthentication
     @RequestMapping(value = "/all", method = RequestMethod.GET)
     @ResponseBody
     public Result all(ProductInfo record) {

+ 6 - 7
src/main/vue/build/webpack.base.conf.js

@@ -11,7 +11,7 @@ function resolve(dir) {
 
 
 let entry = {}
-fs.readdirSync(path.resolve(__dirname, '../src/entries')).forEach(function (file) {
+fs.readdirSync(path.resolve(__dirname, '../src/entries')).forEach(function(file) {
     if (file.endsWith('.html')) {
         var moduleName = file.replace(/\.html$/, '')
         entry[moduleName] = `./src/entries/${moduleName}.js`
@@ -24,9 +24,9 @@ module.exports = {
     output: {
         path: config.build.assetsRoot,
         filename: '[name].js',
-        publicPath: process.env.NODE_ENV === 'production'
-            ? config.build.assetsPublicPath
-            : config.dev.assetsPublicPath
+        publicPath: process.env.NODE_ENV === 'production' ?
+            config.build.assetsPublicPath :
+            config.dev.assetsPublicPath
     },
     resolve: {
         extensions: ['.js', '.vue', '.json'],
@@ -36,8 +36,7 @@ module.exports = {
         }
     },
     module: {
-        rules: [
-            {
+        rules: [{
                 test: /\.vue$/,
                 loader: 'vue-loader',
                 options: vueLoaderConfig
@@ -85,4 +84,4 @@ module.exports = {
         tls: 'empty',
         child_process: 'empty'
     }
-}
+}

+ 13 - 18
src/main/vue/build/webpack.dev.conf.js

@@ -15,7 +15,7 @@ const HOST = process.env.HOST
 const PORT = process.env.PORT && Number(process.env.PORT)
 
 let htmlPlugins = []
-fs.readdirSync(path.resolve(__dirname, '../src/entries')).forEach(function (file) {
+fs.readdirSync(path.resolve(__dirname, '../src/entries')).forEach(function(file) {
     if (file.endsWith('.html')) {
         var moduleName = file.replace(/\.html$/, '')
         htmlPlugins.push(new HtmlWebpackPlugin({
@@ -29,7 +29,7 @@ fs.readdirSync(path.resolve(__dirname, '../src/entries')).forEach(function (file
 
 const devWebpackConfig = merge(baseWebpackConfig, {
     module: {
-        rules: utils.styleLoaders({sourceMap: config.dev.cssSourceMap, usePostCSS: true})
+        rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
     },
     // cheap-module-eval-source-map is faster for development
     devtool: config.dev.devtool,
@@ -39,7 +39,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
         clientLogLevel: 'warning',
         historyApiFallback: {
             rewrites: [
-                {from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html')},
+                { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
             ],
         },
         hot: true,
@@ -48,9 +48,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
         host: HOST || config.dev.host,
         port: PORT || config.dev.port,
         open: config.dev.autoOpenBrowser,
-        overlay: config.dev.errorOverlay
-            ? {warnings: false, errors: true}
-            : false,
+        overlay: config.dev.errorOverlay ? { warnings: false, errors: true } : false,
         publicPath: config.dev.assetsPublicPath,
         proxy: config.dev.proxyTable,
         quiet: true, // necessary for FriendlyErrorsPlugin
@@ -68,13 +66,11 @@ const devWebpackConfig = merge(baseWebpackConfig, {
         // https://github.com/ampedandwired/html-webpack-plugin
         ...htmlPlugins,
         // copy custom static assets
-        new CopyWebpackPlugin([
-            {
-                from: path.resolve(__dirname, '../static'),
-                to: config.dev.assetsSubDirectory,
-                ignore: ['.*']
-            }
-        ])
+        new CopyWebpackPlugin([{
+            from: path.resolve(__dirname, '../static'),
+            to: config.dev.assetsSubDirectory,
+            ignore: ['.*']
+        }])
     ]
 })
 
@@ -86,7 +82,7 @@ module.exports = new Promise((resolve, reject) => {
         } else {
             // publish the new Port, necessary for e2e tests
             process.env.PORT = port
-            // add port to devServer config
+                // add port to devServer config
             devWebpackConfig.devServer.port = port
 
             // Add FriendlyErrorsPlugin
@@ -94,12 +90,11 @@ module.exports = new Promise((resolve, reject) => {
                 compilationSuccessInfo: {
                     messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
                 },
-                onErrors: config.dev.notifyOnErrors
-                    ? utils.createNotifierCallback()
-                    : undefined
+                onErrors: config.dev.notifyOnErrors ?
+                    utils.createNotifierCallback() : undefined
             }))
 
             resolve(devWebpackConfig)
         }
     })
-})
+})

+ 7 - 539
src/main/vue/package-lock.json

@@ -1722,7 +1722,6 @@
         "anymatch": "2.0.0",
         "async-each": "1.0.1",
         "braces": "2.3.1",
-        "fsevents": "1.2.4",
         "glob-parent": "3.1.0",
         "inherits": "2.0.3",
         "is-binary-path": "1.0.1",
@@ -3051,6 +3050,11 @@
         "event-emitter": "0.3.5"
       }
     },
+    "es6-promise": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+      "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+    },
     "es6-set": {
       "version": "0.1.5",
       "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
@@ -3739,535 +3743,6 @@
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
       "dev": true
     },
-    "fsevents": {
-      "version": "1.2.4",
-      "resolved": "http://registry.npm.taobao.org/fsevents/download/fsevents-1.2.4.tgz",
-      "integrity": "sha1-9B3LGvJYKvNpLaNvxVy9jhBBxCY=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "2.10.0",
-        "node-pre-gyp": "0.10.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.3.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "balanced-match": "1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "2.6.9",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "deep-extend": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "2.2.4"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "1.2.0",
-            "console-control-strings": "1.1.0",
-            "has-unicode": "2.0.1",
-            "object-assign": "4.1.1",
-            "signal-exit": "3.0.2",
-            "string-width": "1.0.2",
-            "strip-ansi": "3.0.1",
-            "wide-align": "1.1.2"
-          }
-        },
-        "glob": {
-          "version": "7.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.21",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": "2.1.2"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true,
-          "dev": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "number-is-nan": "1.0.1"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "brace-expansion": "1.1.11"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true
-        },
-        "minipass": {
-          "version": "2.2.4",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "safe-buffer": "5.1.1",
-            "yallist": "3.0.2"
-          }
-        },
-        "minizlib": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "2.2.4"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "2.6.9",
-            "iconv-lite": "0.4.21",
-            "sax": "1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.10.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "1.0.3",
-            "mkdirp": "0.5.1",
-            "needle": "2.2.0",
-            "nopt": "4.0.1",
-            "npm-packlist": "1.1.10",
-            "npmlog": "4.1.2",
-            "rc": "1.2.7",
-            "rimraf": "2.6.2",
-            "semver": "5.5.0",
-            "tar": "4.4.1"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1.1.1",
-            "osenv": "0.1.5"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.1.10",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "3.0.1",
-            "npm-bundled": "1.0.3"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "1.1.4",
-            "console-control-strings": "1.1.0",
-            "gauge": "2.7.4",
-            "set-blocking": "2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "wrappy": "1.0.2"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "1.0.2",
-            "os-tmpdir": "1.0.2"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.7",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "0.5.1",
-            "ini": "1.3.5",
-            "minimist": "1.2.0",
-            "strip-json-comments": "2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.1",
-            "string_decoder": "1.1.1",
-            "util-deprecate": "1.0.2"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "7.1.2"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.1",
-          "bundled": true,
-          "dev": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.5.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "5.1.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "ansi-regex": "2.1.1"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "1.0.1",
-            "fs-minipass": "1.2.5",
-            "minipass": "2.2.4",
-            "minizlib": "1.1.0",
-            "mkdirp": "0.5.1",
-            "safe-buffer": "5.1.1",
-            "yallist": "3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "1.0.2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true
-        }
-      }
-    },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -5942,13 +5417,6 @@
       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
       "dev": true
     },
-    "nan": {
-      "version": "2.10.0",
-      "resolved": "http://registry.npm.taobao.org/nan/download/nan-2.10.0.tgz",
-      "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8=",
-      "dev": true,
-      "optional": true
-    },
     "nanomatch": {
       "version": "1.2.9",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
@@ -10653,8 +10121,8 @@
     },
     "vue-amap": {
       "version": "0.5.8",
-      "resolved": "http://registry.npm.taobao.org/vue-amap/download/vue-amap-0.5.8.tgz",
-      "integrity": "sha1-jYZuOcA3sxyF/33cWPy1rvA8O2w=",
+      "resolved": "https://registry.npmjs.org/vue-amap/-/vue-amap-0.5.8.tgz",
+      "integrity": "sha512-VWU6M58jAY4K80QGi+2tYWxvAszd/MQiWkBEYdyu2ptBHAgsNfZz2zxR1mWL32V74Q2bFoZz4yfOycMrQywlUA==",
       "requires": {
         "uppercamelcase": "1.1.0"
       }

+ 1 - 0
src/main/vue/package.json

@@ -18,6 +18,7 @@
     "chart.js": "^2.7.2",
     "date-fns": "^1.29.0",
     "element-ui": "^2.4.1",
+    "es6-promise": "^4.2.4",
     "less": "^3.0.4",
     "less-loader": "^4.1.0",
     "normalize.css": "^8.0.0",

BIN
src/main/vue/src/assetsPre/Star.png


BIN
src/main/vue/src/assetsPre/contact1.png


BIN
src/main/vue/src/assetsPre/contact2.png


BIN
src/main/vue/src/assetsPre/contact3.png


BIN
src/main/vue/src/assetsPre/contact4.png


BIN
src/main/vue/src/assetsPre/contact5.png


BIN
src/main/vue/src/assetsPre/fankui1.png


BIN
src/main/vue/src/assetsPre/fankui2.png


BIN
src/main/vue/src/assetsPre/fankui3.png


BIN
src/main/vue/src/assetsPre/join.png


BIN
src/main/vue/src/assetsPre/kefu.png


BIN
src/main/vue/src/assetsPre/location.png


BIN
src/main/vue/src/assetsPre/location_pre.png


BIN
src/main/vue/src/assetsPre/newInfo.png


BIN
src/main/vue/src/assetsPre/newShop.png


BIN
src/main/vue/src/assetsPre/quckmenu.png


BIN
src/main/vue/src/assetsPre/quckmenu_sanjiao.png


+ 153 - 0
src/main/vue/src/components/GoodsLarge.vue

@@ -0,0 +1,153 @@
+<template>
+    <router-link :to='{name:"shop",query:{id:info.id}}' class="goods">
+
+        <div class="goodsImg" :style="{backgroundImage:'url('+info.icon+')'}"></div>
+        <div class="goodsInfo">
+            <div class="title">
+                <div class="name">{{info.storeName}}</div>
+                <img src="../assetsPre/location_pre.png" alt="">
+                <div class="address">{{info.citye}}</div>
+            </div>
+            <div class="titlesub">
+                {{info.description}}
+            </div>
+            <div class="subtitle">
+                <span>响应时间 :</span>
+                <span>{{info.responseTime}}分钟</span>
+            </div>
+            <div class="subtitle">
+                <span>返片率 :</span>
+                <span>{{info.reworkRate}}%</span>
+            </div>
+        </div>
+
+        <img src="../assetsPre/levelA.png" alt="" class="level">
+    </router-link>
+</template>
+
+<script>
+
+export default {
+    name: 'goodsLarge',
+    props:{
+        info:{
+            type:Object,
+            default:{}
+        }
+    },
+    data() {
+        return {
+
+        }
+    },
+    computed: {
+
+    },
+    methods: {
+
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.goods {
+    overflow: hidden;
+    padding: 28px 74px 27px 24px;
+    position: relative;
+    font-size: 0;
+    height: 133px;
+    background-color: #fff;
+    margin-top: 20px;
+    display: block;
+
+    .level {
+        display: inline-block;
+        vertical-align: middle;
+        width: 58.5px;
+        height: 30px;
+    }
+
+    .goodsImg {
+        width: 233px;
+        height: 133px;
+        border-radius: 4px;
+        background-position: center center;
+        background-size: cover;
+        background-repeat: no-repeat;
+        display: inline-block;
+        vertical-align: middle;
+    }
+
+    .goodsInfo {
+        display: inline-block;
+        vertical-align: middle;
+        margin-left: 23px;
+        height: 133px;
+        width: 500px;
+        overflow: hidden;
+    }
+
+    .title {
+        overflow: hidden;
+
+        .name {
+            display: inline-block;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            font-size: 18px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 24px;
+            vertical-align: middle;
+            max-width: 400px;
+        }
+
+        img {
+            width: 12px;
+            height: 15px;
+            margin: 0 6px 0 10px;
+            vertical-align: middle;
+        }
+
+        .address {
+            display: inline-block;
+            font-size: 12px;
+            font-family: PingFangSC;
+            font-weight: bold;
+            color: rgba(11, 158, 192, 1);
+            line-height: 17px;
+            vertical-align: middle;
+        }
+    }
+
+    .titlesub {
+        display: inline-block;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        font-size: 14px;
+        font-family: MicrosoftYaHei;
+        color: rgba(153, 153, 153, 1);
+        line-height: 19px;
+        margin-top: 6px;
+        width: 500px;
+    }
+
+    .subtitle {
+        margin-top: 8px;
+        span {
+            font-size: 12px;
+            font-family: MicrosoftYaHei;
+
+            line-height: 16px;
+            &:first-child {
+                color: #666666;
+            }
+            &:last-child {
+                color: #fb6e08;
+            }
+        }
+    }
+}
+</style>

+ 15 - 9
src/main/vue/src/components/GoodsLittle.vue

@@ -1,26 +1,32 @@
 <template>
-    <div class="goods">
+    <router-link :to='{name:"shop",query:{id:info.id}}' class="goods">
         <img src="../assetsPre/levelA.png" alt="" class="level">
-        <div class="goodsImg" style="background-image:url(https://bpic.588ku.com/back_pic/05/56/93/515b212d11992dd.jpg)"></div>
+        <div class="goodsImg" :style="{backgroundImage:'url('+info.icon+')'}"></div>
         <div class="title">
-            <div class="name">美瑞莉娜工作室</div>
-            <div class="address">合肥</div>
+            <div class="name">{{info.storeName}}</div>
+            <div class="address">{{info.citye}}</div>
         </div>
         <div class="subtitle">
             <span>响应时间 :</span>
-            <span>15分钟</span>
+            <span>{{info.responseTime}}分钟</span>
         </div>
         <div class="subtitle">
             <span>返片率 :</span>
-            <span>2%</span>
+            <span>{{info.reworkRate}}%</span>
         </div>
-    </div>
+    </router-link>
 </template>
 
 <script>
 
 export default {
     name: 'goodsLittle',
+    props: {
+        info: {
+            type: Object,
+            default: {}
+        }
+    },
     data() {
         return {
 
@@ -38,9 +44,9 @@ export default {
 <style lang="less" scoped>
 .goods {
     overflow: hidden;
-    padding: 32px 30px 0;
+    padding: 32px 30px 0 0;
     position: relative;
-    display: inline-block;
+    display: block;
     .level {
         width: 39px;
         height: 20px;

+ 99 - 0
src/main/vue/src/components/MiniHead.vue

@@ -0,0 +1,99 @@
+<template>
+    <div style="background:#F0F0F0">
+        <div class="HeadContent">
+            <div class="Head">
+                <div class="HeadAll">
+                    <div class="HeadLeft">
+                        <span>您好,欢迎来到图忆途摄影服务平台!</span>
+                        <img src="../assetsPre/location.png" alt="">
+                        <span>{{locationCity}}</span>
+                    </div>
+                </div>
+
+                <div class="HeadRight">
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+
+</template>
+
+<script>
+import logo from '../components/Logo'
+import { mapState } from "vuex";
+export default {
+    name: 'miniHead',
+    data() {
+        return {
+
+        }
+    },
+    computed: {
+        ...mapState(["locationInfo", "userInfo"]),
+        locationCity() {
+            var city = ''
+            if (this.locationInfo) {
+                city = this.locationInfo.addressComponent.city.split('市')[0]
+                if (!city) {
+                    city = this.locationInfo.addressComponent.province.split('省')[0]
+                }
+            }
+            return city
+        },
+    },
+    methods: {
+
+    },
+    components: {
+        logo
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.HeadContent {
+    width: 100%;
+    height: 36px;
+}
+.Head {
+    width: 100%;
+    margin: auto;
+    overflow: hidden;
+    height: 36px;
+    background: rgba(240, 240, 240, 1);
+    position: fixed;
+    top: 0;
+    left: 0;
+    z-index: 500;
+
+    .HeadAll {
+        width: 1190px;
+        margin: auto;
+        height: 36px;
+
+        .HeadLeft {
+            float: left;
+            height: 36px;
+            font-size: 0;
+            line-height: 36px;
+
+            span {
+                font-size: 12px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 16px;
+                vertical-align: middle;
+            }
+
+            img {
+                width: 12px;
+                height: 15px;
+                vertical-align: middle;
+                margin: 0 5px 0 7px;
+            }
+        }
+    }
+}
+</style>

+ 30 - 0
src/main/vue/src/emUI.less

@@ -3,6 +3,9 @@
     padding: 0;
     border: 0;
 }
+body{
+    background-color: #f9f9f9;
+}
 
 .myTab{
     position: relative;
@@ -143,6 +146,15 @@ a{
     border-radius:7px;
 
 }
+.swiper a{
+    display:block;
+    width: 100%;
+    height: 100%;
+}
+
+.noButton .el-carousel__indicators{
+    display: none
+}
 
 
 .swiper .el-carousel__indicator.is-active .el-carousel__button{
@@ -170,3 +182,21 @@ a{
     line-height:16px;
     font-weight: normal;
 }
+
+.goodsTab .el-tabs__item{
+    font-size:14px;
+    font-family:MicrosoftYaHei;
+    color:rgba(51,51,51,1);
+    line-height:50px;
+    height: 50px;
+}
+.goodsTab .el-tabs__item.is-active{
+    color:rgba(11,158,192,1);
+}
+.goodsTab .el-tabs__active-bar{
+    height:3px;
+    background:rgba(11,158,192,1);
+}
+.goodsTab .el-tabs__nav-wrap{
+    padding-left: 26px;
+}

+ 11 - 0
src/main/vue/src/entries/index.html

@@ -8,6 +8,17 @@
     <link rel="icon" href="/static/favicon.ico" />
     <script src="/static/polyfill.min.js"></script>
     <script src="/static/fontawesome-v5.2.0.js"></script>
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.8&key=dd8f1d46b89cb06d842c321d0d021672"></script>
+    <style>
+        #app {
+            width: 100%;
+            height: 100%;
+            overflow: auto;
+            position: absolute;
+            top: 0;
+            left: 0;
+        }
+    </style>
 </head>
 
 <body>

+ 6 - 1
src/main/vue/src/entries/index.js

@@ -34,6 +34,7 @@ axios.defaults.baseURL = baseUrl;
 Vue.prototype.$http = {
     get(params) {
         return new Promise((resolve, reject) => {
+            console.log('xxx')
             if (params instanceof String) {
                 params = { url: params };
             } else if (!params instanceof Object) {
@@ -149,6 +150,10 @@ Vue.prototype.$http = {
         });
     }
 };
+
+
+
+
 Vue.mixin({
     methods: {
         timeFormatter(row, column, cellValue, index) {
@@ -188,7 +193,7 @@ window.onload = updateTableHeight;
 window.onresize = updateTableHeight;
 setInterval(updateTableHeight, 500);
 
-new Vue({
+var app = new Vue({
     el: '#app',
     router,
     store,

+ 108 - 0
src/main/vue/src/pagesPre/About.vue

@@ -0,0 +1,108 @@
+<template>
+    <div class="conatiner">
+        <div class="banner" style="background-image:url(http://bpic.588ku.com/back_pic/03/63/06/2457abee2a5523a.jpg)"></div>
+
+        <div class="content">
+            <div class="name">
+                <div class="kuai"></div>
+                <span>关于我们</span>
+            </div>
+            <div class="content-content">
+                <div class="content-img" style="background-image:url(http://bpic.588ku.com/back_pic/04/17/43/435827c692027aa.jpg)"></div>
+
+                <div class="content-text">
+                    <div class="title">安徽图忆途网络科技服务有限公司</div>
+                    <div class="content-all">
+                        此处展示公司简介信息,案例示例 浙江百慕生物科技有限公司隶属浙江丽珀集团,成立于2011年3月,注册资本1000万元,是一家从事海洋生物开发销售的公司,主要从事保健品(海参)产品的销售。 旗下的优参堂海参品牌源自于卢炜翎先生创立的优参号参堂,经过一百多年的发展,现已成为最具规模化,现代化,专业化的海参加工生产企业之一。 公司特与世纪联华超市股份有限公司、物美商业集团股份有限公司、天天好大药房等合作,在浙江省多个城市100多家门店进行销售。此外公司还搭档杭州电视台生活频道《生活大参考》、杭州电视台生活频道电商平台共同进行优参堂海参的销售,致力于将品牌以更多样化的形式进行推广,将产品以更方便快捷的渠道送达到消费者手中。 公司本着“客户至上,质量为本”的原则,建立健全了严苛的质量标准检验体系,除了通过国家食品认证体系之外,还委托国家轻工业食品质量监督检测杭州站特别做了农药、兽药残留检测,海水污染检测,以远远低于国家标准的检测结果确保海参品质。
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'home',
+    data() {
+        return {
+        }
+    },
+    computed: {
+    },
+    methods: {
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.banner {
+    width: 1191px;
+    height: 220px;
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: cover;
+    margin: auto;
+}
+
+.content {
+    width: 1146px;
+    margin: 20px auto;
+    background: rgba(255, 255, 255, 1);
+    border: 1px solid rgba(234, 234, 234, 1);
+    padding: 0 22px;
+    .name {
+        height: 36px;
+        line-height: 36px;
+        border-bottom: 1px solid #ebebeb;
+        .kuai {
+            width: 7px;
+            height: 15px;
+            background: rgba(11, 158, 192, 1);
+            display: inline-block;
+            vertical-align: middle;
+        }
+
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 19px;
+            margin-left: 13px;
+            vertical-align: middle;
+        }
+    }
+    .content-content {
+        overflow: hidden;
+        padding: 16px 0 100px;
+        .content-img {
+            width: 414px;
+            height: 316px;
+            background-position: center center;
+            background-repeat: no-repeat;
+            background-size: cover;
+            float: left;
+        }
+
+        .content-text {
+            width: 680px;
+            float: right;
+
+            .title {
+                font-size: 18px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 24px;
+            }
+
+            .content-all {
+                font-size: 14px;
+                font-family: PingFangSC-Regular;
+                color: rgba(102, 102, 102, 1);
+                line-height: 24px;
+                margin-top: 13px;
+            }
+        }
+    }
+}
+</style>

+ 185 - 59
src/main/vue/src/pagesPre/App.vue

@@ -1,66 +1,75 @@
 <template>
-    <div class="container">
-        <div style="background-color:#fff;">
-            <div class="Head">
-                <div class="HeadTop">
-                    <img class="logo" src="../assetsPre/logo.png" alt="">
-                    <div class="Head-right">
-                        <el-input class="search" v-model="input" placeholder="搜索商品或服务">
-                            <template slot="append">
-                                <button>搜索</button>
-                            </template>
-                        </el-input>
+    <div class="container" @scroll="menu" id='container' @resize='getSize'>
+        <div style="min-width:1190px">
+            <mini-head></mini-head>
+            <div style="background-color:#fff;box-shadow: 0px 1px 2px 0px rgba(199, 199, 199, 0.5);">
+                <div class="Head">
+                    <div class="HeadTop">
+                        <img class="logo" src="../assetsPre/logo.png" alt="">
+                        <div class="Head-right">
+                            <el-input class="search" v-model="input" placeholder="搜索商品或服务">
+                                <template slot="append">
+                                    <button>搜索</button>
+                                </template>
+                            </el-input>
 
-                        <div class="shop-enter">
-                            <img src="../assetsPre/shop.png" alt="">
-                            <span>入驻接单</span>
+                            <div class="shop-enter">
+                                <img src="../assetsPre/shop.png" alt="">
+                                <span>入驻接单</span>
+                            </div>
                         </div>
-                    </div>
 
-                </div>
-                <div class="HeadBottom">
-                    <div class="service-list" @mousemove="showMenu=true" @mouseout="showMenu=false">
-                        <div class="name">
-                            <span>服务列表</span>
-                            <img src="../assetsPre/menu.png" alt="">
-                        </div>
-                        <transition name='slide-down'>
-                            <div class="service-content" v-if="showMenu">
-                                <div class="serive-item">
-                                    <div class="title">修图服务</div>
-                                    <div class="serive-val-list">
-                                        <a href='#' class="service-val">精修套餐</a>
-                                        <a href='#' class="service-val">中修套餐</a>
-                                        <a href='#' class="service-val">简修套餐</a>
-                                    </div>
-                                </div>
-                                <div class="serive-item">
-                                    <div class="title">修图服务</div>
-                                    <div class="serive-val-list">
-                                        <a href='#' class="service-val">精修套餐</a>
-                                        <a href='#' class="service-val">中修套餐</a>
-                                        <a href='#' class="service-val">简修套餐</a>
+                    </div>
+                    <div class="HeadBottom">
+                        <div class="service-list" @mousemove="showMenu=true" @mouseout="showMenu=false">
+                            <div class="name">
+                                <span>服务列表</span>
+                                <img src="../assetsPre/menu.png" alt="">
+                            </div>
+                            <transition name='slide-down'>
+                                <div class="service-content" v-if="showMenu">
+                                    <div class="serive-item" v-for="item in serviceType">
+                                        <div class="title">{{item.serviceType}}</div>
+                                        <div class="serive-val-list">
+                                            <a href='#' class="service-val" v-for="todo in item.serviceTypeDetailList">{{todo.typeName}}</a>
+                                        </div>
                                     </div>
                                 </div>
-                            </div>
-                        </transition>
+                            </transition>
 
-                    </div>
+                        </div>
 
-                    <div class="menuList">
-                        <router-link id='menuItem0' class="menu-item" :style="{color:nowMenu==0?'#0B9EC0':'#333'}" :to='{name:"index"}'>首页</router-link>
-                        <router-link id='menuItem1' class="menu-item" :style="{color:nowMenu==1?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:1}}'>修图商</router-link>
-                        <router-link id='menuItem2' class="menu-item" :style="{color:nowMenu==2?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:2}}'>影楼</router-link>
-                        <router-link id='menuItem3' class="menu-item" :style="{color:nowMenu==3?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:3}}'>样片</router-link>
-                        <router-link id='menuItem4' class="menu-item" :style="{color:nowMenu==4?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:4}}'>营销</router-link>
-                        <router-link id='menuItem5' class="menu-item" :style="{color:nowMenu==5?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:5}}'>周边</router-link>
-                        <div class="menu-line" :style="{left:lineLeft+'px',width:lineWidth+'px'}"></div>
+                        <div class="menuList">
+                            <router-link id='menuItem0' class="menu-item" :style="{color:nowMenu==0?'#0B9EC0':'#333'}" :to='{name:"index"}'>首页</router-link>
+                            <div :id='"menuItem"+(index+1)' v-for="(item,index) in serviceType" class="menu-item" :style="{color:nowMenu==(index+1)?'#0B9EC0':'#333'}" @click="goMenu(index+1)">{{item.shortName}}</div>
+                            <!-- <router-link id='menuItem2' class="menu-item" :style="{color:nowMenu==2?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:2}}'>影楼</router-link>
+                            <router-link id='menuItem3' class="menu-item" :style="{color:nowMenu==3?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:3}}'>样片</router-link>
+                            <router-link id='menuItem4' class="menu-item" :style="{color:nowMenu==4?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:4}}'>营销</router-link>
+                            <router-link id='menuItem5' class="menu-item" :style="{color:nowMenu==5?'#0B9EC0':'#333'}" :to='{name:"business",query:{id:5}}'>周边</router-link> -->
+                            <div class="menu-line" :style="{left:lineLeft+'px',width:lineWidth+'px'}"></div>
+                        </div>
                     </div>
                 </div>
             </div>
+           <!-- <keep-alive exclude="shop"> -->
+                <router-view ref='child'></router-view>
+           <!-- </keep-alive> -->
+            <logo-foot :isBottom='isBottom'></logo-foot>
+        </div>
+
+        <div class="little-menu">
+            <div class="little-item">
+                <img src="../assetsPre/fankui1.png" style="width:17px;height:18px;" alt="">
+                <div>咨询</div>
+            </div>
+            <div class="little-item">
+                <img src="../assetsPre/fankui2.png" style="width:20px;height:20px;" alt="">
+                <div>反馈</div>
+            </div>
+            <div class="little-item" @click="goTop">
+                <img src="../assetsPre/fankui3.png" style="width:24px;height:20px;" alt="">
+            </div>
         </div>
-        <router-view></router-view>
-        <logo-foot :isBottom='false'></logo-foot>
     </div>
 </template>
 
@@ -68,24 +77,54 @@
 import logo from '../components/Logo'
 import { mapState } from 'vuex'
 import logoFoot from '../pagesPre/LogoFoot'
-
+import miniHead from '../components/MiniHead'
 export default {
     name: 'App',
     created() {
         setTimeout(() => {
-            console.log(document.getElementById('menuItem0').offsetWidth)
+            console.log(this.$route.name)
+            if (this.$route.name == 'index') {
+                this.nowMenu = 0
+                this.isBottom = false
+            } else if (this.$route.name == 'business') {
+                this.nowMenu = parseInt(this.$route.query.id)
+                this.isBottom = true
+            } else {
+                this.nowMenu = -1
+                this.isBottom = true
+            }
+            var length = -2
+            for (var i = 0; i < this.nowMenu; i++) {
+                if (document.getElementById('menuItem' + i)) {
+                    length += document.getElementById('menuItem' + i).offsetWidth + 36
+                }
+            }
+            this.lineLeft = length
         }, 1000)
     },
+    mounted() {
+        this.$http.get({
+            url: '/serviceType/all',
+            data: {}
+        }).then(res => {
+            if (res.success) {
+                this.$store.commit('updateServiceType', res.data)
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+    },
     data() {
         return {
             showMenu: false,
             nowMenu: 0,
             input: '',
             lineLeft: -2,
+            isBottom: false
         }
     },
     computed: {
-        ...mapState(['userInfo']),
+        ...mapState(['userInfo', 'serviceType', 'hrefHistory']),
         // lineLeft() {
         //     var length = -2
         //     if (document.getElementById('menuItem0')) {
@@ -102,30 +141,76 @@ export default {
                 width = document.getElementById('menuItem' + this.nowMenu).offsetWidth + 4
             }
 
+            if (this.nowMenu === -1) {
+                width = 0
+            }
+
             return width
         }
     },
     methods: {
-
+        menu() {
+            this.$refs.child.scrollMenu()
+        },
+        getSize() {
+            console.log('bvbbbbbbbbb')
+        },
+        goTop() {
+            document.getElementById('container').scrollTop = 0
+        },
+        goMenu(index) {
+            this.$router.replace({
+                name: "business",
+                query: {
+                    id: index
+                }
+            })
+        }
     },
     watch: {
         $route() {
             if (this.$route.name == 'index') {
                 this.nowMenu = 0
+                this.isBottom = false
             }
             else if (this.$route.name == 'business') {
                 this.nowMenu = parseInt(this.$route.query.id)
-
+                this.isBottom = true
+            }
+            else {
+                this.nowMenu = -1
+                this.isBottom = true
             }
             var length = -2
             for (var i = 0; i < this.nowMenu; i++) {
-                length += document.getElementById('menuItem' + i).offsetWidth + 40.5
+                if (document.getElementById('menuItem' + i)) {
+                    length += document.getElementById('menuItem' + i).offsetWidth + 36
+                }
             }
             this.lineLeft = length
+            document.getElementById('container').scrollTop = 0
+        },
+        hrefHistory() {
+            if (this.hrefHistory.length > 2) {
+                this.nowMenu = this.hrefHistory[1].href.split('=')[1]
+
+                var length = -2
+                for (var i = 0; i < this.nowMenu; i++) {
+                    if (document.getElementById('menuItem' + i)) {
+                        length += document.getElementById('menuItem' + i).offsetWidth + 36
+                    }
+                }
+                this.lineLeft = length
+            }
+            else if (this.hrefHistory.length > 1 && this.$route.name != 'business') {
+                this.nowMenu = 0
+                this.lineLeft = -2
+            }
+
         }
     },
     components: {
-        logo, logoFoot
+        logo, logoFoot,miniHead
     }
 }
 </script>
@@ -133,12 +218,20 @@ export default {
 <style lang="less" scoped>
 .container {
     background: rgba(249, 249, 249, 1);
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
 }
+
 .Head {
     // overflow: hidden;
-    width: 1190px;
+    width: 1196px;
     margin: auto;
     background-color: #fff;
+
     .HeadTop {
         overflow: hidden;
         padding: 32px 0 30px;
@@ -225,6 +318,7 @@ export default {
                 background: #f1f7fe;
                 padding: 0 14px 10px 10px;
                 width: 196px;
+                z-index: 500;
 
                 .serive-item {
                     .title {
@@ -261,6 +355,7 @@ export default {
             float: left;
             margin-left: 78px;
             position: relative;
+            font-size: 0;
 
             .menu-item {
                 margin-right: 36px;
@@ -269,6 +364,8 @@ export default {
                 color: rgba(51, 51, 51, 1);
                 line-height: 40px;
                 font-weight: bold;
+                display: inline-block;
+                cursor: pointer;
             }
 
             .menu-line {
@@ -283,4 +380,33 @@ export default {
         }
     }
 }
+
+.little-menu {
+    position: fixed;
+    right: 0px;
+    bottom: 30px;
+    background: rgba(255, 255, 255, 1);
+    border: 1px solid rgba(234, 234, 234, 1);
+    cursor: pointer;
+    .little-item {
+        padding: 8px 11px 8px;
+        &:not(:last-child) {
+            border-bottom: 1px solid rgba(234, 234, 234, 1);
+        }
+
+        img {
+            display: block;
+            margin: auto;
+        }
+
+        div {
+            font-size: 12px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 16px;
+            margin-top: 4px;
+            text-align: center;
+        }
+    }
+}
 </style>

+ 551 - 16
src/main/vue/src/pagesPre/Business.vue

@@ -1,49 +1,584 @@
 <template>
     <div class="conatiner">
-        <el-carousel height="420px" :interval="4000" class="swiper">
-            <el-carousel-item style="backgroundImage:url(https://bpic.588ku.com/element_banner/20/18/08/2d44722d8e86bcdf3ad16ec341a2caa2.jpg)">
-
-            </el-carousel-item>
-            <el-carousel-item style="backgroundImage:url(https://bpic.588ku.com/element_banner/20/18/08/dc94f7674aff60d0fc101cf41f176670.jpg)">
-
-            </el-carousel-item>
+        <el-carousel class="swiper" :class="[bannerList.length==1?'noButton':'']" height="420px" :interval="4000">
+            <template v-for="item in bannerList">
+                <el-carousel-item @click="goBanner(item.url)" :style="{backgroundImage:'url('+item.imageUrl+')'}">
+                    <a v-if="item.url" :href="item.url"></a>
+                </el-carousel-item>
+            </template>
 
         </el-carousel>
-
-        <el-breadcrumb separator-class="el-icon-arrow-right" class="Breadcrumb">
+        <el-breadcrumb v-if="serviceType.length>0" separator-class="el-icon-arrow-right" class="Breadcrumb">
             <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
-            <el-breadcrumb-item>修图商</el-breadcrumb-item>
+            <el-breadcrumb-item>{{serviceType[nowIndex].shortName}}</el-breadcrumb-item>
         </el-breadcrumb>
 
         <div class="content">
             <div class="content-left">
-                div.
+                <div class="flift-content">
+                    <div class="flift-title">筛选条件</div>
+
+                    <div class="flift-item">
+                        <div class="flift-name">
+                            区域:
+                        </div>
+                        <div class="flift-list">
+                            <div id='filit_address0' :class="{isActive:(address==0)}" @click="address=0">全部</div>
+                            <div id='filit_address1' :class="{isActive:(address==1)}" v-if="this.locationCity" @click="address=1">定位所在地:{{this.locationCity}}</div>
+                            <div v-for="(item,index) in cityList" :class="{isActive:(address==(index+2))}" :id='"filit_address"+(index+2)' @click="address=(index+2)">{{item.districtName}}</div>
+                            <div class="box" :style="{width:addressFiliftLocation.width+'px',height:addressFiliftLocation.height+'px',top:addressFiliftLocation.top+'px',left:addressFiliftLocation.left+'px'}"></div>
+                        </div>
+                    </div>
+
+                    <div class="flift-item">
+                        <div class="flift-name">
+                            信誉等级:
+                        </div>
+                        <div class="flift-list">
+                            <div id='filit_level0' :class="{isActive:(level==0)}" @click="level=0">全部</div>
+                            <div id='filit_level1' :class="{isActive:(level==1)}" @click="level=1">A</div>
+                            <div id='filit_level2' :class="{isActive:(level==2)}" @click="level=2">B</div>
+                            <div id='filit_level3' :class="{isActive:(level==3)}" @click="level=3">C</div>
+                            <div id='filit_level4' :class="{isActive:(level==4)}" @click="level=4">D</div>
+                            <div id='filit_level5' :class="{isActive:(level==5)}" @click="level=5">E</div>
+                            <div class="box" :style="{width:levelFiliftLocation.width+'px',height:levelFiliftLocation.height+'px',top:levelFiliftLocation.top+'px',left:levelFiliftLocation.left+'px'}"></div>
+                        </div>
+                    </div>
+
+                    <div class="flift-item">
+                        <div class="flift-name">
+                            响应时间:
+                        </div>
+                        <div class="flift-list">
+                            <div id='filit_time0' :class="{isActive:(time==0)}" @click="time=0">全部</div>
+                            <div :id='"filit_time"+item.id' :class="{isActive:(time==item.id)}" @click="time=item.id" v-for="item in timeList">{{item.name}}</div>
+                            <div class="box" :style="{width:timeFiliftLocation.width+'px',height:timeFiliftLocation.height+'px',top:timeFiliftLocation.top+'px',left:timeFiliftLocation.left+'px'}"></div>
+                        </div>
+                    </div>
+                    <div class="flift-item">
+                        <div class="flift-name">
+                            排序:
+                        </div>
+                        <div class="flift-list">
+                            <div style="padding-right:15px;" @click="creditOrder=(creditOrder==1?2:1)">
+                                信誉等级
+                                <i class="el-icon-caret-top top-icon" :class="{isActive:creditOrder==1}"></i>
+                                <i class="el-icon-caret-bottom bottom-icon" :class="{isActive:creditOrder==2}"></i>
+                            </div>
+                            <div style="padding-right:15px;" @click="responseOrder=(responseOrder==1?2:1)">
+                                响应时间
+                                <i class="el-icon-caret-top top-icon" :class="{isActive:responseOrder==1}"></i>
+                                <i class="el-icon-caret-bottom bottom-icon" :class="{isActive:responseOrder==2}"></i>
+                            </div>
+                            <div style="padding-right:15px;" @click="reworkOrder=(reworkOrder==1?2:1)">
+                                返片率
+                                <i class="el-icon-caret-top top-icon" :class="{isActive:reworkOrder==1}"></i>
+                                <i class="el-icon-caret-bottom bottom-icon" :class="{isActive:reworkOrder==2}"></i>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="goodsList">
+                    <goods-large :info='item' v-for="item in goodsList"></goods-large>
+                </div>
+
+            </div>
+
+            <div class="content-right">
+                <div class="right-title">
+                    热门修图商
+                </div>
+                <goods-little v-for="item in hotList" :info='item' style="border-top:1px solid #EAEAEA;padding:15px 0 29px"></goods-little>
             </div>
         </div>
     </div>
 </template>
 
 <script>
+import goodsLittle from '../components/GoodsLittle'
+import goodsLarge from '../components/GoodsLarge'
+import { mapState } from "vuex";
 export default {
     name: 'home',
     data() {
-        return {}
+        return {
+            address: 0,
+            level: 0,
+            time: 0,
+            nowIndex: 0,
+            bannerList: [],
+            hotList: [],
+            currentPage: 0,
+            flag: true,
+            goodsList: [],
+            cityList: [],
+            district: '',
+            credit: '',
+            advancedQuery: '',
+            timeList: [{
+                id: 1,
+                name: '0-15分钟',
+                key: 'AND_,response_time_,>=_,0_;AND_,response_time_,<_,15'
+            }, {
+                id: 2,
+                name: '15-30分钟',
+                key: 'AND_,response_time_,>=_,15_;AND_,response_time_,<_,30'
+            }, {
+                id: 3,
+                name: '30-45分钟',
+                key: 'AND_,response_time_,>=_,30_;AND_,response_time_,<_,45'
+            }, {
+                id: 4,
+                name: '45-60分钟',
+                key: 'AND_,response_time_,>=_,45_;AND_,response_time_,<_,60'
+            }, {
+                id: 5,
+                name: '60分钟以上',
+                key: 'AND_,response_time_,>=_,60'
+            }],
+            orderType: ['', 'asc', 'desc'],
+            orderByStr: '',
+            creditOrder: '',
+            responseOrder: '',
+            reworkOrder: ''
+        }
     },
     computed: {
+        ...mapState(["locationInfo", "serviceType"]),
+        locationCity() {
+            var city = ''
+            if (this.locationInfo) {
+                city = this.locationInfo.addressComponent.city.split('市')[0]
+                if (!city) {
+                    city = this.locationInfo.addressComponent.province.split('省')[0]
+                }
+            }
+            return city
+        },
+        addressFiliftLocation() {
+            var location = {
+                width: 46,
+                height: 26,
+                top: 7,
+                left: 0
+            }
+            if (document.getElementById("filit_address" + this.address)) {
+                var width = document.getElementById("filit_address" + this.address).offsetWidth
+                var height = document.getElementById("filit_address" + this.address).offsetHeight
+                var top = document.getElementById("filit_address" + this.address).offsetTop
+                var left = document.getElementById("filit_address" + this.address).offsetLeft
+                location = {
+                    width: width,
+                    height: height,
+                    top: top,
+                    left: left
+                }
+            }
+            return location
+        },
+        levelFiliftLocation() {
+            var location = {
+                width: 46,
+                height: 26,
+                top: 7,
+                left: 0
+            }
+            if (document.getElementById("filit_level" + this.level)) {
+                var width = document.getElementById("filit_level" + this.level).offsetWidth
+                var height = document.getElementById("filit_level" + this.level).offsetHeight
+                var top = document.getElementById("filit_level" + this.level).offsetTop
+                var left = document.getElementById("filit_level" + this.level).offsetLeft
+                location = {
+                    width: width,
+                    height: height,
+                    top: top,
+                    left: left
+                }
+            }
+            return location
+        },
+        timeFiliftLocation() {
+            var location = {
+                width: 46,
+                height: 26,
+                top: 7,
+                left: 0
+            }
+            if (document.getElementById("filit_time" + this.time)) {
+                var width = document.getElementById("filit_time" + this.time).offsetWidth
+                var height = document.getElementById("filit_time" + this.time).offsetHeight
+                var top = document.getElementById("filit_time" + this.time).offsetTop
+                var left = document.getElementById("filit_time" + this.time).offsetLeft
+                location = {
+                    width: width,
+                    height: height,
+                    top: top,
+                    left: left
+                }
+            }
+            return location
+        }
+    },
+    mounted() {
+
+        this.$http.get({
+            url: '/districtInfo/all',
+            data: {
+            }
+        }).then(res => {
+            if (res.success) {
+                this.cityList = res.data
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+        setTimeout(() => {
+            this.freash()
+        }, 500)
+    },
+    watch: {
+        $route() {
+            this.freash()
+        },
+        address() {
+            if (this.address == 0) {
+                this.district = ''
+            }
+            else if (this.address == 1) {
+                this.district = this.locationCity
+            }
+            else {
+                this.district = this.cityList[this.address - 2].districtName
+            }
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
+        level() {
+            if (this.level == 0) {
+                this.credit = ''
+            }
+            else if (this.level == 1) {
+                this.credit = 'A'
+            }
+            else if (this.level == 2) {
+                this.credit = 'B'
+            }
+            else if (this.level == 3) {
+                this.credit = 'C'
+            }
+            else if (this.level == 4) {
+                this.credit = 'D'
+            }
+            else if (this.level == 5) {
+                this.credit = 'E'
+            }
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
+        time() {
+            if (this.time == 0) {
+                this.advancedQuery = ''
+            }
+            else {
+                this.timeList.forEach(item => {
+                    if (item.id == this.time) {
+                        this.advancedQuery = item.key
+                    }
+                })
+            }
+
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
+        creditOrder() {
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
+        responseOrder() {
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
+        reworkOrder() {
+            this.currentPage = 0
+            this.flag = true
+            this.getInfo()
+        },
     },
     methods: {
+        freash() {
+            if (this.$route.query.id) {
+                this.nowIndex = parseInt(this.$route.query.id) - 1
+            }
+
+            document.title = this.serviceType[this.nowIndex].shortName
+
+            this.address = 0
+            this.level = 0
+            this.time = 0
+
+            this.creditOrder = ''
+            this.responseOrder = ''
+            this.reworkOrder = ''
+
+            this.$http.get({
+                url: '/bannerInfo/all',
+                data: {
+                    location: this.nowIndex + 8
+                }
+            }).then(res => {
+                if (res.success) {
+                    this.bannerList = res.data
+                }
+            }).catch(e => {
+                console.log(e)
+            })
+            var list = [{
+                name: '首页',
+                href: '/'
+            }]
+            list.push({
+                name: this.serviceType[this.nowIndex].shortName,
+                href: this.$route.fullPath
+            })
+            this.$store.commit('updateHrefHistory', list)
+
+
+            this.$http.get({
+                url: '/storeInfo/page',
+                data: {
+                    currentPage: 1,
+                    pageNumber: 20,
+                    serviceType: this.serviceType[this.nowIndex].id,
+                    hotFlag: 1,
+                    useFlag: 'Y'
+                }
+            }).then(res => {
+                if (res.success) {
+                    this.hotList = res.data.pp
+                }
+            }).catch(e => {
+                console.log(e)
+            })
+            this.flag = true
+            this.currentPage = 0
+            this.getInfo()
+        },
+        getInfo() {
+            if (!this.flag) {
+                return
+            }
+            else {
+                this.flag = false
+            }
+            if (this.currentPage == 0) {
+                this.goodsList = []
+            }
+            var data = {
+                currentPage: this.currentPage,
+                pageNumber: 20,
+                serviceType: this.serviceType[this.nowIndex].id,
+                useFlag: 'Y'
+            }
+
+            if (this.district) {
+                data.district = this.district
+            }
+
+            if (this.credit) {
+                data.credit = this.credit
+            }
+
+            if (this.advancedQuery) {
+                data.advancedQuery = this.advancedQuery
+            }
+
+            data.orderByStr = ''
+
+            console.log(this.creditOrder)
+
+            if (this.creditOrder) {
+                data.orderByStr += 'credit_,' + this.orderType[this.creditOrder]
+            }
+
+            if (this.responseOrder) {
+                if (data.orderByStr) {
+                    data.orderByStr += '_;'
+                }
+                data.orderByStr += 'response_time_,' + this.orderType[this.responseOrder]
+            }
+
+            if (this.reworkOrder) {
+                if (data.orderByStr) {
+                    data.orderByStr += '_;'
+                }
+                data.orderByStr += 'rework_rate_,' + this.orderType[this.reworkOrder]
+            }
+
+            this.currentPage++
+            this.$http.get({
+                url: '/storeInfo/page',
+                data: data
+            }).then(res => {
+                if (res.success) {
+                    this.goodsList = this.goodsList.concat(res.data.pp)
+                    if (res.data.page.currentPage < res.data.page.totalPage) {
+                        this.flag = true
+                    }
+                }
+            }).catch(e => {
+                console.log(e)
+            })
+        },
+        scrollMenu() {
+            if (document.getElementById('container').scrollTop + document.body.clientHeight + 100 >= document.getElementById('container').scrollHeight) {
+                this.getInfo()
+            }
+        }
+    },
+    components: {
+        goodsLittle, goodsLarge
     }
 }
 </script>
 
 <style lang="less" scoped>
 .swiper {
-    width: 1190px;
+    width: 1196px;
     height: 420px;
     margin: auto;
 }
-.Breadcrumb{
-    width: 1190px;
-    margin:13px auto 10px;
+.Breadcrumb {
+    width: 1196px;
+    margin: 13px auto 10px;
+}
+
+.content {
+    width: 1196px;
+    overflow: hidden;
+    margin: auto;
+    min-height: 800px;
+
+    .content-left {
+        width: 925px;
+        float: left;
+        .flift-content {
+            background: rgba(255, 255, 255, 1);
+            border-radius: 4px;
+            border: 1px solid rgba(234, 234, 234, 1);
+            .flift-title {
+                font-size: 14px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 19px;
+                padding: 9px 17px 4px;
+                border-bottom: 1px solid rgba(234, 234, 234, 1);
+            }
+
+            .flift-item {
+                overflow: hidden;
+                .flift-name {
+                    width: 70px;
+                    padding-right: 13px;
+                    font-size: 12px;
+                    font-family: MicrosoftYaHei;
+                    color: rgba(51, 51, 51, 1);
+                    line-height: 40px;
+                    text-align: right;
+                    float: left;
+                }
+                .flift-list {
+                    width: 826px;
+                    float: left;
+                    font-size: 0;
+                    padding-top: 7px;
+                    position: relative;
+                    div {
+                        padding: 5px 11px;
+                        font-size: 12px;
+                        font-family: MicrosoftYaHei;
+                        color: #333;
+                        line-height: 16px;
+                        display: inline-block;
+                        margin-bottom: 7px;
+                        margin-right: 10px;
+                        cursor: pointer;
+                        z-index: 2;
+                        position: relative;
+
+                        &.isActive {
+                            color: #fff;
+                        }
+                    }
+
+                    .box {
+                        width: 45px;
+                        height: 22px;
+                        background: rgba(11, 158, 192, 1);
+                        border-radius: 2px;
+                        position: absolute;
+                        left: 0;
+                        top: 10px;
+                        padding: 0;
+                        transition: all ease-in-out 0.3s;
+                        z-index: 1;
+                    }
+
+                    .top-icon {
+                        position: absolute;
+                        top: 5px;
+                        right: 0;
+                        color: #d6d6d6;
+
+                        &.isActive {
+                            color: #0b9ec0;
+                        }
+                    }
+
+                    .bottom-icon {
+                        position: absolute;
+                        bottom: 2px;
+                        right: 0;
+                        color: #d6d6d6;
+
+                        &.isActive {
+                            color: #0b9ec0;
+                        }
+                    }
+                }
+
+                &:not(:last-child) {
+                    .flift-list {
+                        border-bottom: 1px solid #eaeaea;
+                    }
+                }
+            }
+        }
+
+        .goodsList {
+            padding-top: 5px;
+        }
+    }
+
+    .content-right {
+        width: 211px;
+        float: right;
+        background-color: #fff;
+        border-radius: 4px;
+        border: 1px solid rgba(234, 234, 234, 1);
+        padding-left: 29px;
+        .right-title {
+            font-size: 16px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 42px;
+        }
+    }
 }
 </style>

+ 167 - 0
src/main/vue/src/pagesPre/Contact.vue

@@ -0,0 +1,167 @@
+<template>
+    <div class="conatiner">
+        <div class="banner" style="background-image:url(http://bpic.588ku.com/back_pic/03/63/06/2457abee2a5523a.jpg)"></div>
+
+        <div class="content">
+            <div class="name">
+                <div class="kuai"></div>
+                <span>加入我们</span>
+            </div>
+
+            <div class="content-content">
+
+                <div class="content-text">
+                    <div class="title">安徽图忆途网络科技服务有限公司</div>
+                    <div class="content-all">
+                        <div>
+                            <img style="width:18px;height:18px" src="../assetsPre/contact2.png" alt="">
+                            <span>电话:(+86)-755-26905651 / 26905652 / 26905653 </span>
+                        </div>
+                        <div>
+                            <img style="width:17px;height:17px" src="../assetsPre/contact4.png" alt="">
+                            <span>传真:(+86)-755-26905650 </span>
+                        </div>
+                        <div>
+                            <img style="width:15px;height:12px" src="../assetsPre/contact3.png" alt="">
+                            <span>邮编:230000 </span>
+                        </div>
+                        <div>
+                            <img style="width:12px;height:17px" src="../assetsPre/contact5.png" alt="">
+                            <span>地址:安徽省合肥市高新区长江西路699号金濠广场B03幢2204</span>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="line"></div>
+
+                <div class="content-img">
+                    <img src="../assetsPre/contact1.png" alt="">
+                    <div class="ps" style="margin-top:23px;">
+                        全国免费服务热线 400-800-0608
+                    </div>
+                    <div class="ps" style="margin-top:8px;">
+                        客服时间 周一至周日 9:00-17:00
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'home',
+    data() {
+        return {
+        }
+    },
+    computed: {
+    },
+    methods: {
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.banner {
+    width: 1191px;
+    height: 220px;
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: cover;
+    margin: auto;
+}
+
+.content {
+    width: 1146px;
+    margin: 20px auto;
+    background: rgba(255, 255, 255, 1);
+    border: 1px solid rgba(234, 234, 234, 1);
+    padding: 0 22px;
+    .name {
+        height: 36px;
+        line-height: 36px;
+        border-bottom: 1px solid #ebebeb;
+        .kuai {
+            width: 7px;
+            height: 15px;
+            background: rgba(11, 158, 192, 1);
+            display: inline-block;
+            vertical-align: middle;
+        }
+
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 19px;
+            margin-left: 13px;
+            vertical-align: middle;
+        }
+    }
+    .content-content {
+        overflow: hidden;
+        padding: 30px 0;
+        .content-img {
+            width: 383px;
+            height: 248px;
+            background-position: center center;
+            background-repeat: no-repeat;
+            background-size: cover;
+            display: inline-block;
+            vertical-align: middle;
+
+            img {
+                width: 137px;
+                height: 99px;
+                display: block;
+                margin: auto;
+            }
+
+            .ps {
+                font-size: 12px;
+                font-family: PingFangSC-Regular;
+                color: rgba(102, 102, 102, 1);
+                line-height: 17px;
+                text-align: center;
+            }
+        }
+
+        .line {
+            width: 1px;
+            height: 248px;
+            display: inline-block;
+            vertical-align: middle;
+            background-color: #eaeaea;
+        }
+        .content-text {
+            width: 720px;
+            display: inline-block;
+            vertical-align: middle;
+            .title {
+                font-size: 18px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 24px;
+            }
+
+            .content-all {
+                div {
+                    img {
+                        vertical-align: middle;
+                    }
+                    span {
+                        vertical-align: middle;
+                        margin-left: 5px;
+                    }
+                }
+                font-size: 14px;
+                font-family: PingFangSC-Regular;
+                color: rgba(102, 102, 102, 1);
+                line-height: 41px;
+                margin-top: 13px;
+            }
+        }
+    }
+}
+</style>

+ 404 - 45
src/main/vue/src/pagesPre/Index.vue

@@ -1,10 +1,15 @@
 <template>
-    <div class="conatiner">
-        <div class="banner" :style="{backgroundImage:'url('+require('../assetsPre/indexBanner.png')+')'}">
+    <div class="conatiner" id='allConatiner'>
+        <el-carousel class="banner swiper" :class="[bannerList.length==1?'noButton':'']" height="420px" :interval="4000">
+            <template v-for="item in bannerList">
+                <el-carousel-item :style="{backgroundImage:'url('+item.imageUrl+')'}">
+                    <a v-if="item.url" :href="item.url"></a>
+                </el-carousel-item>
+            </template>
 
-        </div>
+        </el-carousel>
 
-        <div class="content">
+        <div class="content" id='content'>
             <div class="content-step">
                 <div class="step-item">
                     <div class="num">1</div>
@@ -40,65 +45,96 @@
 
             </div>
 
-            <div class="content-box">
+            <div class="content-box" :id="'box'+index" v-for="(item,index) in serviceType">
                 <div class="box-top">
                     <div class="title">
-                        修图商
+                        {{item.shortName}}
                     </div>
                     <div class="subTitle">
-                        专业一对一定制化修图服务
+                        {{item.description}}
                     </div>
-                    <router-link class='more' :to='{name:"business",query:{id:1}}'>查看更多 ></router-link>
+                    <router-link class='more' :to='{name:"business",query:{id:(index+1)}}'>查看更多 ></router-link>
                 </div>
                 <div class="box-content">
-                    <div class="box-left"></div>
+                    <div class="box-left" :style="{backgroundImage:'url('+item.image+')'}"></div>
                     <div class="box-right">
-                        <div class="box-right-top" style="background:rgba(40,208,235,1);">
+                        <div class="box-right-top" :style="{backgroundColor:item.color}">
                             <div class="box-ad">
                                 <span>消息提醒:最热门服务商家可在此展示位置自定义一条广告消息展示</span>
                             </div>
-                            <div class="box-hot">热门修图商</div>
+                            <div class="box-hot">热门{{item.shortName}}</div>
                             <img src="../assetsPre/hot.png" alt="">
                         </div>
                         <div class="box-right-content">
-                            <div class="box-goodsList">
-                                <goods-little style="border-right:1px solid #EAEAEA"></goods-little>
-                                <goods-little style="border-right:1px solid #EAEAEA"></goods-little>
-                                <goods-little style="border-right:1px solid #EAEAEA"></goods-little>
-                                <goods-little style="border-right:1px solid #EAEAEA;padding-bottom: 30px;"></goods-little>
-                                <goods-little style="border-right:1px solid #EAEAEA;padding-bottom: 30px;"></goods-little>
-                                <goods-little style="border-right:1px solid #EAEAEA;padding-bottom: 30px;"></goods-little>
+                            <div class="box-goodsList" v-loading="loading">
+                                <template v-if='serviceGoods[item.id]'>
+                                    <goods-little v-for="(todo,todoIndex) in serviceGoods[item.id].home" :info='todo' style="padding-left:30px;display:inline-block"></goods-little>
+                                </template>
                             </div>
-                            <div class="box-rankList">
-                                <div class="box-rankItem">
-                                    <div class="num" :style="{backgroundImage:'url('+require('../assetsPre/num_bg_pre.png')+')'}">1</div>
-                                    <div class="name">韩国艺匠ARTIZ STUDIO</div>
-                                </div>
-                                <div class="box-rankItem">
-                                    <div class="num" :style="{backgroundImage:'url('+require('../assetsPre/num_bg_pre.png')+')'}">2</div>
-                                    <div class="name">韩国艺匠ARTIZ STUDIO</div>
-                                </div>
-                                <div class="box-rankItem">
-                                    <div class="num" :style="{backgroundImage:'url('+require('../assetsPre/num_bg_pre.png')+')'}">3</div>
-                                    <div class="name">韩国艺匠ARTIZ STUDIO</div>
-                                </div>
-                                <div class="box-rankItem">
-                                    <div class="num" :style="{backgroundImage:'url('+require('../assetsPre/num_bg.png')+')'}">4</div>
-                                    <div class="name">韩国艺匠ARTIZ STUDIO</div>
-                                </div>
-                                <div class="box-rankItem">
-                                    <div class="num" :style="{backgroundImage:'url('+require('../assetsPre/num_bg.png')+')'}">5</div>
-                                    <div class="name">韩国艺匠ARTIZ STUDIO</div>
-                                </div>
+                            <div class="box-rankList" v-loading="loading">
+                                <template v-if='serviceGoods[item.id]'>
+                                    <router-link :to='{name:"shop",query:{id:todo.id}}' class="box-rankItem" v-for="(todo,todoIndex) in serviceGoods[item.id].hot">
+                                        <div class="num" :style="{backgroundImage:'url('+(todoIndex<3?require('../assetsPre/num_bg_pre.png'):require('../assetsPre/num_bg.png'))+')'}">{{todoIndex+1}}</div>
+                                        <div class="name">{{todo.storeName}}</div>
+                                    </router-link>
+                                </template>
+
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
 
-            <div class="quickMenu">
-                  
+            <div class="quickMenu" id="quickMenu" :style="{position:quickFixed?'fixed':'absolute'}">
+                <div class="quickTop">
+                    <img src="../assetsPre/quckmenu.png" alt="">
+                </div>
+                <div class="quck-item" @click="goMenu(index)" :class="{active:(nowShort==index)}" v-for="(item,index) in serviceType">
+                    <span>{{item.shortName}}</span>
+                </div>
+
+                <img class="sanjiao" :style="{top:quickTop}" src="../assetsPre/quckmenu_sanjiao.png" alt="">
+            </div>
+
+            <div class="newRight" id='newRight'>
+                <div class="newShop" v-if="!hideShow1" style="margin-bottom:10px">
+                    <div class="newShop-name">
+                        <img src="../assetsPre/newShop.png" alt="">
+                        <span>新入驻</span>
+                        <i class="el-icon-close" id='close1' @click="hideShow1=true"></i>
+                    </div>
+                    <div class="newShop-list">
+                        <router-link :to='{name:"shop",query:{id:item.id}}' class="newShop-item" v-for="item in newShop">
+                            <span>{{item.storeName}}</span>
+                            <span style="color:#1BB8AC">{{getTime(item.createTime)}}</span>
+                            <span>入住了平台</span>
+                        </router-link>
+                    </div>
+                </div>
+
+                <div class="newShop" v-if="!hideShow2">
+                    <div class="newShop-name">
+                        <img src="../assetsPre/newInfo.png" alt="">
+                        <span>新订单</span>
+                        <i class="el-icon-close" id='close1' @click="hideShow2=true"></i>
+                    </div>
+                </div>
             </div>
+
+        </div>
+
+        <div class="minRight">
+            <el-tooltip v-if="hideShow1" content="新入驻" placement="left" effect="light">
+                <div class="minRight-item" @click="hideShow1=false">
+                    <img src="../assetsPre/newShop.png" alt="">
+                </div>
+            </el-tooltip>
+
+            <el-tooltip v-if="hideShow2" content="新订单" placement="left" effect="light">
+                <div class="minRight-item" @click="hideShow2=false">
+                    <img src="../assetsPre/newInfo.png" alt="">
+                </div>
+            </el-tooltip>
         </div>
 
         <menuFoot></menuFoot>
@@ -107,39 +143,220 @@
 </template>
 
 <script>
+var newShopLeft = 100;
+window.onresize = function () {
+    if (document.getElementById('allConatiner')) {
+        if (document.getElementById('allConatiner').offsetWidth <= 1750 && document.getElementById('allConatiner').offsetWidth > 1390) {
+            document.getElementById('newRight').style.right = 0 - (document.getElementById('allConatiner').offsetWidth - 1390) / 2 + 'px'
+        }
+        else if (document.getElementById('allConatiner').offsetWidth <= 1390) {
+            document.getElementById('newRight').style.right = 0
+        }
+        else {
+            document.getElementById('newRight').style.right = '-180px'
+
+        }
+    }
+
+};
 import goodsLittle from '../components/GoodsLittle'
 import menuFoot from '../pagesPre/MenuFoot'
+import { mapState } from 'vuex'
+import moment from 'moment/min/moment-with-locales'
 export default {
     name: 'home',
     data() {
         return {
+            newShopLeft,
+            hideShow1: false,
+            hideShow2: false,
+            nowShort: 0,
+            quickFixed: false,
+            bannerList: [],
+            serviceGoods: {},
+            loading: true,
+            newShop: []
         }
     },
+    mounted() {
+
+        this.$http.get({
+            url: '/storeInfo/page',
+            data: {
+                currentPage: 1,
+                pageNumber: 4,
+                orderByStr: 'create_time_,desc',
+                    useFlag:'Y'
+            }
+        }).then(res => {
+            if (res.success) {
+                this.newShop = res.data.pp
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+
+        setTimeout(() => {
+            if (document.getElementById('allConatiner').offsetWidth <= 1750 && document.getElementById('allConatiner').offsetWidth > 1390) {
+                console.log('a')
+                document.getElementById('newRight').style.right = 0 - (document.getElementById('allConatiner').offsetWidth - 1390) / 2 + 'px'
+            }
+            else if (document.getElementById('allConatiner').offsetWidth <= 1390) {
+                console.log('b')
+                document.getElementById('newRight').style.right = 0
+            }
+            else {
+                console.log('c')
+                document.getElementById('newRight').style.right = '-180px'
+
+            }
+
+            this.serviceType.forEach((item, index) => {
+                this.serviceGoods[item.id] = {
+                    home: [],
+                    hot: []
+                }
+                this.$http.get({
+                    url: '/storeInfo/page',
+                    data: {
+                        currentPage: 1,
+                        pageNumber: 6,
+                        serviceType: item.id,
+                        homeFlag: 1,
+                    useFlag:'Y'
+                    }
+                }).then(res => {
+                    if (res.success) {
+                        this.serviceGoods[item.id].home = res.data.pp
+                    }
+                }).catch(e => {
+                    console.log(e)
+                })
+
+                this.$http.get({
+                    url: '/storeInfo/page',
+                    data: {
+                        currentPage: 1,
+                        pageNumber: 10,
+                        serviceType: item.id,
+                        hotFlag: 1,
+                    useFlag:'Y'
+                    }
+                }).then(res => {
+                    if (res.success) {
+                        this.serviceGoods[item.id].hot = res.data.pp
+                    }
+                }).catch(e => {
+                    console.log(e)
+                })
+
+            });
+
+            setTimeout(() => {
+                this.loading = false
+            }, 500)
+
+
+        }, 500)
+
+
+
+        this.$http.get({
+            url: '/bannerInfo/all',
+            data: {
+                location: '1'
+            }
+        }).then(res => {
+            if (res.success) {
+                this.bannerList = res.data
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+
+        var list = [{
+            name: '首页',
+            href: '/'
+        }]
+        this.$store.commit('updateHrefHistory', list)
+    },
     computed: {
+        ...mapState(['serviceType']),
+        quickTop() {
+            var val = 65
+            val = this.nowShort * 50 + 65
+            return val + 'px'
+        }
     },
     methods: {
+        getTime(str) {
+            var time = ''
+            if (str) {
+                time = moment(str).fromNow()
+            }
+            return time
+        },
+        goBanner(banner) {
+            console.log(banner)
+            if (banner) {
+                this.$router.push(banner)
+            }
+        },
+        scrollMenu() {
+            // console.log(document.getElementById('content').offsetLeft)
+            if (document.getElementById('container').scrollTop >= 600) {
+                this.quickFixed = true
+                document.getElementById('quickMenu').style.left = document.getElementById('content').offsetLeft + 'px'
+            }
+            else {
+                this.quickFixed = false
+                document.getElementById('quickMenu').style.left = 0
+            }
+
+            // console.log(document.getElementById('box0').offsetTop,document.getElementById('container').scrollTop)
+
+            for (var i = 0; i < this.serviceType.length; i++) {
+                if (document.getElementById('container').scrollTop >= document.getElementById('box' + i).offsetTop + (document.body.clientHeight / 3)) {
+                    this.nowShort = i
+                }
+            }
+
+            if (this.nowShort == -1) {
+                this.nowShort = 0
+            }
+        },
+        goMenu(index) {
+            document.getElementById('container').scrollTop = document.getElementById('box' + index).offsetTop + 730 - 250
+        }
     },
     components: {
-        goodsLittle,menuFoot
+        goodsLittle, menuFoot
     }
 }
 </script>
 
 <style lang="less" scoped>
+.conatiner {
+    // min-width: 1190px;
+}
 .banner {
     height: 420px;
     width: 100%;
     background-size: cover;
     background-repeat: no-repeat;
     background-position: center center;
-    min-width: 1190px;
+    min-width: 1196px;
 }
 
 .content {
     width: 100%;
-    // max-width: 1555px;
+    max-width: 1390px;
+    margin: auto;
+    position: relative;
     .content-step {
-        width: 1190px;
+        width: 1196px;
         height: 80px;
         background: rgba(255, 255, 255, 1);
         border: 1px solid rgba(234, 234, 234, 1);
@@ -286,17 +503,21 @@ export default {
                 .box-right-content {
                     overflow: hidden;
                     padding-top: 14px;
+                    height: 484px;
 
                     .box-goodsList {
                         font-size: 0;
                         width: 716px;
                         float: left;
+                        height: 100%;
                     }
                 }
 
                 .box-rankList {
                     width: 241px;
                     float: right;
+                    border-left: 1px solid #ebebeb;
+                    height: 100%;
 
                     .box-rankItem {
                         margin-left: 26px;
@@ -304,6 +525,7 @@ export default {
                         overflow: hidden;
                         margin-top: 12px;
                         margin-bottom: 6px;
+                        display: block;
                         .num {
                             width: 15px;
                             height: 20px;
@@ -336,5 +558,142 @@ export default {
             }
         }
     }
+
+    .quickMenu {
+        position: absolute;
+        top: 120px;
+        left: 0px;
+        background-color: #fff;
+
+        .quickTop {
+            background: rgba(255, 255, 255, 1);
+            img {
+                width: 55px;
+                height: 45px;
+                display: block;
+                margin: auto;
+            }
+        }
+
+        .quck-item {
+            width: 55px;
+            height: 50px;
+            background: rgba(255, 255, 255, 1);
+            border: 1px solid rgba(234, 234, 234, 1);
+            text-align: center;
+            border-top: 0;
+            line-height: 51px;
+            cursor: pointer;
+            span {
+                vertical-align: middle;
+                font-size: 12px;
+                font-family: MicrosoftYaHei;
+                color: rgba(153, 153, 153, 1);
+                line-height: 16px;
+                max-width: 24px;
+            }
+
+            &.active {
+                // border-color: #0b9ec0;
+                border: 1px solid #81bcd4;
+                span {
+                    color: #0b9ec0;
+                }
+            }
+        }
+
+        .sanjiao {
+            position: absolute;
+            right: -8px;
+            top: 65px;
+            width: 9px;
+            height: 11px;
+            transition: top ease-in-out 0.3s;
+        }
+    }
+
+    .newRight {
+        position: absolute;
+        right: -180px;
+        top: 0;
+    }
+
+    .newShop {
+        width: 250px;
+        background: rgba(255, 255, 255, 1);
+        border: 1px solid rgba(234, 234, 234, 1);
+
+        .newShop-name {
+            border-bottom: 1px solid rgba(234, 234, 234, 1);
+            height: 40px;
+            line-height: 40px;
+            img {
+                width: 20px;
+                height: 18px;
+                vertical-align: middle;
+                margin: 0 7px 0 12px;
+            }
+
+            span {
+                font-size: 14px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 19px;
+                vertical-align: middle;
+            }
+
+            i {
+                float: right;
+                line-height: 40px;
+                padding: 0 10px;
+                font-size: 18px;
+                cursor: pointer;
+            }
+        }
+        .newShop-list {
+            padding-left: 25px;
+
+            .newShop-item {
+                line-height: 33px;
+                height: 33px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+                display: block;
+                span {
+                    vertical-align: middle;
+                    font-size: 12px;
+                    font-family: MicrosoftYaHei;
+                    color: rgba(102, 102, 102, 1);
+                    line-height: 16px;
+                }
+                &:not(:last-child) {
+                    border-bottom: 1px solid rgba(234, 234, 234, 1);
+                }
+            }
+        }
+    }
+}
+
+.minRight {
+    position: absolute;
+    top: 650px;
+    right: 0;
+    background-color: #fff;
+    border: 1px solid #ebebeb;
+
+    .minRight-item {
+        padding: 10px;
+        img {
+            width: 20px;
+            height: 18px;
+            display: block;
+            cursor: pointer;
+        }
+
+        &:not(:last-child) {
+            border-bottom: 1px solid #ebebeb;
+        }
+    }
 }
 </style>

+ 140 - 0
src/main/vue/src/pagesPre/Join.vue

@@ -0,0 +1,140 @@
+<template>
+    <div class="conatiner">
+        <div class="banner" style="background-image:url(http://bpic.588ku.com/back_pic/03/63/06/2457abee2a5523a.jpg)"></div>
+
+        <div class="content">
+            <div class="name">
+                <div class="kuai"></div>
+                <span>加入我们</span>
+            </div>
+
+            <div class="content-content">
+
+                <div class="content-text">
+                    如果你是:
+                    <br/>
+                    <b>狂恋代码的超级极客;</b>
+                    <br/> 互联网行业的超级脑残粉;
+                    <br/>
+                    <b>重度互联网依赖者; </b>
+                    <br/> 梦想用自己的右手,咳咳,不,双手让我们的行业变得更酷……
+                    <br/> 恭喜你,和我们基因相符,
+                    <br/> 赶快加入我们吧
+                    <br/> 邮箱:admin@nowcoder.com
+                    <br/> 联系方式:010-60728802
+                </div>
+
+                <div class="line"></div>
+
+                <div class="content-img">
+                    <img src="../assetsPre/join.png" alt="">
+                    <div class="button">诚聘英才</div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'home',
+    data() {
+        return {
+        }
+    },
+    computed: {
+    },
+    methods: {
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.banner {
+    width: 1191px;
+    height: 220px;
+    background-position: center center;
+    background-repeat: no-repeat;
+    background-size: cover;
+    margin: auto;
+}
+
+.content {
+    width: 1146px;
+    margin: 20px auto;
+    background: rgba(255, 255, 255, 1);
+    border: 1px solid rgba(234, 234, 234, 1);
+    padding: 0 22px;
+    .name {
+        height: 36px;
+        line-height: 36px;
+        border-bottom: 1px solid #ebebeb;
+        .kuai {
+            width: 7px;
+            height: 15px;
+            background: rgba(11, 158, 192, 1);
+            display: inline-block;
+            vertical-align: middle;
+        }
+
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 19px;
+            margin-left: 13px;
+            vertical-align: middle;
+        }
+    }
+    .content-content {
+        overflow: hidden;
+        padding: 30px 0;
+        .content-img {
+            width: 383px;
+            height: 248px;
+            background-position: center center;
+            background-repeat: no-repeat;
+            background-size: cover;
+            display: inline-block;
+            vertical-align: middle;
+
+            img {
+                width: 137px;
+                height: 99px;
+                display: block;
+                margin: auto;
+            }
+
+            .button {
+                width: 149px;
+                height: 50px;
+                border: 1px solid rgba(11, 158, 192, 1);
+                font-size: 24px;
+                font-family: PingFangSC-Regular;
+                color: rgba(11, 158, 192, 1);
+                line-height: 50px;
+                text-align: center;
+                margin: 37px auto;
+            }
+        }
+
+        .line {
+            width: 1px;
+            height: 248px;
+            display: inline-block;
+            vertical-align: middle;
+            background-color: #eaeaea;
+        }
+        .content-text {
+            width: 720px;
+            display: inline-block;
+            vertical-align: middle;
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 30px;
+            padding-left: 30px;
+        }
+    }
+}
+</style>

+ 6 - 1
src/main/vue/src/pagesPre/Login.vue

@@ -5,7 +5,7 @@
             <div class="login">
                 <div class="login-wrapper" @keyup.enter="login">
                     <div class="tabLine" :style="{left:activeName=='first'?'33px':'177px'}"></div>
-                    <el-tabs class="myTab" v-model="activeName">
+                    <el-tabs class="myTab"  v-model="activeName">
 
                         <el-tab-pane label="用户名登陆" name="first">
                             <el-form :model="userInfo" style="width: 288px;margin-top:27px;" ref="form">
@@ -195,6 +195,11 @@ export default {
 }
 </script>
 <style lang="less" scoped>
+.container{
+    height: 100%;
+    background-color: #fff;
+    min-width: 1190px;
+}
 .loginCenter {
     overflow: hidden;
     padding: 96px 0 129px;

+ 3 - 3
src/main/vue/src/pagesPre/LogoFoot.vue

@@ -20,13 +20,13 @@
                             <a href="#">周边</a>
                         </li>
                         <li>
-                            <a href="#">联系我们</a>
+                            <router-link :to='{name:"contact"}'>联系我们</router-link>
                         </li>
                         <li>
-                            <a href="#">加入我们</a>
+                            <router-link :to='{name:"join"}'>加入我们</router-link>
                         </li>
                         <li>
-                            <a href="#">关于我们</a>
+                            <router-link :to='{name:"about"}'>关于我们</router-link>
                         </li>
                     </ul>
 

+ 16 - 14
src/main/vue/src/pagesPre/LogoHead.vue

@@ -1,16 +1,19 @@
 <template>
-    <div class="HeadContent">
-        <div class="Head">
-            <img class="logo" src="../assetsPre/logo.png" alt="">
-            <div class="line">
-                |
+    <div style="background:#fff">
+        <div class="HeadContent">
+            <div class="Head">
+                <img class="logo" src="../assetsPre/logo.png" alt="">
+                <div class="line">
+                    |
+                </div>
+                <div class="welcome">
+                    欢迎登陆
+                </div>
             </div>
-            <div class="welcome">
-                欢迎登陆
-            </div>
-        </div>
 
+        </div>
     </div>
+
 </template>
 
 <script>
@@ -28,7 +31,7 @@ export default {
     methods: {
 
     },
-    components:{
+    components: {
         logo
     }
 }
@@ -47,12 +50,11 @@ export default {
     background: rgba(255, 255, 255, 1);
 
     .logo {
-       width: 300px;
-       height: 54px;
-       float: left;
+        width: 300px;
+        height: 54px;
+        float: left;
     }
 
-
     .line {
         float: left;
         font-size: 30px;

+ 48 - 0
src/main/vue/src/pagesPre/Main.vue

@@ -4,12 +4,60 @@
     </keep-alive>
 </template>
 <script>
+import { mapState } from "vuex";
 export default {
     name: '',
     data() {
         return {
+
         }
     },
+    computed: {
+        ...mapState(["locationInfo"])
+    },
+    created() {
+        // this.$http.post({
+        //     url: '/auth/login',
+        //     data: {
+        //         username: 'root',
+        //         password: '123456',
+        //     }
+        // }).then(res => {
+
+        // }).catch(() => {
+
+        // })
+
+
+    },
+    mounted() {
+        // var geolocation = new qq.maps.Geolocation(
+        //     "GLFBZ-ZR2W6-76XSA-MF7CQ-GDJ6Z-6FB5K",
+        //     "图途象"
+        // );
+        // if (!this.locationInfo) {
+        //     geolocation.getLocation(res => {
+        //         console.log(res)
+        //         this.$store.commit('updateLocationInfo', res)
+
+        //     })
+        // }
+
+        var mapObj = new AMap.Map('iCenter');
+        mapObj.plugin('AMap.Geolocation', ()=> {
+            var geolocation = new AMap.Geolocation({
+                enableHighAccuracy: false,//是否使用高精度定位,默认:true
+                timeout: 10000,          //超过10秒后停止定位,默认:无穷大
+                maximumAge: 0,           //定位结果缓存0毫秒,默认:0
+            });
+            mapObj.addControl(geolocation);
+            geolocation.getCurrentPosition();
+            AMap.event.addListener(geolocation, 'complete', (result)=>{
+                console.log(result)
+                this.$store.commit('updateLocationInfo', result)
+            });//返回定位信息
+        });
+    },
     watch: {
         $route() {
             if (this.$route.meta.title) {

+ 1 - 1
src/main/vue/src/pagesPre/MenuFoot.vue

@@ -66,7 +66,7 @@ export default {
 
 <style lang="less" scoped>
 .menuList {
-    width: 1190px;
+    width: 1196px;
     margin: 50px auto;
     height: 90px;
     font-size: 0;

+ 0 - 22
src/main/vue/src/pagesPre/Periphery.vue

@@ -1,22 +0,0 @@
-<template>
-    <div class="conatiner">
-periphery
-    </div>
-</template>
-
-<script>
-export default {
-    name: 'home',
-    data() {
-        return {
-        }
-    },
-    computed: {
-    },
-    methods: {
-    }
-}
-</script>
-
-<style lang="less" scoped>
-</style>

+ 371 - 2
src/main/vue/src/pagesPre/Product.vue

@@ -1,22 +1,391 @@
 <template>
     <div class="conatiner">
-product
+        <el-breadcrumb separator-class="el-icon-arrow-right" class="Breadcrumb">
+            <template v-for="(item,index) in hrefHistory">
+                <el-breadcrumb-item v-if="index<hrefHistory.length-1" :to="{ path: item.href }">{{item.name}}</el-breadcrumb-item>
+                <el-breadcrumb-item v-else>{{item.name}}</el-breadcrumb-item>
+            </template>
+
+        </el-breadcrumb>
+
+        <div class="goods">
+            <div class="goodsImg" :style="{backgroundImage:'url('+shopInfo.icon+')'}"></div>
+            <div class="goodsInfo">
+                <div class="title">
+                    <div class="name">{{shopInfo.storeName}}</div>
+                    <img src="../assetsPre/location_pre.png" alt="">
+                    <div class="address">{{shopInfo.citye}}</div>
+                </div>
+                <div class="titlesub">
+                    {{shopInfo.description}}
+                </div>
+                <div class="subtitle">
+                    <span>响应时间 :</span>
+                    <span>{{shopInfo.responseTime}}分钟</span>
+                </div>
+                <div class="subtitle">
+                    <span>返片率 :</span>
+                    <span>{{shopInfo.reworkRate}}%</span>
+                </div>
+
+                <div class="collection">
+                    <img src="../assetsPre/Star.png" alt="">
+                    <span>收藏店铺</span>
+                </div>
+
+                <div class="ask">
+                    <img src="../assetsPre/kefu.png" alt="">
+                    <span>在线咨询</span>
+                </div>
+            </div>
+
+            <img src="../assetsPre/levelA.png" alt="" class="level">
+        </div>
+
+        <div class="goodsList">
+            <el-tabs class="goodsTab" v-model="activeName">
+                <el-tab-pane label="在售商品" name="first">
+                    <div class="allGoods">
+                        <template v-for="(item,index) in goodsList">
+                            <div class="goods-item">
+                                <div class="icon" :style="{backgroundImage:'url('+item.image+')'}"></div>
+                                <div class="title">{{item.title}}</div>
+                                <div class="subTitle">
+                                    <span>¥{{item.price}}</span>
+                                    <span style="margin-left:3px;">已售</span>
+                                    <span style="color:#FB6E08">{{item.salesVolume}}</span>
+                                </div>
+                            </div>
+
+                            <div class="line" v-if="(index+1)%4==0"></div>
+                        </template>
+
+                    </div>
+
+                </el-tab-pane>
+                <el-tab-pane :label="'店铺评价 ('+(shopInfo.commentCount||'0')+')'" name="second">店铺评价({{shopInfo.commentCount}})</el-tab-pane>
+                <el-tab-pane label="最近成单" name="third">最近成单</el-tab-pane>
+            </el-tabs>
+        </div>
     </div>
 </template>
 
 <script>
+import { mapState } from 'vuex'
 export default {
-    name: 'home',
+    name: 'shop',
     data() {
         return {
+            shopInfo: {},
+            activeName: 'first',
+            goodsList: []
         }
     },
     computed: {
+        ...mapState(['userInfo', 'hrefHistory'])
+    },
+    mounted() {
+        var list = []
+        this.hrefHistory.forEach((item, index) => {
+            if (index < 3) {
+                list.push(item)
+            }
+        })
+
+        console.log(list)
+
+        if (list.length == 0) {
+            list.push({
+                name: '首页',
+                href: '/'
+            })
+        }
+
+        list.push({
+            name: document.title,
+            href: this.$route.fullPath
+        })
+
+
+        this.$store.commit('updateHrefHistory', list)
+
+        this.$http.get({
+            url: '/productInfo/getOne',
+            data: {
+                id: this.$route.query.id
+            }
+        }).then(res => {
+            if (res.success) {
+                this.shopInfo = res.data
+                document.title = res.data.title
+                var list = this.hrefHistory
+                list[list.length - 1].name = res.data.title
+                this.$store.commit('updateHrefHistory', list)
+
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+
+        this.$http.get({
+            url: '/productInfo/all',
+            data: {
+                storeId: this.$route.query.id,
+                onShelf: 'Y',
+                useFlag: 'Y'
+            }
+        }).then(res => {
+            if (res.success) {
+                this.goodsList = res.data
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
     },
     methods: {
+        scrollMenu() {
+
+        }
     }
 }
 </script>
 
 <style lang="less" scoped>
+.Breadcrumb {
+    padding: 21px 0 14px;
+    margin: auto;
+    width: 1190px;
+}
+
+.goods {
+    margin: auto;
+    width: 1146px;
+    overflow: hidden;
+    padding: 22px;
+    position: relative;
+    font-size: 0;
+    height: 268px;
+    background-color: #fff;
+    display: block;
+    border-radius: 4px;
+    border: 1px solid rgba(234, 234, 234, 1);
+
+    .level {
+        display: inline-block;
+        vertical-align: top;
+        width: 58.5px;
+        height: 30px;
+    }
+
+    .goodsImg {
+        width: 360px;
+        height: 268px;
+        border-radius: 4px;
+        background-position: center center;
+        background-size: cover;
+        background-repeat: no-repeat;
+        display: inline-block;
+        vertical-align: middle;
+    }
+
+    .goodsInfo {
+        display: inline-block;
+        vertical-align: middle;
+        margin-left: 24px;
+        height: 268px;
+        width: 700px;
+        overflow: hidden;
+        position: relative;
+    }
+
+    .title {
+        overflow: hidden;
+
+        .name {
+            display: inline-block;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            font-size: 18px;
+            font-size: 24px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 31px;
+            vertical-align: middle;
+            max-width: 400px;
+        }
+
+        img {
+            width: 12px;
+            height: 15px;
+            margin: 0 6px 2px 17px;
+            vertical-align: bottom;
+        }
+
+        .address {
+            display: inline-block;
+            font-size: 12px;
+            font-family: PingFangSC;
+            font-weight: bold;
+            color: rgba(11, 158, 192, 1);
+            line-height: 17px;
+            vertical-align: bottom;
+        }
+    }
+
+    .titlesub {
+        font-size: 14px;
+        font-family: MicrosoftYaHei;
+        color: rgba(153, 153, 153, 1);
+        line-height: 19px;
+        margin-top: 14px;
+    }
+
+    .subtitle {
+        margin-top: 10px;
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+
+            line-height: 16px;
+            &:first-child {
+                color: #666666;
+            }
+            &:last-child {
+                color: #fb6e08;
+            }
+        }
+    }
+
+    .collection {
+        width: 152px;
+        height: 39px;
+        border-radius: 3px;
+        border: 1px solid rgba(253, 149, 1, 1);
+        text-align: center;
+        line-height: 39px;
+        margin-top: 20px;
+        cursor: pointer;
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: #fb6e08;
+            line-height: 19px;
+            vertical-align: middle;
+        }
+
+        img {
+            width: 20px;
+            height: 20px;
+            margin-right: 10px;
+            vertical-align: middle;
+        }
+    }
+    .ask {
+        line-height: 32px;
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        cursor: pointer;
+        span {
+            font-size: 12px;
+            font-family: PingFangSC;
+            font-weight: 500;
+            color: rgba(153, 153, 153, 1);
+            line-height: 17px;
+            vertical-align: middle;
+            margin-left: 10px;
+        }
+
+        img {
+            width: 38px;
+            height: 32px;
+            vertical-align: middle;
+        }
+    }
+}
+
+.goodsList {
+    width: 1190px;
+    margin: 22px auto;
+    background: rgba(255, 255, 255, 1);
+    border-radius: 4px;
+    border: 1px solid rgba(234, 234, 234, 1);
+
+    .goodsTab {
+        margin-left: 20px;
+    }
+
+    .allGoods {
+        font-size: 0;
+        .goods-item {
+            display: inline-block;
+            width: 25%;
+            padding: 35px 0 68px;
+            box-sizing: border-box;
+            -moz-box-sizing: border-box; /* Firefox */
+            -webkit-box-sizing: border-box; /* Safari */
+
+            .icon {
+                width: 176px;
+                height: 100px;
+                border-radius: 4px;
+                background-position: center center;
+                background-repeat: no-repeat;
+                background-size: cover;
+                margin: auto;
+            }
+
+            .title {
+                margin: auto;
+                font-size: 14px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 19px;
+                margin-top: 8.6px;
+                width: 176px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+            }
+
+            .subTitle {
+                margin: auto;
+                line-height: 26px;
+                margin-top: 7px;
+                width: 176px;
+                span {
+                    &:first-child {
+                        font-size: 20px;
+                        font-family: MicrosoftYaHei;
+                        color: rgba(251, 110, 8, 1);
+                        line-height: 20px;
+                        vertical-align: bottom;
+                    }
+                    font-size: 12px;
+                    font-family: MicrosoftYaHei;
+                    color: rgba(102, 102, 102, 1);
+                    line-height: 16px;
+                    vertical-align: bottom;
+                }
+            }
+
+            &:not(:last-child) {
+                border-right: 1px solid #eaeaea;
+            }
+
+            &:nth-child(4n) {
+                border-right: 0;
+            }
+        }
+
+        .line {
+            width: 100%;
+            height: 1px;
+            background: #eaeaea;
+        }
+    }
+}
 </style>

+ 0 - 22
src/main/vue/src/pagesPre/Sale.vue

@@ -1,22 +0,0 @@
-<template>
-    <div class="conatiner">
-sale
-    </div>
-</template>
-
-<script>
-export default {
-    name: 'home',
-    data() {
-        return {
-        }
-    },
-    computed: {
-    },
-    methods: {
-    }
-}
-</script>
-
-<style lang="less" scoped>
-</style>

+ 392 - 0
src/main/vue/src/pagesPre/Shop.vue

@@ -0,0 +1,392 @@
+<template>
+    <div class="conatiner">
+        <el-breadcrumb separator-class="el-icon-arrow-right" class="Breadcrumb">
+            <template v-for="(item,index) in hrefHistory">
+                <el-breadcrumb-item v-if="index<hrefHistory.length-1" :to="{ path: item.href }">{{item.name}}</el-breadcrumb-item>
+                <el-breadcrumb-item v-else>{{item.name}}</el-breadcrumb-item>
+            </template>
+
+        </el-breadcrumb>
+
+        <div class="goods">
+            <div class="goodsImg" :style="{backgroundImage:'url('+shopInfo.icon+')'}"></div>
+            <div class="goodsInfo">
+                <div class="title">
+                    <div class="name">{{shopInfo.storeName}}</div>
+                    <img src="../assetsPre/location_pre.png" alt="">
+                    <div class="address">{{shopInfo.citye}}</div>
+                </div>
+                <div class="titlesub">
+                    {{shopInfo.description}}
+                </div>
+                <div class="subtitle">
+                    <span>响应时间 :</span>
+                    <span>{{shopInfo.responseTime}}分钟</span>
+                </div>
+                <div class="subtitle">
+                    <span>返片率 :</span>
+                    <span>{{shopInfo.reworkRate}}%</span>
+                </div>
+
+                <div class="collection">
+                    <img src="../assetsPre/Star.png" alt="">
+                    <span>收藏店铺</span>
+                </div>
+
+                <div class="ask">
+                    <img src="../assetsPre/kefu.png" alt="">
+                    <span>在线咨询</span>
+                </div>
+            </div>
+
+            <img src="../assetsPre/levelA.png" alt="" class="level">
+        </div>
+
+        <div class="goodsList">
+            <el-tabs class="goodsTab" v-model="activeName">
+                <el-tab-pane label="在售商品" name="first">
+                    <div class="allGoods">
+                        <template v-for="(item,index) in goodsList">
+                            <router-link :to='{name:"product",query:{id:item.id}}' class="goods-item">
+                                <div class="icon" :style="{backgroundImage:'url('+item.image+')'}"></div>
+                                <div class="title">{{item.title}}</div>
+                                <div class="subTitle">
+                                    <span>¥{{item.price}}</span>
+                                    <span style="margin-left:3px;">已售</span>
+                                    <span style="color:#FB6E08">{{item.salesVolume}}</span>
+                                </div>
+                            </router-link>
+
+                            <div class="line" v-if="(index+1)%4==0"></div>
+                        </template>
+
+                    </div>
+
+                </el-tab-pane>
+                <el-tab-pane :label="'店铺评价 ('+(shopInfo.commentCount||'0')+')'" name="second">店铺评价({{shopInfo.commentCount}})</el-tab-pane>
+                <el-tab-pane label="最近成单" name="third">最近成单</el-tab-pane>
+            </el-tabs>
+        </div>
+    </div>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+export default {
+    name: 'shop',
+    data() {
+        return {
+            shopInfo: {},
+            activeName: 'first',
+            goodsList: []
+        }
+    },
+    computed: {
+        ...mapState(['userInfo', 'hrefHistory'])
+    },
+    mounted() {
+        var list = []
+        this.hrefHistory.forEach((item, index) => {
+            if (index < 2) {
+                list.push(item)
+            }
+
+        })
+
+        console.log(list)
+
+        if (list.length == 0) {
+            list.push({
+                name: '首页',
+                href: '/'
+            })
+        }
+
+        list.push({
+            name: document.title,
+            href: this.$route.fullPath
+        })
+
+
+        this.$store.commit('updateHrefHistory', list)
+
+        this.$http.get({
+            url: '/storeInfo/getOne',
+            data: {
+                id: this.$route.query.id
+            }
+        }).then(res => {
+            if (res.success) {
+                this.shopInfo = res.data
+                document.title = res.data.storeName
+                var list = this.hrefHistory
+                list[list.length - 1].name = res.data.storeName
+                this.$store.commit('updateHrefHistory', list)
+
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+
+        this.$http.get({
+            url: '/productInfo/all',
+            data: {
+                storeId: this.$route.query.id,
+                onShelf: 'Y',
+                useFlag: 'Y'
+            }
+        }).then(res => {
+            if (res.success) {
+                this.goodsList = res.data
+            }
+        }).catch(e => {
+            console.log(e)
+        })
+
+    },
+    methods: {
+        scrollMenu() {
+
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.Breadcrumb {
+    padding: 21px 0 14px;
+    margin: auto;
+    width: 1190px;
+}
+
+.goods {
+    margin: auto;
+    width: 1146px;
+    overflow: hidden;
+    padding: 22px;
+    position: relative;
+    font-size: 0;
+    height: 268px;
+    background-color: #fff;
+    display: block;
+    border-radius: 4px;
+    border: 1px solid rgba(234, 234, 234, 1);
+
+    .level {
+        display: inline-block;
+        vertical-align: top;
+        width: 58.5px;
+        height: 30px;
+    }
+
+    .goodsImg {
+        width: 360px;
+        height: 268px;
+        border-radius: 4px;
+        background-position: center center;
+        background-size: cover;
+        background-repeat: no-repeat;
+        display: inline-block;
+        vertical-align: middle;
+    }
+
+    .goodsInfo {
+        display: inline-block;
+        vertical-align: middle;
+        margin-left: 24px;
+        height: 268px;
+        width: 700px;
+        overflow: hidden;
+        position: relative;
+    }
+
+    .title {
+        overflow: hidden;
+
+        .name {
+            display: inline-block;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            font-size: 18px;
+            font-size: 24px;
+            font-family: MicrosoftYaHei;
+            color: rgba(51, 51, 51, 1);
+            line-height: 31px;
+            vertical-align: middle;
+            max-width: 400px;
+        }
+
+        img {
+            width: 12px;
+            height: 15px;
+            margin: 0 6px 2px 17px;
+            vertical-align: bottom;
+        }
+
+        .address {
+            display: inline-block;
+            font-size: 12px;
+            font-family: PingFangSC;
+            font-weight: bold;
+            color: rgba(11, 158, 192, 1);
+            line-height: 17px;
+            vertical-align: bottom;
+        }
+    }
+
+    .titlesub {
+        font-size: 14px;
+        font-family: MicrosoftYaHei;
+        color: rgba(153, 153, 153, 1);
+        line-height: 19px;
+        margin-top: 14px;
+    }
+
+    .subtitle {
+        margin-top: 10px;
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+
+            line-height: 16px;
+            &:first-child {
+                color: #666666;
+            }
+            &:last-child {
+                color: #fb6e08;
+            }
+        }
+    }
+
+    .collection {
+        width: 152px;
+        height: 39px;
+        border-radius: 3px;
+        border: 1px solid rgba(253, 149, 1, 1);
+        text-align: center;
+        line-height: 39px;
+        margin-top: 20px;
+        cursor: pointer;
+        span {
+            font-size: 14px;
+            font-family: MicrosoftYaHei;
+            color: #fb6e08;
+            line-height: 19px;
+            vertical-align: middle;
+        }
+
+        img {
+            width: 20px;
+            height: 20px;
+            margin-right: 10px;
+            vertical-align: middle;
+        }
+    }
+    .ask {
+        line-height: 32px;
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        cursor: pointer;
+        span {
+            font-size: 12px;
+            font-family: PingFangSC;
+            font-weight: 500;
+            color: rgba(153, 153, 153, 1);
+            line-height: 17px;
+            vertical-align: middle;
+            margin-left: 10px;
+        }
+
+        img {
+            width: 38px;
+            height: 32px;
+            vertical-align: middle;
+        }
+    }
+}
+
+.goodsList {
+    width: 1190px;
+    margin: 22px auto;
+    background: rgba(255, 255, 255, 1);
+    border-radius: 4px;
+    border: 1px solid rgba(234, 234, 234, 1);
+
+    .goodsTab {
+        margin-left: 20px;
+    }
+
+    .allGoods {
+        font-size: 0;
+        .goods-item {
+            display: inline-block;
+            width: 25%;
+            padding: 35px 0 68px;
+            box-sizing: border-box;
+            -moz-box-sizing: border-box; /* Firefox */
+            -webkit-box-sizing: border-box; /* Safari */
+
+            .icon {
+                width: 176px;
+                height: 100px;
+                border-radius: 4px;
+                background-position: center center;
+                background-repeat: no-repeat;
+                background-size: cover;
+                margin: auto;
+            }
+
+            .title {
+                margin: auto;
+                font-size: 14px;
+                font-family: MicrosoftYaHei;
+                color: rgba(51, 51, 51, 1);
+                line-height: 19px;
+                margin-top: 8.6px;
+                width: 176px;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                white-space: nowrap;
+            }
+
+            .subTitle {
+                margin: auto;
+                line-height: 26px;
+                margin-top: 7px;
+                width: 176px;
+                span {
+                    &:first-child {
+                        font-size: 20px;
+                        font-family: MicrosoftYaHei;
+                        color: rgba(251, 110, 8, 1);
+                        line-height: 20px;
+                        vertical-align: bottom;
+                    }
+                    font-size: 12px;
+                    font-family: MicrosoftYaHei;
+                    color: rgba(102, 102, 102, 1);
+                    line-height: 16px;
+                    vertical-align: bottom;
+                }
+            }
+
+            &:not(:last-child) {
+                border-right: 1px solid #eaeaea;
+            }
+
+            &:nth-child(4n) {
+                border-right: 0;
+            }
+        }
+
+        .line {
+            width: 100%;
+            height: 1px;
+            background: #eaeaea;
+        }
+    }
+}
+</style>

+ 39 - 12
src/main/vue/src/routerPre/index.js

@@ -36,28 +36,55 @@ const router = new Router({
                     }
                 },
                 {
-                    path: '/customer',
-                    name: 'customer',
+                    path: '/about',
+                    name: 'about',
                     component: () =>
-                        import ('../pagesPre/Customer')
+                        import ('../pagesPre/About'),
+                    meta: {
+                        title: '关于我们'
+                    }
                 },
                 {
-                    path: '/product',
-                    name: 'product',
+                    path: '/join',
+                    name: 'join',
+                    component: () =>
+                        import ('../pagesPre/Join'),
+                    meta: {
+                        title: '加入我们'
+                    }
+                },
+                {
+                    path: '/contact',
+                    name: 'contact',
+                    component: () =>
+                        import ('../pagesPre/Contact'),
+                    meta: {
+                        title: '联系我们'
+                    }
+                },
+                {
+                    path: '/shop',
+                    name: 'shop',
                     component: () =>
-                        import ('../pagesPre/Product')
+                        import ('../pagesPre/Shop'),
+                    meta: {
+                        title: '店铺详情'
+                    }
                 },
                 {
-                    path: '/sale',
-                    name: 'sale',
+                    path: '/product',
+                    name: 'product',
                     component: () =>
-                        import ('../pagesPre/Sale')
+                        import ('../pagesPre/Product'),
+                    meta: {
+                        title: '商品详情'
+                    }
                 },
                 {
-                    path: '/periphery',
-                    name: 'periphery',
+                    path: '/customer',
+                    name: 'customer',
                     component: () =>
-                        import ('../pagesPre/Periphery')
+                        import ('../pagesPre/Customer')
                 }
             ]
         },

+ 15 - 4
src/main/vue/src/vuexPre/index.js

@@ -7,7 +7,10 @@ export default new Vuex.Store({
     state: {
         tableHeight: 0,
         fetchingData: false,
-        userInfo: null
+        userInfo: null,
+        locationInfo: null,
+        serviceType: [],
+        hrefHistory: []
     },
     mutations: {
         updateTableHeight(state, height) {
@@ -18,8 +21,16 @@ export default new Vuex.Store({
         },
         updateUserInfo(state, userInfo) {
             state.userInfo = userInfo
-        }
+        },
+        updateLocationInfo(state, location) {
+            state.locationInfo = location
+        },
+        updateServiceType(state, serviceType) {
+            state.serviceType = serviceType
+        },
+        updateHrefHistory(state, list) {
+            state.hrefHistory = list
+        },
     },
     actions: {}
-})
-;
+});

+ 1 - 1
src/main/vue/static/weather_icons/font/weathericons-regular-webfont.svg

@@ -102,7 +102,7 @@
 <glyph unicode="&#xf04e;" horiz-adv-x="851" d="M0 1027q0 41 40.5 108t77.5 111q10 12 25 29.5t17 19.5l39 -46q44 -49 81 -114t37 -108q0 -66 -45.5 -113t-111.5 -47t-113 47t-47 113zM333 584q0 46 26 107.5t64 113.5q73 98 140 163q7 5 28 26l27 -26q62 -59 141 -162q41 -55 66.5 -115t25.5 -107q0 -110 -75 -184.5 t-185 -74.5q-108 0 -183 76t-75 183zM495 1320q0 69 107 181l27 -30q30 -35 54 -78.5t24 -72.5q0 -44 -30.5 -73.5t-74.5 -29.5q-46 0 -76.5 29.5t-30.5 73.5z" />
 <glyph unicode="&#xf050;" horiz-adv-x="2539" d="M0 521q0 -39 30 -66q26 -30 67 -30h1567q46 0 78 -32t32 -79q0 -46 -31.5 -76.5t-78.5 -30.5t-78 31q-26 28 -64 28q-40 0 -68.5 -27.5t-28.5 -65.5q0 -40 30 -67q90 -88 209 -88q125 0 214 86t89 210t-89.5 213.5t-213.5 89.5h-1567q-40 0 -68.5 -28t-28.5 -68zM0 871 q0 -37 30 -65q28 -28 67 -28h2138q125 0 214.5 87t89.5 210q0 124 -89.5 212t-214.5 88q-123 0 -208 -85q-29 -26 -29 -71q0 -41 27.5 -67t67.5 -26q39 0 67 26q30 33 75 33q46 0 77.5 -32t31.5 -78t-31.5 -77t-77.5 -31h-2138q-40 0 -68.5 -28t-28.5 -68z" />
 <glyph unicode="&#xf051;" horiz-adv-x="2613" d="M0 693q0 40 32 74q36 31 75 31h248q43 0 72 -31t29 -74q0 -46 -29 -77t-72 -31h-248q-43 0 -75 32.5t-32 75.5zM355 1544q0 43 28 73q36 31 75 31q42 0 73 -31l175 -176q30 -35 30 -74q0 -45 -29 -75t-70 -30q-39 0 -75 31l-179 173q-28 34 -28 78zM568 104q0 45 31 73 q28 28 73 28h281l332 312q16 13 36 0l337 -312h295q43 0 73.5 -29.5t30.5 -71.5q0 -43 -30.5 -74t-73.5 -31h-361q-16 0 -31 8l-257 242l-255 -242q-13 -8 -30 -8h-347q-43 0 -73.5 31t-30.5 74zM667 693q0 -155 66 -282q4 -19 27 -19h201q12 0 16 9t-2 20 q-102 123 -102 272q0 180 128 306t308 126q179 0 305.5 -126t126.5 -306q0 -150 -101 -272q-7 -11 -3.5 -20t16.5 -9h203q21 0 25 19q66 123 66 282q0 130 -51 248t-136.5 203.5t-203.5 136t-247 50.5q-130 0 -248.5 -50.5t-205 -136t-137.5 -203.5t-51 -248zM1203 1648v245 q0 46 30 75.5t76 29.5q45 0 74.5 -30t29.5 -75v-245q0 -46 -29.5 -75.5t-74.5 -29.5q-46 0 -76 29.5t-30 75.5zM1880 1367q0 40 29 74l173 176q31 31 75 31t74 -30.5t30 -73.5q0 -46 -28 -78l-180 -173q-34 -31 -75 -31q-43 0 -70.5 29.5t-27.5 75.5zM2159 693q0 43 28.5 74 t70.5 31h251q43 0 74 -31t31 -74q0 -44 -31 -76t-74 -32h-251q-43 0 -71 31t-28 77z" />
-<glyph unicode="&#xf052;" horiz-adv-x="2585" d="M0 681q0 44 32 72q28 28 73 28h246q43 0 71 -28.5t28 -71.5q0 -45 -28.5 -75.5t-70.5 -30.5h-246q-43 0 -74 31.5t-31 74.5zM351 1519q0 45 27 72q32 32 75 32q46 0 72 -32l173 -174q74 -70 0 -144q-30 -30 -69 -30q-35 0 -72 30l-179 174q-27 29 -27 72zM561 103 q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-335 -303q-20 -14 -35 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5zM661 681q0 -159 62 -280q9 -17 29 -17h199q13 0 16 8t-8 19 q-95 119 -95 270q0 176 126 299.5t304 123.5q176 0 301.5 -124t125.5 -299q0 -151 -95 -270q-11 -11 -8 -19t16 -8h201q21 0 26 17q66 125 66 280q0 127 -50.5 244.5t-135.5 202.5t-202 135.5t-245 50.5t-245 -50.5t-202 -135.5t-135.5 -202.5t-50.5 -244.5zM1190 1621v248 q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5v-248q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM1859 1345q0 45 28 72l174 174q26 32 72 32q44 0 73 -30.5t29 -73.5q0 -45 -27 -72l-177 -174q-37 -30 -74 -30q-42 0 -70 29.5t-28 72.5zM2135 681 q0 43 28 71.5t71 28.5h247q43 0 73.5 -29t30.5 -71q0 -43 -30.5 -74.5t-73.5 -31.5h-247q-42 0 -70.5 30.5t-28.5 75.5z" />
+<glyph unicode="&#xf052;" horiz-adv-x="2585" d="M0 681q0 44 32 72q28 28 73 28h246q43 0 71 -28.5t28 -71.5q0 -45 -28.5 -75.5t-70.5 -30.5h-246q-43 0 -74 31.5t-31 74.5zM351 1519q0 45 27 72q32 32 75 32q46 0 72 -32l173 -174q74 -70 0 -144q-30 -30 -69 -30q-35 0 -72 30l-179 174q-27 29 -27 72zM561 103 q0 42 32 74q29 29 72 29h343q17 0 30 -8l251 -237l255 237q11 8 31 8h352q43 0 73.5 -30t30.5 -73t-30.5 -73.5t-73.5 -30.5h-286l-335 -303q-20 -14 -35 0l-329 303h-277q-43 0 -73.5 30.5t-30.5 73.5zM661 681q0 -159 62 -280q9 -17 29 -17h199q13 0 16 8t-8 19 q-95 119 -95 270q0 176 126 299.5t304 123.5q176 0 301.5 -124t125.5 -299q0 -151 -95 -270q-11 -11 -8 -19t16 -8h201q21 0 26 17q66 125 66 280q0 127 -50.5 244.5t-135.5 202.5t-202 135.5t-245 50.5t-245 -50.5t-202 -135.5t-135.5 -202.5t-50.5 -244.5zM1196 1621v248 q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5v-248q0 -43 -30.5 -73.5t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM1859 1345q0 45 28 72l174 174q26 32 72 32q44 0 73 -30.5t29 -73.5q0 -45 -27 -72l-177 -174q-37 -30 -74 -30q-42 0 -70 29.5t-28 72.5zM2135 681 q0 43 28 71.5t71 28.5h247q43 0 73.5 -29t30.5 -71q0 -43 -30.5 -74.5t-73.5 -31.5h-247q-42 0 -70.5 30.5t-28.5 75.5z" />
 <glyph unicode="&#xf053;" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185z" />
 <glyph unicode="&#xf054;" horiz-adv-x="538" d="M0 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69 178t-168 91v783q0 10 -11 20.5t-24 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />
 <glyph unicode="&#xf055;" horiz-adv-x="1085" d="M0 245q0 136 63 253.5t176 196.5v1058q0 128 88 217t216 89q129 0 217.5 -89t88.5 -217v-1058q113 -79 175 -196.5t62 -253.5q0 -148 -72.5 -273t-197.5 -197.5t-273 -72.5q-147 0 -272 72.5t-198 197.5t-73 273zM187 245q0 -149 104.5 -254.5t251.5 -105.5 q149 0 256.5 107t107.5 253q0 100 -51.5 184.5t-140.5 131.5l-30 15q-16 7 -16 31v1146q0 52 -36 86t-90 34q-52 0 -88.5 -34t-36.5 -86v-1146q0 -24 -15 -31l-29 -15q-88 -47 -137.5 -131t-49.5 -185zM270 245q0 -114 78 -194t188 -80t191 80.5t81 193.5q0 101 -69.5 178 t-168.5 91v783q0 10 -10.5 20.5t-23.5 10.5q-14 0 -22.5 -9t-8.5 -22v-783q-98 -14 -166.5 -91t-68.5 -178z" />