Browse Source

first commit

傅豪杰 1 year ago
commit
8cc681ef52
100 changed files with 27259 additions and 0 deletions
  1. 18 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 5 0
      .eslintignore
  4. 29 0
      .eslintrc.js
  5. 17 0
      .gitignore
  6. 10 0
      .postcssrc.js
  7. 30 0
      README.md
  8. 41 0
      build/build.js
  9. 54 0
      build/check-versions.js
  10. BIN
      build/logo.png
  11. 101 0
      build/utils.js
  12. 22 0
      build/vue-loader.conf.js
  13. 92 0
      build/webpack.base.conf.js
  14. 95 0
      build/webpack.dev.conf.js
  15. 149 0
      build/webpack.prod.conf.js
  16. 7 0
      config/dev.env.js
  17. 75 0
      config/index.js
  18. 4 0
      config/prod.env.js
  19. 7 0
      config/test.env.js
  20. 36 0
      index.html
  21. 17539 0
      package-lock.json
  22. 99 0
      package.json
  23. 43 0
      project.config.json
  24. 7 0
      project.private.config.json
  25. 21 0
      src/App.vue
  26. BIN
      src/assets/images/2022copy.png
  27. BIN
      src/assets/images/a-12.png
  28. BIN
      src/assets/images/a-124.png
  29. BIN
      src/assets/images/ad_icon1.png
  30. BIN
      src/assets/images/ad_icon2.png
  31. BIN
      src/assets/images/ad_icon3.png
  32. BIN
      src/assets/images/ad_icon4.png
  33. BIN
      src/assets/images/addlist.png
  34. BIN
      src/assets/images/banner.png
  35. BIN
      src/assets/images/bg.png
  36. BIN
      src/assets/images/copy.png
  37. BIN
      src/assets/images/del.png
  38. BIN
      src/assets/images/foot_icon1.png
  39. BIN
      src/assets/images/foot_icon2.png
  40. BIN
      src/assets/images/foot_icon3.png
  41. BIN
      src/assets/images/icon1.png
  42. BIN
      src/assets/images/icon11.png
  43. BIN
      src/assets/images/icon2.png
  44. BIN
      src/assets/images/icon22.png
  45. BIN
      src/assets/images/icon3.png
  46. BIN
      src/assets/images/icon33.png
  47. BIN
      src/assets/images/icon4.png
  48. BIN
      src/assets/images/icon5.png
  49. BIN
      src/assets/images/icon6.png
  50. BIN
      src/assets/images/icon7.png
  51. BIN
      src/assets/images/icon8.png
  52. BIN
      src/assets/images/icon9.png
  53. BIN
      src/assets/images/j_ico01.png
  54. BIN
      src/assets/images/j_ico02.png
  55. BIN
      src/assets/images/j_ico03.png
  56. BIN
      src/assets/images/j_ico04.png
  57. BIN
      src/assets/images/login.png
  58. BIN
      src/assets/images/my_banner.png
  59. BIN
      src/assets/images/my_icon1.png
  60. BIN
      src/assets/images/my_icon2.png
  61. BIN
      src/assets/images/my_icon3.png
  62. BIN
      src/assets/images/my_icon4.png
  63. BIN
      src/assets/images/my_icon5.png
  64. BIN
      src/assets/images/my_icon6.png
  65. BIN
      src/assets/images/myicon3.png
  66. BIN
      src/assets/images/sm.png
  67. BIN
      src/assets/images/status.png
  68. BIN
      src/assets/images/top.png
  69. BIN
      src/assets/images/whrite.png
  70. BIN
      src/assets/logo.png
  71. 36 0
      src/components/back.vue
  72. 36 0
      src/components/backindex.vue
  73. 23 0
      src/components/banner.vue
  74. 84 0
      src/components/tabbar.vue
  75. 82 0
      src/main.js
  76. 303 0
      src/pages/addressbook.vue
  77. 301 0
      src/pages/cityaddressbook.vue
  78. 675 0
      src/pages/cityexpress.vue
  79. 94 0
      src/pages/daishou.vue
  80. 158 0
      src/pages/editaddress.vue
  81. 860 0
      src/pages/express.vue
  82. 180 0
      src/pages/foreignaddress.vue
  83. 622 0
      src/pages/foreignexpress.vue
  84. 130 0
      src/pages/forgetpassword.vue
  85. 180 0
      src/pages/hkaddress.vue
  86. 610 0
      src/pages/hkexpress.vue
  87. 302 0
      src/pages/inaddressbook.vue
  88. 247 0
      src/pages/index.vue
  89. 817 0
      src/pages/inexpress.vue
  90. 222 0
      src/pages/info.vue
  91. 182 0
      src/pages/innewaddress.vue
  92. 152 0
      src/pages/key.vue
  93. 128 0
      src/pages/login.vue
  94. 420 0
      src/pages/logisticslist.vue
  95. 283 0
      src/pages/mailInfo.vue
  96. 318 0
      src/pages/multipleaddressbook.vue
  97. 832 0
      src/pages/multipleexpress.vue
  98. 171 0
      src/pages/my.vue
  99. 301 0
      src/pages/myaddressbook.vue
  100. 0 0
      src/pages/myexpress.vue

+ 18 - 0
.babelrc

@@ -0,0 +1,18 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"],
+  "env": {
+    "test": {
+      "presets": ["env", "stage-2"],
+      "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]
+    }
+  }
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 5 - 0
.eslintignore

@@ -0,0 +1,5 @@
+/build/
+/config/
+/dist/
+/*.js
+/test/unit/coverage/

+ 29 - 0
.eslintrc.js

@@ -0,0 +1,29 @@
+// https://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  env: {
+    browser: true,
+  },
+  extends: [
+    // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
+    // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
+    'plugin:vue/essential', 
+    // https://github.com/standard/standard/blob/master/docs/RULES-en.md
+    'standard'
+  ],
+  // required to lint *.vue files
+  plugins: [
+    'vue'
+  ],
+  // add your custom rules here
+  rules: {
+    // allow async-await
+    'generator-star-spacing': 'off',
+    // allow debugger during development
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
+  }
+}

+ 17 - 0
.gitignore

@@ -0,0 +1,17 @@
+.DS_Store
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+/test/unit/coverage/
+/test/e2e/reports/
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 10 - 0
.postcssrc.js

@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 30 - 0
README.md

@@ -0,0 +1,30 @@
+# vuelist
+
+> A Vue.js project
+
+## Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+
+# run unit tests
+npm run unit
+
+# run e2e tests
+npm run e2e
+
+# run all tests
+npm test
+```
+
+For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

+ 41 - 0
build/build.js

@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})

+ 54 - 0
build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

BIN
build/logo.png


+ 101 - 0
build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 92 - 0
build/webpack.base.conf.js

@@ -0,0 +1,92 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const createLintingRule = () => ({
+  // test: /\.(js|vue)$/,
+  // loader: 'eslint-loader',
+  // enforce: 'pre',
+  // include: [resolve('src'), resolve('test')],
+  // options: {
+  //   formatter: require('eslint-friendly-formatter'),
+  //   emitWarning: !config.dev.showEslintErrorsInOverlay
+  // }
+})
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      ...(config.dev.useEslint ? [createLintingRule()] : []),
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 95 - 0
build/webpack.dev.conf.js

@@ -0,0 +1,95 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [
+        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+      ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true
+    }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.dev.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 149 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,149 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = process.env.NODE_ENV === 'testing'
+  ? require('../config/test.env')
+  : require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: process.env.NODE_ENV === 'testing'
+        ? 'index.html'
+        : config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 7 - 0
config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})

+ 75 - 0
config/index.js

@@ -0,0 +1,75 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+module.exports = {
+  dev: {
+
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {},
+
+    // Various Dev Server settings
+    host: 'localhost', // can be overwritten by process.env.HOST
+    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    // Use Eslint Loader?
+    // If true, your code will be linted during bundling and
+    // linting errors and warnings will be shown in the console.
+    useEslint: true,
+    // If true, eslint errors and warnings will also be shown in the error overlay
+    // in the browser.
+    showEslintErrorsInOverlay: false,
+
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    devtool: 'cheap-module-eval-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    cssSourceMap: true
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: './',
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: true,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: '#source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+}

+ 4 - 0
config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"'
+}

+ 7 - 0
config/test.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const devEnv = require('./dev.env')
+
+module.exports = merge(devEnv, {
+  NODE_ENV: '"testing"'
+})

+ 36 - 0
index.html

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+		<title>天纵物流</title>
+    <style>
+      *{margin: 0px;padding: 0px;}
+	  body{
+		  background: #f6f6f6;
+	  }
+    </style>
+	</head>
+	<body>
+		<div id="app"></div>
+		<!-- built files will be auto injected -->
+	</body>
+
+</html>
+<script>
+	(function(doc, win) {
+		var docEl = doc.documentElement,
+			resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
+			recalc = function() {
+				var clientWidth = docEl.clientWidth;
+				if (clientWidth >= 750) {
+					docEl.style.fontSize = 100 + 'px';
+				} else {
+					docEl.style.fontSize = 20 * (clientWidth / 150) + 'px';
+				};
+			};
+		if (!doc.addEventListener) return;
+		win.addEventListener(resizeEvt, recalc, false);
+		doc.addEventListener('DOMContentLoaded', recalc, false);
+	})(document, window);
+</script>

File diff suppressed because it is too large
+ 17539 - 0
package-lock.json


+ 99 - 0
package.json

@@ -0,0 +1,99 @@
+{
+  "name": "vuelist",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "",
+  "private": true,
+  "scripts": {
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev",
+    "unit": "jest --config test/unit/jest.conf.js --coverage",
+    "e2e": "node test/e2e/runner.js",
+    "test": "npm run unit && npm run e2e",
+    "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "clipboard": "^2.0.8",
+    "jquery": "^3.6.0",
+    "jsbarcode": "^3.11.5",
+    "qrcode": "^1.4.4",
+    "sass-loader": "^10.1.1",
+    "vant": "^2.12.11",
+    "vue": "^2.5.2",
+    "vue-jsonp": "^2.0.0",
+    "vue-resource": "^1.5.2",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.6.2",
+    "weixin-js-sdk": "^1.6.0"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-eslint": "^8.2.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-jest": "^21.0.2",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-dynamic-import-node": "^1.2.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^2.0.1",
+    "chromedriver": "^2.27.2",
+    "copy-webpack-plugin": "^4.0.1",
+    "cross-spawn": "^5.0.1",
+    "css-loader": "^0.28.0",
+    "eslint": "^4.15.0",
+    "eslint-config-standard": "^10.2.1",
+    "eslint-friendly-formatter": "^3.0.0",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-import": "^2.7.0",
+    "eslint-plugin-node": "^5.2.0",
+    "eslint-plugin-promise": "^3.4.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-vue": "^4.0.0",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^1.1.4",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "jest": "^22.0.4",
+    "jest-serializer-vue": "^0.3.0",
+    "less": "^3.11.1",
+    "less-loader": "^5.0.0",
+    "nightwatch": "^0.9.12",
+    "node-notifier": "^5.1.2",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "selenium-server": "^3.0.1",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^0.5.8",
+    "vue-jest": "^1.0.2",
+    "vue-loader": "^13.3.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 43 - 0
project.config.json

@@ -0,0 +1,43 @@
+{
+  "appid": "wx4e4e58e8f4d714a2",
+  "compileType": "miniprogram",
+  "libVersion": "3.0.1",
+  "packOptions": {
+    "ignore": [],
+    "include": []
+  },
+  "setting": {
+    "urlCheck": true,
+    "coverView": true,
+    "es6": true,
+    "postcss": true,
+    "lazyloadPlaceholderEnable": false,
+    "preloadBackgroundData": false,
+    "minified": true,
+    "autoAudits": false,
+    "uglifyFileName": false,
+    "uploadWithSourceMap": true,
+    "enhance": true,
+    "showShadowRootInWxmlPanel": true,
+    "packNpmManually": false,
+    "packNpmRelationList": [],
+    "minifyWXSS": true,
+    "useStaticServer": true,
+    "showES6CompileOption": false,
+    "checkInvalidKey": true,
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "disableUseStrict": false,
+    "useCompilerPlugins": false,
+    "minifyWXML": true
+  },
+  "condition": {},
+  "editorSetting": {
+    "tabIndent": "insertSpaces",
+    "tabSize": 2
+  },
+  "description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html"
+}

+ 7 - 0
project.private.config.json

@@ -0,0 +1,7 @@
+{
+  "projectname": "user-mobile-terminal",
+  "setting": {
+    "compileHotReLoad": true
+  },
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html"
+}

+ 21 - 0
src/App.vue

@@ -0,0 +1,21 @@
+<template>
+  <div id="app">
+    <router-view ></router-view>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'App'
+}
+</script>
+
+<style  scoped>
+#app {
+  width: 100%;
+ max-width:7.5rem;
+ margin: 0 auto;
+}
+
+
+</style>

BIN
src/assets/images/2022copy.png


BIN
src/assets/images/a-12.png


BIN
src/assets/images/a-124.png


BIN
src/assets/images/ad_icon1.png


BIN
src/assets/images/ad_icon2.png


BIN
src/assets/images/ad_icon3.png


BIN
src/assets/images/ad_icon4.png


BIN
src/assets/images/addlist.png


BIN
src/assets/images/banner.png


BIN
src/assets/images/bg.png


BIN
src/assets/images/copy.png


BIN
src/assets/images/del.png


BIN
src/assets/images/foot_icon1.png


BIN
src/assets/images/foot_icon2.png


BIN
src/assets/images/foot_icon3.png


BIN
src/assets/images/icon1.png


BIN
src/assets/images/icon11.png


BIN
src/assets/images/icon2.png


BIN
src/assets/images/icon22.png


BIN
src/assets/images/icon3.png


BIN
src/assets/images/icon33.png


BIN
src/assets/images/icon4.png


BIN
src/assets/images/icon5.png


BIN
src/assets/images/icon6.png


BIN
src/assets/images/icon7.png


BIN
src/assets/images/icon8.png


BIN
src/assets/images/icon9.png


BIN
src/assets/images/j_ico01.png


BIN
src/assets/images/j_ico02.png


BIN
src/assets/images/j_ico03.png


BIN
src/assets/images/j_ico04.png


BIN
src/assets/images/login.png


BIN
src/assets/images/my_banner.png


BIN
src/assets/images/my_icon1.png


BIN
src/assets/images/my_icon2.png


BIN
src/assets/images/my_icon3.png


BIN
src/assets/images/my_icon4.png


BIN
src/assets/images/my_icon5.png


BIN
src/assets/images/my_icon6.png


BIN
src/assets/images/myicon3.png


BIN
src/assets/images/sm.png


BIN
src/assets/images/status.png


BIN
src/assets/images/top.png


BIN
src/assets/images/whrite.png


BIN
src/assets/logo.png


+ 36 - 0
src/components/back.vue

@@ -0,0 +1,36 @@
+<template>
+  <van-nav-bar
+    :title="title"
+    left-text="返回"
+    left-arrow
+    @click-left="onClickLeft"
+  />
+</template>
+<script>
+  export default {
+    props: {
+      title:""
+    },
+    methods:{
+      onClickLeft(){
+        this.$router.back()
+      }
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .van-nav-bar__content{
+    .van-nav-bar__title{
+      font-size: 16px;
+    }
+  }
+/deep/.van-icon-arrow-left::before{
+  color: #333;
+  font-size: 16px;
+}
+/deep/.van-nav-bar__text{
+  color: #333 !important;
+  font-size: 16px;
+}
+</style>

+ 36 - 0
src/components/backindex.vue

@@ -0,0 +1,36 @@
+<template>
+  <van-nav-bar
+    :title="title"
+    left-text="返回"
+    left-arrow
+    @click-left="onClickLeft"
+  />
+</template>
+<script>
+  export default {
+    props: {
+      title:""
+    },
+    methods:{
+      onClickLeft(){
+        this.$router.push({path:'/'})
+      }
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+  /deep/ .van-nav-bar__content{
+    .van-nav-bar__title{
+      font-size: 16px;
+    }
+  }
+/deep/.van-icon-arrow-left::before{
+  color: #333;
+  font-size: 16px;
+}
+/deep/.van-nav-bar__text{
+  color: #333 !important;
+  font-size: 16px;
+}
+</style>

+ 23 - 0
src/components/banner.vue

@@ -0,0 +1,23 @@
+<template>
+  <div class="banner">
+    <img src="../assets/images/banner.png" alt="">
+  </div>
+</template>
+<script>
+  export default {
+    data() {
+      return {
+
+
+      };
+    },
+  };
+</script>
+
+<style lang="less" scoped>
+  .banner{
+    font-size: 0px;
+    img{width: 100%;}
+  }
+
+</style>

+ 84 - 0
src/components/tabbar.vue

@@ -0,0 +1,84 @@
+<template>
+  <div class="">
+    <van-tabbar route="" v-model="active" class="tabbar" active-color="#01c4b8" inactive-color="#999999">
+      <van-tabbar-item replace to="/">
+        <span>首页</span>
+        <template #icon="props">
+          <img :src="props.active ? icon.inactive1 : icon.active1" />
+        </template>
+      </van-tabbar-item>
+			<van-tabbar-item  replace  to="/Logisticslist">
+			  <span>运单追踪</span>
+			  <template #icon="props">
+			    <img :src="props.active ? icon.inactive2 : icon.active2" />
+			  </template>
+			</van-tabbar-item>
+      <van-tabbar-item  replace  to="/Search">
+        <span>收件</span>
+        <template #icon="props">
+          <img :src="props.active ? icon.inactive4 : icon.active4" />
+        </template>
+      </van-tabbar-item>
+      <van-tabbar-item  replace  to="/My">
+        <span>我的</span>
+        <template #icon="props">
+          <img :src="props.active ? icon.inactive3 : icon.active3" />
+        </template>
+      </van-tabbar-item>
+     <!-- <van-tabbar-item icon="search">标签</van-tabbar-item>
+      <van-tabbar-item icon="setting-o">标签</van-tabbar-item> -->
+    </van-tabbar>
+  </div>
+</template>
+<script>
+  import {Tabbar,TabbarItem} from 'vant';
+  export default {
+
+    data() {
+      return {
+        active: 0,
+        icon: {
+          active1: require("../assets/images/icon1.png"),
+          inactive1: require("../assets/images/icon11.png"),
+          active2: require("../assets/images/icon2.png"),
+          inactive2: require("../assets/images/icon22.png"),
+          active3: require("../assets/images/icon3.png"),
+          inactive3: require("../assets/images/icon33.png"),
+		  active4: require("../assets/images/a-12.png"),
+		  inactive4: require("../assets/images/a-124.png"),
+        },
+      };
+    },
+    methods:{
+      // change(num){
+      //   this.active=num;
+      //   console.log(this.active);
+      //   if(num==0){
+      //     this.$router.push('/')
+      //   }
+      //   if(num==1){
+      //     this.$router.push('/Yw')
+      //   }
+      //   if(num==2){
+      //     this.$router.push('/My')
+      //   }
+
+      // }
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+  .tabbar {
+    width: 100%;
+    max-width: 7.5rem;
+    left: 50%;
+    margin-left: -3.75rem;
+  }
+
+  .van-tabbar-item{
+    //font-size: .24rem;
+
+  }
+
+</style>

+ 82 - 0
src/main.js

@@ -0,0 +1,82 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+
+import Vue from 'vue'
+import {VueJsonp} from 'vue-jsonp'
+Vue.use(VueJsonp)
+import App from './App'
+import router from './router'
+import store from './store/store' // 引入store
+import resource from 'vue-resource' // 引入vue-resource
+import tabbar from './components/tabbar.vue'
+import banner from './components/banner.vue'
+import back from './components/back.vue'
+import backIndex from './components/backindex.vue'
+import Vant from 'vant'
+import clipboard from 'clipboard'
+import 'vant/lib/index.css'
+import wx from 'weixin-js-sdk'
+Vue.prototype.$wx= wx
+
+Vue.component('tabbar',tabbar)
+Vue.component('banner',banner)
+Vue.component('back',back)
+Vue.component('backindex',backIndex)
+Vue.config.productionTip = false
+Vue.use(Vant)
+Vue.use(resource)
+import common from './script/common.js'
+Vue.use(common)
+Vue.prototype.clipboard = clipboard
+
+
+// 时间戳过滤器
+Vue.filter('dateFormat', (dataStr) => {
+  var time = new Date(dataStr)
+
+  function timeAdd0 (str) {
+    if (str < 10) {
+      str = '0' + str
+    }
+    return str
+  }
+  var y = time.getFullYear()
+  var m = time.getMonth() + 1
+  var d = time.getDate()
+  var h = time.getHours()
+  var mm = time.getMinutes()
+  var s = time.getSeconds()
+  return y + '-' + timeAdd0(m) + '-' + timeAdd0(d) + ' ' + timeAdd0(h) + ':' + timeAdd0(mm) + ':' + timeAdd0(s)
+})
+
+//Vue.prototype.common=common
+// Vue.http.options.emulateJSON = true;
+// Vue.http.options.headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'};
+
+// Vue.http.interceptors.push((request, next) => {
+// next((response) => {}
+
+// })
+/* eslint-disable no-new */
+router.beforeEach((to, from, next) => {
+	if (to.matched.some(record => record.meta.needLogin)) { // 判断该路由是否需要登录权限
+		//登录判断
+		
+		if (localStorage.getItem('userId')) { // 判断当前用户的登录信息loginInfo是否存在
+			next();
+		} else {
+			next({
+				path: '/Login'
+			})
+		}
+	} else {
+		next();
+	}
+})
+new Vue({
+  el: '#app',
+  router,
+  store:store,
+  components: { App },
+  template: '<App/>'
+})

+ 303 - 0
src/pages/addressbook.vue

@@ -0,0 +1,303 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">寄件人</p>
+				<p @click="tab(2)" :class="[index==2?'active':'']" class="">收件人</p>
+			</div>		
+		</div>
+		<!-- 寄件人 -->
+		<div v-if="index==1">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLink(item)">
+							<p>寄</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}  {{item.telPhone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>	
+							<p @click="linkEdit(item.id)">	
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button @click="link(1)" type="info" color="#00c4b8">添加寄件人</van-button>
+			</div>
+		</div>
+		
+		<!-- 收件人 -->
+		<div v-if="index==2">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLinkSj(item)">
+							<p style="background: #fa9c22;">收</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}  {{item.telPhone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>						
+							<p @click="linkEdit(item.id)">
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button type="info" @click="link(2)" color="#fa9c22">添加收件人</van-button>
+			</div>
+		</div>
+	</div>	
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"地址簿",
+				index:1,
+				userId:'',
+				addressList:[]
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			//获取参数
+			this.index = this.$route.query.active
+			this.getData();
+		},
+		methods:{
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			tab(obj){
+				this.index=obj
+				this.getData()
+			},
+			link(obj){
+				this.$router.push({path:"/Newaddress",query:{type:obj}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressList.do",{userId:this.userId,type:this.index},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.addressList = res.body.addressList
+					}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			del(id){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					Toast.loading({
+					    message: '删除中...',
+					    forbidClick: true,
+					    duration:0
+					});
+					this.$http.post(this.$store.state.host+"/personal/deleteAddressInfoById.do",{id:id},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								this.getData()
+							}else{
+								Toast("删除失败!")
+							}
+						Toast.clear()
+					},res=>{
+							 //发送失败
+						Toast("网络错误!")
+					})
+					Toast.clear()
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+			},
+			//跳去编辑页
+			linkEdit(id){
+				this.$router.push({path:"/Editaddress",query:{id:id}})
+			},
+			adressLink(item){
+				let jjInfo = {}
+				jjInfo.jjname = item.name+' '+item.phone
+				jjInfo.jjadd = item.provinceAndCity+' '+item.address
+				jjInfo.sender = item.name
+				jjInfo.senderPhone = item.phone
+				jjInfo.senderMobile = item.telPhone
+				jjInfo.sendAddr = item.provinceAndCity
+				jjInfo.sendAddress = item.address
+				this.$store.commit("getJjInfo",jjInfo)
+				this.$router.push({path:"/Express"})
+			},
+			adressLinkSj(item){
+				let sjInfo = {}
+				sjInfo.sjname = item.name+' '+item.phone
+				sjInfo.sjadd = item.provinceAndCity+' '+item.address
+				sjInfo.receiver = item.name
+				sjInfo.receiverPhone = item.phone
+				sjInfo.receiveMobile = item.telPhone
+				sjInfo.receiveAddr = item.provinceAndCity
+				sjInfo.receiveAddress = item.address
+				this.$store.commit("getSjInfo",sjInfo)
+				this.$router.push({path:"/Express"})
+			}
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding: .33rem;			
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}
+			
+		}
+		.jjinfo{
+			font-size: .36rem;
+			color: #999999;
+			padding: .0rem .33rem 0.33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					flex-wrap: wrap;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem .2rem;
+						//width: 6rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 5.2rem;
+							p:nth-of-type(1){
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.cz{
+						border-top: .01rem solid #ededed;
+						width: 100%;
+						display: flex;
+						flex-direction: row-reverse;
+						font-size: .24rem;
+						color: #999999;
+						padding-top: .2rem;
+						p{
+							margin-left: .2rem;
+							img{
+								width:.22rem;
+								height: .24rem;
+							}
+							span{
+								position: relative;
+								top: -.01rem;
+							}
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		
+		
+		
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	
+</style>

+ 301 - 0
src/pages/cityaddressbook.vue

@@ -0,0 +1,301 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">寄件人</p>
+				<p @click="tab(2)" :class="[index==2?'active':'']" class="">收件人</p>
+			</div>		
+		</div>
+		<!-- 寄件人 -->
+		<div v-if="index==1">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLink(item)">
+							<p>寄</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>	
+							<p @click="linkEdit(item.id)">	
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button @click="link(1)" type="info" color="#00c4b8">添加寄件人</van-button>
+			</div>
+		</div>
+		
+		<!-- 收件人 -->
+		<div v-if="index==2">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLinkSj(item)">
+							<p style="background: #fa9c22;">收</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>						
+							<p @click="linkEdit(item.id)">
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button type="info" @click="link(2)" color="#fa9c22">添加收件人</van-button>
+			</div>
+		</div>
+	</div>	
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"地址簿",
+				index:1,
+				userId:'',
+				addressList:[]
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			//获取参数
+			this.index = this.$route.query.active
+			this.getData();
+		},
+		methods:{
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			tab(obj){
+				this.index=obj
+				this.getData()
+			},
+			link(obj){
+				this.$router.push({path:"/Newaddress",query:{type:obj}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressList.do",{userId:this.userId,type:this.index},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.addressList = res.body.addressList
+					}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			del(id){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					Toast.loading({
+					    message: '删除中...',
+					    forbidClick: true,
+					    duration:0
+					});
+					this.$http.post(this.$store.state.host+"/personal/deleteAddressInfoById.do",{id:id},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								this.getData()
+							}else{
+								Toast("删除失败!")
+							}
+						Toast.clear()
+					},res=>{
+							 //发送失败
+						Toast("网络错误!")
+					})
+					Toast.clear()
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+			},
+			//跳去编辑页
+			linkEdit(id){
+				this.$router.push({path:"/Editaddress",query:{id:id}})
+			},
+			adressLink(item){
+				let jjInfo = {}
+				jjInfo.jjname = item.name+' '+item.phone
+				jjInfo.jjadd = item.provinceAndCity+' '+item.address
+				jjInfo.sender = item.name
+				jjInfo.senderPhone = item.phone
+				jjInfo.sendAddr = item.provinceAndCity
+				jjInfo.sendAddress = item.address
+				this.$store.commit("getJjInfo",jjInfo)
+				this.$router.push({path:"/Cityexpress"})
+			},
+			adressLinkSj(item){
+				let sjInfo = {}
+				sjInfo.sjname = item.name+' '+item.phone
+				sjInfo.sjadd = item.provinceAndCity+' '+item.address
+				sjInfo.receiver = item.name
+				sjInfo.receiverPhone = item.phone
+				sjInfo.receiveAddr = item.provinceAndCity
+				sjInfo.receiveAddress = item.address
+				this.$store.commit("getSjInfo",sjInfo)
+				this.$router.push({path:"/Cityexpress"})
+			}
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding: .33rem;			
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}
+			
+		}
+		.jjinfo{
+			font-size: .36rem;
+			color: #999999;
+			padding: .0rem .33rem 0.33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					flex-wrap: wrap;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem .2rem;
+						
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 5.2rem;
+							p:nth-of-type(1){
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.cz{
+						border-top: .01rem solid #ededed;
+						width: 100%;
+						display: flex;
+						flex-direction: row-reverse;
+						font-size: .24rem;
+						color: #999999;
+						padding-top: .2rem;
+						p{
+							margin-left: .2rem;
+							img{
+								width:.22rem;
+								height: .24rem;
+							}
+							span{
+								position: relative;
+								top: -.01rem;
+							}
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		
+		
+		
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	
+</style>

+ 675 - 0
src/pages/cityexpress.vue

@@ -0,0 +1,675 @@
+<template>
+	<div class="content">
+		<backindex :title="titlename"></backindex>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="addtype(1)">填写寄件地址</p>
+							<p v-else @click="addtype(1)">{{jjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(1)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>				
+				</div>
+				<div class="jj" style="border-top:.01rem solid #ededed">
+					<div class="jjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="sjname==''||sjname==' '">收件地址</p>
+							<p v-else>{{sjname}}</p>
+							<p v-if="sjadd==''||sjadd==' '" @click="addtype(2)">填写收件地址</p>
+							<p v-else @click="addtype(2)">{{sjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(2)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>
+				</div>
+			</div>
+			
+		</div>
+		
+		<!-- 快递公司 -->
+		<div class="kdshow">
+			<van-field readonly clickable name="picker" :value="expressInfoShow" label="快递公司" placeholder="请选择快递公司" @click="showPicker = false" />
+			<van-popup v-model="showPicker" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns"
+			    @confirm="onConfirm"
+			    @cancel="showPicker = false"
+			  />
+			</van-popup>
+		</div>
+		
+		<!-- 主体类型 -->
+		<!-- <div class="kdshow">
+			<van-field readonly clickable name="picker" :value="mainType" label="主体类型" placeholder="请选择主体类型" @click="showPicker2 = true" />
+			<van-popup v-model="showPicker2" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns2"
+			    @confirm="onConfirm0"
+			    @cancel="showPicker2 = false"
+			  />
+			</van-popup>
+		</div> -->
+		
+		<!-- 寄件属性 -->
+		<div class="choose">
+			<div>
+				<div class="type_wp">
+					<div>
+						<p>物品类型</p>
+						<p v-if="wptype==''" @click="wpshow=true">请选择</p>
+						<p v-else @click="wpshow=true">{{wptype}}</p>
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='物品'">重量(公斤)</template>
+							<template v-if="wptype=='文件'">数量(件数)</template>
+						</p>
+						<p>
+							<van-field name="stepper" style="padding: 0px;">
+								<template #input>
+									<van-stepper v-model="stepper"></van-stepper>
+								</template>
+							</van-field>
+						</p>
+					</div>
+				</div>
+				<div class="type_price">
+					<div>
+						<p>付款方式</p>
+                        <p v-if="pricetype==''" @click="priceshow=true">请选择</p>
+						<p v-else @click="priceshow=true">{{pricetype}}</p>
+					</div>
+					<div>
+						<p>声明价值</p>
+						<p style="display: flex;justify-content: center;"><input style="width: 1rem;border: none;text-align: center;" v-model="declaredValue" type="number" />元</p>
+					</div>
+				</div>
+			</div>			
+		</div>
+		<!-- 备注 -->
+		<div class="bz">
+			<div>
+				<van-field v-model="bz" name="备注" label="备注" placeholder="包装运输等要求"/>
+			</div>		
+		</div>
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+		<!-- 弹窗物品类型 -->
+		<van-popup v-model="wpshow" position="bottom">
+		  <van-picker title="物品类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false"/>
+		</van-popup>
+		<!-- 弹窗付款方式 -->
+		<van-popup v-model="priceshow" position="bottom">
+		  <van-picker title="付款方式" show-toolbar :columns="pricelist" @confirm="onConfirm2" @cancel="priceshow=false"/>
+		</van-popup>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable @closed="close" :close-on-click-overlay="false">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+				  <van-field v-model="name" name="姓名" label="姓名" placeholder="请输入姓名" :rules="[{ required: false}]"/>
+				  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" :rules="[{ required: false}]"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="address" maxlength="50" name="详细地址" label="详细地址" placeholder="请输入详细地址" :rules="[{ required: false}]"/>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div>
+				</van-form>
+			</div>
+		  
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+	</div>	
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"同城急送",
+				wptype:"物品",//物品类型
+				wpshow:false,//物品类型弹窗显示
+				wplist:["物品","文件"],
+				pricetype:"月结(公司件)",//付款类型
+				stepper:'',
+				priceshow:false,//付款类型弹窗显示
+				pricelist:["自费(个人件)","月结(公司件)"],
+				addshow:false,
+				name:"",
+				phone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				bz:"",
+				check:false,
+				userId:'',
+				showPicker:false,//快递
+				expressInfoShow:"同城急送",//快递公司展示
+				expressPhone:"",//快递公司电话传值
+				expressInfo:"5",//快递公司传值
+				columns:[],//快递公司列表
+				columns2:["个人件","公司件"],
+				jjInfo:{},
+				sjInfo:{},
+				declaredValue:'0', //声明价值
+				showPicker2:false,
+				jjLocation:{},//寄件经纬度
+				sjLocation:{}//收件经纬度
+				//mainType:''
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			
+			//寄件地址
+			if(JSON.stringify(this.$store.state.jjInfo)!='{}'){
+				this.jjname = this.$store.state.jjInfo.jjname
+				this.jjadd = this.$store.state.jjInfo.jjadd
+				this.jjInfo = this.$store.state.jjInfo
+				this.getLat(this.jjadd,1)
+			}else{
+				this.getDefaultAddress()
+			}
+			
+			//收件地址
+			if(JSON.stringify(this.$store.state.sjInfo)!='{}'){
+				this.sjname = this.$store.state.sjInfo.sjname
+				this.sjadd = this.$store.state.sjInfo.sjadd
+				this.sjInfo = this.$store.state.sjInfo
+				this.getLat(this.sjadd,2)
+			}
+			//this.getLogisticsList()
+		},
+		methods:{
+			getLat(address,type){
+				this.$jsonp(
+					"http://api.map.baidu.com/geocoding/v3?address="+address+"&output=json&ak=AFb5d4d8279a19b2fc3a16d063f26772&callback=showLocation"
+				).then(res => {
+					if(type == 1){
+						this.showLocation(res)
+					}
+					if(type == 2){
+						this.showLocation2(res)
+					}	
+				});
+			},
+			showLocation(e){
+				if(e.status == 0){
+					console.log(e.result.location)
+					this.jjLocation = e.result.location
+				}else{
+					Toast('寄件地址获取经纬度错误!')
+				}
+			},
+			showLocation2(e){
+				if(e.status == 0){
+					console.log(e.result.location)
+					this.sjLocation = e.result.location
+				}else{
+					Toast('收件地址获取经纬度错误!')
+				}
+			},
+			// 选择快递公司
+			onConfirm(e){
+				this.expressInfoShow=e.text
+				this.expressInfo=e.expressCompany
+				this.expressPhone=e.phone
+				this.showPicker=false
+			},
+			onConfirm0(e){
+				this.mainType=e
+				this.showPicker2=false
+			},
+			// 选择物品确定
+			onConfirm1(e){//确定
+				this.wptype=e
+				this.wpshow=false
+			},
+			// 选择付款方式确定
+			onConfirm2(e){//确定
+				this.pricetype=e
+				this.priceshow=false
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==2){
+					this.title="收件地址"
+				}
+				this.addshow=true
+			},
+			// 填写地址确定
+			onSubmit(){
+				if(this.name == '' || this.name == undefined ){
+					Toast('请填写姓名')
+					return
+				}
+				if(this.phone == '' || this.phone == undefined ){
+					Toast('请填写手机')
+					return
+				}
+				let regPhone = new RegExp(this.$store.state.regPhone)
+				if(!regPhone.test(this.phone)){
+					Toast('手机号格式不正确')
+					return
+				}
+				if(this.city == '' || this.city == undefined ){
+					Toast('请选择省市区')
+					return
+				}
+				if(this.address == '' || this.address == undefined ){
+					Toast('请填写详细地址')
+					return
+				}
+				if(this.index==1){
+					this.jjname=this.name+' '+this.phone
+					this.jjadd=this.city+' '+this.address
+					this.jjInfo.jjname = this.jjname
+					this.jjInfo.jjadd = this.jjadd
+					this.jjInfo.sender = this.name
+					this.jjInfo.senderPhone = this.phone
+					this.jjInfo.sendAddr = this.city
+					this.jjInfo.sendAddress = this.address
+					this.$store.commit("getJjInfo",this.jjInfo)
+					this.getLat(this.jjadd,1)
+				}
+				if(this.index==2){
+					this.sjname=this.name+' '+this.phone
                    this.sjadd=this.city+' '+this.address
+					this.sjInfo.sjname = this.sjname
+					this.sjInfo.sjadd = this.sjadd
+					this.sjInfo.receiver = this.name
+					this.sjInfo.receiverPhone = this.phone
+					this.sjInfo.receiveAddr = this.city
+					this.sjInfo.receiveAddress = this.address
+					this.$store.commit("getSjInfo",this.sjInfo)
+					this.getLat(this.sjadd,2)
+				}
+				
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				this.$router.push({path:'/CityAddressbook',query:{active:obj}})
+			},
+			//立即寄件交互
+			save(){
+				
+				if(this.jjname == '' || this.jjname == undefined || 
+				this.jjadd == '' || this.jjadd == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+				
+				if(JSON.stringify(this.jjLocation) == '{}'){
+					Toast('寄件地址经纬度为空')
+					return
+				}
+				
+				if(this.sjname == '' || this.sjname == undefined ||
+				this.sjadd == '' || this.sjadd == undefined){
+					Toast('请填写收件人信息')
+					return
+				}
+				
+				if(JSON.stringify(this.sjLocation) == '{}'){
+					Toast('收件地址经纬度为空')
+					return
+				}
+				
+				/* if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				} */
+				
+				if(this.wptype == '' || this.wptype == undefined){
+					Toast('请选择物品类型')
+					return
+				}
+				
+				if(this.stepper == '' || this.stepper == undefined){
+					Toast('请选择重量')
+					return
+				}
+				
+				if(this.pricetype == '' || this.pricetype == undefined){
+					Toast('请选择付款方式')
+					return
+				}
+				let payWay = ''
+				let mainType = ''
+				if(this.pricetype == "自费(个人件)"){
+					payWay = '自费'
+					mainType = '个人件'
+				}
+				if(this.pricetype == "月结(公司件)"){
+					payWay = '月结'
+					mainType = '公司件'
+				}
+				
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+				
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				
+				this.$http.post(this.$store.state.host+"/sendMail/saveMail.do",{userId:this.userId,
+					sender:this.jjInfo.sender,
+					senderPhone:this.jjInfo.senderPhone,
+					sendAddr:this.jjInfo.sendAddr,
+					sendAddress:this.jjInfo.sendAddress,
+					receiver:this.sjInfo.receiver,
+					receiverPhone:this.sjInfo.receiverPhone,
+					receiveAddr:this.sjInfo.receiveAddr,
+					receiveAddress:this.sjInfo.receiveAddress,
+					expressInfo:5,
+					itemType:this.wptype,
+					mainType:mainType,
+					weight:this.stepper,
+					itemNum:this.stepper,
+					payWay:payWay,
+					expressType:'外部件',
+					declaredValue:this.declaredValue,
+					itemRemark:this.bz,
+					expressPhone:this.expressPhone,
+					lat:this.jjLocation.lat,//寄件纬度
+					lon:this.jjLocation.lng,//寄件经度
+					toLat:this.sjLocation.lat,//收件纬度
+					toLon:this.sjLocation.lng,//收件经度
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else{
+								Toast("寄件失败");
+							}		
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+		
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: .33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						padding-left: .3rem;
+						
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				//content: "";
+				display: none;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			>div{
+				background: white;
+				
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+						
+					} 
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+				.type_price{
+					display: flex;
+					justify-content: center;
+					border-top: .01rem solid #ededed;
+					margin-top: .3rem;
+					padding-top: .3rem;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+						}
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+			}
+			
+		}
+	    .bz{
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+		.check{
+			font-size: .24rem;
+			
+			text-align: center;
+			
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+			
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+</style>

+ 94 - 0
src/pages/daishou.vue

@@ -0,0 +1,94 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<div class="content">
+			<van-search v-model="value" placeholder="请输入搜索关键词" />
+			<div class="slide">
+				<van-collapse v-model="activeNames" accordion>
+				  <van-collapse-item title="总部>销售部" name="1" value="12/12">
+					  <ul>
+						  <li><p>测试1</p></li>
+						  <li><p>测试1</p></li>
+						  <li><p>测试1</p></li>
+					  </ul>
+				  </van-collapse-item>
+				  <van-collapse-item title="总部>销售部" name="2" value="12/12">
+					  <ul>
+					  	<li><p>测试2</p></li>
+					  	<li><p>测试2</p></li>
+					  	<li><p>测试2</p></li>					  
+					  </ul>
+				  </van-collapse-item>
+				  <van-collapse-item title="总部>销售部" name="3" value="12/12">
+					  <ul>
+						  <li><p>测试3</p></li>
+						  <li><p>测试4</p></li>
+						  <li><p>测试5</p></li>
+					  </ul>
+				  </van-collapse-item>
+				</van-collapse>
+			</div>
+			<!--  -->
+			<div class="search" v-show="false">
+				<ul>
+					<li><p>测试2</p></li>
+					<li><p>测试2</p></li>
+					<li><p>测试2</p></li>					  
+				</ul>
+			</div>
+		</div>
+	</div>
+	
+</template>
+
+<script>
+	export default{
+		data(){
+			return{
+				titlename:"快递代收",
+				value:"",
+				activeNames: "",
+			}
+		},
+		methods:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		padding: .2rem .33rem;
+		/deep/.van-search{
+			padding: 0px;
+			.van-search__content{
+				background: white;
+			}
+		}
+		.slide{
+			margin-top: .2rem;
+			ul{
+				li{
+					p{
+						padding: .1rem 0rem;
+						font-size: .3rem;
+					}
+				}
+			}
+		}
+		.search{
+			margin-top: .2rem;
+			background: white;
+			padding: 10px 16px;
+			ul{
+				li{
+					p{
+						padding: .2rem 0rem;
+						font-size: .3rem;
+					}
+					border-bottom: .01rem solid #F6F6F6;
+				}
+			}
+		}
+	}
+</style>

+ 158 - 0
src/pages/editaddress.vue

@@ -0,0 +1,158 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<div class="form">
+			<van-form @submit="onSubmit">
+			  <van-field v-model="name" name="姓名" label="姓名" placeholder="请输入姓名" :rules="[{ required: false}]"/>
+			  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" :rules="[{ required: false}]"/>
+			  <van-field v-model="telPhone" maxlength="20" type="text" name="座机" label="座机" placeholder="请输入座机" :rules="[{ required: false}]"/>
+			  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+			  <van-field v-model="address" name="详细地址" maxlength="50" label="详细地址" placeholder="请输入详细地址" :rules="[{ required: false}]"/>
+			  <div style="margin-top: 16px;">
+			    <van-button color="#00c4b8" block type="info" native-type="submit" :disabled="disabled">确定</van-button>
+			  </div>
+			</van-form>
+			<!-- 城市选择 -->
+			<van-popup v-model="areashow" position="bottom">
+			  <van-area
+			    :area-list="areaList"
+			    @confirm="onConfirm3"
+			    @cancel="areashow = false"
+			  />
+			</van-popup>
+		</div>
+	</div>
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import {Toast} from 'vant'
+	export default{
+		data(){
+			return{
+				titlename:"编辑地址",
+				name:"",
+				phone:"",
+				telPhone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				id:'',
+				disabled:false
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.id=this.$route.query.id
+			this.getData()
+		},
+		methods:{
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressInfoById.do",{id:this.id},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.name = res.body.addressInfo.name
+							this.phone = res.body.addressInfo.phone
+							this.telPhone = res.body.addressInfo.telPhone
+							this.city = res.body.addressInfo.provinceAndCity
+							this.address = res.body.addressInfo.address
+						}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			onSubmit(){
+				
+				if(this.name == '' || this.name == undefined){
+					Toast('请输入姓名')
+					return
+				}
+				
+				if ((this.phone == '' || this.phone == undefined) && (this.telPhone == '' || this.telPhone == undefined)) {
+					Toast('请填写手机号或者座机号')
+					return
+				}
+				
+				if(this.phone != '' && this.phone != undefined){
+					let regPhone = new RegExp(this.$store.state.regPhone)
+					if (!regPhone.test(this.phone)) {
+						Toast('手机号格式不正确')
+						return
+					}
+				}
+				
+				if(this.city == '' || this.city == undefined){
+					Toast('请选择省市区')
+					return
+				}
+				
+				if(this.address == '' || this.address == undefined){
+					Toast('请输入详细地址')
+					return
+				}
+				
+				this.disabled = true;
+				
+				this.$http.post(this.$store.state.host+"/personal/editAddressInfoById.do",{id:this.id,
+					name:this.name,
+					phone:this.phone,
+					telPhone:this.telPhone,
+					provinceAndCity:this.city,
+					address:this.address
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("保存成功");
+								let that = this;
+								setTimeout(function(){
+									that.$router.back()
+								},500)
+							}else{
+								Toast("保存失败");
+							}
+							this.disabled = false;
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+						this.disabled = false;
+					})
+					this.disabled = false;
+			},
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+				console.log(e)
+			},
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		
+		.form{
+			padding: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+	}
+</style>

+ 860 - 0
src/pages/express.vue

@@ -0,0 +1,860 @@
+<template>
+	<div class="content">
+		<backindex :title="titlename"></backindex>
+
+		<!--运单号-->
+		<div v-show="wayShow" class="sm" style="padding-top: 10px;height: 50px;">
+			<div>
+				<van-field style="background-color: rgb(0, 196, 184);" maxlength="50" v-model="waybillNo" name="运单号" label="运单号" placeholder="运单号"/>
+				<img @click="wxScanCode(1)" src="../assets/images/sm.png" alt="">
+			</div>
+		</div>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}}  {{jjInfo.senderMobile}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="addtype(1)">填写寄件地址</p>
+							<p v-else @click="addtype(1)">{{jjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(1)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>
+				</div>
+				<div class="jj" style="border-top:.01rem solid #ededed">
+					<div class="jjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="sjname==''||sjname==' '">收件地址</p>
+							<p v-else>{{sjname}}  {{sjInfo.receiveMobile}}</p>
+							<p v-if="sjadd==''||sjadd==' '" @click="addtype(2)">填写收件地址</p>
+							<p v-else @click="addtype(2)">{{sjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(2)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>
+				</div>
+			</div>
+
+		</div>
+
+		<!-- 快递公司 -->
+		<div class="kdshow">
+			<van-field readonly clickable name="picker" :value="expressInfoShow" label="快递公司" placeholder="请选择快递公司" @click="showPicker = true" />
+			<van-popup v-model="showPicker" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns"
+			    @confirm="onConfirm"
+			    @cancel="showPicker = false"
+			  />
+			</van-popup>
+		</div>
+
+    <!--成本中心-->
+    <div class="kdshow" v-show="this.accountType == 2">
+      <van-field readonly clickable name="picker2" :value="costCenterInfoShow" label="成本中心" placeholder="请选择成本中心" @click="showPicker9 = true" />
+      <van-popup v-model="showPicker9" position="bottom">
+        <van-picker
+          show-toolbar
+          :columns="costCenterList"
+          @confirm="onConfirm9"
+          @cancel="showPicker9 = false"
+        />
+      </van-popup>
+    </div>
+
+		<!-- 寄件属性 -->
+		<div class="choose">
+			<div>
+				<div class="type_wp">
+					<div>
+						<p>物品类型</p>
+						<p v-if="wptype==''" @click="wpshow=true">请选择</p>
+						<p v-else @click="wpshow=true">{{wptype}}</p>
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='产品'">重量(公斤)</template>
+							<template v-if="wptype=='非产品'">重量(公斤)</template>
+							<template v-if="wptype=='文件'">数量(件数)</template>
+						</p>
+						<p>
+							<van-field name="stepper" style="padding: 0px;">
+								<template #input>
+									<van-stepper v-model="stepper" :max="max"></van-stepper>
+								</template>
+							</van-field>
+						</p>
+					</div>
+				</div>
+				<div class="type_price">
+					<div>
+						<p>付款方式</p>
+            <p v-if="pricetype==''" @click="priceshow=true">请选择</p>
+						<p v-else @click="priceshow=true">{{pricetype}}</p>
+					</div>
+					<div>
+						<p>声明价值</p>
+						<p style="display: flex;justify-content: center;"><input style="width: 1rem;border: none;text-align: center;" v-model="declaredValue" type="number" />元</p>
+					</div>
+				</div>
+
+
+				<div class="type_price" v-show="this.accountType == 1">
+					<div>
+						<p>邮购类型</p>
+				        <p v-if="addresstype==''" @click="addressshow=true">请选择</p>
+						<p v-else @click="addressshow=true">{{addresstype}}</p>
+					</div>
+				</div>
+
+			</div>
+		</div>
+
+		<!--商品订单编号-->
+		<div class="sm" style="padding-bottom: 0;" v-show="this.accountType == 1">
+			<div>
+				<van-field maxlength="50" v-model="goodOrderNo" name="POS/订单号" label="POS/订单号" placeholder="请输入POS/订单号"/>
+				<img @click="wxScanCode(2)" src="../assets/images/sm.png" alt="">
+			</div>
+		</div>
+
+		<!-- 备注 -->
+		<div class="bz">
+			<div>
+				<van-field v-model="bz" name="备注" label="备注" placeholder="包装运输等要求"/>
+			</div>
+		</div>
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+
+
+		<!-- 弹窗物品类型 -->
+		<van-popup v-model="wpshow" position="bottom">
+		  <van-picker title="物品类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false"/>
+		</van-popup>
+		<!-- 弹窗付款方式 -->
+		<van-popup v-model="priceshow" position="bottom">
+		  <van-picker title="付款方式" show-toolbar :columns="pricelist" @confirm="onConfirm2" @cancel="priceshow=false"/>
+		</van-popup>
+		<!-- 弹窗地址类型类型 -->
+		<van-popup v-model="addressshow" position="bottom">
+		  <van-picker title="邮购类型" show-toolbar :columns="addlist" @confirm="onConfirm8" @cancel="addressshow=false"/>
+		</van-popup>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable @closed="close" :close-on-click-overlay="false">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+				  <van-field v-model="name" name="姓名" label="姓名" placeholder="请输入姓名" :rules="[{ required: false}]"/>
+				  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" :rules="[{ required: false}]"/>
+				  <van-field v-model="telPhone" maxlength="20" type="text" name="座机" label="座机" placeholder="请输入座机" :rules="[{ required: false}]"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="address" maxlength="50" name="详细地址" label="详细地址" placeholder="请输入详细地址" :rules="[{ required: false}]"/>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div>
+				</van-form>
+			</div>
+
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+	</div>
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"寄件",
+				wptype:"产品",//物品类型
+				addresstype:"顾客邮购",//地址类型
+				youGouType:"",//邮购类型
+				addressshow:false,//地址类型弹窗显示
+				addlist:['顾客邮购','非顾客邮购'],//
+				wpshow:false,//物品类型弹窗显示
+        wplist:[],
+				pricetype:"月结(公司件)",//付款类型
+				stepper:'',
+				max:'',
+				priceshow:false,//付款类型弹窗显示
+				pricelist:["自费(个人件)","月结(公司件)"],
+				addshow:false,
+				name:"",
+				phone:"",
+				telPhone:'',
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				bz:"",
+				check:false,
+				userId:'',
+				showPicker:false,//快递
+				expressInfoShow:"",//快递公司展示
+				expressPhone:"",//快递公司电话传值
+				expressInfo:"",//快递公司传值
+				columns:[],//快递公司列表
+				columns2:["个人件","公司件"],
+				jjInfo:{},
+				sjInfo:{},
+				declaredValue:'0', //声明价值
+				showPicker2:false,
+				goodOrderNo:'',//商品订单编号
+				waybillNo:'',//运单号
+				wayShow:true,
+        accountType:'',//账号类型
+				mailRoomId:'',
+        showPicker9:false,
+        costCenterList:[],//成本中心列表
+        costCenterInfoShow:"",
+        costCenterName:"",//成本中心展示
+        costCenterId:""//成本中心展示
+			}
+		},
+		created:function(){
+			this.isLogin();
+
+			this.userId = localStorage.getItem("userId")
+      this.accountType = localStorage.getItem("accountType")
+      console.log("accountType:" + this.accountType)
+      if(this.accountType == '1'){
+        this.wplist = ["产品","非产品","文件","测试弹窗1"]
+
+      }else{
+        this.wplist = ["产品","文件","测试弹窗2"]
+      }
+      this.mailRoomId = localStorage.getItem("roomId")
+
+			//寄件地址
+			if(JSON.stringify(this.$store.state.jjInfo)!='{}'){
+				this.jjname = this.$store.state.jjInfo.jjname
+				this.jjadd = this.$store.state.jjInfo.jjadd
+				this.jjInfo = this.$store.state.jjInfo
+			}else{
+				//获取默认地址
+				this.getDefaultAddress()
+			}
+
+			//收件地址
+			if(JSON.stringify(this.$store.state.sjInfo)!='{}'){
+				this.sjname = this.$store.state.sjInfo.sjname
+				this.sjadd = this.$store.state.sjInfo.sjadd
+				this.sjInfo = this.$store.state.sjInfo
+			}
+			this.getLogisticsList()
+      //获取成本中心
+      this.getCostCenterList()
+		},
+		methods:{
+			wxScanCode(type) {
+				// let purl = /(Android)/i.test(navigator.userAgent) ? window.location.href.split('#')[0] : encodeURI(window.location.href.split('#')[0]);
+				// let dataForm = {
+				//     'url': purl
+			 //    }
+				//alert(purl)
+				let wx = this.$wx;
+				this.$http.post(this.$store.state.host + "/weixin/getWxConfig", {
+						url:window.location.href.split('#')[0]
+					}, {
+						emulateJSON: true
+					})
+					.then(res => {
+						//发送成功
+						var timestamp = res.body.wxConfig.timestamp;
+						var noncestr = res.body.wxConfig.nonceStr;
+						var signature = res.body.wxConfig.signature;
+						var appId = res.body.wxConfig.appId;
+						wx.config({
+							debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
+							// debug : true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
+							appId: appId, // 必填,公众号的唯一标识
+							timestamp: timestamp, // 必填,生成签名的时间戳
+							nonceStr: noncestr, // 必填,生成签名的随机串
+							signature: signature, // 必填,签名,见附录1
+							jsApiList: [
+								"scanQRCode",
+							] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
+						});
+						wx.ready(()=> {
+							wx.scanQRCode({
+								needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
+								scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
+								success:(res)=> {
+									var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
+									if(result.indexOf(",") != -1){
+										let result1 = res.resultStr.split(",");
+										result = result1[result1.length-1];
+									}
+									if(type==1){
+										this.waybillNo = result;
+									}else{
+										this.goodOrderNo = result;
+									}
+
+								},
+								error: function(res) {
+									console.log(res);
+								}
+							});
+
+						});
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+					})
+
+			},
+			// 选择快递公司
+			onConfirm(e){
+				this.expressInfoShow=e.text
+				this.expressInfo=e.id
+				this.expressPhone=e.phone
+				this.showPicker=false
+				if(this.expressInfo == 1){
+					this.wayShow = true
+				}else{
+					this.wayShow = false
+				}
+			},
+
+      // 选择成本中心
+      onConfirm9(e){
+        this.costCenterInfoShow=e.text
+      	this.costCenterId=e.id
+      	this.costCenterName=e.costCenterName
+      	this.showPicker9=false
+        console.log("costCenterId:"+this.costCenterId)
+        console.log("costCenterName:"+this.costCenterName)
+      },
+
+			onConfirm0(e){
+				this.mainType=e
+				this.showPicker2=false
+			},
+			// 选择物品确定
+			onConfirm1(e){//确定
+				this.wptype=e
+				if(this.wptype == '文件'){
+					this.max = '10'
+				}else{
+					this.max = '1'
+				}
+				this.wpshow=false
+			},
+			// 选择付款方式确定
+			onConfirm2(e){//确定
+				this.pricetype=e
+				this.priceshow=false
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+			},
+			// 填写地址类型确定
+			onConfirm8(e){//确定
+				this.addresstype=e
+				this.addressshow=false
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==2){
+					this.title="收件地址"
+				}
+				this.addshow=true
+			},
+			// 填写地址确定
+			onSubmit(){
+				if(this.name == '' || this.name == undefined ){
+					Toast('请填写姓名')
+					return
+				}
+				// if(this.phone == '' || this.phone == undefined ){
+				// 	Toast('请填写手机')
+				// 	return
+				// }
+				// let regPhone = new RegExp(this.$store.state.regPhone)
+				// if(!regPhone.test(this.phone)){
+				// 	Toast('手机号格式不正确')
+				// 	return
+				// }
+
+				if ((this.phone == '' || this.phone == undefined) && (this.telPhone == '' || this.telPhone == undefined)) {
+					Toast('请填写手机号或者座机号')
+					return
+				}
+
+				if(this.phone != '' && this.phone != undefined){
+					let regPhone = new RegExp(this.$store.state.regPhone)
+					if (!regPhone.test(this.phone)) {
+						Toast('手机号格式不正确')
+						return
+					}
+				}
+
+				if(this.city == '' || this.city == undefined ){
+					Toast('请选择省市区')
+					return
+				}
+				if(this.address == '' || this.address == undefined ){
+					Toast('请填写详细地址')
+					return
+				}
+				if(this.index==1){
+					this.jjname=this.name+' '+this.phone
+					this.jjadd=this.city+' '+this.address
+					this.jjInfo.jjname = this.jjname
+					this.jjInfo.jjadd = this.jjadd
+					this.jjInfo.sender = this.name
+					this.jjInfo.senderPhone = this.phone
+					this.jjInfo.senderMobile = this.telPhone
+					this.jjInfo.sendAddr = this.city
+					this.jjInfo.sendAddress = this.address
+					this.$store.commit("getJjInfo",this.jjInfo)
+				}
+				if(this.index==2){
+					this.sjname=this.name+' '+this.phone
                    this.sjadd=this.city+' '+this.address
+					this.sjInfo.sjname = this.sjname
+					this.sjInfo.sjadd = this.sjadd
+					this.sjInfo.receiver = this.name
+					this.sjInfo.receiverPhone = this.phone
+					this.sjInfo.receiveMobile = this.telPhone
+					this.sjInfo.receiveAddr = this.city
+					this.sjInfo.receiveAddress = this.address
+					this.$store.commit("getSjInfo",this.sjInfo)
+				}
+
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				this.$router.push({path:'/Addressbook',query:{active:obj}})
+			},
+			//立即寄件交互
+			save(){
+
+        if(this.accountType == 2){//办公室
+          //成本中心
+          if(this.costCenterName == '' || this.costCenterName == undefined ||
+            this.costCenterId == '' || this.costCenterId == undefined){
+            Toast('请选择成本中心')
+            return
+          }
+        
+        }else if(this.accountType == 1){//柜台
+
+          //顾客邮购
+          if(this.addresstype == '顾客邮购'){
+          	this.youGouType = '1'
+          }else if(this.addresstype == '非顾客邮购'){
+          	this.youGouType = '2'
+          }
+
+          //POS/订单号
+          if(this.goodOrderNo == ''){
+          	Toast('请填写订单号')
+          	return
+          }
+          
+        }else{//没有绑定账号类型
+            Toast('当前账号没有绑定账号类型,请联系管理员')
+          	return
+
+        }
+
+
+
+				if(this.jjname == '' || this.jjname == undefined ||
+				this.jjadd == '' || this.jjadd == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+
+				if(this.sjname == '' || this.sjname == undefined ||
+				this.sjadd == '' || this.sjadd == undefined){
+					Toast('请填写收件人信息')
+					return
+				}
+
+				if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				}
+
+				if(this.wptype == '' || this.wptype == undefined){
+					Toast('请选择物品类型')
+					return
+				}
+
+				if(this.stepper == '' || this.stepper == undefined){
+					Toast('请选择重量')
+					return
+				}
+
+				if(this.pricetype == '' || this.pricetype == undefined){
+					Toast('请选择付款方式')
+					return
+				}
+				let payWay = ''
+				let mainType = ''
+				if(this.pricetype == "自费(个人件)"){
+					payWay = '自费'
+					mainType = '个人件'
+				}
+				if(this.pricetype == "月结(公司件)"){
+					payWay = '月结'
+					mainType = '公司件'
+				}
+
+
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+
+				this.$http.post(this.$store.state.host+"/sendMail/saveMail.do",{userId:this.userId,
+					sender:this.jjInfo.sender,
+					senderPhone:this.jjInfo.senderPhone,
+					senderMobile:this.jjInfo.senderMobile,
+					sendAddr:this.jjInfo.sendAddr,
+					sendAddress:this.jjInfo.sendAddress,
+					receiver:this.sjInfo.receiver,
+					receiverPhone:this.sjInfo.receiverPhone,
+					receiveMobile:this.sjInfo.receiveMobile,
+					receiveAddr:this.sjInfo.receiveAddr,
+					receiveAddress:this.sjInfo.receiveAddress,
+					expressInfo:this.expressInfo,
+					waybillNo:this.waybillNo,
+					itemType:this.wptype,
+					mainType:mainType,
+					weight:this.stepper,
+					itemNum:this.stepper,
+					payWay:payWay,
+					expressType:'外部件',
+					declaredValue:this.declaredValue,
+					itemRemark:this.bz,
+					expressPhone:this.expressPhone,
+					goodOrderNo:this.goodOrderNo,
+					youGouType:this.youGouType,
+          costCenterName:this.costCenterName,
+          costCenterId:this.costCenterId,
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else if(res.body.msg != '' && res.body.msg != 'success'){
+								Toast(res.body.msg);
+							}else{
+								Toast("寄件失败");
+							}
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.sm{
+			display: flex;
+			padding: .33rem;
+			padding-bottom: 0;
+			font-size: .3rem;
+			justify-content: space-between;
+			/deep/.van-field{
+				width: 6.2rem;
+				height: .76rem;
+				.van-search__content{
+					background-color: white;
+				}
+				input{
+					text-align: right;
+				}
+			}
+			img{
+				width:.4rem;
+				height: .4rem;
+				position: relative;
+				top: -.58rem;
+				right: -6.38rem;
+			}
+		}
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+
+			padding: .33rem;
+			padding-top: 0;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: 0rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						padding-left: .3rem;
+
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+
+					}
+				}
+		    }
+
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				content: "";
+				display: inline-block;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			>div{
+				background: white;
+
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+				.type_price{
+					display: flex;
+					justify-content: center;
+					border-top: .01rem solid #ededed;
+					margin-top: .3rem;
+					padding-top: .3rem;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+						}
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+			}
+
+		}
+	    .bz{
+			margin-top: -0.53rem;
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+
+			}
+		}
+		.check{
+			font-size: .24rem;
+
+			text-align: center;
+
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+</style>

+ 180 - 0
src/pages/foreignaddress.vue

@@ -0,0 +1,180 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<div class="form">
+			<van-form @submit="onSubmit">
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="personName" name="姓名" label="姓名" placeholder="请用英文输入姓名"/>
+			  <van-field v-model="emailAddress" name="邮箱" label="邮箱" placeholder="请用英文输入邮箱"/>
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="countryCode" name="国家编码" label="国家编码" placeholder="请用英文输入国家编码"/>
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="city" name="州/城市" label="州/城市" placeholder="请用英文输入州/城市"/>
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="phone" type="number" name="电话" label="电话" placeholder="请输入电话"/>
+			 <!-- <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" /> -->
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="postalCode" name="邮编" label="邮编" placeholder="请用输入邮编"/>
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="address" name="详细地址" label="详细地址" placeholder="请用英文输入详细地址"/>
+			  <van-field oninput="value=value.replace(/[^\w\.\s/]/ig,'')" v-model="companyName" name="公司名称" label="公司名称" placeholder="请用英文输入公司名称 如SF EXPRESS CO,LTD"/>
+			  <div style="margin-top: 16px;">
+			    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+			  </div>
+			</van-form>
+			<!-- 城市选择 -->
+			<van-popup v-model="areashow" position="bottom">
+			  <van-area
+			    :area-list="areaList"
+			    @confirm="onConfirm3"
+			    @cancel="areashow = false"
+			  />
+			</van-popup>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	import areaList from "@/script/areas.js"
+	export default{
+		data(){
+			return{
+				titlename:"寄件人",
+				personName:"",
+				countryCode:"",
+				emailAddress:"",
+				postalCode:"",
+				companyName:"",
+				phone:"",
+				city:"",
+				address:"",
+				areashow:false,
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.titlename=this.$route.query.active
+			if(this.titlename==1){
+				this.titlename="寄件人地址"
+				if(JSON.stringify(this.$store.state.foreignJjInfo)!='{}'){
+					this.personName = this.$store.state.foreignJjInfo.personName
+					this.countryCode = this.$store.state.foreignJjInfo.countryCode
+					this.emailAddress = this.$store.state.foreignJjInfo.emailAddress
+					this.postalCode = this.$store.state.foreignJjInfo.postalCode
+					this.companyName = this.$store.state.foreignJjInfo.companyName
+					this.phone = this.$store.state.foreignJjInfo.phone
+					this.address = this.$store.state.foreignJjInfo.address
+					this.city = this.$store.state.foreignJjInfo.city
+				}
+			}
+			if(this.titlename==2){
+				this.titlename="收件人地址"
+				console.log(this.$store.state.foreignSjInfo)
+				if(JSON.stringify(this.$store.state.foreignSjInfo)!='{}'){
+					this.personName = this.$store.state.foreignSjInfo.personName
+					this.countryCode = this.$store.state.foreignSjInfo.countryCode
+					this.emailAddress = this.$store.state.foreignSjInfo.emailAddress
+					this.postalCode = this.$store.state.foreignSjInfo.postalCode
+					this.companyName = this.$store.state.foreignSjInfo.companyName
+					this.phone = this.$store.state.foreignSjInfo.phone
+					this.address = this.$store.state.foreignSjInfo.address
+					this.city = this.$store.state.foreignSjInfo.city
+				}
+			}
+		},
+		methods:{
+			//确定
+			onSubmit(){
+				if(this.personName == '' || this.personName == undefined){
+					Toast('请用英文输入姓名');
+					return;
+				}
+				
+				if(this.emailAddress == '' || this.emailAddress == undefined){
+					Toast('请用英文输入邮箱');
+					return;
+				}
+				
+				if(this.countryCode == '' || this.countryCode == undefined){
+					Toast('请用英文输入国家编号');
+					return;
+				}
+				
+				if(this.city == '' || this.city == undefined){
+					Toast('请用英文输入州/城市');
+					return;
+				}
+				
+				if(this.phone == '' || this.phone == undefined){
+					Toast('请输入电话');
+					return;
+				}
+				
+				if(this.postalCode == '' || this.postalCode == undefined){
+					Toast('请输入邮编');
+					return;
+				}
+				
+				if(this.address == '' || this.address == undefined){
+					Toast('请用英文输入详细地址');
+					return;
+				}
+				
+				if(this.companyName == '' || this.companyName == undefined){
+					Toast('请用英文输入公司名称');
+					return;
+				}
+				
+				if(this.$route.query.active == 1){
+					let foreignJjInfo = {};
+					foreignJjInfo.jjname = this.personName+' '+this.phone
+					foreignJjInfo.jjadd = this.countryCode+' '+this.address
+					foreignJjInfo.personName = this.personName;
+					foreignJjInfo.emailAddress = this.emailAddress;
+					foreignJjInfo.countryCode = this.countryCode;
+					foreignJjInfo.city = this.city;
+					foreignJjInfo.phone = this.phone;
+					foreignJjInfo.postalCode = this.postalCode;
+					foreignJjInfo.address = this.address;
+					foreignJjInfo.companyName = this.companyName;
+					this.$store.commit("getForeignJjInfo",foreignJjInfo);
+				}else if(this.$route.query.active == 2){
+					let foreignSjInfo = {};
+					foreignSjInfo.sjname = this.personName+' '+this.phone
+					foreignSjInfo.sjadd = this.countryCode+' '+this.address
+					foreignSjInfo.personName = this.personName;
+					foreignSjInfo.emailAddress = this.emailAddress;
+					foreignSjInfo.countryCode = this.countryCode;
+					foreignSjInfo.city = this.city;
+					foreignSjInfo.phone = this.phone;
+					foreignSjInfo.postalCode = this.postalCode;
+					foreignSjInfo.address = this.address;
+					foreignSjInfo.companyName = this.companyName;
+					this.$store.commit("getForeignSjInfo",foreignSjInfo);
+				}
+				
+				this.$router.push({path:"/Foreignexpress"})
+			},
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+				console.log(e)
+			},
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		
+		.form{
+			padding: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+	}
+</style>

+ 622 - 0
src/pages/foreignexpress.vue

@@ -0,0 +1,622 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="link(1)">请用英文填写寄件地址</p>
+							<p v-else @click="link(1)">{{jjadd}}</p>
+						</div>
+					</div>
+					<!-- <div class="dzb" @click="link(1)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div> -->				
+				</div>
+				<div class="jj" style="border-top:.01rem solid #ededed">
+					<div class="jjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="sjname==''||sjname==' '">收件地址</p>
+							<p v-else>{{sjname}}</p>
+							<p v-if="sjadd==''||sjadd==' '" @click="link(2)">请用英文填写收件信息</p>
+							<p v-else @click="link(2)">{{sjadd}}</p>
+						</div>
+					</div>
+					<!-- <div class="dzb" @click="link(2)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div> -->
+				</div>
+			</div>
+			
+		</div>
+		
+		<!-- 寄件属性 -->
+		<div class="choose">
+			<div>
+				<div class="type_wp">
+					<div>
+						<p>物品类型</p>
+						<p v-if="wptype==''" @click="wpshow=true">请选择</p>
+						<p v-else @click="wpshow=true">{{wptype}}</p>
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='物品'">重量(公斤)</template>
+							<template v-if="wptype=='文件'">数量(件数)</template>
+						</p>
+						<p>
+							<van-field name="stepper" style="padding: 0px;">
+								<template #input>
+									<van-stepper v-model="stepper"></van-stepper>
+								</template>
+							</van-field>
+						</p>
+					</div>
+				</div>
+				<!-- <div class="type_price">
+					<div>
+						<p>付款方式</p>
+                        <p v-if="pricetype==''" @click="priceshow=true">请选择</p>
+						<p v-else @click="priceshow=true">{{pricetype}}</p>
+					</div>
+					<div>
+						<p>声明价值</p>
+						<p>0元</p>
+					</div>
+				</div> -->
+			</div>			
+		</div>
+		<!-- 申报信息 -->
+		<div class="bz">
+			<!-- <div>
+				<van-field v-model="sbxx" name="申报信息" label="申报信息" @click="links" placeholder="必填"/>
+			</div> -->
+			<div>
+				<van-field type="number" v-model="bjprice" name="保价" label="保价" placeholder="最高赠7倍运费,建议保价"/>
+			</div>
+		</div>
+		<!-- 预计送达时间 -->
+		<!-- <div class="sdtime">
+			<div>
+				<p>预计送达时间</p>
+				<div>
+					<p class="active">
+						<span>3日18:00前</span>
+						<span>¥36起</span>
+					</p>
+					<p>
+						<span>3日18:00前</span>
+						<span>¥36起</span>
+					</p>
+				</div>
+			</div>
+			
+		</div> -->
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+		<!-- 弹窗物品类型 -->
+		<van-popup v-model="wpshow" position="bottom">
+		  <van-picker title="物品类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false"/>
+		</van-popup>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable closed="close">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+				  <van-field v-model="name" name="姓名" label="姓名" placeholder="请用英文输入姓名"/>
+				  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" />
+				  <van-field v-model="address" name="详细地址" label="详细地址" placeholder="请用英文输入详细地址"/>
+				  <van-field v-model="emailAddress" name="邮箱地址" label="邮箱地址" placeholder="请输入邮箱地址"/>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div>
+				</van-form>
+			</div>
+		  
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+		
+	</div>	
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"国际件",
+				wptype:"物品",//物品类型
+				wpshow:false,//物品类型弹窗显示
+				wplist:["物品","文件"],
+				addshow:false,
+				name:"",
+				phone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				sbxx:"",
+				check:false,
+				bjprice:"",
+				stepper:'',
+				emailAddress:'',//邮箱地址
+			}
+		},
+		created:function(){
+			this.isLogin();
+			//this.areaList=area.areaList
+			if(JSON.stringify(this.$store.state.foreignJjInfo)!='{}'){
+				this.jjname = this.$store.state.foreignJjInfo.jjname
+				this.jjadd = this.$store.state.foreignJjInfo.jjadd
+				/* this.personName = this.$store.state.foreignJjInfo.personName
+				this.countryCode = this.$store.state.foreignJjInfo.countryCode
+				this.emailAddress = this.$store.state.foreignJjInfo.emailAddress
+				this.postalCode = this.$store.state.foreignJjInfo.postalCode
+				this.companyName = this.$store.state.foreignJjInfo.companyName
+				this.phone = this.$store.state.foreignJjInfo.phone
+				this.address = this.$store.state.foreignJjInfo.address
+				this.city = this.$store.state.foreignJjInfo.city */
+			}
+			if(JSON.stringify(this.$store.state.foreignSjInfo)!='{}'){
+				this.sjname = this.$store.state.foreignSjInfo.sjname
+				this.sjadd = this.$store.state.foreignSjInfo.sjadd
+				// this.personName = this.$store.state.foreignSjInfo.personName
+				// this.countryCode = this.$store.state.foreignSjInfo.countryCode
+				// this.emailAddress = this.$store.state.foreignSjInfo.emailAddress
+				// this.postalCode = this.$store.state.foreignSjInfo.postalCode
+				// this.companyName = this.$store.state.foreignSjInfo.companyName
+				// this.phone = this.$store.state.foreignSjInfo.phone
+				// this.address = this.$store.state.foreignSjInfo.address
+				// this.city = this.$store.state.foreignSjInfo.city
+			}
+		},
+		methods:{
+			// 选择物品确定
+			onConfirm1(e){//确定
+				this.wptype=e
+				this.wpshow=false
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==2){
+					this.title="收件地址"
+				}
+				this.addshow=true
+			},
+			// 填写地址确定
+			onSubmit(){
+				if(this.index==1){
+					this.jjname=this.name+' '+this.phone+' '+this.emailAddress
+					this.jjadd=this.city+' '+this.address
+				}
+				if(this.index==2){
+					this.sjname=this.name+' '+this.phone+' '+this.emailAddress
                    this.sjadd=this.city+' '+this.address
+				}
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				this.$router.push({path:'/Foreignaddress',query:{active:obj}})
+			},
+			// 申报信息跳转
+			links(obj){
+				this.$router.push({path:'/Sbxx'})
+			},
+			// 选择快递公司
+			onConfirm(e){
+				this.value=e
+				this.showPicker=false
+			},
+			//立即寄件交互
+			save(){
+				
+				if(this.jjname == '' || this.jjname == undefined || 
+				this.jjadd == '' || this.jjadd == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+				
+				if(this.sjname == '' || this.sjname == undefined ||
+				this.sjadd == '' || this.sjadd == undefined){
+					Toast('请填写收件人信息')
+					return
+				}
+				
+				/* if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				} */
+				
+				if(this.wptype == '' || this.wptype == undefined){
+					Toast('请选择物品类型')
+					return
+				}
+				
+				if(this.stepper == '' || this.stepper == undefined){
+					Toast('请选择重量/数量')
+					return
+				}
+				
+				/* if(this.pricetype == '' || this.pricetype == undefined){
+					Toast('请选择付款方式')
+					return
+				} */
+				// let payWay = ''
+				// let mainType = ''
+				// if(this.pricetype == "自费(个人件)"){
+				// 	payWay = '自费'
+				// 	mainType = '个人件'
+				// }
+				// if(this.pricetype == "月结(公司件)"){
+				// 	payWay = '月结'
+				// 	mainType = '公司件'
+				// }
+				
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+				
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				
+				this.$http.post(this.$store.state.host+"/sendMail/saveMail.do",{userId:localStorage.getItem("userId"),
+					sender:this.$store.state.foreignJjInfo.personName,
+					senderPhone:this.$store.state.foreignJjInfo.phone,
+					sendAddr:this.$store.state.foreignJjInfo.city,
+					sendAddress:this.$store.state.foreignJjInfo.address,
+					sendCountryCode:this.$store.state.foreignJjInfo.countryCode,
+					sendEmailAddress:this.$store.state.foreignJjInfo.emailAddress,
+					sendPostalCode:this.$store.state.foreignJjInfo.postalCode,
+					sendCompanyName:this.$store.state.foreignJjInfo.companyName,
+					receiver:this.$store.state.foreignSjInfo.personName,
+					receiverPhone:this.$store.state.foreignSjInfo.phone,
+					receiveAddr:this.$store.state.foreignSjInfo.city,
+					receiveAddress:this.$store.state.foreignSjInfo.address,
+					receiveCountryCode:this.$store.state.foreignSjInfo.countryCode,
+					receiveEmailAddress:this.$store.state.foreignSjInfo.emailAddress,
+					receivePostalCode:this.$store.state.foreignSjInfo.postalCode,
+					receiveCompanyName:this.$store.state.foreignSjInfo.companyName,
+					expressInfo:3,
+					itemType:this.wptype,
+					mainType:"",
+					weight:this.stepper,
+					itemNum:this.stepper,
+					payWay:"",
+					expressType:'外部件',
+					declaredValue:this.bjprice,
+					itemRemark:"",
+					expressPhone:""
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else{
+								Toast("寄件失败");
+							}		
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: .33rem;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						padding-left: .3rem;
+						
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				content: "";
+				display: inline-block;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			>div{
+				background: white;
+				
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+						
+					} 
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+				.type_price{
+					display: flex;
+					justify-content: center;
+					border-top: .01rem solid #ededed;
+					margin-top: .3rem;
+					padding-top: .3rem;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+						}
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+			}
+			
+		}
+	    .bz{
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+		.sdtime{
+			padding: 0rem .33rem .33rem;
+			font-size: .3rem;
+			>div{
+				background: white;
+				padding: .2rem .33rem;
+				>p{
+					color: #646566;
+					padding-bottom: .2rem;
+				}
+				div{
+					display: flex;
+					p{
+						border:.01rem solid #cecaca;
+						border-radius: .05rem;
+						width: 30%;
+						display: block;
+						margin-right: 3%;
+						span{
+							display: block;
+							text-align: center;
+						}
+						span:nth-of-type(1){
+							color: #cecaca;					
+							padding: .15rem 0rem;
+							font-weight: bold;
+						}
+						span:nth-of-type(2){
+							background: #cecaca;
+							padding: .05rem 0rem;
+							color: white;
+						}
+					}
+					p.active{
+						border:.01rem solid #e50909;					
+						span:nth-of-type(1){
+							color: #e50909;											
+						}
+						span:nth-of-type(2){
+							background: #e50909;							
+						}
+					}
+				}
+			}
+			
+		}
+		.check{
+			font-size: .24rem;
+			
+			text-align: center;
+			
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+			
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+</style>

+ 130 - 0
src/pages/forgetpassword.vue

@@ -0,0 +1,130 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<div class="login">
+			<!-- <div class="item">
+				<van-cell-group>
+			       <van-field v-model="name"  placeholder="请输入用户名或邮箱" />
+			    </van-cell-group>
+			</div> -->
+			<div class="item">
+				<van-cell-group>
+			       <van-field v-model="password" type="password"  placeholder="请输入密码" />
+			    </van-cell-group>
+			</div>
+			<div class="item">
+				<van-cell-group>
+			       <van-field v-model="password2" type="password"  placeholder="请再次输入密码" />
+			    </van-cell-group>
+			</div>
+			<div class="btn">
+				<van-button type="primary" @click="save()" color="#00c4b8">保存</van-button>
+			</div>
+			<!-- <div class="register">
+				<router-link to="">新用户注册</router-link>
+				<router-link to="">忘记密码</router-link>
+			</div> -->
+		</div>
+	</div>
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		
+		data(){
+			return{
+				titlename:"修改密码",
+				name:"",
+				password:"",
+				password2:"",
+				yzm:"",
+				userId:"",
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem('userId');
+		},
+		methods:{
+			save(){
+				if(this.password == '' || this.password == undefined){
+					Toast('请输入密码!');
+					return;
+				}
+				if(this.password2 == '' || this.password2 == undefined){
+					Toast('请再次输入密码!');
+					return;
+				}
+				if(this.password2 != this.password){
+					Toast('两次输入密码不相同!');
+					return;
+				}
+				//交互
+				this.$http.post(this.$store.state.host + "/appSysUser/forgetPassword", {
+						userId: this.userId,
+						password:this.password
+					}, {
+						emulateJSON: true
+					})
+					.then(res => {
+						//发送成功
+						if (res.body.msg == 'success') {
+							localStorage.removeItem("userId");
+							this.$router.push({path:'/'});
+						}else{
+							Toast('修改失败!');
+						}
+				
+						//if()
+					}, res => {
+						//发送失败
+					})
+				
+				
+			}
+		}
+	}
+</script>
+<style scoped lang="less">
+	.content{
+		.loginimg{
+			width:3.48rem;
+			margin: 0 auto;
+			display: block;
+			padding: 2.15rem .8rem;
+		}
+		.login{
+			width: 5.8rem;
+			margin: 0.3rem auto 0px;
+			.item{
+				border: .01rem solid #bfbfbf;
+				border-radius: .1rem;
+				margin-bottom: .3rem;
+				background: white;
+				overflow: hidden;
+				color: #999999;
+			}
+			.item:nth-of-type(3){
+				margin-bottom: .2rem;
+			}
+			.btn{
+				button{
+					width: 100%;
+				}
+			}
+			.register{
+				font-size: .24rem;
+				display: flex;
+				justify-content: space-between;
+				margin-top: .2rem;
+				a{
+					color: #999999;
+				}
+				a:nth-of-type(1){
+					color: #02bfb3;
+				}
+			}
+		}
+	}
+</style>

+ 180 - 0
src/pages/hkaddress.vue

@@ -0,0 +1,180 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<div class="form">
+			<van-form @submit="onSubmit"><!--oninput="value=value.replace(/[^\w\.\s/]/ig,'')"-->
+			  <van-field  v-model="personName" name="姓名" label="姓名" placeholder="请输入姓名"/>
+			  <van-field  v-model="emailAddress" name="邮箱" label="邮箱" placeholder="请输入邮箱"/>
+			  <van-field  v-model="countryCode" name="国家编码" label="国家编码" placeholder="请用输入国家编码"/>
+			  <van-field  v-model="city" name="州/城市" label="州/城市" placeholder="请输入州/城市"/>
+			  <van-field  v-model="phone" type="number" name="电话" label="电话" placeholder="请输入电话"/>
+			 <!-- <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" /> -->
+			  <van-field  v-model="postalCode" name="邮编" label="邮编" placeholder="请输入邮编"/>
+			  <van-field  v-model="address" name="详细地址" label="详细地址" placeholder="请输入详细地址"/>
+			  <van-field  v-model="companyName" name="公司名称" label="公司名称" placeholder="请输入公司名称 如SF EXPRESS CO,LTD"/>
+			  <div style="margin-top: 16px;">
+			    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+			  </div>
+			</van-form>
+			<!-- 城市选择 -->
+			<van-popup v-model="areashow" position="bottom">
+			  <van-area
+			    :area-list="areaList"
+			    @confirm="onConfirm3"
+			    @cancel="areashow = false"
+			  />
+			</van-popup>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	import areaList from "@/script/areas.js"
+	export default{
+		data(){
+			return{
+				titlename:"寄件人",
+				personName:"",
+				countryCode:"",
+				emailAddress:"",
+				postalCode:"",
+				companyName:"",
+				phone:"",
+				city:"",
+				address:"",
+				areashow:false,
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.titlename=this.$route.query.active
+			if(this.titlename==1){
+				this.titlename="寄件人地址"
+				if(JSON.stringify(this.$store.state.hkJjInfo)!='{}'){
+					this.personName = this.$store.state.hkJjInfo.personName
+					this.countryCode = this.$store.state.hkJjInfo.countryCode
+					this.emailAddress = this.$store.state.hkJjInfo.emailAddress
+					this.postalCode = this.$store.state.hkJjInfo.postalCode
+					this.companyName = this.$store.state.hkJjInfo.companyName
+					this.phone = this.$store.state.hkJjInfo.phone
+					this.address = this.$store.state.hkJjInfo.address
+					this.city = this.$store.state.hkJjInfo.city
+				}
+			}
+			if(this.titlename==2){
+				this.titlename="收件人地址"
+				console.log(this.$store.state.hkSjInfo)
+				if(JSON.stringify(this.$store.state.hkSjInfo)!='{}'){
+					this.personName = this.$store.state.hkSjInfo.personName
+					this.countryCode = this.$store.state.hkSjInfo.countryCode
+					this.emailAddress = this.$store.state.hkSjInfo.emailAddress
+					this.postalCode = this.$store.state.hkSjInfo.postalCode
+					this.companyName = this.$store.state.hkSjInfo.companyName
+					this.phone = this.$store.state.hkSjInfo.phone
+					this.address = this.$store.state.hkSjInfo.address
+					this.city = this.$store.state.hkSjInfo.city
+				}
+			}
+		},
+		methods:{
+			//确定
+			onSubmit(){
+				if(this.personName == '' || this.personName == undefined){
+					Toast('请用英文输入姓名');
+					return;
+				}
+				
+				if(this.emailAddress == '' || this.emailAddress == undefined){
+					Toast('请用英文输入邮箱');
+					return;
+				}
+				
+				if(this.countryCode == '' || this.countryCode == undefined){
+					Toast('请用英文输入国家编号');
+					return;
+				}
+				
+				if(this.city == '' || this.city == undefined){
+					Toast('请用英文输入州/城市');
+					return;
+				}
+				
+				if(this.phone == '' || this.phone == undefined){
+					Toast('请输入电话');
+					return;
+				}
+				
+				if(this.postalCode == '' || this.postalCode == undefined){
+					Toast('请输入邮编');
+					return;
+				}
+				
+				if(this.address == '' || this.address == undefined){
+					Toast('请用英文输入详细地址');
+					return;
+				}
+				
+				if(this.companyName == '' || this.companyName == undefined){
+					Toast('请用英文输入公司名称');
+					return;
+				}
+				
+				if(this.$route.query.active == 1){
+					let hkJjInfo = {};
+					hkJjInfo.jjname = this.personName+' '+this.phone
+					hkJjInfo.jjadd = this.countryCode+' '+this.address
+					hkJjInfo.personName = this.personName;
+					hkJjInfo.emailAddress = this.emailAddress;
+					hkJjInfo.countryCode = this.countryCode;
+					hkJjInfo.city = this.city;
+					hkJjInfo.phone = this.phone;
+					hkJjInfo.postalCode = this.postalCode;
+					hkJjInfo.address = this.address;
+					hkJjInfo.companyName = this.companyName;
+					this.$store.commit("getHkJjInfo",hkJjInfo);
+				}else if(this.$route.query.active == 2){
+					let hkSjInfo = {};
+					hkSjInfo.sjname = this.personName+' '+this.phone
+					hkSjInfo.sjadd = this.countryCode+' '+this.address
+					hkSjInfo.personName = this.personName;
+					hkSjInfo.emailAddress = this.emailAddress;
+					hkSjInfo.countryCode = this.countryCode;
+					hkSjInfo.city = this.city;
+					hkSjInfo.phone = this.phone;
+					hkSjInfo.postalCode = this.postalCode;
+					hkSjInfo.address = this.address;
+					hkSjInfo.companyName = this.companyName;
+					this.$store.commit("getHkSjInfo",hkSjInfo);
+				}
+				
+				this.$router.push({path:"/Hkexpress"})
+			},
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+				console.log(e)
+			},
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		
+		.form{
+			padding: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+	}
+</style>

+ 610 - 0
src/pages/hkexpress.vue

@@ -0,0 +1,610 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="link(1)">请填写寄件地址</p>
+							<p v-else @click="link(1)">{{jjadd}}</p>
+						</div>
+					</div>
+					<!-- <div class="dzb" @click="link(1)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div> -->
+				</div>
+				<div class="jj" style="border-top:.01rem solid #ededed">
+					<div class="jjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="sjname==''||sjname==' '">收件地址</p>
+							<p v-else>{{sjname}}</p>
+							<p v-if="sjadd==''||sjadd==' '" @click="link(2)">请填写收件信息</p>
+							<p v-else @click="link(2)">{{sjadd}}</p>
+						</div>
+					</div>
+					<!-- <div class="dzb" @click="link(2)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div> -->
+				</div>
+			</div>
+
+		</div>
+
+		<!-- 寄件属性 -->
+		<div class="choose">
+			<div>
+				<div class="type_wp">
+					<div>
+						<p>物品类型</p>
+						<p v-if="wptype==''" @click="wpshow=true">请选择</p>
+						<p v-else @click="wpshow=true">{{wptype}}</p>
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='物品'">重量(公斤)</template>
+							<template v-if="wptype=='文件'">数量(件数)</template>
+						</p>
+						<p>
+							<van-field name="stepper" style="padding: 0px;">
+								<template #input>
+									<van-stepper v-model="stepper"></van-stepper>
+								</template>
+							</van-field>
+						</p>
+					</div>
+				</div>
+				<!-- <div class="type_price">
+					<div>
+						<p>付款方式</p>
+                        <p v-if="pricetype==''" @click="priceshow=true">请选择</p>
+						<p v-else @click="priceshow=true">{{pricetype}}</p>
+					</div>
+					<div>
+						<p>声明价值</p>
+						<p>0元</p>
+					</div>
+				</div> -->
+			</div>
+		</div>
+		<!-- 申报信息 -->
+		<div class="bz">
+			<!-- <div>
+				<van-field v-model="sbxx" name="申报信息" label="申报信息" @click="links" placeholder="必填"/>
+			</div> -->
+			<div>
+				<van-field type="number" v-model="bjprice" name="保价" label="保价" placeholder="最高赠7倍运费,建议保价"/>
+			</div>
+		</div>
+		<!-- 预计送达时间 -->
+		<!-- <div class="sdtime">
+			<div>
+				<p>预计送达时间</p>
+				<div>
+					<p class="active">
+						<span>3日18:00前</span>
+						<span>¥36起</span>
+					</p>
+					<p>
+						<span>3日18:00前</span>
+						<span>¥36起</span>
+					</p>
+				</div>
+			</div>
+
+		</div> -->
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+    
+    
+		<!-- 弹窗物品类型 -->
+		<van-popup v-model="wpshow" position="bottom">
+		  <van-picker title="物品类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false"/>
+		</van-popup>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable closed="close">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+				  <van-field v-model="name" name="姓名" label="姓名" placeholder="请用英文输入姓名"/>
+				  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" />
+				  <van-field v-model="address" name="详细地址" label="详细地址" placeholder="请用英文输入详细地址"/>
+				  <van-field v-model="emailAddress" name="邮箱地址" label="邮箱地址" placeholder="请输入邮箱地址"/>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div>
+				</van-form>
+			</div>
+
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+
+	</div>
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"港澳台件",
+				wptype:"物品",//物品类型
+				wpshow:false,//物品类型弹窗显示
+				wplist:["物品","文件"],
+				addshow:false,
+				name:"",
+				phone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				sbxx:"",
+				check:false,
+				bjprice:"",
+				stepper:'',
+				emailAddress:'',//邮箱地址
+			}
+		},
+		created:function(){
+			this.isLogin();
+			//this.areaList=area.areaList
+			if(JSON.stringify(this.$store.state.hkJjInfo)!='{}'){
+				this.jjname = this.$store.state.hkJjInfo.jjname
+				this.jjadd = this.$store.state.hkJjInfo.jjadd
+			}
+			if(JSON.stringify(this.$store.state.hkSjInfo)!='{}'){
+				this.sjname = this.$store.state.hkSjInfo.sjname
+				this.sjadd = this.$store.state.hkSjInfo.sjadd
+			}
+		},
+		methods:{
+			// 选择物品确定
+			onConfirm1(e){//确定
+				this.wptype=e
+				this.wpshow=false
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==2){
+					this.title="收件地址"
+				}
+				this.addshow=true
+			},
+			// 填写地址确定
+			onSubmit(){
+				if(this.index==1){
+					this.jjname=this.name+' '+this.phone+' '+this.emailAddress
+					this.jjadd=this.city+' '+this.address
+				}
+				if(this.index==2){
+					this.sjname=this.name+' '+this.phone+' '+this.emailAddress
                    this.sjadd=this.city+' '+this.address
+				}
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				this.$router.push({path:'/Hkaddress',query:{active:obj}})
+			},
+			// 申报信息跳转
+			links(obj){
+				this.$router.push({path:'/Sbxx'})
+			},
+			// 选择快递公司
+			onConfirm(e){
+				this.value=e
+				this.showPicker=false
+			},
+			//立即寄件交互
+			save(){
+
+				if(this.jjname == '' || this.jjname == undefined ||
+				this.jjadd == '' || this.jjadd == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+
+				if(this.sjname == '' || this.sjname == undefined ||
+				this.sjadd == '' || this.sjadd == undefined){
+					Toast('请填写收件人信息')
+					return
+				}
+
+				/* if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				} */
+
+				if(this.wptype == '' || this.wptype == undefined){
+					Toast('请选择物品类型')
+					return
+				}
+
+				if(this.stepper == '' || this.stepper == undefined){
+					Toast('请选择重量/数量')
+					return
+				}
+
+				/* if(this.pricetype == '' || this.pricetype == undefined){
+					Toast('请选择付款方式')
+					return
+				} */
+				// let payWay = ''
+				// let mainType = ''
+				// if(this.pricetype == "自费(个人件)"){
+				// 	payWay = '自费'
+				// 	mainType = '个人件'
+				// }
+				// if(this.pricetype == "月结(公司件)"){
+				// 	payWay = '月结'
+				// 	mainType = '公司件'
+				// }
+
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+
+				this.$http.post(this.$store.state.host+"/sendMail/saveMail.do",{userId:localStorage.getItem("userId"),
+					sender:this.$store.state.hkJjInfo.personName,
+					senderPhone:this.$store.state.hkJjInfo.phone,
+					sendAddr:this.$store.state.hkJjInfo.city,
+					sendAddress:this.$store.state.hkJjInfo.address,
+					sendCountryCode:this.$store.state.hkJjInfo.countryCode,
+					sendEmailAddress:this.$store.state.hkJjInfo.emailAddress,
+					sendPostalCode:this.$store.state.hkJjInfo.postalCode,
+					sendCompanyName:this.$store.state.hkJjInfo.companyName,
+					receiver:this.$store.state.hkJjInfo.personName,
+					receiverPhone:this.$store.state.hkJjInfo.phone,
+					receiveAddr:this.$store.state.hkJjInfo.city,
+					receiveAddress:this.$store.state.hkJjInfo.address,
+					receiveCountryCode:this.$store.state.hkJjInfo.countryCode,
+					receiveEmailAddress:this.$store.state.hkJjInfo.emailAddress,
+					receivePostalCode:this.$store.state.hkJjInfo.postalCode,
+					receiveCompanyName:this.$store.state.hkJjInfo.companyName,
+					expressInfo:"1",
+					itemType:this.wptype,
+					mainType:"",
+					weight:this.stepper,
+					itemNum:this.stepper,
+					payWay:"",
+					expressType:'外部件',
+					declaredValue:this.bjprice,
+					itemRemark:"",
+					expressPhone:""
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else if(res.body.msg != '' && res.body.msg != 'success'){
+								Toast(res.body.msg);
+							}else{
+								Toast("寄件失败");
+							}
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: .33rem;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						padding-left: .3rem;
+
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+
+					}
+				}
+		    }
+
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				content: "";
+				display: inline-block;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			>div{
+				background: white;
+
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+				.type_price{
+					display: flex;
+					justify-content: center;
+					border-top: .01rem solid #ededed;
+					margin-top: .3rem;
+					padding-top: .3rem;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+						}
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+			}
+
+		}
+	    .bz{
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+
+			}
+		}
+		.sdtime{
+			padding: 0rem .33rem .33rem;
+			font-size: .3rem;
+			>div{
+				background: white;
+				padding: .2rem .33rem;
+				>p{
+					color: #646566;
+					padding-bottom: .2rem;
+				}
+				div{
+					display: flex;
+					p{
+						border:.01rem solid #cecaca;
+						border-radius: .05rem;
+						width: 30%;
+						display: block;
+						margin-right: 3%;
+						span{
+							display: block;
+							text-align: center;
+						}
+						span:nth-of-type(1){
+							color: #cecaca;
+							padding: .15rem 0rem;
+							font-weight: bold;
+						}
+						span:nth-of-type(2){
+							background: #cecaca;
+							padding: .05rem 0rem;
+							color: white;
+						}
+					}
+					p.active{
+						border:.01rem solid #e50909;
+						span:nth-of-type(1){
+							color: #e50909;
+						}
+						span:nth-of-type(2){
+							background: #e50909;
+						}
+					}
+				}
+			}
+
+		}
+		.check{
+			font-size: .24rem;
+
+			text-align: center;
+
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+</style>

+ 302 - 0
src/pages/inaddressbook.vue

@@ -0,0 +1,302 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">内部收件人</p>
+				<!-- <p @click="tab(2)" :class="[index==2?'active':'']" class="">收件人</p> -->
+			</div>		
+		</div>
+		<!-- 寄件人 -->
+		<!-- <div v-if="index==1">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLink(item)">
+							<p>寄</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>	
+							<p @click="linkEdit(item.id)">	
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div> -->
+			<!-- 寄件 -->
+			<!-- <div class="btn-jj">
+				<van-button @click="link(1)" type="info" color="#00c4b8">添加寄件人</van-button>
+			</div>
+		</div> -->
+		
+		<!-- 收件人 -->
+		<div v-if="index==3">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLinkSj(item)">
+							<p style="background: #fa9c22;">收</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}} {{item.telPhone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>						
+							<!-- <p @click="linkEdit(item.id)">
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p> -->
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button type="info" @click="link(3)" color="#00c4b8">添加收件人</van-button>
+			</div>
+		</div>
+	</div>	
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"地址簿",
+				index:3,
+				userId:'',
+				addressList:[]
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			//获取参数
+			this.index = this.$route.query.active
+			this.getData();
+		},
+		methods:{
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			tab(obj){
+				this.index=obj
+				this.getData()
+			},
+			link(obj){
+				this.$router.push({path:"/InNewaddress",query:{type:obj}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressList.do",{userId:this.userId,type:this.index},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.addressList = res.body.addressList
+					}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			del(id){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					Toast.loading({
+					    message: '删除中...',
+					    forbidClick: true,
+					    duration:0
+					});
+					this.$http.post(this.$store.state.host+"/personal/deleteAddressInfoById.do",{id:id},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								this.getData()
+							}else{
+								Toast("删除失败!")
+							}
+						Toast.clear()
+					},res=>{
+							 //发送失败
+						Toast("网络错误!")
+					})
+					Toast.clear()
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+			},
+			//跳去编辑页
+			linkEdit(id){
+				this.$router.push({path:"/Editaddress",query:{id:id}})
+			},
+			adressLink(item){
+				let jjInfo = {}
+				jjInfo.jjname = item.name+' '+item.phone
+				jjInfo.jjadd = item.provinceAndCity+' '+item.address
+				jjInfo.sender = item.name
+				jjInfo.senderPhone = item.phone
+				jjInfo.sendAddr = item.provinceAndCity
+				jjInfo.sendAddress = item.address
+				this.$store.commit("getJjInfo",jjInfo)
+				this.$router.push({path:"/Express"})
+			},
+			adressLinkSj(item){
+				let sjInfo = {}
+				sjInfo.sjname = item.name+' '+item.phone
+				sjInfo.sjadd = item.provinceAndCity+' '+item.address
+				sjInfo.receiver = item.name
+				sjInfo.receiverPhone = item.phone
+				sjInfo.receiveMobile = item.telPhone
+				sjInfo.receiveAddr = item.provinceAndCity
+				sjInfo.receiveAddress = item.address
+				this.$store.commit("getSjInfo3",sjInfo)
+				this.$router.push({path:"/Inexpress"})
+			}
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding: .33rem;			
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}
+			
+		}
+		.jjinfo{
+			font-size: .36rem;
+			color: #999999;
+			padding: .0rem .33rem 0.33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					flex-wrap: wrap;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem .2rem;
+						
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 5.2rem;
+							p:nth-of-type(1){
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.cz{
+						border-top: .01rem solid #ededed;
+						width: 100%;
+						display: flex;
+						flex-direction: row-reverse;
+						font-size: .24rem;
+						color: #999999;
+						padding-top: .2rem;
+						p{
+							margin-left: .2rem;
+							img{
+								width:.22rem;
+								height: .24rem;
+							}
+							span{
+								position: relative;
+								top: -.01rem;
+							}
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		
+		
+		
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	
+</style>

+ 247 - 0
src/pages/index.vue

@@ -0,0 +1,247 @@
+<template>
+  <div class="content">
+    <!-- banner图 -->
+    <banner></banner>
+	<!-- 寄件按钮 -->
+	<div class="btn-two">
+		<router-link to="/Express">
+			<img src="../assets/images/icon4.png" alt="">
+			<span>
+				<p>寄快递</p>
+				<p>放心寄 丢必赔</p>
+			</span>
+		</router-link>
+		<router-link to="Inexpress">
+			<img src="../assets/images/icon5.png" alt="">
+			<span>
+				<p>内部件</p>
+				<p>让工作 更便捷</p>
+			</span>
+		</router-link>
+	</div>
+	<!-- 同城急送 -->
+	<div class="btn-four">
+		<div>
+			<router-link to="/Cityexpress">
+				<img src="../assets/images/icon6.png" alt="">
+				<span>
+					<p>同城急送</p>
+					<p>闪送更快更安全</p>
+				</span>
+			</router-link>
+		</div>
+		<div>
+			<router-link to="/Multipleexpress">
+				<img src="../assets/images/icon7.png" alt="">
+				<span>
+					<p>批量寄</p>
+					<p>便捷寄多个快递</p>
+				</span>
+			</router-link>
+		</div>
+		<div>
+			<router-link to="/Foreignexpress">
+				<img src="../assets/images/icon8.png" alt="">
+				<span>
+					<p>国际件</p>
+					<p>放心寄 丢必赔</p>
+				</span>
+			</router-link>
+		</div>
+		<div>
+			<router-link to="/Hkexpress">
+				<img src="../assets/images/icon9.png" alt="">
+				<span>
+					<p>港澳台</p>
+					<p>让工作 更快捷</p>
+				</span>
+			</router-link>
+		</div>
+
+
+
+	</div>
+    <!--  -->
+	<div class="ad-two">
+		<router-link :to="{ path: 'Myaddressbook', query: { active: 1 }}">
+			<img src="../assets/images/ad_icon1.png" alt="">
+			<span>地址簿</span>
+		</router-link>
+		<router-link to="" @click.native="link()">
+			<img src="../assets/images/ad_icon2.png" alt="">
+			<span>寄包柜</span>
+		</router-link>
+		<!-- <router-link to="">
+			<img src="../assets/images/ad_icon3.png" alt="">
+			<span>运费时效</span>
+		</router-link> -->
+		<router-link to="/Xz">
+			<img src="../assets/images/ad_icon4.png" alt="">
+			<span>禁寄品</span>
+		</router-link>
+	</div>
+	<!-- 底部icon -->
+	<div class="foot_icon">
+		<div>
+			<img src="../assets/images/foot_icon1.png" >
+			<p>放心寄 丢必赔</p>
+		</div>
+		<div>
+			<img src="../assets/images/foot_icon2.png" >
+			<p>闪电送件</p>
+		</div>
+		<div>
+			<img src="../assets/images/foot_icon3.png" >
+			<p>专属客服</p>
+		</div>
+	</div>
+	<!-- 底部 -->
+    <tabbar></tabbar>
+
+  </div>
+</template>
+<script>
+  import {Toast,Dialog} from 'vant'
+  // import tabber from "./components/tabbar"
+  export default {
+    data() {
+      return {
+
+
+      };
+    },
+    created:function(){
+      //本地(服务器下面这个要去了)
+      //localStorage.setItem("openid", "123");
+      //this.getOpenid("");
+	  this.isLogin();
+    },
+    methods:{
+      link(){
+        Toast("正在开发中,敬请期待!")
+      }
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+.content{
+	padding: .33rem .34rem 1rem;
+	.btn-two{
+		font-size: .24rem;
+		color: #999999;
+		display: flex;
+		justify-content: space-between;
+		margin:.2rem auto;
+		a{
+			display: flex;
+			color: #999999;
+			padding: .25rem 0rem;
+			background: white;
+			width:48%;
+			border-radius: .05rem;
+			justify-content: center;
+			img{
+				width: .67rem;
+				height: .68rem;
+				position: relative;
+				top: .1rem;
+			}
+			span{
+				margin-left: .25rem;
+				p:nth-of-type(1){
+					font-size: .3rem;
+					color:#333;
+					font-weight: bold;
+					margin-bottom: .1rem;
+				}
+			}
+		}
+	}
+	.btn-four{
+		font-size: .24rem;
+		color: #999999;
+		display: flex;
+		flex-wrap: wrap;
+		justify-content: space-between;
+		margin:.2rem auto;
+		background: white;
+		padding: .25rem .2rem;
+		border-radius: .05rem;
+		div{
+			flex: 1;
+			min-width: 48%;
+			padding: .2rem 0rem;
+			a{
+				display: flex;
+				color: #999999;
+				justify-content: center;
+				padding: .1rem 0rem;
+				img{
+					width: .52rem;
+					height: .5rem;
+					position: relative;
+					top: .2rem;
+				}
+				span{
+					margin-left: .25rem;
+					p:nth-of-type(1){
+						font-size: .3rem;
+						color:#333;
+						font-weight: bold;
+						margin-bottom: .1rem;
+					}
+				}
+			}
+
+		}
+		div:nth-of-type(1) a,div:nth-of-type(3) a{
+			border-right: .01rem solid #f7f7f7;
+		}
+		div:nth-of-type(1),div:nth-of-type(2){
+			border-bottom: .01rem solid #f7f7f7;
+		}
+
+	}
+	.ad-two{
+		font-size: .24rem;
+		color: #999999;
+		display: flex;
+		justify-content: center;
+		margin:.2rem auto;
+		a{
+			flex: 1;
+			color: #999999;
+			padding: .35rem 0rem;
+			background: white;
+			width:48%;
+			border-radius: .05rem;
+			text-align: center;
+			img{
+				width: .55rem;
+				height: .55rem;
+				margin-bottom: .1rem;
+			}
+			span{
+				display: block;
+
+			}
+		}
+	}
+	.foot_icon{
+		display: flex;
+		justify-content: center;
+		margin: .55rem auto;
+		div{
+			flex: 1;
+			text-align: center;
+			font-size: .2rem;
+			color: #999999;
+			img{
+				width: .64rem;
+				height: .64rem;
+			}
+		}
+	}
+}
+</style>

+ 817 - 0
src/pages/inexpress.vue

@@ -0,0 +1,817 @@
+<template>
+	<div class="content">
+		<backindex :title="titlename"></backindex>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<!-- <p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="addtype(1)">填写寄件地址</p>
+							<p v-else @click="addtype(1)">{{jjadd}}</p> -->
+							<p>{{user.name}} {{user.organization}} {{user.phone}} {{user.telephone}}</p>
+							<p>{{jjaddress}}</p>
+						</div>
+					</div>
+					<!-- <div class="dzb">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>	 -->
+				</div>
+				<div class="jj" style="border-top:.01rem solid #ededed">
+					<div class="jjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="sjname==''||sjname==' '">收件地址</p>
+							<p v-else>{{sjname}}   {{sjInfo.receiveMobile}}</p>
+							<p v-if="sjadd==''||sjadd==' '" @click="addtype(3)">填写收件地址</p>
+							<p v-else @click="addtype(3)">{{sjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(3)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>
+				</div>
+			</div>
+
+		</div>
+		<!-- 快递公司 -->
+		<div class="kdshow">
+			<van-field readonly clickable name="picker" :value="expressInfoShow" label="快递公司" placeholder="请选择快递公司" @click="showPicker = true" />
+			<van-popup v-model="showPicker" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns"
+			    @confirm="onConfirm"
+			    @cancel="showPicker = false"
+			  />
+			</van-popup>
+		</div>
+		<!-- 主体类型 -->
+		<!-- <div class="kdshow">
+			<van-field readonly clickable name="picker" :value="mainType" label="主体类型" placeholder="请选择主体类型" @click="showPicker2 = true" />
+			<van-popup v-model="showPicker2" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns2"
+			    @confirm="onConfirm0"
+			    @cancel="showPicker2 = false"
+			  />
+			</van-popup>
+		</div> -->
+		<!-- 寄件属性 -->
+		<div class="choose">
+			<div>
+				<div class="type_wp">
+					<div>
+						<p>物品类型</p>
+						<p v-if="wptype==''" @click="wpshow=true">请选择</p>
+						<p v-else @click="wpshow=true">{{wptype}}</p>
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='产品'">重量(公斤)</template>
+							<template v-if="wptype=='非产品'">重量(公斤)</template>
+							<template v-if="wptype=='文件'">数量(件数)</template>
+						</p>
+						<p>
+							<van-field name="stepper" style="padding: 0px;">
+								<template #input>
+									<van-stepper v-model="stepper" :max="max"></van-stepper>
+								</template>
+							</van-field>
+						</p>
+					</div>
+				</div>
+			</div>
+		</div>
+		<!-- 内部调拨 -->
+		<div class="choose">
+			<div>
+				<div class="type_inner">
+					<div>
+						<p>地址类型</p>
+						<p v-if="addresstype==''" @click="addressshow=true">请选择</p>
+						<p v-else @click="addressshow=true">{{addresstype}}</p>
+						<!-- <p class="inner_p">内部调拨</p> -->
+					</div>
+					<div>
+						<p>
+							<template v-if="wptype=='产品'">选择产品</template>
+							<template v-if="wptype=='非产品'">选择标签</template>
+							<template v-if="wptype=='文件'">选择标签</template>
+						</p>
+						<p v-if="innerType==''" @click="wpshow2=true">请选择</p>
+						<p v-else @click="wpshow2=true">{{innerType}}</p>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<!--商品订单编号-->
+		<div class="bz" style="padding-bottom: 0;" v-show="this.accountType == 1">
+			<div>
+				<van-field maxlength="50" v-model="goodOrderNo" name="调拨单号" label="调拨单号" placeholder="请输入调拨单号"/>
+			</div>
+		</div>
+
+		<!-- 备注 -->
+		<div class="bz">
+			<div>
+				<van-field v-model="bz" name="备注" label="备注" placeholder="包装运输等要求"/>
+			</div>
+		</div>
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+		<!-- 弹窗物品类型 -->
+		<van-popup v-model="wpshow" position="bottom">
+		  <van-picker title="物品类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false"/>
+		</van-popup>
+		<!-- 弹窗内部类型 -->
+		<van-popup v-model="wpshow2" position="bottom">
+		  <van-picker title="选择" show-toolbar :columns="innerlist" @confirm="onConfirm11" @cancel="wpshow2=false"/>
+		</van-popup>
+
+		<!-- 弹窗地址类型类型 -->
+		<van-popup v-model="addressshow" position="bottom">
+		  <van-picker title="地址类型" show-toolbar :columns="addlist" @confirm="onConfirm8" @cancel="addressshow=false"/>
+		</van-popup>
+
+		<!-- 弹窗付款方式 -->
+		<van-popup v-model="priceshow" position="bottom">
+		  <van-picker title="付款方式" show-toolbar :columns="pricelist" @confirm="onConfirm2" @cancel="priceshow=false"/>
+		</van-popup>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable @closed="close" :close-on-click-overlay="false">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+					<form action="/">
+					  <van-search
+						shape="round"
+					    v-model="dsname"
+					    show-action
+					    placeholder="请输入搜索关键词"
+					    @search="onSearch"
+					    @cancel="onCancel"
+					  />
+					</form>
+					<van-list>
+					  <van-cell v-for="(item,index) in dsList" @click="onSubmit(index)" :key="item.name" :title="item.name + ' ' + item.phone + ' ' + item.telephone " />
+					</van-list>
+				  <!-- <van-field v-model="name" readonly name="姓名" label="姓名" placeholder="请输入姓名" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="phone" readonly maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="telPhone" readonly maxlength="20" type="text" name="座机" label="座机" placeholder="请输入座机" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="address" readonly maxlength="50" name="详细地址" label="详细地址" placeholder="请输入详细地址" @click="dsnameshow = true" :rules="[{ required: false}]"/> -->
+				 <!-- <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div> -->
+				</van-form>
+			</div>
+		</van-popup>
+		<!-- 代收人列表 -->
+		<van-popup v-model="dsnameshow" position="bottom">
+		  <van-picker title="内部收件人" show-toolbar :columns="dsList" value-key="text" @confirm="onConfirmDs" @cancel="dsnameshow=false"/>
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+	</div>
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"内部件",
+				wptype:"产品",//物品类型
+				wpshow:false,//物品类型弹窗显示
+				wplist:["产品","非产品","文件"],
+				pricetype:"",//付款类型
+				stepper:'',
+				max:'',
+				priceshow:false,//付款类型弹窗显示
+				pricelist:["自费","月结"],
+				addshow:false,
+				name:"",
+				phone:"",
+				telPhone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				bz:"",
+				check:false,
+				showPicker:false,//快递
+				value:"",
+				columns:[],
+				columns2:["个人件","公司件"],
+				user:{},
+				expressInfoShow:"",//快递公司展示
+				expressPhone:"",//快递公司电话传值
+				expressInfo:"",//快递公司传值
+				showPicker2:false,
+				mainType:'',
+				jjaddress:'',//寄件个人地址
+				dsList:[],//代收人列表
+				dsnameshow:false,
+				dsname:'',
+				userId:"",
+				sjInfo:{},
+				declaredValue:'',
+				innerType:'可销品',//内部调拨
+				wpshow2:false,//内部类型弹窗显示
+				innerlist:['可销品','非卖品'],
+				addresstype:"办公室",//地址类型
+				addressTypeSend:'',//上传地址类型字段
+				addressshow:false,//地址类型弹窗显示
+				addlist:['办公室','仓库','店铺调拨'],//
+				goodOrderNo:'',
+        accountType:''//账号类型
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			this.getUser();
+			this.getPersonalAddress()
+      this.accountType = localStorage.getItem("accountType")
+			//代收人列表
+			//this.findCollectAgentList()
+			//收件地址
+			if(JSON.stringify(this.$store.state.sjInfo3)!='{}'){
+				this.sjname = this.$store.state.sjInfo3.sjname
+				this.sjadd = this.$store.state.sjInfo3.sjadd
+				this.sjInfo = this.$store.state.sjInfo3
+			}else{
+				//收件人记忆
+				this.getLastRecvUserInfo()
+			}
+			//获取快递信息
+			this.getLogisticsList()
+
+		},
+		methods:{
+			//代收人搜索
+			onSearch(){
+				this.$http.post(this.$store.state.host+"/sendMail/searchInnerContactsList.do",{
+					userId:this.userId,name:this.dsname},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.dsList = res.body.list
+							for(var i=0;i<this.dsList.length;i++){
+								this.dsList[i].text = this.dsList[i].name +' '+ this.dsList[i].phone +' ' + this.dsList[i].telephone
+							}
+							//this.dsnameshow=true
+						}
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+			},
+			//搜索取消
+			onCancel(){
+				this.onSearch()
+			},
+			// 填写地址类型确定
+			onConfirm8(e){//确定
+
+				this.addresstype=e
+				this.addressshow=false
+			},
+			onConfirmDs(e){//确定
+				if(e != undefined){
+					this.name = e.name
+					this.phone=e.phone
+					this.telPhone = e.telephone
+					this.address = e.address
+					this.city = e.province + ' ' + e.area + ' ' + e.city
+				}
+				//this.getPersonalAddressById(e.user_id)
+				this.dsnameshow=false
+			},
+			//收件人记忆
+			getLastRecvUserInfo(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/sendMail/getLastRecvUserInfo.do",{userId:this.userId},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							if(JSON.stringify(res.body.result)!='{}'){
+								this.sjname = res.body.result.name+' '+res.body.result.phone
+								this.sjadd = res.body.result.area+' '+res.body.result.address
+								this.sjInfo = {}
+								this.sjInfo.sjname = this.sjname
+								this.sjInfo.sjadd = this.sjadd
+								this.sjInfo.receiver = res.body.result.name
+								this.sjInfo.receiverPhone = res.body.result.phone
+								this.sjInfo.receiveMobile = res.body.result.telPhone
+								this.sjInfo.receiveAddr = res.body.result.area
+								this.sjInfo.receiveAddress = res.body.result.address
+								this.$store.commit("getSjInfo3",this.sjInfo)
+							}
+
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			//收件
+			getPersonalAddress(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getPersonalAddress.do",{userId:this.userId},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.jjaddress = res.body.address
+							this.jjadd = res.body.provinceAndCity
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			// 选择快递公司
+			onConfirm(e){
+				this.expressInfoShow=e.text
+				this.expressInfo=e.id
+				this.expressPhone=e.phone
+				this.showPicker=false
+			},
+			onConfirm0(e){
+				this.mainType=e
+				this.showPicker2=false
+			},
+			// 选择物品确定
+			onConfirm1(e){//确定
+			if(e == '产品'){
+				this.innerlist = ['可销品','非卖品']
+				this.innerType = '可销品'
+			}else{
+				this.innerlist = ["小样","物料"]
+				this.innerType = '小样'
+			}
+
+			if(e == '文件'){
+				this.max = '10'
+			}else{
+				this.max = '1'
+			}
+
+				this.wptype=e
+				this.wpshow=false
+			},
+			// 选择内部确定
+			onConfirm11(e){//确定
+				this.innerType=e
+				this.wpshow2=false
+
+
+			},
+			// 选择付款方式确定
+			onConfirm2(e){//确定
+				this.pricetype=e
+				this.priceshow=false
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==3){
+					this.title="内部收件地址"
+				}
+				this.addshow=true
+				this.onSearch()
+			},
+			// 填写地址确定
+			onSubmit(index){
+				this.name = this.dsList[index].name
+				this.phone = this.dsList[index].phone
+				this.city = this.dsList[index].province + ' '+ this.dsList[index].city+' ' + this.dsList[index].area
+				this.address = this.dsList[index].address
+				this.telPhone = this.dsList[index].telPhone
+				if(this.index==3){
+					this.sjname=this.name+' '+this.phone
+			        this.sjadd=this.city+' '+this.address
+					this.sjInfo = {}
+					this.sjInfo.sjname = this.sjname
+					this.sjInfo.sjadd = this.sjadd
+					this.sjInfo.receiver = this.name
+					this.sjInfo.receiverPhone = this.phone
+					this.sjInfo.receiveMobile = this.telPhone
+					this.sjInfo.receiveAddr = this.city
+					this.sjInfo.receiveAddress = this.address
+					this.$store.commit("getSjInfo3",this.sjInfo)
+				}
+
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				this.$router.push({path:'/Inaddressbook',query:{active:obj}})
+			},
+			//立即寄件交互
+			save(){
+
+				if(this.user.name == '' || this.user.name == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+
+				if(this.sjname == '' || this.sjname == undefined ||
+				this.sjadd == '' || this.sjadd == undefined){
+					Toast('请填写收件人信息')
+					return
+				}
+
+				if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				}
+
+				if(this.wptype == '' || this.wptype == undefined){
+					Toast('请选择物品类型')
+					return
+				}
+
+				if(this.stepper == '' || this.stepper == undefined){
+					Toast('请选择数量')
+					return
+				}
+
+
+        if(this.accountType == 1){//柜台
+          if(this.goodOrderNo == ''){
+          	Toast('请填写调拨单号')
+          	return
+          }
+        }else{//没有绑定账号类型
+            Toast('当前账号没有绑定账号类型,请联系管理员')
+          	return
+        }
+
+
+				if(this.addresstype == '店铺调拨'){ 
+					this.addressTypeSend = '3'
+				}else if(this.addresstype == '仓库'){
+					this.addressTypeSend = '2'
+				}else if(this.addresstype == '办公室'){
+					this.addressTypeSend = '1'
+				}
+
+
+
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+
+				this.$http.post(this.$store.state.host+"/sendMail/saveMail.do",{userId:this.userId,
+					sender:this.user.name,
+					senderPhone:this.user.phone,
+					senderMobile:this.user.telephone,
+					sendAddr:this.jjadd,
+					sendAddress:this.jjaddress,
+					receiver:this.sjInfo.receiver,
+					receiverPhone:this.sjInfo.receiverPhone,
+					receiveMobile:this.sjInfo.receiveMobile,
+					receiveAddr:this.sjInfo.receiveAddr,
+					receiveAddress:this.sjInfo.receiveAddress,
+					expressInfo:this.expressInfo,
+					itemType:this.wptype,
+					mainType:this.mainType,
+					weight:this.stepper,
+					itemNum:this.stepper,
+					payWay:this.pricetype,
+					mainType:'公司件',
+					expressType:'内部件',
+					declaredValue:this.declaredValue,
+					itemRemark:this.bz,
+					expressPhone:this.expressPhone,
+					innerType:this.innerType,
+					goodOrderNo:this.goodOrderNo,
+					addressType:this.addressTypeSend
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else if(res.body.msg != '' && res.body.msg != 'success'){
+								Toast(res.body.msg);
+							}else{
+								Toast("寄件失败");
+							}
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: .33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						padding-left: .3rem;
+
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+
+					}
+				}
+		    }
+
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				content: "";
+				display: inline-block;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			>div{
+				background: white;
+
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+
+				.type_inner{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+
+						p:nth-of-type(2){
+
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+						/* .inner_p{
+
+							color: black;
+							margin-top: .2rem;
+							font-size: .36rem;
+						} */
+
+					}
+					div:nth-of-type(2){
+						border-right: .01rem solid #ededed;
+
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+
+			}
+
+		}
+	    .bz{
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+
+			}
+		}
+		.check{
+			font-size: .24rem;
+
+			text-align: center;
+
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+</style>

+ 222 - 0
src/pages/info.vue

@@ -0,0 +1,222 @@
+<template>
+	<div>
+		<!-- <back :title="titlename"></back> -->
+		<van-nav-bar
+		  :title="titlename"
+		  left-text="返回"
+		  left-arrow
+		  @click-left="onClickLeft"
+		/>
+		<div class="content">
+			<p>收件查询</p>
+			<div class="jjlist">
+				<div class="listinfo">
+					<div class="list_top">
+						<div class="list_top_left">
+							<img src="../assets/images/ad_icon1.png" alt="">
+							<div>
+								<p>派单号 {{expressInfo.dispatchNo}}</p>
+								<p><template v-if="expressInfo.expressCompany == 1">顺丰</template>
+								<template v-if="expressInfo.expressCompany == 2">中通</template>
+								<template v-if="expressInfo.expressCompany == 3">DHL</template>
+								<template v-if="expressInfo.expressCompany == 4">EMS</template>
+								<template v-if="expressInfo.expressCompany == 5">同城</template>
+								<template v-if="expressInfo.expressCompany == 6">京东</template> {{expressInfo.expressNo}}</p>
+								<p>{{expressInfo.recordDate}}</p>
+							</div>
+						</div>
+						<p>
+							<template v-if="expressInfo.expressStatus == 1">未派送</template>
+							<template v-if="expressInfo.expressStatus == 2">已派送</template>
+						</p>
+					</div>
+					<!-- <div class="fast">
+						<p>同城急送</p>
+					</div> -->
+				</div>
+			</div>
+			<div class="info">
+				<img style="width: 4rem;height: 4rem;margin: 0 auto;display: block;" id="image" :src="qrcode">
+				<p>收件人:{{expressInfo.recipient}}</p>
+				<p>公司:{{expressInfo.company}}</p>
+				<p>座位:{{expressInfo.sendSeat}}</p>
+				<p>手机:{{expressInfo.phone}}</p>
+				<p>智能柜:{{expressInfo.cabinet}}</p>
+				<p>快件类型:{{expressInfo.expressType}}</p>
+				<p>是否私人件:
+					<template v-if="expressInfo.isCompany == '否'">是</template>
+					<template v-else>否</template>
+				</p>
+				<p>是否问题件:{{expressInfo.isProblem}}</p>
+				<p>是否已派件:<template v-if="expressInfo.expressStatus == 1">否</template><template v-if="expressInfo.expressStatus == 2">是</template>
+				</p>
+				<p>备注:{{expressInfo.remark}}</p>
+				<div class="pjinfo">
+					<p>{{expressInfo.modifyDate}}  <!-- 派件中,收派员【{{expressInfo.solicitor}}】 --></p>
+				</div> 
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import QRCode from 'qrcode'
+	import {Toast,Dialog} from 'vant'
+	export default {
+		data() {
+			return {
+				titlename: "查快递",
+				openid:'',
+				id:'',
+				expressInfo:{},
+				qrcode:''
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.openid = this.$store.state.openId
+			//获取参数
+			this.id = this.$route.query.id
+			this.getData();
+		},
+		methods:{
+			makeQRCode(obj) {
+			    QRCode.toDataURL(obj).then(imgData => {
+			        if(imgData) {
+			           //console.log(imgData)
+					   this.qrcode=imgData
+			        }
+			    });
+			},
+			onClickLeft(){
+			  this.$router.push({path:"/Search",query:{type:2}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/sendMail/getExpressDetailById.do",{id:this.id},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.expressInfo = res.body.expressInfo
+							console.log(this.expressInfo)
+							this.makeQRCode(this.expressInfo.expressNo)
+							//console.log(res.body)
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			}	
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content {
+		padding: .2rem .33rem;
+		font-size: .3rem;
+		>p{
+			font-size: .3rem;
+			text-align: center;
+			margin-bottom: .2rem;
+		}
+		.info {
+			padding: .4rem;
+			background: white;
+			line-height: 200%;
+			color: #666666;
+
+			.pjinfo {
+				margin-top: .1rem;
+				border-top: .01rem solid #f0efef;
+				padding-top: .1rem;
+			}
+		}
+
+		.jjlist {
+			font-size: .3rem;
+			color: #999999;
+
+			.listinfo {
+				background: white;
+				padding: .33rem .33rem .2rem;
+				border-radius: .05rem;
+				margin-bottom: .2rem;
+				position: relative;
+				.list_top {
+					display: flex;
+					justify-content: space-between;
+
+					.list_top_left {
+						img {
+							display: inline-block;
+							width: .9rem;
+							height: .9rem;
+							position: relative;
+							top: -.1rem;
+						}
+
+						div {
+							width: 4rem;
+							margin-left: .2rem;
+							display: inline-block;
+							line-height: 150%;
+
+							p:nth-of-type(1) {
+								font-size: .3rem;
+								font-weight: bold;
+								color: #333;
+							}
+
+							
+
+							p:nth-of-type(3) {
+								font-size: .2rem;
+							}
+						}
+					}
+
+					>p {
+						font-size: .24rem;
+						color: #f5693d;
+						font-weight: bold;
+					}
+				}
+                .fast{
+				  background: url(../assets/images/status.png) no-repeat center;
+				  background-size: 100% 100%;
+				  color: white;
+				  position: absolute;
+				  bottom: 0px;
+				  right: 0px;
+				  width: 1rem;
+				  height: .4rem;
+				  text-align: center;
+				  line-height: .4rem;
+				  font-size: .2rem;
+			  }				
+				
+			}
+		}
+	}
+	
+	/deep/ .van-nav-bar__content{
+	    .van-nav-bar__title{
+	      font-size: 16px;
+	    }
+	  }
+	/deep/.van-icon-arrow-left::before{
+	  color: #333;
+	  font-size: 16px;
+	}
+	/deep/.van-nav-bar__text{
+	  color: #333 !important;
+	  font-size: 16px;
+	}
+</style>

+ 182 - 0
src/pages/innewaddress.vue

@@ -0,0 +1,182 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<div class="form">
+			<van-form @submit="onSubmit">
+				<form action="/">
+				  <van-search
+					shape="round"
+				    v-model="dsname"
+				    show-action
+				    placeholder="请输入搜索关键词"
+				    @search="onSearch"
+				    @cancel="onCancel"
+				  />
+				</form>	
+			  <van-field readonly v-model="name" name="姓名" label="姓名" placeholder="请输入姓名" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+			  <van-field readonly v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+			  <van-field readonly v-model="telPhone" maxlength="20" type="text" name="座机" label="座机" placeholder="请输入座机" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+			  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+			  <van-field readonly v-model="address" name="详细地址" label="详细地址" placeholder="请输入详细地址" @click="dsnameshow = true" :rules="[{ required: false}]"/>
+			  <div style="margin-top: 16px;">
+			    <van-button color="#00c4b8" block type="info" native-type="submit" :disabled="disabled">确定</van-button>
+			  </div>
+			</van-form>
+			<!-- 代收人列表 -->
+			<van-popup v-model="dsnameshow" position="bottom">
+			  <van-picker title="内部收件人" show-toolbar :columns="dsList" value-key="text" @confirm="onConfirmDs" @cancel="dsnameshow=false"/>
+			</van-popup> 
+			<!-- 城市选择 -->
+			<van-popup v-model="areashow" position="bottom">
+			  <van-area
+			    :area-list="areaList"
+			    @confirm="onConfirm3"
+			    @cancel="areashow = false"
+			  />
+			</van-popup>
+		</div>
+	</div>
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import {Toast} from 'vant'
+	export default{
+		data(){
+			return{
+				titlename:"添加内部收件人",
+				name:"",
+				phone:"",
+				telPhone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				type:'',
+				disabled:false,
+				dsList:[],//代收人列表
+				dsnameshow:false,
+				dsname:'',
+				userId:''
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.type=this.$route.query.type
+			//代收人列表
+			this.findCollectAgentList()
+			this.userId = localStorage.getItem("userId");
+		},
+		methods:{
+			//代收人搜索
+			onSearch(){
+				this.$http.post(this.$store.state.host+"/sendMail/searchInnerContactsList.do",{
+					userId:this.userId,name:this.dsname},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.dsList = res.body.list					
+							for(var i=0;i<this.dsList.length;i++){
+								this.dsList[i].text = this.dsList[i].name+' ' + this.dsList[i].telephone+' '+ this.dsList[i].phone
+							}							
+							this.dsnameshow=true
+						}
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+			},
+			//搜索取消
+			onCancel(){
+				this.findCollectAgentList()
+			},
+			onConfirmDs(e){//确定
+				if(e != undefined){
+					this.name = e.name
+					this.phone=e.phone
+					this.telPhone = e.telephone
+					this.address = e.address
+					this.city = e.province + ' ' + e.area + ' ' + e.city 
+				}
+				//this.getPersonalAddressById(e.user_id)
+				this.dsnameshow=false
+			},
+			onSubmit(){
+				
+				if(this.name == '' || this.name == undefined){
+					Toast('请输入姓名')
+					return
+				}
+				
+				if(this.phone == '' || this.phone == undefined){
+					Toast('请填写手机号')
+					return
+				}
+				
+				if(this.city == '' || this.city == undefined){
+					Toast('请选择省市区')
+					return
+				}
+				
+				if(this.address == '' || this.address == undefined){
+					Toast('请输入详细地址')
+					return
+				}
+				
+				
+				this.disabled = true;
+				
+				this.$http.post(this.$store.state.host+"/personal/saveAddressInfo.do",{userId:this.userId,
+					name:this.name,
+					phone:this.phone,
+					telPhone:this.telPhone,
+					provinceAndCity:this.city,
+					address:this.address,
+					type:this.type
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("保存成功");
+								let that = this;
+								setTimeout(function(){
+									that.$router.back()
+								},500)
+							}else{
+								Toast("保存失败");
+							}
+							this.disabled = false;
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+						this.disabled = false;
+					})
+					this.disabled = false;
+			},
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+				console.log(e)
+			},
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		
+		.form{
+			padding: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+	}
+</style>

+ 152 - 0
src/pages/key.vue

@@ -0,0 +1,152 @@
+<template>
+  <div class="content">
+    <div class="verify-code-div" @click="codeInputFun">
+      <ul class="verify-code-num-list">
+        <li>
+          <span>{{codeArr[0]}}</span>
+          <span v-if="isFocus && !codeArr[0]" class="caret"></span>
+        </li>
+        <li>
+          <span>{{codeArr[1]}}</span>
+          <span v-if="isFocus && !codeArr[1] && codeArr[0]" class="caret"></span>
+        </li>
+        <li>
+          <span>{{codeArr[2]}}</span>
+          <span v-if="isFocus && !codeArr[2] && codeArr[0] && codeArr[1]" class="caret"></span>
+        </li>
+        <li>
+          <span>{{codeArr[3]}}</span>
+          <span v-if="isFocus && !codeArr[3] && codeArr[0] && codeArr[1] && codeArr[2]" class="caret"></span>
+        </li>
+        <li>
+          <span>{{codeArr[4]}}</span>
+          <span v-if="isFocus && !codeArr[4] && codeArr[0] && codeArr[1] && codeArr[2]&& codeArr[3]"
+            class="caret"></span>
+        </li>
+        <li>
+          <span>{{codeArr[5]}}</span>
+          <span v-if="isFocus && !codeArr[5] && codeArr[0] && codeArr[1] && codeArr[2]&& codeArr[3] && codeArr[4]"
+            class="caret"></span>
+        </li>
+      </ul>
+      <input @focus="focus" @blur="blur" ref="codeInput" type="text" class="verify-code-input" unselectable="on"
+        maxlength="6" v-model="code">
+    </div>
+  </div>
+</template>
+
+
+
+<script>
+  export default {
+    name: 'verificatonCode',
+    data() {
+      return {
+        code: '',
+        codeArr: [],
+        isFocus: false
+      }
+    },
+    watch: {
+      code(newVal) {
+        this.codeArr = String(newVal).split("")
+      }
+    },
+    methods: {
+      focus() {
+        this.isFocus = true
+      },
+      blur() {
+        this.isFocus = false
+      },
+      codeInputFun() {
+        this.$refs.codeInput.focus()
+      },
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  @keyframes shan {
+    to {
+      opacity: 0;
+    }
+
+    from {
+      opacity: 1;
+    }
+  }
+
+  .content {
+    width: 100%;
+    min-height: 100vh;
+    background: rgba(0,0,0,0.6);
+  }
+
+  .verify-code-div {
+    width: 6.5rem;
+    margin: auto;
+    position: absolute;
+    top: 40%;
+    left: 50%;
+    transform: translate(-50%,-50%);
+    background: none;
+    .verify-code-input {
+      width: 100%;
+      height: 1rem;
+      border:none;
+      outline: none;
+      color: transparent;
+      caret-color: transparent;
+      background: none;
+    }
+
+    .verify-code-num-list {
+      width: 100%;
+      height: 1rem;
+
+      position: absolute;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      text-align: center;
+
+      &:after {
+        content: "";
+        display: block;
+        clear: both;
+      }
+
+      li {
+        background: #fff;
+        float: left;
+        width: 1rem;
+        height: 1rem;
+        text-align: center;
+        line-height: 1rem;
+        display: inline-block;
+        //background: rgba(0, 0, 0, .05);
+        border-radius: 10px;
+        margin-right: .1rem;
+        font-size: 20px;
+        overflow: hidden;
+
+        .caret {
+          margin-top: .2rem;
+          display: inline-block;
+          min-width: 2px;
+          max-width: 2px;
+          width: 2px;
+          height: .6rem;
+          background: rgba(0, 0, 0, .4);
+          animation: shan 0.8s infinite;
+        }
+
+        &:last-child {
+          margin-right: 0px;
+        }
+      }
+    }
+  }
+</style>

+ 128 - 0
src/pages/login.vue

@@ -0,0 +1,128 @@
+<template>
+	<div class="content">
+		<img class="loginimg" src="../assets/images/login.png" alt="">
+		<div class="login">
+			<div class="item">
+				<van-cell-group>
+			       <van-field v-model="name"  placeholder="请输入登录名" />
+			    </van-cell-group>
+			</div>
+			<div class="item">
+				<van-cell-group>
+			       <van-field v-model="password" type="password"  placeholder="请输入密码" />
+			    </van-cell-group>
+			</div>
+			<!-- <div class="item">
+				<van-cell-group>
+			       <van-field v-model="yzm" type="number"  placeholder="请输入验证码" />
+			    </van-cell-group>
+			</div> -->
+			<div class="btn">
+				<van-button type="primary" color="#00c4b8" @click="login">登录</van-button>
+			</div>
+			<div class="register">
+				<!-- <router-link to="">新用户注册</router-link>
+				<router-link to="/Forgetpassword">忘记密码</router-link> -->
+			</div>
+			<div style="font-size: 10px;text-align: center;padding-top: 1.625rem;">
+				<a style="color: black" href="https://beian.miit.gov.cn">沪ICP备2021029008号-1</a>
+			</div>
+		</div>
+	</div>
+</template>
+
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return{
+				name:"",
+				password:"",
+				yzm:""
+			}
+		},
+		created:function(){
+			if(localStorage.getItem('name')!=null){
+				this.name = localStorage.getItem('name')
+			}
+			if(localStorage.getItem('password')!=null){
+				this.password = localStorage.getItem('password')
+			}
+		},
+		methods:{
+			//登录
+			login(){
+				if(this.name == '' || this.name == undefined){
+					Toast('请输入登录名');
+					return;
+				}
+				if(this.password == '' || this.password == undefined){
+					Toast('请输入登录名');
+					return;
+				}
+				this.$http.post(this.$store.state.host+"/appSysUser/employee_login",{account:this.name,password:this.password},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.result=='success'){
+							//localStorage
+							localStorage.setItem("userId",res.body.userId);
+							localStorage.setItem("roomId",res.body.roomId);
+              localStorage.setItem("accountType",res.body.accountType);
+							localStorage.setItem("name",this.name);
+							localStorage.setItem("password",this.password);
+							this.$router.push({path:'/'});
+						}else{
+							Toast('登录失败!');
+						}
+				},res=>{
+						//发送失败
+					Toast("发送失败!")
+				})
+			}
+		}
+	}
+</script>
+<style scoped lang="less">
+	.content{
+		.loginimg{
+			width:3.48rem;
+			margin: 0 auto;
+			display: block;
+			padding: 2.15rem .8rem;
+		}
+		.login{
+			width: 5.8rem;
+			margin: 0 auto;
+			.item{
+				border: .01rem solid #bfbfbf;
+				border-radius: .1rem;
+				margin-bottom: .5rem;
+				background: white;
+				overflow: hidden;
+				color: #999999;
+			}
+			.item:nth-of-type(3){
+				margin-bottom: .2rem;
+			}
+			.btn{
+				button{
+					width: 100%;
+				}
+			}
+			.register{
+				font-size: .24rem;
+				display: flex;
+				justify-content: space-between;
+				//margin-top: .2rem;
+				margin-bottom: .2rem;
+				a{
+					color: #999999;
+				}
+				a:nth-of-type(1){
+					color: #02bfb3;
+				}
+			}
+		}
+	}
+</style>

+ 420 - 0
src/pages/logisticslist.vue

@@ -0,0 +1,420 @@
+<template>
+	<div class="content">
+		<van-search v-model="value" @search="onSearch" placeholder="请输入运单号" />
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">外部件</p>
+				<p @click="tab(2)" :class="[index==2?'active':'']">内部件</p>
+			</div>		
+		</div>
+		<!-- 按天按月 -->
+		<div class="change">
+			<div class="time">
+				<p @click="changetimeNew()" class="timeactive">日期筛选</p>
+				<!-- <p @click="changetime(1)" :class="[time==1?'timeactive':'']">按月</p>
+				<p @click="changetime(2)" :class="[time==2?'timeactive':'']">按天</p> -->
+			</div>
+			<div class="datapicker">
+				<p @click="showPicker=true">{{timevalue}}</p>
+			</div>
+		</div>
+		<!-- 订单列表 -->
+		<div class="list">
+			<div class="logistics" v-for="item in mailList">
+				<div class="logistics_top">
+					<p>订单号:<span :id="'copytkl'+item.expressNo">{{item.expressNo}}</span></p>
+					<!-- <p > -->
+					<img :id="'fz'+item.expressNo" @click="copyLink(item.expressNo)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.expressNo" src="../assets/images/2022copy.png" alt="">
+					<!-- </p> -->
+				</div>
+				<div class="logistics_center" @click="mailDetail(item.id)">
+					<div>
+						<p>{{item.sendCity}}</p>
+						<p>{{item.sender}}</p>
+					</div>
+					<div>
+						<img v-if="item.sendSt == '待揽件'" src="../assets/images/j_ico01.png" alt="">
+						<img v-if="item.sendSt == '已揽收'" src="../assets/images/j_ico01.png" alt="">
+						<img v-if="item.sendSt == '派送中'" src="../assets/images/j_ico02.png" alt="">
+						<img v-if="item.sendSt == '已签收'" src="../assets/images/j_ico03.png" alt="">
+						<img v-if="item.sendSt == '已退回'" src="../assets/images/j_ico04.png" alt="">
+						<p>{{item.sendSt}}</p>
+					</div>
+					<div>
+						<p>{{item.receiveCity}}</p>
+						<p>{{item.receiver}}</p>
+					</div>
+				</div>
+				<!-- <div class="logistics_bottom">
+					<p>已揽件:顺丰速运已取快件</p>
+					<p>接收时间:2022-10-23 10:11</p>
+				</div> -->
+			</div>
+			<!-- <div class="logistics">
+				<div class="logistics_top">
+					<p>订单号:CX223232322</p>
+					<img src="../assets/images/2022copy.png" alt="">
+				</div>
+				<div class="logistics_center">
+					<div>
+						<p>苏州</p>
+						<p>张三</p>
+					</div>
+					<div>
+						<img src="../assets/images/j_ico01.png" alt="">
+						<p>已揽件</p>
+					</div>
+					<div>
+						<p>上海</p>
+						<p>张三</p>
+					</div>
+				</div>
+				<div class="logistics_bottom">
+					<p>已揽件:顺丰速运已取快件</p>
+					<p>接收时间:2022-10-23 10:11</p>
+				</div>
+			</div> -->
+			<!-- <div class="logistics">
+				<div class="logistics_top">
+					<p>订单号:CX223232322</p>
+					<img src="../assets/images/2022copy.png" alt="">
+				</div>
+				<div class="logistics_center">
+					<div>
+						<p>苏州</p>
+						<p>张三</p>
+					</div>
+					<div>
+						<img src="../assets/images/j_ico02.png" alt="">
+						<p>派送中</p>
+					</div>
+					<div>
+						<p>上海</p>
+						<p>张三</p>
+					</div>
+				</div>
+				<div class="logistics_bottom">
+					<p>派送中:快件派送不成功</p>
+					<p>预计送达时间:2022-10-23 10:11</p>
+				</div>
+			</div> -->
+			<!-- <div class="logistics">
+				<div class="logistics_top">
+					<p>订单号:CX223232322</p>
+					<img src="../assets/images/2022copy.png" alt="">
+				</div>
+				<div class="logistics_center">
+					<div>
+						<p>苏州</p>
+						<p>张三</p>
+					</div>
+					<div>
+						<img src="../assets/images/j_ico03.png" alt="">
+						<p>已签收</p>
+					</div>
+					<div>
+						<p>上海</p>
+						<p>张三</p>
+					</div>
+				</div>
+				<div class="logistics_bottom">
+					<p>签收时间:2022-10-23 10:11</p>
+				</div>
+			</div> -->
+			<!-- <div class="logistics">
+				<div class="logistics_top">
+					<p>订单号:CX223232322</p>
+					<img src="../assets/images/2022copy.png" alt="">
+				</div>
+				<div class="logistics_center">
+					<div>
+						<p>苏州</p>
+						<p>张三</p>
+					</div>
+					<div>
+						<img src="../assets/images/j_ico01.png" alt="">
+						<p>已退回</p>
+					</div>
+					<div>
+						<p>上海</p>
+						<p>张三</p>
+					</div>
+				</div>
+				<div class="logistics_bottom">
+					<p>已退回:有客户要求快件正在退回</p>
+					<p>退回时间:2022-10-23 10:11</p>
+				</div>
+			</div> -->
+		</div>
+		<!-- 日历选择 -->
+		<van-calendar color="#00c4b8" v-model:show="showPicker" type="range" :min-date="minDate" :max-date="maxDate" @confirm="onConfirm" />
+		<!-- 时间选择 -->
+		<!-- <van-popup v-model:show="showPicker" position="bottom">
+		  <van-datetime-picker
+		    :type="showPickertype"
+			:max-date="maxDate"
+		    @confirm="onConfirm"
+		    @cancel="showPicker = false"
+		  />
+		</van-popup> -->
+		<tabbar></tabbar>
+	</div>
+</template>
+
+<script>
+import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				expressType:'外部件',
+				userId:'',
+				mailList:"",
+				index:1,
+				time:1,
+				value:"",
+				timevalue:"请选择日期范围",
+				showPicker:false,
+				showPickertype:"year-month",
+				minDate: new Date(2022, 0, 1),
+				maxDate: new Date(),
+				startTime:'',
+				endTime:'',
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			this.getmailList();
+		},
+		methods:{
+			//寄件详情
+			mailDetail(id){		  
+				this.$router.push({path:'/MailInfo',query:{id:id}})
+			},
+			//单号搜索
+			onSearch(val) {
+				this.getmailList();
+			},
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			//寄件查询
+			getmailList(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/mailRoute/getPersonalMailList.do",{userId:this.userId,
+				expressType:this.expressType,
+				expressNo:this.value,
+				startTime:this.startTime,
+				endTime:this.endTime},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.mailList = res.body.mailList
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			tab(obj){//外部件、内部件切换
+				this.index=obj
+				if(this.index == 1){
+					this.expressType = '外部件'
+				}
+				if(this.index == 2){
+					this.expressType = '内部件'
+				}
+				this.getmailList();
+			},
+			changetime(obj){//选择按月份、按天数
+				this.time=obj
+				this.timevalue="请选择"
+				if(obj==1){//按月份时间选择器为年-月
+					this.showPickertype="year-month"
+				}
+				if(obj==2){//按天时间选择器为年-月-日
+					this.showPickertype="date"
+				}
+			},
+			/* onConfirm(value){//时间确定
+			    let year,month,day
+				let date=new Date(value)
+				year=date.getFullYear()
+				month=date.getMonth()+1>9?date.getMonth()+1:'0'+(date.getMonth()+1)
+				
+				if(this.time==1){
+					this.timevalue=year+'-'+month
+				}
+				if(this.time==2){
+					day=date.getDate()>9?date.getDate():'0'+date.getDate()
+					this.timevalue=year+'-'+month+'-'+day
+				}
+				this.showPicker=false
+			}, */
+			onConfirm(values){//时间确定
+				const [start, end] = values;
+				this.showPicker = false;
+				this.startTime = this.formatDate(start);
+				this.endTime = this.formatDate(end);
+				this.timevalue = this.startTime+ '~' +this.endTime;
+				this.getmailList();
+			},
+			formatDate(date){
+				let year,month,day
+				year=date.getFullYear()
+				month=date.getMonth()+1>9?date.getMonth()+1:'0'+(date.getMonth()+1)
+				day=date.getDate()>9?date.getDate():'0'+date.getDate()
+				return (year+'-'+month+'-'+day)
+			}
+			
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style lang="less" scoped="">
+	.content{
+		font-size: .3rem;
+		//padding: .33rem;
+		padding: .33rem .33rem 1.2rem;
+		/deep/.van-search{
+			padding: 0px;
+			margin-bottom: .3rem;
+			.van-search__content{
+				background: white;
+			}
+		}
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding-bottom: .3rem;
+			background: white;
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .15rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}			
+		}
+		.change{
+			color: #00c4b8;
+			margin-bottom: .3rem;
+			padding: 0rem .3rem;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			background: white;
+			padding-bottom: .3rem;
+			.datapicker{
+				color: #9f9d9d;
+				font-size: .3rem;
+				p:after{
+					content: "";
+					display: inline-block;
+					margin-left: .1rem;
+					width: .15rem;
+					height: .15rem;
+					border-right: .05rem solid #9f9d9d;
+					border-bottom: .05rem solid #9f9d9d;
+					transform: rotate(45deg);
+					position: relative;
+					top: -.05rem;
+				}
+			}
+			.time{
+				width: 2rem;
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				font-size: .26rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.timeactive{
+					background: #00c4b8;
+					color: white;
+				}
+			}			
+		}
+		.logistics{
+			background: white;
+			border-radius: .1rem;
+			padding: .15rem;
+			margin-bottom: .3rem;
+			.logistics_top{
+				display: flex;
+				align-items: center;
+				img{
+					width: 12px;
+					height: 14px;
+					margin-left: .1rem;
+				}
+			}
+			.logistics_center{
+				padding:.3rem .6rem;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				font-size: .26rem;
+				color: #9f9d9d;
+				div:nth-of-type(1){
+					text-align: center;
+					p:nth-of-type(1){
+						font-size: .36rem;
+						font-weight: bold;
+						color: #333;
+						margin-bottom: .2rem;
+					}
+				}
+				div:nth-of-type(2){
+					text-align: center;
+					color: #333;
+					font-weight: bold;
+				}
+				div:nth-of-type(3){
+					text-align: center;
+					p:nth-of-type(1){
+						font-size: .36rem;
+						font-weight: bold;
+						color: #333;
+						margin-bottom: .2rem;
+					}
+				}
+			}
+			.logistics_bottom{
+				color: #9f9d9d;
+				font-size: .26rem;
+				p{
+					padding-top: .1rem;
+				}
+			}
+		}
+	}
+</style>

+ 283 - 0
src/pages/mailInfo.vue

@@ -0,0 +1,283 @@
+<template>
+	<div>
+		<!-- <van-nav-bar
+		  :title="titlename"
+		  left-text="返回"
+		  left-arrow
+		  @click-left="onClickLeft"
+		/> -->
+		<back :title="titlename"></back>
+		<div class="content">
+			<p>寄件查询</p>
+			<div class="jjlist">
+				<div class="listinfo">
+					<div class="list_top">
+						<div class="list_top_left">
+							<img src="../assets/images/ad_icon1.png" alt="">
+							<div>
+								<p><template v-if="expressInfo.expressInfo == 1">顺丰</template>
+								<template v-if="expressInfo.expressInfo == 2">中通</template>
+								<template v-if="expressInfo.expressInfo == 3">DHL</template>
+								<template v-if="expressInfo.expressInfo == 4">EMS</template>
+								<template v-if="expressInfo.expressInfo == 5">同城</template>
+								<template v-if="expressInfo.expressInfo == 6">京东</template>	{{expressInfo.expressNo}}</p>
+								<p>{{expressInfo.sender}} {{expressInfo.senderPhone}}</p>
+								<p>{{expressInfo.recordDate|dateFormat}}</p>
+							</div>
+						</div>
+						<p>
+							<template v-if="expressInfo.auditSt == 1">审核中</template>
+							<template v-if="expressInfo.auditSt == 2">审核通过</template>
+							<template v-if="expressInfo.auditSt == 3">审核拒绝</template>
+						</p>
+					</div>
+					<!-- <div class="fast">
+						<p @click="showTxm">条形码</p>
+					</div> -->
+				</div>
+			</div>
+			<div class="info">
+				<img style="margin: 0 auto;display: block;" id="barcode"/>
+
+				<p>秘钥:{{expressInfo.collectKey}}</p>
+				<p>部门:{{expressInfo.costCenterName}}</p>
+				<!-- <p>座位:{{expressInfo.sendSeat}}</p> -->
+				<!-- <p>智能柜:{{expressInfo.cabinet}}</p> -->
+				<p>快件类型:{{expressInfo.expressType}}</p>
+				<p>收件人:{{expressInfo.receiver}}</p>
+				<p>收件人手机:{{expressInfo.receiverPhone}}</p>
+				<p>收件人地址:{{expressInfo.receiveAddress}}</p>
+				<!-- <p>是否私人件:<template v-if="expressInfo.mainType == '个人件'">是</template><template v-else>否</template>
+				</p>
+				<p>是否问题件:{{expressInfo.isProblem}}</p>
+				<p>是否已派件:<template v-if="expressInfo.expressStatus == 1">否</template><template v-if="expressInfo.expressStatus == 2">是</template>
+				</p> -->
+				<p>备注:{{expressInfo.remark}}</p>
+				<img style="width: 4rem;height: 4rem;margin: 0 auto;display: block;" id="image" :src="qrcode">
+				<div class="pjinfo" v-for="item in routeList">
+					<p>{{item.acceptTime}} 【{{item.remark}}】 {{item.acceptAddress}}</p>
+				</div>
+			</div>
+			<van-popup v-model="txmShow">
+				<van-image width="380" height="250" :src="txmUrl" />
+			</van-popup>
+		</div>
+	</div>
+</template>
+
+<script>
+	import JsBarcode from 'jsbarcode'
+	import QRCode from 'qrcode'
+	import {Toast,Dialog} from 'vant'
+	export default {
+		data() {
+			return {
+				titlename: "查快递",
+				userId:'',
+				id:'',
+				expressInfo:{},
+				qrcode:"",
+				routeList:[],//路由信息
+				txmShow:false,
+				txmUrl:''
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			//获取参数
+			this.id = this.$route.query.id
+			this.getData();
+		},
+		methods:{
+			showTxm(){
+				// if(this.expressInfo.expressInfo == 2){
+				// 	window.location.href = this.txmUrl;
+				// }else{
+				// 	this.txmShow = true;
+				// }
+				//无需判断
+				this.txmShow = true;
+			},
+			makeQRCode(obj) {
+			    QRCode.toDataURL(obj).then(imgData => {
+			        if(imgData) {
+			           //console.log(imgData)
+					   this.qrcode=imgData
+			        }
+			    });
+			},
+			makeBarcode(obj){
+				JsBarcode("#barcode",obj, {
+					format: "CODE128", //选择要使用的条形码类型
+					width: 2, //设置条之间的宽度
+					height: 60, //高度
+					displayValue: true, //是否在条形码下方显示文字
+					text: obj, //覆盖显示的文本
+					//fontOptions: "bold italic", //使文字加粗体或变斜体
+					//font: "fantasy", //设置文本的字体
+					textAlign: "center", //设置文本的水平对齐方式
+					textPosition: "top", //设置文本的垂直位置
+					textMargin: 1, //设置条形码和文本之间的间距
+					fontSize: 16, //设置文本的大小
+					//background: "#eee", //设置条形码的背景
+					lineColor: "black", //设置条和文本的颜色。
+					margin: 2 //设置条形码周围的空白边距
+				});
+			},
+			onClickLeft(){
+			  this.$router.push({path:"/Search",query:{type:1}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/sendMail/getMailDetailById.do",{id:this.id},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.expressInfo = res.body.mailInfo
+							this.txmUrl = this.$store.state.host + "/" + res.body.mailInfo.sheetPdfPath
+							this.makeQRCode(this.expressInfo.expressNo)
+							this.makeBarcode(this.expressInfo.expressNo)
+							this.getMailRoute()
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			//查询快递路由信息
+			getMailRoute(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/mailRoute/getMailRoute.do",{expressInfo:this.expressInfo.expressInfo,
+				expressNo:this.expressInfo.expressNo},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.routeList = res.body.routeList
+							//console.log(res.body)
+						}
+						Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content {
+		padding: .2rem .33rem;
+		font-size: .3rem;
+		>p{
+			font-size: .3rem;
+			text-align: center;
+			margin-bottom: .2rem;
+		}
+		.info {
+			padding: .4rem;
+			background: white;
+			line-height: 200%;
+			color: #666666;
+
+			.pjinfo {
+				margin-top: .1rem;
+				border-top: .01rem solid #f0efef;
+				padding-top: .1rem;
+			}
+		}
+
+		.jjlist {
+			font-size: .3rem;
+			color: #999999;
+
+			.listinfo {
+				background: white;
+				padding: .33rem .33rem .2rem;
+				border-radius: .05rem;
+				margin-bottom: .2rem;
+				position: relative;
+				.list_top {
+					display: flex;
+					justify-content: space-between;
+
+					.list_top_left {
+						img {
+							display: inline-block;
+							width: .9rem;
+							height: .9rem;
+							position: relative;
+							top: -.1rem;
+						}
+
+						div {
+							width: 4rem;
+							margin-left: .2rem;
+							display: inline-block;
+							line-height: 150%;
+
+							p:nth-of-type(1) {
+								font-size: .3rem;
+								font-weight: bold;
+								color: #333;
+							}
+
+							
+
+							p:nth-of-type(3) {
+								font-size: .2rem;
+							}
+						}
+					}
+
+					>p {
+						font-size: .24rem;
+						color: #f5693d;
+						font-weight: bold;
+					}
+				}
+                .fast{
+				  //background: url(../assets/images/status.png) no-repeat center;
+				  background-color: #00c4b8;
+				  background-size: 100% 100%;
+				  color: white;
+				  position: absolute;
+				  bottom: 0px;
+				  right: 0px;
+				  width: 1.1rem;
+				  height: .5rem;
+				  text-align: center;
+				  line-height: .5rem;
+				  font-size: .2rem;
+			  }				
+				
+			}
+		}
+	}
+	
+	/deep/ .van-nav-bar__content{
+	    .van-nav-bar__title{
+	      font-size: 16px;
+	    }
+	  }
+	/deep/.van-icon-arrow-left::before{
+	  color: #333;
+	  font-size: 16px;
+	}
+	/deep/.van-nav-bar__text{
+	  color: #333 !important;
+	  font-size: 16px;
+	}
+</style>

+ 318 - 0
src/pages/multipleaddressbook.vue

@@ -0,0 +1,318 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">寄件人</p>
+				<p @click="tab(2)" :class="[index==2?'active':'']" class="">收件人</p>
+			</div>		
+		</div>
+		<!-- 寄件人 -->
+		<div v-if="index==1">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLink(item)">
+							<p>寄</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}  {{item.telPhone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>	
+							<p @click="linkEdit(item.id)">	
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button @click="link(1)" type="info" color="#00c4b8">添加寄件人</van-button>
+			</div>
+		</div>
+		
+		<!-- 收件人 -->
+		<div v-if="index==2">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress" @click="adressLinkSj(item)">
+							<p style="background: #fa9c22;">收</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}  {{item.telPhone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>						
+							<p @click="linkEdit(item.id)">
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button type="info" @click="link(2)" color="#fa9c22">添加收件人</van-button>
+			</div>
+		</div>
+	</div>	
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"地址簿",
+				index:1,
+				userId:'',
+				addressList:[]
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId")
+			//获取参数
+			this.index = this.$route.query.active
+			this.getData();
+		},
+		methods:{
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			tab(obj){
+				this.index=obj
+				this.getData()
+			},
+			link(obj){
+				this.$router.push({path:"/Newaddress",query:{type:obj}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressList.do",{userId:this.userId,type:this.index},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.addressList = res.body.addressList
+					}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			del(id){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					Toast.loading({
+					    message: '删除中...',
+					    forbidClick: true,
+					    duration:0
+					});
+					this.$http.post(this.$store.state.host+"/personal/deleteAddressInfoById.do",{id:id},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								this.getData()
+							}else{
+								Toast("删除失败!")
+							}
+						Toast.clear()
+					},res=>{
+							 //发送失败
+						Toast("网络错误!")
+					})
+					Toast.clear()
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+			},
+			//跳去编辑页
+			linkEdit(id){
+				this.$router.push({path:"/Editaddress",query:{id:id}})
+			},
+			adressLink(item){
+				let jjInfo = {}
+				jjInfo.jjname = item.name+' '+item.phone
+				jjInfo.jjadd = item.provinceAndCity+' '+item.address
+				jjInfo.sender = item.name
+				jjInfo.senderPhone = item.phone
+				jjInfo.senderMobile = item.telPhone
+				jjInfo.sendAddr = item.provinceAndCity
+				jjInfo.sendAddress = item.address
+				this.$store.commit("getJjInfo",jjInfo)
+				this.$router.push({path:"/MultipleExpress"})
+			},
+			adressLinkSj(items){
+				let sjInfo = {}
+				sjInfo.sjname = items.name+' '+items.phone
+				sjInfo.sjadd = items.provinceAndCity+' '+items.address
+				sjInfo.receiver = items.name
+				sjInfo.receiverPhone = items.phone
+				sjInfo.receiveMobile = items.telPhone
+				sjInfo.receiveAddr = items.provinceAndCity
+				sjInfo.receiveAddress = items.address
+				sjInfo.itemType = '物品'
+				sjInfo.weight = '1'
+				sjInfo.itemNum = '1'
+				sjInfo.wpinfo='物品-1kg'
+				
+				
+				//判断数组中是否有一条数据的地址相同
+				let someResult = this.$store.state.sjList.some(function(item) {
+				  return item.receiveAddress == sjInfo.receiveAddress;
+				});
+				if(someResult){
+					Toast("您已添加过该收件人!")
+					return;
+				}
+				
+				this.$store.state.sjList.push(sjInfo)
+				this.$router.push({path:"/MultipleExpress"})
+			}
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding: .33rem;
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}
+			
+		}
+		.jjinfo{
+			font-size: .36rem;
+			color: #999999;
+			padding: .0rem .33rem 0.33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					flex-wrap: wrap;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem .2rem;
+						
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 5.2rem;
+							p:nth-of-type(1){
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.cz{
+						border-top: .01rem solid #ededed;
+						width: 100%;
+						display: flex;
+						flex-direction: row-reverse;
+						font-size: .24rem;
+						color: #999999;
+						padding-top: .2rem;
+						p{
+							margin-left: .2rem;
+							img{
+								width:.22rem;
+								height: .24rem;
+							}
+							span{
+								position: relative;
+								top: -.01rem;
+							}
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		
+		
+		
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	
+</style>

+ 832 - 0
src/pages/multipleexpress.vue

@@ -0,0 +1,832 @@
+<template>
+	<div class="content">
+		<backindex :title="titlename"></backindex>
+		<!-- 寄件地址 -->
+		<div class="jjinfo">
+			<div>
+				<div class="jj">
+					<div class="jjaddress">
+						<p>寄</p>
+						<div>
+							<p v-if="jjname==''||jjname==' '">寄件地址</p>
+							<p v-else>{{jjname}} {{jjInfo.senderMobile}}</p>
+							<p v-if="jjadd==''||jjadd==' '" @click="addtype(1)">填写寄件地址</p>
+							<p v-else @click="addtype(1,1)">{{jjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb" @click="link(1)">
+						<img src="../assets/images/addlist.png" alt="">
+						<p>地址簿</p>
+					</div>				
+				</div>
+			</div>			
+		</div>
+		<!-- 收件地址 -->
+		<div class="sjinfo" v-for="(item,index) in sjList">
+			<div>
+				<div class="top"><p>{{index+1}}</p></div>
+				<div class="sj">
+					<div class="sjaddress">
+						<p style="background: #fa9c22;">收</p>
+						<div>
+							<p v-if="item.sjname==''||item.sjname==' '">收件地址</p>
+							<p v-else>{{item.sjname}} {{item.receiveMobile}}</p>
+							<p v-if="item.sjadd==''||item.sjadd==' '" @click="addtype(2)">填写收件地址</p>
+							<p v-else @click="addtype(2,index)">{{item.sjadd}}</p>
+						</div>
+					</div>
+					<div class="dzb cz">
+						<div>
+							<img src="../assets/images/whrite.png" alt="">
+							<p @click="addtype(2,index)">编辑</p>
+						</div>
+						<div>
+							<img src="../assets/images/del.png" alt="">
+							<p @click="del(index)">删除</p>
+						</div>
+					</div>
+				</div>
+				<div class="sj" style="border-top:.01rem solid #ededed">
+					<div class="sjaddress">
+						<van-field v-model="item.wpinfo" name="物品信息" label="物品信息" placeholder="请填写"  @click="wpShow(index)" readonly/>
+					</div>
+				</div>
+			</div>	
+		</div>
+		<!-- 添加收件人 -->
+		<div class="add_per">
+			<div>
+				<div class="add_per_info">
+					<p style="background: #fa9c22;">收</p>
+					<p @click="link(2)">+添加收件人</p>
+				</div>
+			</div>
+		</div>
+		<!-- 快递公司 -->
+		<div class="kdshow">
+			<van-field readonly clickable name="picker" :value="expressInfoShow" label="快递公司" placeholder="请选择快递公司" @click="showPicker = true" />
+			<van-popup v-model="showPicker" position="bottom">
+			  <van-picker
+			    show-toolbar
+			    :columns="columns"
+			    @confirm="onConfirm"
+			    @cancel="showPicker = false"
+			  />
+			</van-popup>
+		</div>
+		<!-- 我同意 -->
+		<div class="check">
+			<van-checkbox icon-size=".24rem" v-model="check" shape="">我同意《电子运单契约条款》</van-checkbox>
+		</div>
+		<!-- 寄件 -->
+		<div class="btn-jj">
+			<van-button type="info" color="#00c4b8" @click="save()">立即寄件</van-button>
+		</div>
+		<!-- 填写地址 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable @closed="close" :close-on-click-overlay="false">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">{{title}}</p>
+				<van-form @submit="onSubmit">
+				  <van-field v-model="name" name="姓名" label="姓名" placeholder="请输入姓名" :rules="[{ required: false}]"/>
+				  <van-field v-model="phone" maxlength="11" type="number" name="手机" label="手机" placeholder="请输入手机" :rules="[{ required: false}]"/>
+				  <van-field v-model="telPhone" maxlength="20" type="text" name="座机" label="座机" placeholder="请输入座机" :rules="[{ required: false}]"/>
+				  <van-field readonly clickable name="area" :value="city" label="省市区" placeholder="请选择省市区" @click="areashow = true" :rules="[{ required: false}]"/>
+				  <van-field v-model="address" name="详细地址" maxlength="50" label="详细地址" placeholder="请输入详细地址" :rules="[{ required: false}]"/>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+				  </div>
+				</van-form>
+			</div>
+		  
+		</van-popup>
+		<!-- 城市选择 -->
+		<van-popup v-model="areashow" position="bottom">
+		  <van-area
+		    :area-list="areaList"
+		    @confirm="onConfirm3"
+		    @cancel="areashow = false"
+		  />
+		</van-popup>
+		<!-- 选择物品 -->
+		<van-popup v-model="wp" round closeable>
+		  <div class="wpinfo">
+			  <div>
+				  <van-field name="radio" label="包裹类型">
+				    <template #input>
+				      <van-radio-group v-model="radio" direction="horizontal">
+				        <van-radio name="物品" shape="square">物品</van-radio>
+				        <van-radio name="文件" shape="square">文件</van-radio>
+				      </van-radio-group>
+				    </template>
+				  </van-field>
+				  <van-field v-if="radio == '物品'" name="stepper" label="预估重量(/KG)">
+				    <template #input>
+				      <van-stepper v-model="kg" />
+				    </template>
+				  </van-field>
+				  <van-field v-if="radio == '文件'" name="stepper" label="文件数量(/件)">
+				    <template #input>
+				      <van-stepper v-model="num" />
+				    </template>
+				  </van-field>
+				  <div style="margin-top: 16px;">
+				    <van-button color="#00c4b8" block type="info" @click="wpconform">确定</van-button>
+				  </div>
+			  </div>
+			  
+		  </div>
+		</van-popup>
+	</div>	
+</template>
+
+<script>
+	import areaList from "@/script/areas.js"
+	import { Stepper,Toast,Dialog } from 'vant';
+	export default{
+		data(){
+			return {
+				titlename:"批量寄",
+				addshow:false,
+				name:"",
+				phone:"",
+				telPhone:"",
+				city:"",
+				address:"",
+				areashow:false,
+				index:"",
+				title:"",
+				jjname:"",
+				jjadd:"",
+				sjname:"",
+				sjadd:"",
+				check:false,
+				wpinfo:"",//物品信息
+				wp:false,
+				kg:1,
+				num:1,
+				radio:"物品",
+				showPicker:false,//快递
+				value:"",
+				expressInfoShow:"",//快递公司展示
+				expressPhone:"",//快递公司电话传值
+				expressInfo:"",//快递公司传值
+				columns:[],
+				sjList:[],
+				wpIndex:'',//物品下标
+				jjInfo:{},//寄件信息
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId");
+			
+			//寄件地址
+			if(JSON.stringify(this.$store.state.jjInfo)!='{}'){
+				this.jjname = this.$store.state.jjInfo.jjname
+				this.jjadd = this.$store.state.jjInfo.jjadd
+				this.jjInfo = this.$store.state.jjInfo
+			}else{	//获取默认地址
+				this.getDefaultAddress()
+			}
+			
+			//收件地址
+			if(JSON.stringify(this.$store.state.sjList)!='[]'){
+				this.sjList = this.$store.state.sjList
+			}
+			//快递公司列表
+			this.getLogisticsList()
+		},
+		methods:{
+			// 选择快递公司
+			onConfirm(e){
+				this.expressInfoShow=e.text
+				this.expressInfo=e.id
+				this.expressPhone=e.phone
+				this.showPicker=false
+			},
+			// 选择物品确定
+			onConfirm1(e){//确定
+				this.wptype=e
+				this.wpshow=false
+				console.log(e)
+			},
+			// 选择付款方式确定
+			onConfirm2(e){//确定
+				this.pricetype=e
+				this.priceshow=false
+				console.log(e)
+			},
+			// 填写地址确定
+			onConfirm3(e){//确定
+				this.city=e[0].name+' '+e[1].name+' '+e[2].name
+				this.areashow=false
+				console.log(e)
+			},
+			// 寄件地址1与收件地址2
+			addtype(obj,index){
+				this.index=obj
+				if(obj==1){
+					this.title="寄件地址"
+				}
+				if(obj==2){
+					this.title="收件地址"
+					this.wpIndex = index
+					this.name = this.sjList[index].receiver
+					this.phone = this.sjList[index].receiverPhone
+					this.telPhone = this.sjList[index].receiveMobile
+					this.city = this.sjList[index].receiveAddr 
+					this.address = this.sjList[index].receiveAddress
+				}
+				this.addshow=true
+			},
+			// 填写地址确定
+			onSubmit(){
+				if(this.name == '' || this.name == undefined ){
+					Toast('请填写姓名')
+					return
+				}
+				// if(this.phone == '' || this.phone == undefined ){
+				// 	Toast('请填写手机')
+				// 	return
+				// }
+				// let regPhone = new RegExp(this.$store.state.regPhone)
+				// if(!regPhone.test(this.phone)){
+				// 	Toast('手机号格式不正确')
+				// 	return
+				// }
+				
+				if ((this.phone == '' || this.phone == undefined) && (this.telPhone == '' || this.telPhone == undefined)) {
+					Toast('请填写手机号或者座机号')
+					return
+				}
+				
+				if(this.phone != '' && this.phone != undefined){
+					let regPhone = new RegExp(this.$store.state.regPhone)
+					if (!regPhone.test(this.phone)) {
+						Toast('手机号格式不正确')
+						return
+					}
+				}
+				
+				if(this.city == '' || this.city == undefined ){
+					Toast('请选择省市区')
+					return
+				}
+				if(this.address == '' || this.address == undefined ){
+					Toast('请填写详细地址')
+					return
+				}
+				if(this.index==1){
+					this.jjname=this.name+' '+this.phone
+					this.jjadd=this.city+' '+this.address
+					let jjInfo = {}
+					jjInfo.jjname = this.jjname
+					jjInfo.jjadd = this.jjadd
+					jjInfo.sender = this.name
+					jjInfo.senderPhone = this.phone
+					jjInfo.senderMobile = this.telPhone
+					jjInfo.sendAddr = this.city
+					jjInfo.sendAddress = this.address
+					this.$store.commit("getJjInfo",jjInfo)
+				}
+				if(this.index==2){
+					this.sjname=this.name+' '+this.phone
+			        this.sjadd=this.city+' '+this.address
+					this.$store.state.sjList[this.wpIndex].sjname = this.sjname
+					this.$store.state.sjList[this.wpIndex].sjadd = this.sjadd
+					this.$store.state.sjList[this.wpIndex].receiver = this.name
+					this.$store.state.sjList[this.wpIndex].receiverPhone = this.phone
+					this.$store.state.sjList[this.wpIndex].receiveMobile = this.telPhone
+					this.$store.state.sjList[this.wpIndex].receiveAddr = this.city
+					this.$store.state.sjList[this.wpIndex].receiveAddress = this.address
+					this.sjList = this.$store.state.sjList
+				}
+				
+				this.addshow=false
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			close(){
+				this.name=""
+				this.phone=""
+				this.telPhone=""
+				this.city=""
+				this.address=""
+			},
+			// 地址簿跳转
+			link(obj){
+				if(this.sjList.length > 19){
+					Toast('添加收件人最多添加20人')
+					return
+				}
+				this.$router.push({path:'/MultipleAddressbook',query:{active:obj}})
+			},
+			// 物品选择
+			wpconform(){
+				this.sjList[this.wpIndex].itemType = this.radio
+				this.sjList[this.wpIndex].weight =this.kg
+				this.sjList[this.wpIndex].itemNum =this.num
+				if(this.radio == '物品'){
+					this.sjList[this.wpIndex].wpinfo=this.radio+'-'+this.kg+'kg'
+				}
+				if(this.radio == '文件'){
+					this.sjList[this.wpIndex].wpinfo=this.radio+'-'+this.num+'件'
+				}		
+				this.wp=false
+			},
+			//添加收件人
+			// addSj(){
+			// 	this.sjList.push({})
+			// },
+			//删除收件人
+			del(index){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					this.sjList.splice(index,1)
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+				
+			},
+			//物品展示
+			wpShow(index){
+				this.wp = true
+				this.wpIndex = index
+				this.radio = this.sjList[index].itemType
+				this.kg = this.sjList[index].weight
+				this.num = this.sjList[index].itemNum
+			},
+			save(){
+				
+				if(this.jjname == '' || this.jjname == undefined || 
+				this.jjadd == '' || this.jjadd == undefined){
+					Toast('请填写寄件人信息')
+					return
+				}
+				
+				if(this.sjList== undefined || this.sjList.length <= 0){
+					Toast('请填写收件人信息')
+					return
+				}
+				
+				if(this.expressInfo == '' || this.expressInfo == undefined){
+					Toast('请选择快递公司')
+					return
+				}
+				
+				if(this.check == false){
+					Toast('请点击同意《电子运单契约条款》')
+					return
+				}
+				
+				//循环sjList信息
+				let receiverMap = []
+				let	receiverPhoneMap = []
+				let	receiveAddrMap = []
+				let	receiveAddressMap = []
+				let	itemTypeMap = []
+				let	weightMap = []
+				let	itemNumMap = []
+				
+				//暂时无值
+				let payWayMap = []
+				let mainTypeMap = []
+				let expressTypeMap = []
+				let declaredValueMap = []
+				let itemRemarkMap = []
+
+				for(var i=0;i<this.sjList.length;i++){
+					receiverMap.push(this.sjList[i].receiver)
+					receiverPhoneMap.push(this.sjList[i].receiverPhone)
+					receiveAddrMap.push(this.sjList[i].receiveAddr)
+					receiveAddressMap.push(this.sjList[i].receiveAddress)
+					itemTypeMap.push(this.sjList[i].itemType)
+					weightMap.push(this.sjList[i].weight)
+					itemNumMap.push(this.sjList[i].itemNum)
+					
+					//暂时无值
+					payWayMap.push('月结')
+					mainTypeMap.push('公司件')
+					expressTypeMap.push('外部件')
+					declaredValueMap.push('0')
+					itemRemarkMap.push(' ')
+				}
+				
+				Toast.loading({
+				    message: '保存中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				
+				this.$http.post(this.$store.state.host+"/sendMail/saveBatchMail.do",{userId:this.userId,
+					sender:this.jjInfo.sender,
+					senderPhone:this.jjInfo.senderPhone,
+					sendAddr:this.jjInfo.sendAddr,
+					sendAddress:this.jjInfo.sendAddress,
+					expressInfo:this.expressInfo,
+					expressPhone:this.expressPhone,
+					receiverMap:receiverMap.toString(),
+					receiverPhoneMap:receiverPhoneMap.toString(),
+					receiveAddrMap:receiveAddrMap.toString(),
+					receiveAddressMap:receiveAddressMap.toString(),
+					itemTypeMap:itemTypeMap.toString(),
+					weightMap:weightMap.toString(),
+					itemNumMap:itemNumMap.toString(),
+					
+					payWayMap:payWayMap.toString(),
+					mainTypeMap:mainTypeMap.toString(),
+					expressTypeMap:expressTypeMap.toString(),
+					declaredValueMap:declaredValueMap.toString(),
+					itemRemarkMap:itemRemarkMap.toString()
+					},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								Toast("下单成功,快递员将尽快上门取件!")
+								let that = this;
+								setTimeout(function(){
+									that.$router.push({path:'/'})
+								},1000)
+							}else if(res.body.msg != '' && res.body.msg != 'success'){
+								Toast(res.body.msg);
+							}else{
+								Toast("寄件失败");
+							}		
+					},res=>{
+						//发送失败
+						Toast("网络错误");
+					})
+					Toast.clear()
+			}
+		},
+		computed:{
+			areaList(){
+				return areaList
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.jjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: .33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .2rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .15rem 0rem;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem;
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .24rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						min-width: 1.4rem;
+						img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						p{
+							font-size: .2rem;
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		.sjinfo{
+			font-size: .24rem;
+			color: #999999;
+			padding: 0rem .33rem .33rem .33rem;
+			word-break: break-word;
			>div{
                background: white;
                border-radius: .05rem;
                padding: .3rem .2rem .1rem;
+				position: relative;
+				.top{
+					background: url(../assets/images/top.png) no-repeat left top;
+					background-size: 100% 100%;
+					position: absolute;
+					left: 0px;
+					top: 0px;
+					width: .6rem;
+					height: .5rem;
+					color: white;
+					text-align: center;
+					p{
+						position: relative;
+						right: .1rem;
+						top: .01rem;
+					}
+				}
+				.sj{
+					display: flex;
+					justify-content: space-between;
+					padding: .15rem 0rem;
+					.sjaddress{
+						width: 100%;
+						display: flex;
+						padding: .1rem 0rem;
+						/deep/.van-field{
+							padding: 0rem;
+
+							.van-field__value{
+								input{
+									text-align: right;
+									padding: 0rem;
+								}
+								
+							}
+						}
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .2rem;
+						}
+						div{
+							//font-weight: bold;
+							//width: 4.2rem;
+							p:nth-of-type(1){
+								font-size: .24rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .24rem;
+							}
+						}
+					}
+					.dzb{
+						text-align: center;
+						border-left: .01rem solid #ededed;
+						//padding-left: .3rem;
+						min-width: 1.4rem;
+						>img{
+							width:.39rem;
+							height: .42rem;
+							padding-top: .2rem;
+						}
+						>p{
+							font-size: .2rem;
+						}
+						
+					}
+					.cz{
+						display: flex;
+						justify-content: center;
+						padding-left: 0rem;
+						padding-top: .2rem;
+						div{
+							text-align: center;
+							padding: 0rem .05rem 0rem;
+							img{
+								width: .26rem;
+								height: .26rem;
+							}
+							p {
+								font-size:.1rem;
+								color: #999999;
+								
+							}
+						}
+					}
+				}
+						
+			}				
+		}
+		.add_per{
+			div{
+				font-size: .3rem;
+				color: #999999;
+				font-weight: bold;
+				padding: 0rem .33rem;
+				margin-bottom: .3rem;
+				border-radius: .05rem;
+				.add_per_info{
+					background: white;
+					display: flex;
+					color: #333;
+					padding: .33rem .2rem;
+					p:nth-of-type(1){
+						font-size: 0.24rem;
+						font-weight: bold;
+						display: inline-block;
+						width: 0.5rem;
+						height: 0.5rem;
+						text-align: center;
+						line-height: 0.5rem;
+						color: white;
+						border-radius: 50%;
+						margin-right: 0.2rem;
+					}
+				}
+			}
+		}
+		.kdshow{
+			font-size: .3rem;
+			padding: .3rem 0px;
+			width: 6.84rem;
+			background: white;
+			border-radius: .05rem;
+			margin: 0rem auto .2rem;
+			/deep/.van-cell{
+				padding: 0px .3rem;
+				overflow: unset;
+				input{
+					text-align: right;
+					height: .5rem;
+					padding-right: .25rem;
+				}
+			}
+			/deep/.van-cell::after{
+				content: "";
+				display: inline-block;
+				border-right: .01rem solid #b0b0b0;
+				border-bottom: .01rem solid #b0b0b0;
+				transform: rotate(-45deg);
+				left: unset;
+				position: absolute;
+				right: .3rem;
+				bottom: .15rem;
+				width: .2rem;
+				height: .2rem;
+			}
+		}
+		.choose{
+			font-size: .3rem;
+			color: #999999;
+			font-weight: bold;
+			padding: 0rem .33rem;
+			margin-bottom: .3rem;
+			>div{
+				background: white;
+				
+				padding: .3rem .3rem;
+				border-radius: .05rem;
+				.type_wp{
+					display: flex;
+					justify-content: center;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+							//position: relative;
+						}
+						
+					} 
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+				.type_price{
+					display: flex;
+					justify-content: center;
+					border-top: .01rem solid #ededed;
+					margin-top: .3rem;
+					padding-top: .3rem;
+					div{
+						flex: 1;
+						text-align: center;
+						p:nth-of-type(2){
+							color: #333;
+							margin-top: .2rem;
+							font-size: .36rem;
+						}
+					}
+					div:nth-of-type(1){
+						border-right: .01rem solid #ededed;
+						p:nth-of-type(2):after{
+							content: "";
+							display: inline-block;
+							width: .15rem;
+							height: .15rem;
+							border-bottom: .01rem solid #999;
+							border-right: .01rem solid #999;
+							transform: rotate(45deg);
+							margin-left: .15rem;
+							position: relative;
+							top: -.08rem;
+						}
+					}
+				}
+			}
+			
+		}
+	    .bz{
+			padding: .33rem;
+		    font-size: .3rem;
+			/deep/.van-field__value{
+				input{
+					text-align: right;
+				}
+				
+			}
+		}
+		.check{
+			font-size: .24rem;
+			
+			text-align: center;
+			
+			/deep/.van-checkbox{
+				justify-content: center;
+				.van-checkbox__label{
+					color: #999;
+				}
+			}
+		}
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	.whrite_add{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+			
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+	}
+	.wpinfo{
+		width: 6.6rem;
+		padding: .2rem;
+		/deep/.van-field{
+			.van-field__label{
+				width:2.5rem;
+				
+			}
+            .van-field__value{
+				input{
+					width:64px
+				}
+			}
+		}
+	}
+</style>

+ 171 - 0
src/pages/my.vue

@@ -0,0 +1,171 @@
+<template>
+	<div class="body">
+    <!-- 选择类型 -->
+    <!-- <back :title="titlename"></back> -->
+    <div class="head">
+		<template v-if="headimgurl!=null&&headimgurl!=''">
+			<img :src="headimgurl" alt="">
+		</template>
+		<template v-else>
+			<img src="../assets/images/foot_icon1.png" alt="">
+		</template>
+		
+		<div>
+			<p>姓名:{{user.name}}</p>
+			<p>{{user.phone}}</p>
+		</div>
+		<img style="width: 100%;border-radius: 0px;margin-top: .4rem;" src="../assets/images/my_banner.png" alt="">
+	</div>
+    <div class="list">
+      <router-link to="/Personinfomation">
+        <img src="../assets/images/my_icon1.png" alt="">
+        <span>个人信息</span>
+      </router-link>
+      <router-link to="/Search">
+        <img src="../assets/images/my_icon2.png" alt="">
+        <span>我的快件</span>
+      </router-link>
+      <router-link to="/Audit">
+        <img src="../assets/images/my_icon2.png" alt="">
+        <span>审核</span>
+      </router-link>
+      <!-- <router-link to="/Appointmentlist">
+        <img src="../assets/images/my_icon3.png" alt="">
+        <span>客服</span>
+      </router-link> -->
+      <router-link :to="{ path: 'Myaddressbook', query: { active: 1 }}">
+        <img src="../assets/images/my_icon4.png" alt="">
+        <span>地址簿维护</span>
+      </router-link>
+      <router-link to="/SuggestList">
+		<img src="../assets/images/my_icon5.png" alt="" style="">
+		<span v-if="notReadNo > 0" style="font-size: .2rem;text-align:center;color: white;position: absolute;left: 0.3rem;top: 0.15rem;border-radius: 50%;background: red;width: 0.28rem;line-height: 0.28rem;">{{notReadNo}}</span>
+        <span>意见建议</span>
+      </router-link>
+      <router-link to="/Setting">
+        <img src="../assets/images/my_icon6.png" alt="">
+        <span>设置</span>
+      </router-link>
+    </div>
+    <!-- 底部 -->
+    <tabbar></tabbar>
+	</div>
+
+</template>
+
+<script>
+export default {
+    data() {
+      return {
+        userId:"",
+        user:[],
+		headimgurl:'',
+		notReadNo:'',//未查看数量(意见建议)
+      };
+    },
+    created:function(){
+			this.isLogin();
+		this.userId = localStorage.getItem("userId");
+		this.getUser();
+		this.headimgurl = localStorage.getItem('headimgurl');
+		this.getSuggestList();
+    },
+    methods:{
+		//跳转
+		getSuggestList(){
+			this.$http.post(this.$store.state.host+"/solic/getSuggestList.do",{
+				userId:this.userId
+			},{emulateJSON:true})
+				.then(res=>{
+					//发送成功
+					if(res.body.msg=='success'){
+						this.notReadNo = res.body.notReadNo;
+					}
+			},res=>{
+					 //发送失败
+			})
+		}
+
+    }
+  };
+</script>
+
+<style lang="less" scoped>
+  body{
+    background: #fbfbfb;
+  }
+  .body{
+    padding-bottom: 1.5rem;
+	  .head{
+		  padding:.43rem .38rem;
+		  font-size: .24rem;
+		  color: #999;
+		  display: flex;
+		  background: white;
+		  flex-wrap: wrap;
+		  position: relative;
+		  img{
+			  width: 1.48rem;
+			  height: 1.48rem;
+			  border-radius: 50%;
+			  margin-right: .4rem;
+		  }
+		  div{
+			  p:nth-of-type(1){
+				  font-size: .36rem;
+				  font-weight: bold;
+				  color: #333;
+				  margin-bottom: .2rem;
+				  padding-top: .3rem;
+			  }
+		  }
+		  div:after{
+			  content: "";
+			  display: block;
+			  width: .2rem;
+			  height: .2rem;
+			  border-left: .01rem solid #333;
+			  border-top: .01rem solid #333;
+			  transform: rotate(135deg);
+			  position: absolute;
+			  right: .38rem;
+			  top: 1rem;
+		  }
+	  }
+    .list{
+      background: white;
+      margin-top: .36rem;
+      border-radius: .05rem;
+      a{
+        font-size: .3rem;
+        font-weight: bold;
+        display: block;
+        color: #333;
+        padding:.3rem .4rem;
+        border-bottom:1px solid #f4f3f3;
+		position: relative;
+        img{
+          width: .4rem;
+          height: .4rem;
+        }
+        span{
+          position: relative;
+          top: -.075rem;
+          margin-left: .3rem;
+        }
+      }
+	  a:after{
+		  content: "";
+		  display: block;
+		  width: .2rem;
+		  height: .2rem;
+		  border-left: .01rem solid #b8b8b8;
+		  border-top: .01rem solid #b8b8b8;
+		  transform: rotate(135deg);
+		  position: absolute;
+		  right: .4rem;
+		  top: .4rem;
+	  }
+    }
+  }
+</style>

+ 301 - 0
src/pages/myaddressbook.vue

@@ -0,0 +1,301 @@
+<template>
+	<div class="content">
+		<back :title="titlename"></back>
+		<!-- table切换 -->
+		<div class="tab">
+			<div>
+				<p @click="tab(1)" :class="[index==1?'active':'']">寄件人</p>
+				<p @click="tab(2)" :class="[index==2?'active':'']" class="">收件人</p>
+			</div>		
+		</div>
+		<!-- 寄件人 -->
+		<div v-if="index==1">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress">
+							<p>寄</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>	
+							<p @click="linkEdit(item.id)">	
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button @click="link(1)" type="info" color="#00c4b8">添加寄件人</van-button>
+			</div>
+		</div>
+		
+		<!-- 收件人 -->
+		<div v-if="index==2">
+			<div class="jjinfo" v-for="item in addressList">
+				<div>
+					<div class="jj">
+						<div class="jjaddress">
+							<p style="background: #fa9c22;">收</p>
+							<div :id="'copytkl'+item.id">
+								<p>{{item.name}}  {{item.phone}}</p>
+								<p>{{item.provinceAndCity}} {{item.address}}</p>
+							</div>
+						</div>
+						<div class="cz">
+							<p @click="del(item.id)">
+								<img src="../assets/images/del.png" alt="">
+								<span>删除</span>
+							</p>						
+							<p @click="linkEdit(item.id)">
+								<img src="../assets/images/whrite.png" alt="">
+								<span>编辑</span>
+							</p>
+							<p :id="'fz'+item.id" @click="copyLink(item.id)" data-clipboard-action="copy" :data-clipboard-target="'#copytkl'+item.id">
+								<img src="../assets/images/copy.png" alt="">
+								<span>复制</span>
+							</p>
+						</div>
+					</div>
+				</div>			
+			</div>
+			<!-- 寄件 -->
+			<div class="btn-jj">
+				<van-button type="info" @click="link(2)" color="#fa9c22">添加收件人</van-button>
+			</div>
+		</div>
+	</div>	
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"地址簿",
+				index:1,
+				userId:'',
+				addressList:[]
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.userId = localStorage.getItem("userId")
+			//获取参数
+			this.index = this.$route.query.active
+			this.getData();
+		},
+		methods:{
+			//复制
+			copyLink(id) {
+			  let _this = this;
+			  let clipboard = new this.clipboard("#fz"+id);
+			  clipboard.on('success', function () {
+			    //window.console.log('00')
+			  });
+			  clipboard.on('error', function () {
+			    _this.$toast("复制失败")
+			  });
+			},
+			tab(obj){
+				this.index=obj
+				this.getData()
+			},
+			link(obj){
+				this.$router.push({path:"/Newaddress",query:{type:obj}})
+			},
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/personal/getAddressList.do",{userId:this.userId,type:this.index},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.addressList = res.body.addressList
+					}
+					Toast.clear()
+				},res=>{
+						 //发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			del(id){
+				Dialog.confirm({ title: '', message: '确定删除吗', })
+				 .then(() => {
+					Toast.loading({
+					    message: '删除中...',
+					    forbidClick: true,
+					    duration:0
+					});
+					this.$http.post(this.$store.state.host+"/personal/deleteAddressInfoById.do",{id:id},{emulateJSON:true})
+						.then(res=>{
+							//发送成功
+							if(res.body.msg=='success'){
+								this.getData()
+							}else{
+								Toast("删除失败!")
+							}
+						Toast.clear()
+					},res=>{
+							 //发送失败
+						Toast("网络错误!")
+					})
+					Toast.clear()
+				})
+				.catch(() => {
+						//  on cancel 
+				})
+			},
+			//跳去编辑页
+			linkEdit(id){
+				this.$router.push({path:"/Editaddress",query:{id:id}})
+			},
+			adressLink(item){
+				let jjInfo = {}
+				jjInfo.jjname = item.name+' '+item.phone
+				jjInfo.jjadd = item.provinceAndCity+' '+item.address
+				jjInfo.sender = item.name
+				jjInfo.senderPhone = item.phone
+				jjInfo.sendAddr = item.provinceAndCity
+				jjInfo.sendAddress = item.address
+				this.$store.commit("getJjInfo",jjInfo)
+				this.$router.push({path:"/Express"})
+			},
+			adressLinkSj(item){
+				let sjInfo = {}
+				sjInfo.sjname = item.name+' '+item.phone
+				sjInfo.sjadd = item.provinceAndCity+' '+item.address
+				sjInfo.receiver = item.name
+				sjInfo.receiverPhone = item.phone
+				sjInfo.receiveAddr = item.provinceAndCity
+				sjInfo.receiveAddress = item.address
+				this.$store.commit("getSjInfo",sjInfo)
+				this.$router.push({path:"/Express"})
+			}
+		},
+		computed:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;
+			padding: .33rem;			
+			div{
+				display: flex;
+				border: .01rem solid #00c4b8;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .1rem 0rem;				
+				}
+				p.active{
+					background: #00c4b8;
+					color: white;
+				}
+			}
+			
+		}
+		.jjinfo{
+			font-size: .36rem;
+			color: #999999;
+			padding: .0rem .33rem 0.33rem;
+			word-break: break-word;
+			>div{
+				background: white;
+				border-radius: .05rem;
+				padding: .1rem .3rem;
+				.jj{
+					display: flex;
+					justify-content: space-between;
+					padding: .2rem 0rem;
+					flex-wrap: wrap;
+					.jjaddress{
+						display: flex;
+						padding: .1rem 0rem .2rem;
+						
+						>p{
+							font-size: .24rem;
+							font-weight: bold;
+							display: inline-block;
+							width:.5rem;
+							height: .5rem;
+							background: #00c4b8;
+							text-align: center;
+							line-height: .5rem;
+							color: white;
+							border-radius: 50%;
+							margin-right: .3rem;
+						}
+						div{
+							//font-weight: bold;
+							max-width: 5.2rem;
+							p:nth-of-type(1){
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+							p:nth-of-type(2){
+								font-size: .3rem;
+							}
+						}
+					}
+					.cz{
+						border-top: .01rem solid #ededed;
+						width: 100%;
+						display: flex;
+						flex-direction: row-reverse;
+						font-size: .24rem;
+						color: #999999;
+						padding-top: .2rem;
+						p{
+							margin-left: .2rem;
+							img{
+								width:.22rem;
+								height: .24rem;
+							}
+							span{
+								position: relative;
+								top: -.01rem;
+							}
+						}
+						
+					}
+				}
+		    }
+		
+		}
+		
+		
+		
+		.btn-jj{
+			padding: .33rem;
+			button{
+				width: 100%;
+			}
+		}
+	}
+	
+</style>

+ 0 - 0
src/pages/myexpress.vue


Some files were not shown because too many files changed in this diff