Browse Source

first commit

傅豪杰 1 year ago
commit
ffba20c700
100 changed files with 44194 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. 37842 0
      package-lock.json
  22. 99 0
      package.json
  23. 43 0
      project.config.json
  24. 7 0
      project.private.config.json
  25. 41 0
      src/App.vue
  26. BIN
      src/assets/images/2.jpg
  27. BIN
      src/assets/images/ad_icon1.png
  28. BIN
      src/assets/images/ad_icon2.png
  29. BIN
      src/assets/images/ad_icon3.png
  30. BIN
      src/assets/images/ad_icon4.png
  31. BIN
      src/assets/images/addlist.png
  32. BIN
      src/assets/images/banner.png
  33. BIN
      src/assets/images/bg.png
  34. BIN
      src/assets/images/copy.png
  35. BIN
      src/assets/images/del.png
  36. BIN
      src/assets/images/foot_icon1.png
  37. BIN
      src/assets/images/foot_icon2.png
  38. BIN
      src/assets/images/foot_icon3.png
  39. BIN
      src/assets/images/icon1.png
  40. BIN
      src/assets/images/icon11.png
  41. BIN
      src/assets/images/icon2.png
  42. BIN
      src/assets/images/icon22.png
  43. BIN
      src/assets/images/icon3.png
  44. BIN
      src/assets/images/icon33.png
  45. BIN
      src/assets/images/icon4.png
  46. BIN
      src/assets/images/icon5.png
  47. BIN
      src/assets/images/icon6.png
  48. BIN
      src/assets/images/icon7.png
  49. BIN
      src/assets/images/icon8.png
  50. BIN
      src/assets/images/icon9.png
  51. BIN
      src/assets/images/login.png
  52. BIN
      src/assets/images/my_banner.png
  53. BIN
      src/assets/images/my_icon1.png
  54. BIN
      src/assets/images/my_icon2.png
  55. BIN
      src/assets/images/my_icon3.png
  56. BIN
      src/assets/images/my_icon4.png
  57. BIN
      src/assets/images/my_icon5.png
  58. BIN
      src/assets/images/my_icon6.png
  59. BIN
      src/assets/images/myicon3.png
  60. BIN
      src/assets/images/phone.jpg
  61. BIN
      src/assets/images/status.png
  62. BIN
      src/assets/images/titlebg.png
  63. BIN
      src/assets/images/top.png
  64. BIN
      src/assets/images/whrite.png
  65. BIN
      src/assets/logo.png
  66. BIN
      src/assets/user/icon1.png
  67. BIN
      src/assets/user/icon2.png
  68. BIN
      src/assets/user/icon3.png
  69. BIN
      src/assets/user/icon4.png
  70. BIN
      src/assets/user/icon5.png
  71. BIN
      src/assets/user/icon6.png
  72. BIN
      src/assets/user/kd1.png
  73. BIN
      src/assets/user/kd2.png
  74. BIN
      src/assets/user/kd3.png
  75. BIN
      src/assets/user/kd4.png
  76. BIN
      src/assets/user/kd5.png
  77. BIN
      src/assets/user/kd6.png
  78. BIN
      src/assets/user/sm.png
  79. BIN
      src/assets/user/success.png
  80. 36 0
      src/components/back.vue
  81. 36 0
      src/components/backindex.vue
  82. 23 0
      src/components/banner.vue
  83. 76 0
      src/components/tabbar.vue
  84. 86 0
      src/main.js
  85. 239 0
      src/pages/addper.vue
  86. 313 0
      src/pages/box.vue
  87. 420 0
      src/pages/email.vue
  88. 130 0
      src/pages/forgetpassword.vue
  89. 526 0
      src/pages/jjsearch.vue
  90. 281 0
      src/pages/key.vue
  91. 444 0
      src/pages/kjsearch.vue
  92. 335 0
      src/pages/kjsearchinfo.vue
  93. 119 0
      src/pages/login.vue
  94. 152 0
      src/pages/my.vue
  95. 70 0
      src/pages/personinfomation.vue
  96. 605 0
      src/pages/pjpc.vue
  97. 405 0
      src/pages/sign.vue
  98. 399 0
      src/pages/sign2.vue
  99. 666 0
      src/pages/sjdj.vue
  100. 0 0
      src/pages/sysearch.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
+ 37842 - 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": {
+    "echarts": "^5.1.2",
+    "jquery": "^3.6.0",
+    "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",
+    "weixin-jsapi": "^1.1.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",
+    "swiper": "^6.7.1",
+    "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": "2.30.0",
+  "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": "tzcourier",
+  "setting": {
+    "compileHotReLoad": true
+  },
+  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html"
+}

+ 41 - 0
src/App.vue

@@ -0,0 +1,41 @@
+<template>
+	<div id="app">
+		<router-view v-if="isRouterAlive"></router-view>
+	</div>
+</template>
+
+<script>
+	export default {
+		name: 'App',
+		provide() { //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。                                             
+			return {
+				reload: this.reload
+			}
+		},
+		data() {
+			return {
+				isRouterAlive: true //控制视图是否显示的变量
+			}
+		},
+		
+		created () {
+		    window.localStorage.setItem('scanUrl',location.href.split('#')[0])
+		},
+		methods: {
+			reload() {
+				this.isRouterAlive = false; //先关闭,
+				this.$nextTick(function() {
+					this.isRouterAlive = true; //再打开
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	#app {
+		width: 100%;
+		max-width: 7.5rem;
+		margin: 0 auto;
+	}
+</style>

BIN
src/assets/images/2.jpg


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/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/phone.jpg


BIN
src/assets/images/status.png


BIN
src/assets/images/titlebg.png


BIN
src/assets/images/top.png


BIN
src/assets/images/whrite.png


BIN
src/assets/logo.png


BIN
src/assets/user/icon1.png


BIN
src/assets/user/icon2.png


BIN
src/assets/user/icon3.png


BIN
src/assets/user/icon4.png


BIN
src/assets/user/icon5.png


BIN
src/assets/user/icon6.png


BIN
src/assets/user/kd1.png


BIN
src/assets/user/kd2.png


BIN
src/assets/user/kd3.png


BIN
src/assets/user/kd4.png


BIN
src/assets/user/kd5.png


BIN
src/assets/user/kd6.png


BIN
src/assets/user/sm.png


BIN
src/assets/user/success.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>

+ 76 - 0
src/components/tabbar.vue

@@ -0,0 +1,76 @@
+<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="/Search">
+        <span>查件</span>
+        <template #icon="props">
+          <img :src="props.active ? icon.inactive2 : icon.active2" />
+        </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"),
+        },
+      };
+    },
+    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>

+ 86 - 0
src/main.js

@@ -0,0 +1,86 @@
+// 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 'vant/lib/index.css'
+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)
+import * as echarts from 'echarts'
+Vue.prototype.$echarts = echarts
+import Swiper from "swiper"
+import 'swiper/swiper.min.css' //样式文件
+//import wx from "weixin-jsapi"; 
+// 在man.js中注册 weixin-jsapi
+//Vue.prototype.wx = wx
+import wx from 'weixin-js-sdk'
+Vue.prototype.$wx= wx
+
+//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/>'
+})
+/* router.beforeEach(function(to, from, next) {
+  if (to.meta.needLogin) {
+    //页面是否登录
+    if (sessionStorage.getItem("userId")) {
+      //存储中是否有token(uid)数据
+      next(); //表示已经登录
+    } else {
+      //next可以传递一个路由对象作为参数 表示需要跳转到的页面
+      next({
+        path: "Login"
+      });
+    }
+  } else {
+    //表示不需要登录
+    next(); //继续往后走
+  }
+}); */
+
+

+ 239 - 0
src/pages/addper.vue

@@ -0,0 +1,239 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<!-- 表单 -->
+		<van-form @submit="onSubmit">
+		  <van-field v-model="name" class="m" name="中文名" label="中文名" placeholder="请填写中文名"/>
+		  <van-field v-model="englishName" type="" name="英文名" label="英文名" placeholder="请填写英文名"/>
+		  <van-field v-model="email" class="m" type="" name="邮箱地址" label="邮箱地址" placeholder="请填写邮箱地址"/>
+		  <van-field v-model="phone" class="m" type="number" name="手机号" label="手机号" placeholder="请填写手机号"/>
+      <van-field v-model="phoneOne"  type="number" name="备用手机号1" label="备用手机号1" placeholder="请填写备用手机号1"/>
+      <van-field v-model="phoneTwo"  type="number" name="备用手机号2" label="备用手机号2" placeholder="请填写备用手机号2"/>
+      <van-field v-model="phoneThree"  type="number" name="备用手机号2" label="备用手机号3" placeholder="请填写备用手机号3"/>
+      <van-field v-model="telephone"  type="number" name="座机号" label="座机号" placeholder="请填写座机号"/>
+      <van-field v-model="telephone2"  type="number" name="座机-分机号" label="座机-分机号" placeholder="请填写座机-分机号"/>
+
+		  <van-field v-model="stationNum" type="" name="工号" label="工号" placeholder="请填写工号"/>
+
+		  <van-field readonly clickable :value="company" class="m" name="公司" label="公司" placeholder="请选择公司" @click="showPicker = true"/>
+		  <van-popup v-model="showPicker" position="bottom">
+		    <van-picker
+		      show-toolbar
+		      :columns="companyList"
+			  value-key="company"
+		      @confirm="onConfirm"
+		      @cancel="showPicker = false"
+		    />
+		  </van-popup>
+
+		  <van-field readonly clickable :value="department" class="m" name="部门" label="部门" placeholder="请选择部门" @click="showPicker2 = true"/>
+		  <van-popup v-model="showPicker2" position="bottom">
+		    <van-picker
+		      show-toolbar
+		      :columns="departmentList"
+			  value-key="department"
+		      @confirm="onConfirm2"
+		      @cancel="showPicker2 = false"
+		    />
+		  </van-popup>
+
+		  <van-field readonly clickable :value="costCenterName"  name="成本中心" label="成本中心" placeholder="请填写成本中心" @click="showPicker3 = true"/>
+		  <van-popup v-model="showPicker3" position="bottom">
+		    <van-picker
+		      show-toolbar
+		      :columns="costCenterNameList"
+			  value-key="costCenterName"
+		      @confirm="onConfirm3"
+		      @cancel="showPicker3 = false"
+		    />
+		  </van-popup>
+
+		  <van-field v-model="build" type="" name="幢/座" label="幢/座" placeholder="请填写幢/座"/>
+		  <van-field v-model="floor" type="" name="楼层" label="楼层" placeholder="请填写楼层"/>
+		  <van-field v-model="seat" type="" name="座位" label="座位" placeholder="请填写座位"/>
+		  <van-field v-model="remark" type="" name="备注" label="备注" placeholder="请填写备注"/>
+		  <div style="margin: 16px;">
+		    <van-button round block type="info" native-type="submit">保存</van-button>
+		  </div>
+		</van-form>
+	</div>
+</template>
+
+<script>
+	import { Form,Toast } from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"新增临时收件人",
+				name:"",
+				englishName:"",
+				email:"",
+				phone:"",
+        phoneOne:"",
+        phoneTwo:"",
+        phoneThree:"",
+        telephone:"",
+        telephone2:"",
+				stationNum:"",
+				build:"",
+				floor:"",
+				seat:"",
+				remark:"",
+				company:"",
+				companyList:[],
+				showPicker:false,
+				department:'',
+				departmentList:[],
+				showPicker2:false,
+				costCenterName:'',
+				costCenterId:'',
+				costCenterNameList:[],
+				showPicker3:false,
+				companyid:'',//公司id
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.openid = this.$store.state.openId;
+			this.getData();
+		},
+		methods:{
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+
+				this.$http.post(this.$store.state.host+"/solic/getTemporaryList.do",{mailRoomId: localStorage.getItem('roomId')},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.companyList = res.body.companyList;
+							this.departmentList = res.body.departList;
+							this.costCenterNameList = res.body.costCenterList;
+						}
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			//所属公司
+			onConfirm(val){
+				this.company = val.company;
+				this.companyid = val.user_id;
+				this.showPicker = false;
+			},
+			//部门
+			onConfirm2(val){
+				this.department = val.department;
+				this.showPicker2 = false;
+			},
+			//成本中心
+			onConfirm3(val){
+				this.costCenterName = val.costCenterName;
+				this.costCenterId = val.id;
+				this.showPicker3 = false;
+			},
+			//提交
+			onSubmit(){
+				if(this.name==''||this.name==undefined){
+					Toast('请填写中文名');
+					return;
+				}
+				if(this.email==''||this.email==undefined){
+					Toast('请填写邮箱地址');
+					return;
+				}
+				if(this.phone==''||this.phone==undefined){
+					Toast('请填写手机号');
+					return;
+				}
+				if(this.company==''||this.company==undefined){
+					Toast('请选择公司');
+					return;
+				}
+				if(this.department==''||this.department==undefined){
+					Toast('请选择部门');
+					return;
+				}
+				// if(this.costCenterName==''||this.costCenterName==undefined){
+				// 	Toast('请选择成本中心');
+				// 	return;
+				// }
+				this.$http.post(this.$store.state.host+"/solic/saveTemporaryEmployee",{
+					mailRoomId: localStorage.getItem('roomId'),
+					name:this.name,//中文名
+					companyId:this.companyid,
+					englishName:this.englishName,//英文名
+					email:this.email,
+					//sex
+					phone:this.phone,
+          phoneOne:this.phoneOne,
+          phoneTwo:this.phoneTwo,
+          phoneThree:this.phoneThree,
+					telephone:this.telephone,
+          telephone2:this.telephone2,
+					stationNum:this.stationNum,//工号
+					company:this.company,//所属公司
+					costCenterName:this.costCenterName,//成本中心
+					costCenterId:this.costCenterId,
+					department:this.department,//部门
+					build:this.build,
+					floor:this.floor,
+					seat:this.seat,//座位号
+					remark:this.remark
+				},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							Toast("保存成功");
+							let that = this;
+							setTimeout(function(){
+								that.$router.push({path:'/Sjdj',query:{}});
+							},500)
+						}else{
+							Toast('保存失败!')
+						}
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	/deep/.van-form{
+	  .van-button--info{
+	    background-color: #00c4b8;
+	    border: 1px solid #00c4b8;
+	    border-radius: 5px;
+	  }
+	  .m .van-field__label::before{
+		  content:"*";
+		  color: red;
+	  }
+	  .van-cell{
+	    font-size: .26rem;
+	    }
+	  .textarea{
+	    font-size: .26rem;
+	    padding: 10px 16px;
+	    color: #646566;
+	    textarea{
+	      width: 98%;
+	      height: 150px;
+	      border-color: #e5e5e5;
+	      color: #999999;
+	      margin-top: 16px;
+	      padding: 10px 1%;
+	    }
+	  }
+	}
+	/deep/.van-field__control{
+	  text-align: right;
+	}
+</style>

+ 313 - 0
src/pages/box.vue

@@ -0,0 +1,313 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<p style="text-align: center;font-size: .36rem;margin-top: .2rem;">快递列表</p>
+		<div class="content">
+			<div class="sm">
+				<van-search placeholder="点击搜索" readonly @click="addshow=true"/>
+			</div>
+			<!-- 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="jjlist">
+				<div class="listinfo">
+					<div class="list_top">
+						<div class="list_top_left">
+							<img src="../assets/images/ad_icon1.png" alt="">
+							<div>
+								<p>内单 432432432123</p>
+								<p><span>收</span>王伟</p>
+								<p>5幢-6层  销售部</p>
+							</div>
+						</div>
+						<p class="staus1" @click="slide">{{options}}</p>
+					</div>
+				</div>
+			</div>
+			<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>内单 432432432</p>
+								<p><span>收</span>王伟</p>
+								<p>5幢-6层  销售部</p>
+							</div>
+						</div>
+						<p class="staus2">待派件</p>
+					</div>
+				</div>
+			</div>
+			
+		</div>
+		<!-- 选择下拉 -->
+		<van-popup v-model="showPicker" position="bottom">
+		  <van-picker title="" show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showPicker=false" />
+		</van-popup>
+		<!-- 筛选 -->
+		<van-popup round v-model="addshow" class="whrite_add" closeable>
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">筛选</p>
+				<van-form @submit="search">
+				  <van-field v-model="box" name="寄包柜" label="寄包柜" placeholder="请选择" readonly/>
+				  <van-field v-model="name" name="收件人" label="收件人" placeholder="请输入收件人"/>
+				  <van-field v-model="starttime" name="开始时间" label="开始时间" placeholder="请选择" readonly @click="time(1)"/>
+				  <van-field v-model="endtime" name="结束时间" label="结束时间" placeholder="请选择" readonly @click="time(2)"/>
+				  <van-field v-model="staus" name="状态" label="状态" placeholder="请选择" readonly @click="ztshow=true"/>
+				  <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="timeshow" position="bottom">
+			<van-datetime-picker
+			  v-model="currentDate"
+			  type="datetime"
+			  title="选择时间"
+			  :min-date="minDate"
+			  @confirm="timedate"
+			  @cancel="timeshow=false"
+			/>
+		</van-popup>
+		<!-- 状态 -->
+		<van-popup v-model="ztshow" position="bottom">
+			<van-picker title="标状态" show-toolbar :columns="ztlist" @confirm="zt" @cancel="ztshow=false"/>
+		</van-popup>
+		
+	</div>
+</template>
+
+<script>
+	export default{
+		data(){
+			return{
+				titlename:"寄包柜子",
+				showPicker:false,
+				columns:["未派件","待派件"],
+				options:"待揽件",
+				index:1,
+				addshow:false,
+				name:"",
+				timeshow:false,
+				box:"",
+				starttime:"",
+				endtime:"",
+				staus:"",
+				currentDate:"",
+				minDate:new Date(),
+				timetype:"",//时间类别1开始、2结束
+				ztshow:false,
+				ztlist:["状态一","状态二"],
+				
+			}
+		},
+		created:function(){
+			this.isLogin();
+		},
+		methods:{
+			// tab切换
+			tab(obj){
+				this.index=obj
+			},
+			// 下拉选择属性
+			slide(){
+				this.showPicker=true
+			},
+			// 下拉选择赋值
+			onConfirm(e){
+				this.options=e
+				this.showPicker=false
+			},
+			search(){},
+			timedate(e){
+				var date=new Date(e)
+				var year=date.getFullYear()
+				var month=date.getMonth()+1
+				month=month>9?month:'0'+month
+				var day=date.getDate()
+				day=day>9?day:'0'+day
+				var hour=date.getHours()
+				hour=hour>9?hour:'0'+hour
+				var minute=date.getMinutes()
+				minute=minute>9?minute:'0'+minute
+				console.log(month)
+				if(this.timetype==1){
+					this.starttime=year+'-'+month+'-'+day+' '+hour+':'+minute
+				}
+				if(this.timetype==2){
+					this.endtime=year+'-'+month+'-'+day+' '+hour+':'+minute
+				}
+				this.timeshow=false
+							
+			},
+			time(obj){
+				this.timeshow=true
+				this.timetype=obj
+				
+			},
+			// 状态显示
+			zt(e){
+				this.staus=e
+				this.ztshow=false
+			}
+			
+		},
+		mounted:function(){
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		padding: 0.25rem .37rem;
+		.tab{
+			font-size: .36rem;
+			color: #00c4b8;	
+					background: white;
+			div{
+				display: flex;
+				text-align: center;			
+				border-radius: .05rem;
+				p{
+					flex: 1;
+					padding: .2rem 0rem;
+					color: #333;				
+				}
+				p.active{
+					border-bottom:.01rem solid #00c4b8;
+					color: #00c4b8;
+				}
+			}
+			
+		}
+		
+		.sm{
+			margin-bottom: .2rem;
+			/deep/.van-search{
+				width: 100%;
+				height: .76rem;
+				border-radius: 25px;
+				overflow: hidden;
+				padding: 0rem;
+				background-color: white;
+				.van-search__content{
+					background-color: white;
+				}
+				input{
+					background-color: white;
+				}
+			}
+			img{
+				width:.4rem;
+				height: .4rem;
+				position: relative;
+				top: .18rem;
+			}
+		}
+		.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: 3.8rem;
+							margin-left: .2rem;
+							display: inline-block;	
+							position: relative;
+							p:nth-of-type(1) {
+								font-size: .28rem;
+								color: #333;
+								font-weight: bold;
+							}
+							p:nth-of-type(2) {
+								font-size: .22rem;
+								margin: .1rem 0rem;
+								display: flex;
+								align-items: center;
+								span{
+									background: #fa9c22;
+									color: white;
+									border-radius:50% ;
+									display: inline-block;
+									width: .4rem;
+									height: .4rem;
+									text-align: center;
+									line-height: .4rem;
+									margin-right: .1rem;
+								}
+							}		
+							p:nth-of-type(3) {
+								font-size: .22rem;
+							}
+						}
+					}		
+					>p {
+						font-size: .24rem;
+						font-weight: bold;
+						display: flex;
+						align-items: center;
+					}
+					>p:after{
+						content: "";
+						width: .1rem;
+						height: .1rem;
+						display: inline-block;
+						border-right: .01rem solid #7a7a7a;
+						border-bottom: .01rem solid #7a7a7a;
+						transform: rotate(45deg);
+						position: relative;
+						margin-left: .05rem;
+						top: -.02rem;
+					}
+					.staus1{
+						color: #f5693d;
+					}
+					.staus2{
+						color: #3d82f5;
+					}
+				}
+			}
+		}
+	}
+	.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>

+ 420 - 0
src/pages/email.vue

@@ -0,0 +1,420 @@
+<template>
+	<div>
+		<!-- <back :title="titlename"></back> -->
+		<div class="content">
+			<div class="sm">
+				<van-search v-model="value" @search="onSearch" placeholder="点击搜索单号" />
+				<img @click="wxScanCode()" src="../assets/user/sm.png" alt="">
+			</div>
+			<!-- 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="echarts1">
+				<div id="myChart1"></div>
+			</div>
+			<!-- 图标 -->
+			<div class="icon">
+				<router-link to="Sjdj">
+					<img src="../assets/user/icon6.png" alt="">
+					<p>收件登记</p>
+				</router-link>
+
+				<router-link to="Pjpc">
+					<img src="../assets/user/icon4.png" alt="">
+					<p>派件批次</p>
+				</router-link>
+
+        <!--<router-link to="Kjsearch">-->
+        <router-link to="Kjsearch">
+					<img src="../assets/user/icon5.png" alt="">
+					<p>派件签收</p>
+				</router-link>
+
+				<router-link to="Key">
+					<img src="../assets/user/icon1.png" alt="">
+					<p>寄件揽收</p>
+				</router-link>
+
+				<router-link to="" @click.native="print()">
+					<img src="../assets/user/icon3.png" alt="">
+					<p>打印面单</p>
+				</router-link>
+
+				<!-- <router-link to="Box"> -->
+				<router-link to="" @click.native="print()">
+					<img src="../assets/user/icon2.png" alt="">
+					<p>寄包柜子</p>
+				</router-link>
+
+        <router-link to="my">
+        	<img src="../assets/user/icon4.png" alt="">
+        	<p>我的</p>
+        </router-link>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		Toast,
+		Dialog
+	} from 'vant'
+	// vue 专用版本JS-SDK
+	import wx from "weixin-jsapi";
+	export default {
+		data() {
+			return {
+				titlename: "邮件收发室",
+				value: "",
+				index: 1,
+				total: 0,
+				title: "今日累计收件",
+				data: [{
+						value: 0,
+						name: '签收成功'
+					},
+					{
+						value: 0,
+						name: '待签收'
+					},
+					{
+						value: 0,
+						name: '问题件'
+					},
+				],
+				expressMap: {}, //收件
+				mailMap: {} //寄件
+			}
+		},
+		created: function() {
+      //this.getOpenid("");
+			this.isLogin();
+			this.getData()
+		},
+		mounted() {
+			// 页面加载完成唤醒微信扫一扫
+      //本地 注释  服务器 放开
+			this.wxScanCode();
+		},
+		methods: {//encodeURI(window.location.href.split('#')[0])
+			wxScanCode() {
+				let purl = /(Android)/i.test(navigator.userAgent) ? window.location.href.split('#')[0] : encodeURI(window.location.href.split('#')[0]);
+				let dataForm = {
+				    'url': purl
+			    }
+				//alert(url)
+				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)=> {
+									//alert(res)
+									var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
+									if(result.indexOf(",") != -1){
+										let result1 = res.resultStr.split(",");
+										result = result1[result1.length-1];
+									}
+									this.onSearch(result)
+								},
+								error: function(res) {
+									console.log(res);
+								}
+							});
+
+						});
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+					})
+
+			},
+			sys(){
+
+			},
+			//打印面单
+			print() {
+				Toast('该功能正在开发中,敬请期待!');
+			},
+			//单号搜索
+			onSearch(val) {
+				this.$router.push({
+					path: '/Sysearch',
+					query: {
+						expressNo: val,
+            searchType: "1" //1.搜索全部 2.搜索快件 3.搜索寄件
+					}
+				})
+			},
+			//后端获取数据
+			getData() {
+				Toast.loading({
+					message: '加载中...',
+					forbidClick: true,
+					duration: 0
+				});
+
+				this.$http.post(this.$store.state.host + "/solic/solicHomePage.do", {
+						mailRoomId: localStorage.getItem('roomId')
+					}, {
+						emulateJSON: true
+					})
+					.then(res => {
+						//发送成功
+						if (res.body.msg == 'success') {
+							this.expressMap = res.body.expressMap
+							this.data[0].value = this.expressMap.successNum
+							this.data[1].value = this.expressMap.waitNum
+							this.data[2].value = this.expressMap.problemNum
+							this.mailMap = res.body.mailMap
+							//this.echart1(this.data)
+						}
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+					})
+				Toast.clear()
+			},
+			tab(obj) {
+				this.getData()
+				this.index = obj
+				if (this.index == 1) {
+					this.title = "今日累计收件"
+					this.total = this.expressMap.receiveNum
+					this.data = [{
+							value: this.expressMap.successNum,
+							name: '签收成功'
+						},
+						{
+							value: this.expressMap.waitNum,
+							name: '待签收'
+						},
+						{
+							value: this.expressMap.problemNum,
+							name: '问题件'
+						},
+					]
+					this.echart1(this.data)
+				}
+				if (this.index == 2) {
+					this.title = "今日累计下单"
+					this.total = this.mailMap.sendNum
+					//alert(this.mailMap.waitLsNum)
+					this.data = [{
+							value: this.mailMap.succesLsNum,
+							name: '揽收成功'
+						},
+						{
+							value: this.mailMap.waitLsNum,
+							name: '待揽收'
+						},
+						{
+							value: this.mailMap.alreadyLsNum,
+							name: '已寄出'
+						},
+						{
+							value: this.mailMap.problemLsNum,
+							name: '问题件'
+						},
+					]
+					this.echart1(this.data)
+				}
+			},
+			echart1(obj) {
+				console.log("图表数据:"+JSON.stringify(obj))
+				let myChart = this.$echarts.init(document.getElementById('myChart1'))
+				var option = {
+					tooltip: {
+						trigger: 'item'
+					},
+					legend: {
+						top: '30%',
+						right: '5%',
+						orient: 'vertical',
+						icon: 'circle',
+					},
+					series: [{
+						name: '数据',
+						type: 'pie',
+						center: ["30%", "50%"],
+						radius: ['40%', '70%'],
+						avoidLabelOverlap: false,
+						label: {
+							normal: {
+								show: true,
+								position: 'center',
+								color: '#4c4a4a',
+								formatter: '{active|' + this.title + '}' + '\n\r' + '{total|' + this.total +
+									'}',
+								rich: {
+									total: {
+										fontSize: 18,
+										fontWeight: 'bold',
+										color: '#454c5c'
+									},
+									active: {
+										fontSize: 12,
+										color: '#6c7a89',
+										lineHeight: 30,
+									},
+								}
+							},
+							emphasis: { //中间文字显示
+								show: true,
+							}
+						},
+						color: ['#07daf9', '#f98407', '#f9df07', '#079bf9'],
+						// emphasis: {
+						//     label: {
+						//         show: false,
+						//         fontSize: '40',
+						//         fontWeight: 'bold'
+						//     }
+						// },
+						labelLine: {
+							show: false
+						},
+						data: obj
+					}]
+				}
+				myChart.setOption(option)
+				window.addEventListener("resize", () => {
+					myChart.resize();
+				})
+			},
+
+		},
+		mounted: function() {
+			setTimeout(()=>{
+			    this.echart1(this.data)
+			},1000)
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content {
+		padding: 0.25rem .37rem;
+
+		.sm {
+			display: flex;
+			margin-bottom: .2rem;
+			justify-content: space-between;
+
+			/deep/.van-search {
+				width: 100%;
+				height: .76rem;
+				border-radius: 25px;
+				overflow: hidden;
+				padding: 0rem;
+				background-color: white;
+
+				.van-search__content {
+					background-color: white;
+				}
+
+				input {
+					background-color: white;
+				}
+			}
+
+			img {
+				width: .4rem;
+				height: .4rem;
+				position: relative;
+				top: .18rem;
+				margin-left: .1rem;
+			}
+		}
+
+		.tab {
+			font-size: .32rem;
+			color: #333;
+			background: #e2e2e2;
+			border-radius: .05rem;
+
+			div {
+				display: flex;
+				text-align: center;
+
+				p {
+					flex: 1;
+					padding: .2rem 0rem;
+					border-top-left-radius: .05rem;
+					border-top-right-radius: .05rem;
+					overflow: hidden;
+				}
+
+				p.active {
+					background: white;
+				}
+			}
+
+		}
+
+		.echarts1 {
+			width: 100%;
+			height: 4.2rem;
+			background: white;
+
+			div {
+				// width: 100%;
+				// height: 100%;
+				width: 100%;
+				height: 200px;
+				margin: 0 auto;
+			}
+		}
+
+		.icon {
+			font-size: .26rem;
+			display: flex;
+			flex-wrap: wrap;
+			justify-content: space-between;
+			background: white;
+			padding: .6rem .4rem 0rem;
+			margin-top: .2rem;
+			border-radius: .05rem;
+
+			a {
+				width: 33%;
+				text-align: center;
+				display: block;
+				margin-bottom: .6rem;
+				color: #333;
+
+				img {
+					width: 1.15rem;
+					height: 1.15rem;
+				}
+			}
+		}
+	}
+</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/LJYforgetPassword", {
+						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>

+ 526 - 0
src/pages/jjsearch.vue

@@ -0,0 +1,526 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<div class="content">
+			<div class="dh">
+				<div>
+					<img src="../assets/images/ad_icon1.png" alt="快递公司图标">
+					<span>单号:{{expressInfo.expressNo}}</span>
+				</div>
+				<!-- <div>
+					<img src="../assets/images/ad_icon1.png" alt="快递公司图标">
+					<span>转单号:112323</span>
+				</div> -->
+			</div>
+			<!-- 寄件地址 -->
+			<div class="jjinfo">
+				<div>
+					<div class="jj">
+						<div class="jjaddress">
+							<p>寄</p>
+							<div>
+								<p>{{expressInfo.sender}} {{expressInfo.senderPhone}}</p>
+								<p>{{expressInfo.sendAddr}}{{expressInfo.sendAddress}}</p>
+							</div>
+						</div>
+					</div>
+					<div class="jj" style="border-top:.01rem solid #ededed">
+						<div class="jjaddress">
+							<p style="background: #fa9c22;">收</p>
+							<div>
+								<p>{{expressInfo.receiver}} {{expressInfo.receiverPhone}}</p>
+								<p>{{expressInfo.receiveAddr}}{{expressInfo.receiveAddress}}</p>
+							</div>
+						</div>
+
+					</div>
+				</div>
+
+			</div>
+			<!-- 快递公司 -->
+			<div class="kdshow">
+				<van-field readonly clickable name="picker" :value="expressComp" label="快递公司" />
+			</div>
+			<!-- 快递属性 -->
+			<div class="ktsx">
+				<p>物品类型:{{expressInfo.itemType}}</p>
+				<p v-if="expressInfo.itemType == '文件'">件数:{{expressInfo.itemNum}}</p>
+				<p v-if="expressInfo.itemType == '物品'">重量(kg):{{expressInfo.weight}}</p>
+				<p>包装类型:{{expressInfo.packingType}}</p>
+				<p>物品性质:{{expressInfo.goodNature}}</p>
+				<p style="width: 100%;">付款方式:{{expressInfo.payWay}}</p>
+				<p style="width: 100%;">体积(cm³):{{expressInfo.volume}}</p>
+				<p style="width: 100%;">备注:{{expressInfo.itemRemark}}</p>
+				<div>
+					<button @click="show=true">修改</button>
+				</div>
+			</div>
+			<div class="group_btn">
+				<button :disabled="buttonDis" @click="sign()">揽件</button>
+				<button @click="print()">打印面单</button>
+			</div>
+		</div>
+		<!-- 修改弹窗 -->
+		<van-popup round v-model="show" class="whrite_add" closeable closed="close">
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">修改信息</p>
+				<van-form @submit="onSubmit">
+					<van-field v-model="expressComp" name="快递公司" disabled label="快递公司" placeholder="请选择"
+						@click="showPicker1 = true" />
+					<van-field v-model="expressInfo.expressPhone" readonly name="联系方式" type="number" label="联系方式" placeholder="请输入快递公司联系方式" />
+					<van-field v-model="expressInfo.itemType" name="物品类型" disabled label="物品类型" placeholder="请选择"
+						@click="showPicker2 = true" />
+					<van-field v-if="expressInfo.itemType == '物品'" v-model="expressInfo.weight" name="重量" type="number" label="重量(kg)"
+						placeholder="请输入" />
+					<van-field v-if="expressInfo.itemType == '文件'" v-model="expressInfo.itemNum" name="数量" type="number" label="数量" placeholder="请输入" />
+					<van-field v-model="expressInfo.packingType" name="包装类型" disabled label="包装类型" placeholder="请选择"
+						@click="showPicker3 = true" />
+					<van-field v-model="expressInfo.goodNature" name="物品性质" disabled label="物品性质" placeholder="请选择"
+						@click="showPicker4 = true" />
+					<van-field v-model="expressInfo.payWay" name="支付方式" disabled label="支付方式" placeholder="请选择"
+						@click="showPicker5 = true" />
+					<van-field v-model="expressInfo.volume" name="体积" type="number" label="体积(cm³)" placeholder="请输入" />
+					<van-field v-model="expressInfo.predictPrice" readonly name="预估价格" type="number" label="预估价格(元)" placeholder="请输入" />
+					<van-field v-model="expressInfo.itemRemark" name="备注" type="text" 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="showPicker1" position="bottom">
+			<van-picker show-toolbar :columns="columns" @confirm="onConfirm1" @cancel="showPicker = false" />
+		</van-popup>
+		<van-popup v-model="showPicker2" position="bottom">
+			<van-picker show-toolbar :columns="columns2" @confirm="onConfirm2" @cancel="showPicker = false" />
+		</van-popup>
+		<van-popup v-model="showPicker3" position="bottom">
+			<van-picker show-toolbar :columns="columns3" @confirm="onConfirm3" @cancel="showPicker = false" />
+		</van-popup>
+		<van-popup v-model="showPicker4" position="bottom">
+			<van-picker show-toolbar :columns="columns4" @confirm="onConfirm4" @cancel="showPicker = false" />
+		</van-popup>
+		<van-popup v-model="showPicker5" position="bottom">
+			<van-picker show-toolbar :columns="columns5" @confirm="onConfirm5" @cancel="showPicker = false" />
+		</van-popup>
+		<!-- 修改弹窗 -->
+	</div>
+</template>
+
+<script>
+	import {
+		Toast,
+		Dialog
+	} from 'vant'
+	export default {
+		data() {
+			return {
+				titlename: "邮件收发室",
+				showPicker: false, //快递
+				expressNo: "", //单号
+				type: '', //寄件/收件
+				expressInfo: {},
+				buttonDis: false,
+				show: false,
+				name: "",
+				showPicker1: false,
+				columns: [],
+				kdphone: "",
+				wptype: "",
+				showPicker2: false,
+				columns2: ["物品", "文件"],
+				bztype: "",
+				showPicker3: false,
+				columns3: ["有", "无"],
+				weight: "",
+				num: "",
+				typeshow: 0,
+				wpxz: "",
+				showPicker4: false,
+				columns4: ["普通", "特殊"],
+				pricetype: "",
+				showPicker5: false,
+				columns5: ["自费", "月结"],
+				tj: "",
+				price: "",
+				bz: "",
+				expressCompId:'',//快递公司Id
+				expressComp:'',//快递公司名
+			}
+		},
+		created: function() {
+			this.isLogin();
+			this.expressNo = this.$route.query.expressNo;
+			this.type = this.$route.query.type;
+			if(this.type == undefined || this.type == ''){
+				this.type = 2;
+			}
+			this.getData();
+			this.getLogisticsList();
+		},
+		methods: {
+			//揽件
+			sign() {
+				this.buttonDis = true
+				this.$http.post(this.$store.state.host + "/solic/mailReceive", {
+						expressNo: this.expressNo,
+						sendSt: 2, //已揽件
+					}, {
+						emulateJSON: true
+					})
+					.then(res => {
+						//发送成功
+						if (res.body.msg == 'success') {
+							//揽件成功
+							Toast.success('揽件成功')
+							setTimeout(() => {
+								this.getData() //刷新数据
+								//this.buttonDis = false
+							}, 2000)
+						} else {
+							Toast.fail('揽件失败')
+							this.buttonDis = false
+						}
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+						this.buttonDis = false
+					})
+
+			},
+			//后端获取数据
+			getData() {
+				Toast.loading({
+					message: '加载中...',
+					forbidClick: true,
+					duration: 0
+				});
+
+				this.$http.post(this.$store.state.host + "/solic/getExpressDetail", {expressNo: this.expressNo,type: this.type}, {emulateJSON: true})
+					.then(res => {
+						//发送成功
+						if (res.body.msg == 'success') {
+							this.expressInfo = res.body.expressInfo
+							this.expressCompId = res.body.expressInfo.expressInfo;
+							switch (res.body.expressInfo.expressInfo){
+								case "1":
+								this.expressComp = '顺丰快递';
+								break;
+								case "2":
+								this.expressComp = '中通快递';
+								break;
+								case "6":
+								this.expressComp = '京东快递';
+								break;
+								case "5":
+								this.expressComp = '同城急送';
+								break;
+								case "4":
+								this.expressComp = '邮政EMS';
+								break;
+								case "3":
+								this.expressComp = 'DHL';
+								break;
+								default:
+								this.expressComp = -1;
+								break;
+							}
+						}
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+					})
+				Toast.clear()
+			},
+			onConfirm1(options) {
+				this.expressComp = options.text;
+				this.expressInfo.expressPhone = options.phone;
+				this.expressCompId = options.id;
+				this.showPicker1 = false;
+			},
+			onConfirm2(options) {
+				this.expressInfo.itemType = options
+				this.showPicker2 = false
+			},
+			onConfirm3(options) {
+				this.expressInfo.packingType = options
+				this.showPicker3 = false
+			},
+			onConfirm4(options) {
+				this.expressInfo.goodNature = options
+				this.showPicker4 = false
+			},
+			onConfirm5(options) {
+				this.expressInfo.payWay = options
+				this.showPicker5 = false
+			},
+			//修改
+			onSubmit() {
+				this.buttonDis = true
+				this.$http.post(this.$store.state.host + "/solic/updateMailInfo", {
+						expressNo: this.expressNo,
+						expressInfo: this.expressCompId, //快递公司[传回快递公司id]
+						expressPhone: this.expressInfo.expressPhone, //快递公司联系方式
+						itemType: this.expressInfo.itemType, //物品类型:物品、文件
+						weight: this.expressInfo.weight, //重量
+						itemNum: this.expressInfo.itemNum, //物品数量
+						packingType: this.expressInfo.packingType, //包装类型:有、无
+						goodNature: this.expressInfo.goodNature, //物品性质:普通、特殊
+						payWay: this.expressInfo.payWay, //支付方式:自费、月结
+						volume: this.expressInfo.volume, //体积
+						predictPrice: this.expressInfo.predictPrice, //预估价格
+						itemRemark: this.expressInfo.itemRemark, //物品备注
+					}, {
+						emulateJSON: true
+					})
+					.then(res => {
+						//发送成功
+						if (res.body.msg == 'success') {
+							//签收成功
+							Toast.success('修改成功')
+							this.show = false
+							setTimeout(() => {
+								this.getData() //刷新数据
+								this.buttonDis = false
+							}, 2000)
+						} else {
+							Toast.fail('修改失败')
+							this.buttonDis = false
+						}
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+						this.buttonDis = false
+					})
+				//this.show = false
+			},
+			//打印面单
+			print(){
+				Toast('该功能正在开发中,敬请期待!')
+			}
+
+		},
+		mounted: function() {
+
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.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;
+		}
+
+		/deep/.van-field__label {
+			color: #333 !important;
+		}
+	}
+
+	.content {
+		padding: 0.25rem .37rem;
+		font-size: .3rem;
+
+		.sm {
+			display: flex;
+			margin-bottom: .2rem;
+			justify-content: space-between;
+
+			/deep/.van-search {
+				width: 6.2rem;
+				height: .76rem;
+				border-radius: 25px;
+				overflow: hidden;
+				padding: 0rem;
+				background-color: white;
+
+				.van-search__content {
+					background-color: white;
+				}
+
+				input {
+					background-color: white;
+				}
+			}
+
+			img {
+				width: .4rem;
+				height: .4rem;
+				position: relative;
+				top: .18rem;
+			}
+		}
+
+		.dh {
+			margin: .2rem 0rem;
+			background: white;
+			padding: .2rem .3rem;
+			border-radius: .05rem;
+
+			div {
+				display: flex;
+				align-items: center;
+
+				img {
+					width: .36rem;
+					height: .36rem;
+					border-radius: 50%;
+					margin-right: .25rem;
+				}
+
+			}
+
+			div:nth-of-type(1) {
+				margin-bottom: .2rem;
+			}
+		}
+
+		.jjinfo {
+			font-size: .24rem;
+			color: #999999;
+
+			>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 {
+							p:nth-of-type(2) {
+								font-size: .24rem;
+							}
+
+							p:nth-of-type(1) {
+								font-size: .3rem;
+								color: #333;
+								margin-bottom: .2rem;
+							}
+						}
+					}
+				}
+			}
+
+		}
+
+		.kdshow {
+			font-size: .3rem;
+			padding: .3rem 0px;
+			background: white;
+			border-radius: .05rem;
+			margin: 0.2rem 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; */
+			}
+		}
+
+		.ktsx {
+			padding: .2rem .3rem;
+			background: white;
+			display: flex;
+			flex-wrap: wrap;
+			justify-content: space-between;
+			font-size: .28rem;
+			line-height: 200%;
+			border-radius: .05rem;
+
+			p {
+				width: 48%;
+			}
+
+			div {
+				width: 100%;
+				border-top: .01rem solid #F6F6F6;
+				text-align: right;
+				padding-top: .2rem;
+				margin-top: .2rem;
+
+				button {
+					font-size: .28rem;
+					border: .01rem solid #00c4b8;
+					color: #00c4b8;
+					background: white;
+					padding: 0rem .3rem;
+					border-radius: .05rem;
+				}
+			}
+		}
+
+		.group_btn {
+			display: flex;
+			justify-content: space-between;
+
+			button {
+				width: 47%;
+				border: none;
+				color: white;
+				padding: .2rem 0rem;
+				margin-top: .3rem;
+				border-radius: .05rem;
+			}
+
+			button:nth-of-type(1) {
+				background: #00c4b8;
+			}
+
+			button:nth-of-type(2) {
+				background: #0086c4;
+			}
+		}
+	}
+</style>

+ 281 - 0
src/pages/key.vue

@@ -0,0 +1,281 @@
+<template>
+	<div class="content">
+		<backindex :title="titlename"></backindex>
+		<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 style="color: #F6F6F6;text-align: center;font-size: .28rem;line-height: 200%;">
+				<p>输入六位密钥,完成揽件</p>
+				<p style="color:aqua">密钥揽件</p>
+        <img src="../assets/user/sm.png" alt="" @click="wxScanCode()" style="height: 100px;">
+
+			</div>
+		</div>
+
+	</div>
+</template>
+
+
+
+<script>
+	import {
+		Toast,
+		Dialog
+	} from 'vant'
+	export default {
+		name: 'verificatonCode',
+		data() {
+			return {
+				titlename:'密钥',
+				code: '',
+				codeArr: [],
+				isFocus: false
+			}
+		},
+		watch: {
+			code(newVal) {
+        console.log("newVal" + newVal)
+				this.codeArr = String(newVal).split("")
+
+				//输入完秘钥判断
+				if (newVal.length == 6) {
+					this.$http.post(this.$store.state.host + "/solic/getExpressDetail", {
+							collectKey: newVal,
+							type: 3
+						}, {
+							emulateJSON: true
+						})
+						.then(res => {
+							//发送成功
+							if (res.body.msg == 'success') {
+                console.log(res.body.expressInfo);
+								if (res.body.expressInfo != undefined || res.body.expressInfo != null) {
+									this.$router.push({path:'/Jjsearch',query:{expressNo:res.body.expressInfo.expressNo}})
+								} else {
+									Toast("查无此单!");
+								}
+							}
+
+						}, res => {
+							//发送失败
+							Toast("网络错误!")
+						})
+				}
+
+			}
+		},
+		methods: {
+			focus() {
+				this.isFocus = true
+			},
+			blur() {
+				this.isFocus = false
+			},
+			codeInputFun() {
+				this.$refs.codeInput.focus()
+			},
+      //微信扫码
+      wxScanCode() {
+      	let purl = /(Android)/i.test(navigator.userAgent) ? window.location.href.split('#')[0] : encodeURI(window.location.href.split('#')[0]);
+      	let dataForm = {
+      	    'url': purl
+          }
+      	//alert(url)
+      	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)=> {
+      						//alert(res)
+      						var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
+
+                  // alert(JSON.stringify(result));
+      						if(result.indexOf(",") != -1){
+      							let result1 = res.resultStr.split(",");
+      							result = result1[result1.length-1];
+
+      						}
+
+                  // alert(result);result=单号
+                  //2023/03/22
+                  // if (result != undefined || result != null) {
+                  // 	this.$router.push({path:'/Jjsearch',query:{expressNo:result}})
+                  // } else {
+                  // 	Toast("查无此单!");
+                  // }
+                  //扫完码判断
+                  if (result != undefined || result != null) {
+                  	this.$http.post(this.$store.state.host + "/solic/getExpressInfo", {
+                  			expressNo: result
+                  		}, {
+                  			emulateJSON: true
+                  		})
+                  		.then(res => {
+                  			//发送成功
+                  			if (res.body.msg == 'success') {
+                          console.log(res.body.expressInfo);
+                  				if (res.body.expressInfo != undefined || res.body.expressInfo != null) {
+                  					this.$router.push({path:'/Jjsearch',query:{expressNo:result}})
+                  				} else {
+                  					Toast("查无此单!");
+                  				}
+                  			}
+
+                  		}, res => {
+                  			//发送失败
+                  			Toast("网络错误!")
+                  		})
+                  }
+
+      					},
+      					error: function(res) {
+      						console.log(res);
+      					}
+      				});
+
+      			});
+      		}, res => {
+      			//发送失败
+      			Toast("网络错误!")
+      		})
+      },
+		}
+	}
+</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: 45%;
+		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>

+ 444 - 0
src/pages/kjsearch.vue

@@ -0,0 +1,444 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<div class="content">
+			<div class="sm">
+				<van-search v-model="value" @search="onSearch" placeholder="点击搜索单号" />
+				<img src="../assets/user/sm.png" alt="" @click="wxScanCode()" >
+			</div>
+			<!-- 快件查询列表 -->
+      <van-checkbox-group v-model="result">
+      <van-cell-group>
+			<div class="jjlist" v-for="item in resultList">
+				<div class="listinfo">
+					<!-- <div class="list_top" @click="goInfo(item.expressNo)"> -->
+          <div class="list_top">
+
+            <div class="checked">
+            	<van-checkbox :disabled="item.signinStatus == 0" checked-color="#00c4b8" :name="item.expressNo" ref="checkboxes" />
+            </div>
+
+						<div class="list_top_left" @click="goInfo(item.expressNo)">
+							<!-- <img src="../assets/images/ad_icon1.png" alt=""> -->
+							<div>
+								<p>{{item.expressNo}}</p>
+								<p>{{item.mailRoom}} {{item.recipient}} {{item.build}} {{item.sendSeat}} {{item.floor}}</p>
+							</div>
+              <span style="margin-top: 30%;">{{item.recordDate2}}</span>
+						</div>
+
+            <div class="closed">
+              <van-icon name="cross" @click="deleteInfo(item)"/>
+            </div>
+
+
+					</div>
+				</div>
+			</div>
+      </van-cell-group>
+      </van-checkbox-group>
+      <div style="margin-top: 16px;">
+				<van-field readonly clickable name="picker" :value="phone" label="收件人手机" placeholder="输入手机号后四位查询" @click="addshow1=true"/>
+				<van-field readonly type="text" v-model="recipient" label="收件人" />
+				<van-button style="margin-top: 16px;" color="#00c4b8" block type="info" @click="signSave">合并签收</van-button>
+			</div>
+
+      <!-- 填写手机号码 -->
+      <van-popup round v-model="addshow1" class="whrite_add2" closeable @closed="close" :close-on-click-overlay="false">
+      	<div>
+      		<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">填写号码</p>
+      		<van-form @submit="onSubmit">
+      		  <van-field v-model="phone" name="收件人手机" label="收件人手机" type="number" maxlength="20" placeholder="输入手机号后四位" @change="searchList()"/>
+      		  <ul>
+      			  <li v-for="(item,i) in employeeList" @click="choose(i,item)">
+      				<p>{{item.name}}</p>
+      				<p>{{item.department}}</p>
+      				<van-icon v-if="index == i" name="passed" />
+      			  </li>
+      		  </ul>
+      		  <div style="margin-top: 16px;">
+      		    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+      		  </div>
+      		</van-form>
+      	</div>
+      </van-popup>
+
+		</div>
+	</div>
+</template>
+
+<script>
+  import {Toast,Dialog,Checkbox,CheckboxGroup} from 'vant'
+  import Swiper from 'swiper'
+	export default{
+    inject: ['reload'],
+		data(){
+			return{
+        result:[],
+				titlename:"快件查询",
+				value:"",
+				expressNo:"",//快递单号
+				resultList:[],
+        addshow1:false,
+        name:"",
+        box:"",
+        phone:'',//手机号
+        recipient:'',//收件人
+        employeeList:[],//收件人列表
+        index:'-1',
+        searchType:"2"//1.搜索全部 2.搜索快件 3.搜索寄件
+			}
+		},
+		created:function(){
+			//this.isLogin();
+		},
+		methods:{
+			//微信扫码
+			wxScanCode() {
+				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(",");
+										this.value = result1[result1.length-1];
+									}
+									this.onSearch(this.value)
+									// this.getData()
+								},
+								error: function(res) {
+									console.log(res);
+								}
+							});
+						});
+					}, res => {
+						//发送失败
+						Toast("网络错误!")
+					})
+
+			},
+      //选择员工
+			choose(val,item){
+				this.index = val
+				this.recipient = item.name
+				this.phone = item.phone
+			},
+			//手机号后四位搜索
+			searchList(){
+				this.$http.post(this.$store.state.host+"/solic/getEmployeeInfoByPhone",{
+          phone:this.phone,
+          },{
+            emulateJSON:true,
+            })
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.employeeList = res.body.employeeList
+						}
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+			},
+			//跳转详情
+			goInfo(expressNo){
+        //收件查询
+					this.$router.push({path:'/Kjsearchinfo',query:{expressNo:expressNo,type:1}})
+			},
+      deleteInfo(e){
+        console.log("E:" + JSON.stringify(e))
+          this.resultList.splice(this.resultList.indexOf(e), 1) // ['b']
+      },
+			//搜索
+			onSearch(val){
+				this.expressNo = val
+				this.getData()
+			},
+      toggle(index) {
+          this.$refs.checkboxes[index].toggle();
+      },
+      onSubmit(){
+      	if(this.recipient == ''){
+      		Toast('请选择收件人')
+      		return
+      	}
+      	this.addshow1=false
+      	//this.tjshow=true
+      },
+      close(){
+      	//this.phone = ''
+      	//this.name = ''
+      	//this.department = ''
+      	this.index = ''
+      },
+			//后端获取数据
+			getData(){
+        localStorage.getItem("userId")
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+        console.log("后端获取数据:expressNo = " + this.expressNo);
+				this.$http.post(this.$store.state.host+"/solic/getExpressListByNo",{
+          expressNo:this.expressNo,
+          searchType:"2",
+          mailRoomId:localStorage.getItem('roomId'),
+          userId:localStorage.getItem('userId'),
+          },{emulateJSON:true})
+					.then(res=>{
+            if(res.body.msg == "success"){
+              var list = res.body.resultList;
+              var oldlist = this.resultList;
+            	//发送成功
+
+              if(oldlist == ''){
+                for (var i = 0; i < list.length; i++) {
+                 this.resultList.push(list[i])
+                }
+              }else{
+
+                for (var i1 = 0; i1 < list.length; i1++) {
+                  if(JSON.stringify(oldlist).indexOf(JSON.stringify(list[i1])) == -1){
+                    this.resultList.push(list[i1])
+                  }else{
+                    console.log('存在重复快递单号!')
+                    Toast("存在重复快递单号!")
+              }
+
+              }
+            }
+            }else if(res.body.msg == "查无此单号"){
+              Toast("查无此快递单号!")
+            }
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+      //合并签收
+      			signSave(){
+      				if(this.result.length == 0){
+      					Toast('请选择需要合并的快递!');
+      					return;
+      				}
+      				if(this.recipient == ''){
+      					Toast('请选择收件人!');
+      					return;
+      				}
+      				this.$http.post(this.$store.state.host+"/solic/marginSignExpress",
+      				{expressNoList:this.result.join(','),
+      				collectAgent:this.recipient},{emulateJSON:true})
+      					.then(res=>{
+      						//发送成功
+      						if(res.body.msg=='success'){
+      							Toast("合并签收成功!");
+      							// setTimeout(()=>{
+             //            this.reload();
+      							// },1200)
+                    setTimeout(() => {
+                    	this.$router.push({path:'/Sign2',query:{expressNoList:this.result.join(',')}});
+                    	this.buttonDis = false
+                    }, 2000)
+
+      						}else{
+      							Toast("合并签收失败!");
+      						}
+      				},res=>{
+      						//发送失败
+      					Toast("网络错误!")
+      				})
+      			},
+      			//选择员工
+      			choose(val,item){
+      				this.index = val
+      				this.recipient = item.name
+      				this.phone = item.phone
+      			},
+      			//手机号后四位搜索
+      			searchList(){
+      				this.$http.post(this.$store.state.host+"/solic/getEmployeeInfoByPhone",{
+             phone:this.phone,
+             },{
+               emulateJSON:true,
+               })
+      					.then(res=>{
+      						//发送成功
+      						if(res.body.msg=='success'){
+      							this.employeeList = res.body.employeeList
+      						}
+      				},res=>{
+      						//发送失败
+      					Toast("网络错误!")
+      				})
+      			},
+
+		},
+		mounted:function(){
+
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		padding: 0.25rem .37rem;
+		.sm{
+			display: flex;
+			margin-bottom: .2rem;
+			justify-content: space-between;
+			/deep/.van-search{
+				width: 6.2rem;
+				height: .76rem;
+				border-radius: 25px;
+				overflow: hidden;
+				padding: 0rem;
+				background-color: white;
+				.van-search__content{
+					background-color: white;
+				}
+				input{
+					background-color: white;
+				}
+			}
+			img{
+				width:.4rem;
+				height: .4rem;
+				position: relative;
+				top: .18rem;
+			}
+		}
+
+    .whrite_add2{
+    	width: 6.6rem;
+    	padding: .4rem .2rem;
+    	font-size: .3rem;
+    	/deep/.van-field__value{
+    		input{
+    			text-align: right;
+    		}
+
+    	}
+    	/deep/.van-popup__close-icon--top-right{
+    		top: 5px;
+    		right: 10px;
+    	}
+    	ul{
+    		li{
+    			padding: 10px 36px 10px 16px;
+    			display: flex;
+    			justify-content: space-between;
+    			position: relative;
+    			i{
+    				position: absolute;
+    				right: 0px;
+    				top:.25rem
+
+    			}
+    			i:before{
+    				background: #00c4b8;
+    				color: white;
+    				border-radius: 50%;
+    			}
+    		}
+    	}
+    }
+    .van-checkbox-group{
+      .van-cell-group{
+        background-color: unset;
+      }
+    }
+		.jjlist {
+			font-size: .3rem;
+			color: #999999;
+
+			.listinfo {
+				background: white;
+				padding: .3rem .3rem .3rem;
+				border-radius: .05rem;
+				margin-bottom: .2rem;
+				position: relative;
+				.list_top {
+					display: flex;
+					justify-content: space-between;
+          align-items: center;
+          position: relative;
+          .closed{
+            position: absolute;
+            right: -0.4rem;
+            top: -0.4rem;
+            z-index: 3;
+            i{
+              background: #ed1919;
+              border-radius: 50%;
+              color: white;
+              padding: 0.03rem;
+            }
+          }
+					.list_top_left {
+						img {
+							display: inline-block;
+							width: .87rem;
+							height: .87rem;
+							position: relative;
+						}
+
+						div {
+							width: 4rem;
+							margin-left: .2rem;
+							display: inline-block;
+							line-height: 150%;
+							position: relative;
+							top: -.1rem;
+							p:nth-of-type(1) {
+								font-size: .28rem;
+								color: #333;
+								font-weight: bold;
+							}
+							p:nth-of-type(2) {
+								font-size: .22rem;
+							}
+						}
+					}
+					>p {
+						font-size: .23rem;
+						font-weight: bold;
+						display: flex;
+						align-items: center;
+					}
+					.staus1{
+						color: #f5693d;
+					}
+					.staus2{
+						color: #3d82f5;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 335 - 0
src/pages/kjsearchinfo.vue

@@ -0,0 +1,335 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<div class="content">
+			<!-- 快件查询列表 -->
+			<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.expressCompany}} {{expressInfo.expressNo}}</p>
+								<p>2021-09-12 10:31</p>
+							</div>
+						</div>
+						<p class="staus1">
+              <template v-if="expressInfo.signinStatus == 0">待签收</template>
+              <template v-if="expressInfo.signinStatus == 1">已签收</template>
+              <template v-if="expressInfo.signinStatus == 2">已代收</template>
+              <template v-if="expressInfo.signinStatus == 3">拒收</template>
+              <template v-if="expressInfo.signinStatus == 4">滞留件</template>
+              <template v-if="expressInfo.signinStatus == 5">问题件</template>
+              <!-- <template v-if="expressInfo.signinStatus == 7">转寄</template>
+              <template v-if="expressInfo.signinStatus == 8">重新分拣</template>
+              <template v-if="expressInfo.signinStatus == 9">已转寄</template> -->
+            </p>
+					</div>
+				</div>
+			</div>
+			<div class="info">
+				<p>收件人:{{expressInfo.recipient}}</p>
+				<p>公司:{{expressInfo.company}}</p>
+				<p>座位:{{expressInfo.sendSeat}}</p>
+				<p>手机:{{expressInfo.phone}}</p>
+
+        <template v-show="expressInfo.phoneOne != '' || expressInfo.phoneOne != NULL">
+          <p>备用手机1:{{expressInfo.phoneOne}}</p>
+        </template>
+
+        <template v-show="expressInfo.phoneTwo != '' || expressInfo.phoneTwo != NULL">
+          <p>备用手机2:{{expressInfo.phoneTwo}}</p>
+        </template>
+
+        <template v-show="expressInfo.phoneThree != '' || expressInfo.phoneThree != NULL">
+          <p>备用手机3:{{expressInfo.phoneThree}}</p>
+        </template>
+
+				<p>智能柜:{{expressInfo.cabinet}}</p>
+				<p>快件类型:{{expressInfo.expressType}}</p>
+				<p>是否公司件:{{expressInfo.isCompany}}</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>3-27 17:27  派件中,收派员【杨柳青】</p>
+				</div> -->
+			</div>
+      <template v-if="expressInfo.signinStatus == 0">
+      <!--签收-->
+			<button :disabled="buttonDis" @click="showYesPopup()" style="width: 45%;background: rgb(0, 196, 184);font-size: 0.3rem;border: none;padding: 0.2rem 0rem;margin-top: 0.5rem;color: white;">签收</button>
+      <van-popup v-model="showYes" position="bottom">
+        <van-picker title="签收原因" show-toolbar :columns="yeslist" @confirm="onConfirmYes" @cancel="showYes=false"/>
+      </van-popup>
+      <!--拒收-->
+      <button :disabled="buttonDis" @click="showNoPopup()" style="width: 45%;background: rgb(255, 0, 0);font-size: 0.3rem;border: none;padding: 0.2rem 0rem;margin-top: 0.5rem;color: white;margin-left: 29px;">拒签</button>
+      <van-popup v-model="showNo" position="bottom">
+        <van-picker title="拒收原因" show-toolbar :columns="nolist" @confirm="onConfirmNo" @cancel="showNo=false"/>
+      </van-popup>
+      <!--底部备注弹窗-->
+      <van-popup round v-model="remarkShow" position="bottom" closeable>
+        <div class="tcshow">
+         <p>备注</p >
+         <textarea name="" v-model="sendRemark" id="sendRemark" placeholder="请输入原因"></textarea>
+         <van-button type="primary" size="large" @click="save()">确定</van-button>
+        </div>
+      </van-popup>
+
+      </template>
+    </div>
+	</div>
+</template>
+
+<script>
+	import {Toast,Dialog} from 'vant'
+	export default{
+		data(){
+			return{
+				titlename:"收件查询",
+				expressNo:'',//快递单号
+        signinStatus:'',//签收状态:0-待签收 1-已签收、2-已代收、3-拒收、4-延迟
+				type:'',//寄件/收件
+				expressInfo:{},
+				buttonDis: false,
+        yeslist:["本人签收","他人代收"],
+        showYes: false,
+        nolist:["拒收","滞留件","问题件"],
+        showNo: false,
+        remarkShow: false,
+        sendRemark:"",
+        why:"",//拒收原因
+        //noPeoplelist:["号码错误","位置更换"],
+        // showNoPeople: false,
+        //noPlacelist:["转寄","重新分拣"],
+        // showNoPlace: false
+			}
+		},
+		created:function(){
+			this.isLogin();
+			this.expressNo = this.$route.query.expressNo
+			this.type = this.$route.query.type
+			this.getData()
+		},
+		methods:{
+      save(){
+        console.log(this.why);
+       if(this.why == "拒收"){
+         this.sign(3)
+       }else if(this.why == "滞留件"){
+         this.sign(4)
+       }else if(this.why == "问题件"){
+         this.sign(5)
+       }
+      },
+      //拒收原因
+      onConfirmNo(e){
+      	if(e == "拒收"){
+          this.remarkShow = true;
+          this.why = e;
+        }else if(e == "滞留件"){
+          this.remarkShow = true;
+          this.why = e;
+        }else if(e == "问题件"){
+          this.remarkShow = true;
+          this.why = e;
+        }
+      	this.showNo = false;
+      },
+      //签收人员
+      onConfirmYes(e){
+      	if(e == "本人签收"){
+          this.sign(1)
+        }else{
+          this.sign(2)
+        }
+      	this.showYes = false;
+      },
+      // //无人签收
+      // onConfirmNoPeople(e){
+      // 	if(e == "号码错误"){
+      //     this.sign(5)
+      //   }else{
+      //     this.sign(6)
+      //   }
+      // 	this.showNoPeople = false;
+      // },
+      // //分拣错误转寄
+      // onConfirmNoPlace(e){
+      // 	if(e == "转寄"){
+      //     this.sign(7)
+      //   }else{
+      //     this.sign(8)
+      //   }
+      // 	this.showNoPlace = false;
+      // },
+
+
+
+      //显示拒收弹窗
+      showNoPopup(){
+        this.showNo = true;
+      },
+      //显示签收弹窗
+      showYesPopup(){
+        this.showYes = true;
+      },
+      //显示无人签收弹窗
+      showNoPeoplePopup(){
+        this.showNoPeople = true;
+      },
+      //显示分拣错误转寄弹窗
+      showNoPlacePopup(){
+        this.showNoPlace = true;
+      },
+
+
+
+			//签收
+			sign(e){
+				this.buttonDis = true
+				this.$http.post(this.$store.state.host+"/solic/signForExpress",{expressNo:this.expressNo,signinStatus:e,sendRemark:this.sendRemark},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							//签收成功
+							Toast.success('操作成功')
+
+							setTimeout(() => {
+								this.$router.push({path:'/Sign',query:{expressNo:this.expressNo}});
+								this.buttonDis = false
+							}, 2000)
+						}else{
+							Toast.fail('操作失败')
+							this.buttonDis = false
+						}
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+					this.buttonDis = false
+				})
+
+			},
+			//后端获取数据
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+
+				this.$http.post(this.$store.state.host+"/solic/getExpressDetail",{expressNo:this.expressNo,type:this.type},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+            console.log(res.body.msg);
+            console.log(res.body.expressInfo);
+						if(res.body.msg=='success'){
+							this.expressInfo = res.body.expressInfo
+						}
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+		},
+		mounted:function(){
+
+		}
+	}
+</script>
+
+<style scoped lang="less">
+  .tcshow{
+    padding: .3rem;
+    font-size: .26rem;
+    textarea{
+     width: 95%;
+     padding: 2.5%;
+     border:1px solid #dedede;
+     border-radius: .1rem;
+     margin: .3rem 0rem;
+     min-height: 1.5rem;
+    }
+    button{
+     background: #00c4b8;
+     border: none;
+     font-size: .26rem;
+     height: .8rem;
+     line-height: .8rem;
+     border-radius: .1rem;
+    }
+   }
+	.content{
+		padding: 0.25rem .37rem;
+		font-size: .3rem;
+		.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: .87rem;
+							height: .87rem;
+							position: relative;
+						}
+
+						div {
+							width: 4rem;
+							margin-left: .2rem;
+							display: inline-block;
+							line-height: 150%;
+							position: relative;
+							top: -.1rem;
+							p:nth-of-type(1) {
+								font-size: .28rem;
+								color: #333;
+								font-weight: bold;
+							}
+							p:nth-of-type(2) {
+								font-size: .22rem;
+							}
+						}
+					}
+					>p {
+						font-size: .24rem;
+						font-weight: bold;
+						display: flex;
+						align-items: center;
+					}
+					.staus1{
+						color: #f5693d;
+					}
+					.staus2{
+						color: #3d82f5;
+					}
+				}
+			}
+		}
+		.info {
+			padding: .4rem;
+			background: white;
+			line-height: 200%;
+			color: #666666;
+
+			.pjinfo {
+				margin-top: .1rem;
+				border-top: .01rem solid #f0efef;
+				padding-top: .1rem;
+			}
+		}
+	}
+</style>

+ 119 - 0
src/pages/login.vue

@@ -0,0 +1,119 @@
+<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="">忘记密码</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(){
+			
+		},
+		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/solic_login",{USERNAME: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);
+							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;
+				a{
+					color: #999999;
+				}
+				a:nth-of-type(1){
+					color: #02bfb3;
+				}
+			}
+		}
+	}
+</style>

+ 152 - 0
src/pages/my.vue

@@ -0,0 +1,152 @@
+<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="/Forgetpassword">
+        <img src="../assets/images/my_icon6.png" alt="">
+        <span>修改密码</span>
+      </router-link>
+    </div>
+
+    <div class="btn">
+    	<van-button color="#00c4b8" @click="loginout">退出登录</van-button>
+    </div>
+	</div>
+
+</template>
+
+<script>
+export default {
+    data() {
+      return {
+        titlename:"我的",
+        userId:"",
+        user:[],
+        headimgurl:''
+      };
+    },
+    created:function(){
+		this.isLogin();
+		this.userId = localStorage.getItem("userId");
+    console.log('userId:'+ this.userId);
+		this.getUser();
+		this.headimgurl = localStorage.getItem('headimgurl');
+    },
+    methods:{
+      //退出登录
+			loginout(){
+				localStorage.removeItem("userId");
+				localStorage.removeItem("openid");
+				window.location.href ='http://47.101.145.23/wuliu/ljy/';
+			}
+    }
+  };
+</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;
+	  }
+
+    }
+    .btn{
+    	padding: 0px .37rem;
+    	button{
+    		width: 100%;
+    		color: white;
+    	}
+    }
+  }
+</style>

+ 70 - 0
src/pages/personinfomation.vue

@@ -0,0 +1,70 @@
+<template>
+	<div>
+		<back :title="titlename"></back>
+		<!-- 表单 -->
+		<van-form >
+		  <van-field v-model="user.USERNAME" readonly type=""       name="用户名" label="用户名" placeholder="用户名" :rules="[{ required: false}]"/>
+		  <van-field v-model="user.NAME"     readonly type=""       name="姓名"   label="姓名"   placeholder="姓名"   :rules="[{ required: false}]"/>
+		  <van-field v-model="user.ROLE_ID"  readonly type=""       name="角色"   label="角色"   placeholder="角色"   :rules="[{ required: false}]"/>
+		  <van-field v-model="user.ROLE_IDS" readonly type=""       name="公司"   label="公司"   placeholder="公司"   :rules="[{ required: false}]"/>
+      <van-field v-model="user.PHONE"    readonly type="number" name="手机号" label="手机号" placeholder="手机号"  :rules="[{ required: false}]"/>
+		  <!-- <div style="margin: 16px;">
+		    <van-button round block type="info" native-type="submit">保存</van-button>
+		  </div> -->
+		</van-form>
+	</div>
+</template>
+
+<script>
+	import { Form,Toast,Field } from 'vant'
+	export default{
+		data(){
+			return {
+				titlename:"个人信息",
+				user:{},
+				userId:'',
+				departmenList:[],
+				show:false
+			}
+		},
+		created:function() {
+			this.userId = localStorage.getItem("userId");
+			this.getUser();
+		},
+		methods:{
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	/deep/.van-form{
+	  .van-button--info{
+	    background-color: #00c4b8;
+	    border: 1px solid #00c4b8;
+	    border-radius: 5px;
+	  }
+	  .m .van-field__label::before{
+		  content:"*";
+		  color: red;
+	  }
+	  .van-cell{
+	    font-size: .26rem;
+	    }
+	  .textarea{
+	    font-size: .26rem;
+	    padding: 10px 16px;
+	    color: #646566;
+	    textarea{
+	      width: 98%;
+	      height: 150px;
+	      border-color: #e5e5e5;
+	      color: #999999;
+	      margin-top: 16px;
+	      padding: 10px 1%;
+	    }
+	  }
+	}
+	/deep/.van-field__control{
+	  text-align: right;
+	}
+</style>

+ 605 - 0
src/pages/pjpc.vue

@@ -0,0 +1,605 @@
+<template>
+	<div>
+		<backindex :title="titlename"></backindex>
+		<p style="text-align: center;font-size: .36rem;margin-top: .2rem;">派件批次 {{dispatchBatchNo}}</p>
+		<div class="content">
+			<!-- table切换 -->
+			<div class="number">
+				<div class="swiper-container">
+				    <div class="swiper-wrapper">
+				        <!-- Slides -->
+				        <div v-for="item in resultList" class="swiper-slide">
+							<div>
+								<p>{{item.build}}/座</p>
+								<p>待派送 {{item.waitNum}}  已派送 {{item.alreadyNum}}</p>
+							</div>
+						</div>
+				    </div>
+
+				    <!-- 如果需要翻页按钮 -->
+				    <div class="swiper-button-prev">
+              <!-- <van-icon name="arrow-left" /> -->
+            </div>
+				    <div class="swiper-button-next">
+              <!-- <van-icon name="arrow" /> -->
+            </div>
+				</div>
+				<div id="mychart"></div>
+			</div>
+			<!-- 快件查询列表 -->
+			<van-checkbox-group v-model="result">
+				<van-cell-group>
+				<div class="jjlist" v-for="(item,index) in expressList">
+					<div class="listinfo">
+						<div class="list_top" @click="goInfo(item.expressNo)">
+							<div class="list_top_left">
+								<img src="../assets/images/ad_icon1.png" alt="">
+								<div>
+									<p>{{item.expressNo}}</p>
+									<p><span>收</span>{{item.recipient}}</p>
+									<p>{{item.build}} {{item.sendSeat}} {{item.floor}} {{item.mailRoom}}</p>
+								</div>
+							</div>
+							<!-- <p class="staus1" @click="slide">{{options}}</p> 0-待签收 1-已签收、2-代收、3-拒收、4-延迟',-->
+							<p class="staus1" v-if="item.signinStatus == 0">待签收</p>
+							<p class="staus1" v-if="item.signinStatus == 1">本人签收</p>
+							<p class="staus2" v-if="item.signinStatus == 2">他人代收</p>
+							<p class="staus2" v-if="item.signinStatus == 3">拒收</p>
+							<p class="staus2" v-if="item.signinStatus == 4">滞留件</p>
+              <p class="staus2" v-if="item.signinStatus == 5">问题件</p>
+						</div>
+					</div>
+					<!-- <div>
+						<van-checkbox :disabled="item.signinStatus != 0" checked-color="#00c4b8" :name="item.expressNo" ref="checkboxes" />
+					</div> -->
+				</div>
+				</van-cell-group>
+			</van-checkbox-group>
+			<!-- <div style="margin-top: 16px;">
+				<van-field readonly clickable name="picker" :value="phone" label="收件人手机" placeholder="输入手机号后四位查询" @click="addshow1=true"/>
+				<van-field readonly type="text" v-model="recipient" label="收件人" />
+				<van-button color="#00c4b8" block type="info" @click="signSave">合并签收</van-button>
+			</div> -->
+
+			<!-- 填写手机号码 -->
+			<!-- <van-popup round v-model="addshow1" class="whrite_add2" closeable @closed="close" :close-on-click-overlay="false">
+				<div>
+					<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">填写号码</p>
+					<van-form @submit="onSubmit">
+					  <van-field v-model="phone" name="收件人手机" label="收件人手机" type="number" maxlength="20" placeholder="输入手机号后四位" @change="searchList()"/>
+					  <ul>
+						  <li v-for="(item,i) in employeeList" @click="choose(i,item)">
+							<p>{{item.name}}</p>
+							<p>{{item.department}}</p>
+							<van-icon v-if="index == i" name="passed" />
+						  </li>
+					  </ul>
+					  <div style="margin-top: 16px;">
+					    <van-button color="#00c4b8" block type="info" native-type="submit">确定</van-button>
+					  </div>
+					</van-form>
+				</div>
+			</van-popup> -->
+		</div>
+		<!-- 选择下拉 -->
+		<!-- <van-popup v-model="showPicker" position="bottom">
+		  <van-picker title="" show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showPicker=false" />
+		</van-popup> -->
+		<!-- 筛选 -->
+		<!-- <van-popup round v-model="addshow" class="whrite_add" closeable>
+			<div>
+				<p style="font-size: 16px;text-align: center;margin-bottom: 16px;">筛选</p>
+				<van-form @submit="search">
+				  <van-field v-model="box" name="寄包柜" label="寄包柜" placeholder="请选择" readonly/>
+				  <van-field v-model="name" name="收件人" label="收件人" placeholder="请输入收件人"/>
+				  <van-field v-model="starttime" name="开始时间" label="开始时间" placeholder="请选择" readonly @click="time(1)"/>
+				  <van-field v-model="endtime" name="结束时间" label="结束时间" placeholder="请选择" readonly @click="time(2)"/>
+				  <van-field v-model="staus" name="状态" label="状态" placeholder="请选择" readonly @click="ztshow=true"/>
+				  <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="timeshow" position="bottom">
+			<van-datetime-picker
+			  v-model="currentDate"
+			  type="datetime"
+			  title="选择时间"
+			  :min-date="minDate"
+			  @confirm="timedate"
+			  @cancel="timeshow=false"
+			/>
+		</van-popup> -->
+		<!-- 状态 -->
+		<!-- <van-popup v-model="ztshow" position="bottom">
+			<van-picker title="标状态" show-toolbar :columns="ztlist" @confirm="zt" @cancel="ztshow=false"/>
+		</van-popup> -->
+
+	</div>
+</template>
+
+<script>
+	import {Toast,Dialog,Checkbox,CheckboxGroup} from 'vant'
+	import Swiper from 'swiper'
+	export default{
+		data(){
+			return{
+				result:[],
+				titlename:"派件批次",
+				showPicker:false,
+				columns:["未派件","待派件"],
+				options:"待揽件",
+				addshow:false,
+				addshow1:false,
+				name:"",
+				timeshow:false,
+				box:"",
+				starttime:"",
+				endtime:"",
+				staus:"",
+				currentDate:"",
+				minDate:new Date(),
+				timetype:"",//时间类别1开始、2结束
+				ztshow:false,
+				ztlist:["状态一","状态二"],
+				total:"",
+				resultList:[],//楼道统计列表
+				expressList:[],//快件列表
+				dispatchBatchNo:'',//批次号
+				employeeList:[],//收件人列表
+				phone:'',//手机号
+				recipient:'',//收件人
+				index:'-1',
+				yiPaiSong:'',
+			}
+		},
+		updated:function(){
+
+		},
+		created:function(){
+			this.isLogin();
+		},
+		methods:{
+			// //合并签收
+			// signSave(){
+			// 	if(this.result.length == 0){
+			// 		Toast('请选择需要合并的快递!');
+			// 		return;
+			// 	}
+			// 	if(this.recipient == ''){
+			// 		Toast('请选择收件人!');
+			// 		return;
+			// 	}
+			// 	this.$http.post(this.$store.state.host+"/solic/marginSignExpress",
+			// 	{expressNoList:this.result.join(','),
+			// 	collectAgent:this.recipient},{emulateJSON:true})
+			// 		.then(res=>{
+			// 			//发送成功
+			// 			if(res.body.msg=='success'){
+			// 				Toast("合并签收成功!");
+			// 				setTimeout(()=>{
+			// 				    this.getData();
+			// 				    this.result = [];
+			// 				    this.recipient = '';
+			// 				    this.phone = '';
+			// 				},1200)
+
+			// 			}else{
+			// 				Toast("合并签收失败!");
+			// 			}
+			// 	},res=>{
+			// 			//发送失败
+			// 		Toast("网络错误!")
+			// 	})
+			// },
+			// //选择员工
+			// choose(val,item){
+			// 	this.index = val
+			// 	this.recipient = item.name
+			// 	this.phone = item.phone
+			// },
+			// //手机号后四位搜索
+			// searchList(){
+			// 	this.$http.post(this.$store.state.host+"/solic/getEmployeeInfoByPhone",{
+   //        phone:this.phone,
+   //        },{
+   //          emulateJSON:true,
+   //          })
+			// 		.then(res=>{
+			// 			//发送成功
+			// 			if(res.body.msg=='success'){
+			// 				this.employeeList = res.body.employeeList
+			// 			}
+			// 	},res=>{
+			// 			//发送失败
+			// 		Toast("网络错误!")
+			// 	})
+			// },
+
+      //跳转详情
+      goInfo(expressNo){
+        //收件查询
+      	this.$router.push({path:'/Kjsearchinfo',query:{expressNo:expressNo,type:1}})
+
+      },
+			// onSubmit(){
+			// 	if(this.recipient == ''){
+			// 		Toast('请选择收件人')
+			// 		return
+			// 	}
+			// 	this.addshow1=false
+			// 	//this.tjshow=true
+			// },
+			close(){
+				//this.phone = ''
+				//this.name = ''
+				//this.department = ''
+				this.index = ''
+			},
+			toggle(index) {
+			    this.$refs.checkboxes[index].toggle();
+			},
+			//获取数据
+			getData(){
+				Toast.loading({
+				    message: '加载中...',
+				    forbidClick: true,
+				    duration:0
+				});
+				this.$http.post(this.$store.state.host+"/solic/getExpressListByBatchNo",{mailRoomId: localStorage.getItem('roomId')},{emulateJSON:true})
+					.then(res=>{
+						//发送成功
+						if(res.body.msg=='success'){
+							this.resultList = res.body.resultList;
+							this.expressList = res.body.expressList;
+							this.dispatchBatchNo = res.body.dispatchBatchNo;
+							this.yiPaiSong = res.body.yiPaiSong;
+							this.total = res.body.total;
+							this.echart();
+						}else if(res.body.msg=='未获取到批次'){
+              Toast(res.body.msg)
+            }
+				},res=>{
+						//发送失败
+					Toast("网络错误!")
+				})
+				Toast.clear()
+			},
+			// // 下拉选择属性
+			// slide(){
+			// 	this.showPicker=true
+			// },
+			// // 下拉选择赋值
+			// onConfirm(e){
+			// 	this.options=e
+			// 	this.showPicker=false
+			// },
+			search(){},
+			timedate(e){
+				var date=new Date(e)
+				var year=date.getFullYear()
+				var month=date.getMonth()+1
+				month=month>9?month:'0'+month
+				var day=date.getDate()
+				day=day>9?day:'0'+day
+				var hour=date.getHours()
+				hour=hour>9?hour:'0'+hour
+				var minute=date.getMinutes()
+				minute=minute>9?minute:'0'+minute
+				console.log(month)
+				if(this.timetype==1){
+					this.starttime=year+'-'+month+'-'+day+' '+hour+':'+minute
+				}
+				if(this.timetype==2){
+					this.endtime=year+'-'+month+'-'+day+' '+hour+':'+minute
+				}
+				this.timeshow=false
+
+			},
+			time(obj){
+				this.timeshow=true
+				this.timetype=obj
+
+			},
+			// 状态显示
+			zt(e){
+				this.staus=e
+				this.ztshow=false
+			},
+			echart(){
+				let myChart = this.$echarts.init(document.getElementById('mychart'))
+				var option = {
+				    tooltip: {
+				        trigger: 'item',
+						//show: false,
+				    },
+				    legend: {
+						show:false,
+				        top: '30%',
+				        right: '5%',
+						orient: 'vertical',
+						icon: 'circle',
+				    },
+				    series: [
+				        {
+				            name: '派送数据',
+				            type: 'pie',
+							center:["55%","50%"],
+				            radius: ['80%', '90%'],
+				            avoidLabelOverlap: false,
+				            label: {
+				               normal: {
+				                    show: true,
+				                    position: 'center',
+				                    color:'#4c4a4a',
+				                    formatter: '{active|派送率}'+'\n\r' + '{total|' + Number(this.yiPaiSong/this.total*100).toFixed(2) +'%}',
+				                    rich: {
+				                        total:{
+			                            fontSize: 18,
+										fontWeight:'bold',
+			                            color:'#00c4b8'
+			                        },
+			                        active: {
+			                            fontSize: 12,
+			                            color:'#6c7a89',
+			                            lineHeight:30,
+			                        },
+				                    }
+				                },
+				                emphasis: {//中间文字显示
+				                    show: true,
+				                }
+				            },
+							color:['#00c4b8','#e1fcfa'],
+				            // emphasis: {
+				            //     label: {
+				            //         show: false,
+				            //         fontSize: '40',
+				            //         fontWeight: 'bold'
+				            //     }
+				            // },
+				            labelLine: {
+				                show: false
+				            },
+				            data: [
+								{value: this.yiPaiSong, name: '签收成功'},
+								{value: this.total-this.yiPaiSong, name: '待派送'},
+							]
+				        }
+				    ]
+				}
+				myChart.setOption(option)
+				window.addEventListener("resize", () => {myChart.resize();})
+			},
+			swiper(){
+				var mySwiper = new Swiper(".swiper-container", {
+				  direction: 'vertical',//垂直滚动
+				  //speed: 400,//过渡时间
+				  loop: false,//循环
+				  //observer:true,
+				  autoplay:false,
+				  // autoplay: {
+				  //   delay: 5000,//自动滚动|时间
+				  // },
+				  nextButton: '.swiper-button-next',
+				  prevButton: '.swiper-button-prev',
+				});
+			}
+		},
+		mounted:function(){
+			this.getData();
+			this.swiper()
+			/* setTimeout(()=>{
+			    this.echart()
+			},1000) */
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.content{
+		padding: 0.25rem .37rem;
+		.number{
+			background: white;
+			padding: .33rem;
+			border-radius: .05rem;
+			font-size: .3rem;
+			margin-bottom: .2rem;
+			display: flex;
+			justify-content: space-between;
+			.swiper-container{
+				width: 50%;
+				height: 2.8rem;
+				overflow: hidden;
+				.swiper-slide{
+					height: 1.2rem !important;
+					margin-bottom: .2rem;
+					background: #ebfaf9;
+					align-items: center;
+					display: flex;
+					flex-wrap: wrap;
+					text-align: center;
+					div{
+						width: 100%;
+						p{
+							display: block;
+							text-align: center;
+						}
+						p:nth-of-type(1){
+							font-size: .3rem;
+							margin-bottom: .1rem;
+						}
+						p:nth-of-type(2){
+							font-size: .24rem;
+						}
+					}
+				}
+
+			}
+			#mychart{
+				width: 50%;
+				height: 2.8rem;
+			}
+		}
+		.sm{
+			margin-bottom: .2rem;
+			/deep/.van-search{
+				width: 100%;
+				height: .76rem;
+				border-radius: 25px;
+				overflow: hidden;
+				padding: 0rem;
+				background-color: white;
+				.van-search__content{
+					background-color: white;
+				}
+				input{
+					background-color: white;
+				}
+			}
+			img{
+				width:.4rem;
+				height: .4rem;
+				position: relative;
+				top: .18rem;
+			}
+		}
+		.jjlist {
+			display: flex;
+			align-items: center;
+			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: 3.5rem;
+							margin-left: .2rem;
+							display: inline-block;
+							position: relative;
+							p:nth-of-type(1) {
+								font-size: .28rem;
+								color: #333;
+								font-weight: bold;
+							}
+							p:nth-of-type(2) {
+								font-size: .22rem;
+								margin: .1rem 0rem;
+								display: flex;
+								align-items: center;
+								span{
+									background: #fa9c22;
+									color: white;
+									border-radius:50% ;
+									display: inline-block;
+									width: .4rem;
+									height: .4rem;
+									text-align: center;
+									line-height: .4rem;
+									margin-right: .1rem;
+								}
+							}
+							p:nth-of-type(3) {
+								font-size: .22rem;
+							}
+						}
+					}
+					>p {
+						font-size: .24rem;
+						font-weight: bold;
+						display: flex;
+						align-items: center;
+					}
+					>p:after{
+						display: none !important;
+						content: "";
+						width: .1rem;
+						height: .1rem;
+						display: inline-block;
+						border-right: .01rem solid #7a7a7a;
+						border-bottom: .01rem solid #7a7a7a;
+						transform: rotate(45deg);
+						position: relative;
+						margin-left: .05rem;
+						top: -.02rem;
+					}
+					.staus1{
+						color: #f5693d;
+					}
+					.staus2{
+						color: #3d82f5;
+					}
+				}
+			}
+		}
+	}
+	.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;
+		}
+	}
+
+	.whrite_add2{
+		width: 6.6rem;
+		padding: .4rem .2rem;
+		font-size: .3rem;
+		/deep/.van-field__value{
+			input{
+				text-align: right;
+			}
+
+		}
+		/deep/.van-popup__close-icon--top-right{
+			top: 5px;
+			right: 10px;
+		}
+		ul{
+			li{
+				padding: 10px 36px 10px 16px;
+				display: flex;
+				justify-content: space-between;
+				position: relative;
+				i{
+					position: absolute;
+					right: 0px;
+					top:.25rem
+
+				}
+				i:before{
+					background: #00c4b8;
+					color: white;
+					border-radius: 50%;
+				}
+			}
+		}
+	}
+
+</style>

+ 405 - 0
src/pages/sign.vue

@@ -0,0 +1,405 @@
+<template>
+	<!-- 手写签名组件 -->
+	<div class="page sign-page">
+		<div class="content">
+			<!-- <p class="title">签收</p> -->
+
+      <div class="sm">
+        <p class="title" style="text-align: center;">签收</p>
+        <!-- <img src="../assets/images/phone.jpg" alt="" @click="chooseImage()"/> -->
+        <van-uploader  :after-read="afterRead">
+          <img src="../assets/images/phone.jpg"/>
+        </van-uploader>
+      </div>
+
+			<div class="whrite-content">
+				<p>快递单号:{{expressNo}}</p>
+
+				<div class="sign-wrap" id="signWrap" v-if="isOrNo == 0">
+					<canvas id="myCanvas" width="400px" height="100%"></canvas>
+				</div>
+
+        <div class="sign-wrap"  style="display: flex; align-items: center;" v-else>
+        	<img style="width: 100%;" :src="phoneImage"/>
+        </div>
+
+        <van-field type="text" v-model="remark" label="快递备注" placeholder="输入快递备注" />
+				<div class="con-btn">
+					<span class="staging-btn size14" @click="clearArea()">清除</span>
+					<span class="submit-btn size14" @click="saveSign()">确认</span>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+</template>
+
+<script>
+	import {
+		Toast,
+		Dialog
+	} from 'vant'
+  import wx from "weixin-jsapi"
+	export default {
+		name: "signature",
+		data() {
+			return {
+				image: "",
+        phoneImage:"",
+				mousePressed: false,
+				c: "",
+				ctx: "",
+				lastX: 0,
+				lastY: 0,
+        isOrNo: 0,
+				expressNo: '',
+        remark: '', //快递备注
+        File:'',
+			};
+		},
+		created() {
+			this.isLogin();
+			this.expressNo = this.$route.query.expressNo
+		},
+		mounted() {
+			this.image = "";
+			this.mousePressed = false;
+			var lastX, lastY;
+			this.ctx = document.getElementById("myCanvas").getContext("2d");
+			this.c = document.getElementById("myCanvas");
+			var signWrap = document.getElementById("signWrap");
+			this.c.width = signWrap.clientWidth; // 设置宽度
+			this.c.height = signWrap.clientHeight; // 设置高度
+			// 监听touchstart事件,touchmove事件,touchend事件等事件
+			this.InitThis();
+		},
+		methods: {
+      //限制
+      onOversize(file){
+      	Toast('文件大小不能超过 50M');
+      },
+      //图片上传
+      afterRead(file){
+        this.isOrNo = 1
+        this.phoneImage = file.content
+        this.File = file.file
+      },
+			InitThis() {
+				// 触摸屏
+				var that = this;
+				this.c.addEventListener(
+					"touchstart",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,重要
+							var touch = event.targetTouches[0];
+							this.mousePressed = true;
+							that.Draw(
+								touch.pageX - this.offsetLeft,
+								touch.pageY - this.offsetTop,
+								false
+							);
+						}
+					},
+					false
+				);
+				this.c.addEventListener(
+					"touchmove",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,重要
+							var touch = event.targetTouches[0];
+							if (this.mousePressed) {
+								that.Draw(
+									touch.pageX - this.offsetLeft,
+									touch.pageY - this.offsetTop,
+									true
+								);
+							}
+						}
+					},
+					false
+				);
+				this.c.addEventListener(
+					"touchend",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,防止手写的时候拖动屏幕,重要
+							this.mousePressed = false;
+						}
+					},
+					false
+				);
+				// 鼠标
+				this.c.onmousedown = function(event) {
+					this.mousePressed = true;
+					that.Draw(
+						event.pageX - this.offsetLeft,
+						event.pageY - this.offsetTop,
+						false
+					);
+				};
+				this.c.onmousemove = function(event) {
+					if (this.mousePressed) {
+						that.Draw(
+							event.pageX - this.offsetLeft,
+							event.pageY - this.offsetTop,
+							true
+						);
+					}
+				};
+				this.c.onmouseup = function(event) {
+					this.mousePressed = false;
+				};
+			},
+			Draw(x, y, isDown) {
+				if (isDown) {
+					this.ctx.beginPath();
+					this.ctx.strokeStyle = "#000"; // 颜色
+					this.ctx.lineWidth = 3; // 线宽
+					this.ctx.lineJoin = "round";
+					this.ctx.lineMax = 10; // 设置画笔最大线宽
+					this.ctx.lineMin = 3; // 设置画笔最小线宽
+					this.ctx.linePressure = 1.2; // 设置画笔笔触压力
+					this.ctx.smoothness = 30; // 设置画笔笔触大小变化的平滑度
+					this.ctx.moveTo(this.lastX, this.lastY);
+					this.ctx.lineTo(x, y);
+					this.ctx.closePath();
+					this.ctx.stroke();
+				}
+				this.lastX = x;
+				this.lastY = y;
+			},
+			// 清空画板
+			clearArea() {
+        if(this.isOrNo == 0){//画板
+          this.ctx.setTransform(1, 0, 0, 1, 0, 0);
+          this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
+        }else{
+          this.phoneImage = ''
+          this.isOrNo = 0;
+          setTimeout(() => {
+          	this.image = "";
+          	this.mousePressed = false;
+          	var lastX, lastY;
+          	this.ctx = document.getElementById("myCanvas").getContext("2d");
+          	this.c = document.getElementById("myCanvas");
+          	var signWrap = document.getElementById("signWrap");
+          	this.c.width = signWrap.clientWidth; // 设置宽度
+          	this.c.height = signWrap.clientHeight; // 设置高度
+          	// 监听touchstart事件,touchmove事件,touchend事件等事件
+          	this.InitThis();
+          }, 300)
+        }
+
+			},
+			// 提交签名
+			saveSign() {
+        if(this.isOrNo == 0){
+          this.checkEmpty(); // 调用 表单非空验证
+        }else{
+          console.log("拍照上传文件:" + this.File)
+
+          Toast.loading({duration: 0,forbidClick: true, message: "上传中..." });
+               	let fd=new FormData()
+               	let signType = '2';
+               	fd.append("file",this.File)
+               	fd.append("expressNo", this.expressNo);
+               	fd.append("signType", signType);
+               	fd.append("remark",this.remark);
+               	this.$http.post(this.$store.state.host + "/solic/uploadpict", fd,{ emulateJSON: true })
+               	.then(res => {
+               	   //发送成功
+               	   if (res.body.msg == 'success') {
+               	   	//签收成功
+               	   	Toast.success('签收成功')
+                    setTimeout(() => {
+                    	this.$router.push({
+                    		path: '/',
+                    		query: {}
+                    	});
+                    }, 2000)
+               	   } else {
+               	   	Toast.fail('签收失败')
+               	   }
+               	},res=>{
+
+               	});
+        }
+
+			},
+			checkEmpty() {
+				var c = document.getElementById("myCanvas"); // 获取html的canvas对象,我这个id="myCanvas"
+				if (this.isCanvasBlank(c)) {
+					Toast("请在签名区域签名后再次确认");
+					return;
+				} else {
+					var image = this.c.toDataURL("image/png"); // 得到生成后的签名base64位  url 地址
+					// 调用
+					/* let blob = this.dataURLtoBlob(image);
+					let file = this.blobToFile(blob, this.expressNo + ".jpg");
+					console.log(file) */
+					let signType = '2';
+					var file = this.dataURLtoFile(image, this.expressNo + signType +".jpg");
+					let fd = new FormData();
+					fd.append("files", file);
+          console.log("签字上传文件:" + file)
+					fd.append("expressNo", this.expressNo);
+					fd.append("signType", signType);
+          fd.append("remark",this.remark);
+					this.$http.post(this.$store.state.host + "/solic/saveEnclosureImg.do", fd)
+						.then(res => {
+							//发送成功
+							if (res.body.msg == 'success') {
+								//签收成功
+								Toast.success('签字成功')
+
+								setTimeout(() => {
+									this.$router.push({
+										path: '/',
+										query: {}
+									});
+								}, 2000)
+							} else {
+								Toast.fail('签字失败')
+							}
+						}, res => {
+							//发送失败
+							Toast("网络错误!")
+						})
+				}
+			},
+			// 验证canvas画布是否为空函数
+			isCanvasBlank(canvas) {
+				var blank = document.createElement("canvas"); // 系统获取一个空canvas对象
+				blank.width = canvas.width;
+				blank.height = canvas.height;
+				return canvas.toDataURL() == blank.toDataURL(); // 比较值相等则为空
+			},
+			// 将base64转换为blob
+			dataURLtoBlob(dataurl) {
+				let arr = dataurl.split(","),
+					mime = arr[0].match(/:(.*?);/)[1],
+					bstr = atob(arr[1]),
+					n = bstr.length,
+					u8arr = new Uint8Array(n);
+				while (n--) {
+					u8arr[n] = bstr.charCodeAt(n);
+				}
+				return new Blob([u8arr], {
+					type: mime
+				});
+			},
+			// 将blob转换为file
+			blobToFile(theBlob, fileName) {
+				theBlob.lastModifiedDate = new Date();
+				theBlob.name = fileName;
+				return theBlob;
+			},
+			//将base64转换为文件
+			dataURLtoFile(dataurl, filename) {
+				var arr = dataurl.split(','),
+					mime = arr[0].match(/:(.*?);/)[1],
+					bstr = atob(arr[1]),
+					n = bstr.length,
+					u8arr = new Uint8Array(n);
+				while (n--) {
+					u8arr[n] = bstr.charCodeAt(n);
+				}
+				return new File([u8arr], filename, {
+					type: mime
+				});
+			},
+
+      //=======================结束======================
+		},
+	};
+</script>
+
+<style lang="less" scoped>
+	.page {
+		// width: 400px;
+		padding-bottom: .3rem;
+
+		.content {
+			text-align: center;
+			padding: 0rem .37rem;
+      .sm {
+        display: flex;
+        margin-bottom: .2rem;
+        justify-content: space-between;
+        align-items: center;
+
+        img {
+          width: .4rem;
+          height: .4rem;
+
+        }
+      }
+
+			.title {
+				font-size: .36rem;
+				padding: .3rem 0rem;
+			}
+
+			.whrite-content {
+				background: white;
+				width: 100%;
+				margin: 0 auto;
+				padding: .3rem 0rem;
+				border-radius: .05rem;
+
+				>p {
+					font-size: .3rem;
+					text-align: left;
+					width: 85%;
+					display: block;
+					margin: 0 auto;
+					padding-bottom: .3rem;
+				}
+			}
+
+			background-size: 100% 100%;
+			background-position: center center;
+
+			.sign-wrap {
+				box-shadow: 0px 0px .1rem #e3e3e3;
+				width: 85%;
+				margin: 0 auto;
+				height: 400px;
+			}
+		}
+
+		.con-btn {
+			width: 85%;
+			margin: .5rem auto 0px;
+			display: flex;
+			align-content: center;
+			justify-content: space-between;
+			opacity: 0.75;
+
+			span {
+				font-size: 0.14rem;
+				width: 45%;
+				height: 0.48rem;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding: .2rem 0rem;
+				border-radius: .05rem;
+			}
+
+			.staging-btn {
+				color: #02bfb3;
+				background: #fff;
+				border: .01rem solid #02bfb3
+			}
+
+			.submit-btn {
+				color: #fff;
+				background: #02bfb3;
+			}
+		}
+	}
+</style>

+ 399 - 0
src/pages/sign2.vue

@@ -0,0 +1,399 @@
+<template>
+	<!-- 手写签名组件 -->
+	<div class="page sign-page">
+		<div class="content">
+
+			<div class="sm">
+			  <p class="title" style="text-align: center;">签收</p>
+			  <!-- <img src="../assets/images/phone.jpg" alt="" @click="chooseImage()"/> -->
+			  <van-uploader  :after-read="afterRead">
+			    <img src="../assets/images/phone.jpg"/>
+			  </van-uploader>
+			</div>
+
+			<div class="whrite-content">
+				<p>快递单号:{{expressNoList}}</p>
+				<div class="sign-wrap" id="signWrap" v-if="isOrNo == 0">
+					<canvas id="myCanvas" width="400px" height="100%"></canvas>
+				</div>
+
+        <div class="sign-wrap"  style="display: flex; align-items: center;" v-else>
+        	<img style="width: 100%;" :src="phoneImage"/>
+        </div>
+
+        <van-field type="text" v-model="remark" label="快递备注" placeholder="输入快递备注" />
+				<div class="con-btn">
+					<span class="staging-btn size14" @click="clearArea()">清除签名</span>
+					<span class="submit-btn size14" @click="saveSign()">确认签名</span>
+				</div>
+			</div>
+
+		</div>
+
+	</div>
+</template>
+
+<script>
+	import {
+		Toast,
+		Dialog
+	} from 'vant'
+	export default {
+		name: "signature",
+		data() {
+			return {
+				image: "",
+				mousePressed: false,
+				c: "",
+				ctx: "",
+				lastX: 0,
+				lastY: 0,
+				expressNoList: '',
+        phoneImage:"",
+        isOrNo: 0,
+        File:'',
+        remark: '', //快递备注
+			};
+		},
+		created() {
+			this.isLogin();
+			this.expressNoList = this.$route.query.expressNoList
+		},
+		mounted() {
+			this.image = "";
+			this.mousePressed = false;
+			var lastX, lastY;
+			this.ctx = document.getElementById("myCanvas").getContext("2d");
+			this.c = document.getElementById("myCanvas");
+			var signWrap = document.getElementById("signWrap");
+			this.c.width = signWrap.clientWidth; // 设置宽度
+			this.c.height = signWrap.clientHeight; // 设置高度
+			// 监听touchstart事件,touchmove事件,touchend事件等事件
+			this.InitThis();
+		},
+		methods: {
+      //限制
+      onOversize(file){
+      	Toast('文件大小不能超过 50M');
+      },
+      //图片上传
+      afterRead(file){
+        this.isOrNo = 1
+        this.phoneImage = file.content
+        this.File = file.file
+      },
+			InitThis() {
+				// 触摸屏
+				var that = this;
+				this.c.addEventListener(
+					"touchstart",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,重要
+							var touch = event.targetTouches[0];
+							this.mousePressed = true;
+							that.Draw(
+								touch.pageX - this.offsetLeft,
+								touch.pageY - this.offsetTop,
+								false
+							);
+						}
+					},
+					false
+				);
+				this.c.addEventListener(
+					"touchmove",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,重要
+							var touch = event.targetTouches[0];
+							if (this.mousePressed) {
+								that.Draw(
+									touch.pageX - this.offsetLeft,
+									touch.pageY - this.offsetTop,
+									true
+								);
+							}
+						}
+					},
+					false
+				);
+				this.c.addEventListener(
+					"touchend",
+					function(event) {
+						if (event.targetTouches.length == 1) {
+							event.preventDefault(); // 阻止浏览器默认事件,防止手写的时候拖动屏幕,重要
+							this.mousePressed = false;
+						}
+					},
+					false
+				);
+				// 鼠标
+				this.c.onmousedown = function(event) {
+					this.mousePressed = true;
+					that.Draw(
+						event.pageX - this.offsetLeft,
+						event.pageY - this.offsetTop,
+						false
+					);
+				};
+				this.c.onmousemove = function(event) {
+					if (this.mousePressed) {
+						that.Draw(
+							event.pageX - this.offsetLeft,
+							event.pageY - this.offsetTop,
+							true
+						);
+					}
+				};
+				this.c.onmouseup = function(event) {
+					this.mousePressed = false;
+				};
+			},
+			Draw(x, y, isDown) {
+				if (isDown) {
+					this.ctx.beginPath();
+					this.ctx.strokeStyle = "#000"; // 颜色
+					this.ctx.lineWidth = 3; // 线宽
+					this.ctx.lineJoin = "round";
+					this.ctx.lineMax = 10; // 设置画笔最大线宽
+					this.ctx.lineMin = 3; // 设置画笔最小线宽
+					this.ctx.linePressure = 1.2; // 设置画笔笔触压力
+					this.ctx.smoothness = 30; // 设置画笔笔触大小变化的平滑度
+					this.ctx.moveTo(this.lastX, this.lastY);
+					this.ctx.lineTo(x, y);
+					this.ctx.closePath();
+					this.ctx.stroke();
+				}
+				this.lastX = x;
+				this.lastY = y;
+			},
+			// 清空画板
+			clearArea() {
+				if(this.isOrNo == 0){//画板
+				  this.ctx.setTransform(1, 0, 0, 1, 0, 0);
+				  this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
+				}else{
+				  this.phoneImage = ''
+				  this.isOrNo = 0;
+				  setTimeout(() => {
+				  	this.image = "";
+				  	this.mousePressed = false;
+				  	var lastX, lastY;
+				  	this.ctx = document.getElementById("myCanvas").getContext("2d");
+				  	this.c = document.getElementById("myCanvas");
+				  	var signWrap = document.getElementById("signWrap");
+				  	this.c.width = signWrap.clientWidth; // 设置宽度
+				  	this.c.height = signWrap.clientHeight; // 设置高度
+				  	// 监听touchstart事件,touchmove事件,touchend事件等事件
+				  	this.InitThis();
+				  }, 300)
+				}
+
+			},
+			// 提交签名
+			saveSign() {
+				if(this.isOrNo == 0){
+				  this.checkEmpty(); // 调用 表单非空验证
+				}else{
+				  console.log("拍照上传文件:" + this.File)
+
+				  Toast.loading({duration: 0,forbidClick: true, message: "上传中..." });
+				       	let fd=new FormData()
+				       	let signType = '2';
+				       	fd.append("file",this.File)
+				       	fd.append("expressNoList", this.expressNoList);
+				       	fd.append("signType", signType);
+				       	fd.append("remark",this.remark);
+				       	this.$http.post(this.$store.state.host + "/solic/uploadpict2", fd,{ emulateJSON: true })
+				       	.then(res => {
+				       	   //发送成功
+				       	   if (res.body.msg == 'success') {
+				       	   	//签收成功
+				       	   	Toast.success('签收成功')
+				            setTimeout(() => {
+				            	this.$router.push({
+				            		path: '/',
+				            		query: {}
+				            	});
+				            }, 2000)
+				       	   } else {
+				       	   	Toast.fail('签收失败')
+				       	   }
+				       	},res=>{
+
+				       	});
+				}
+			},
+			checkEmpty() {
+				var c = document.getElementById("myCanvas"); // 获取html的canvas对象,我这个id="myCanvas"
+				if (this.isCanvasBlank(c)) {
+					Toast("请在签名区域签名后再次确认");
+					return;
+				} else {
+					var image = this.c.toDataURL("image/png"); // 得到生成后的签名base64位  url 地址
+					// 调用
+					/* let blob = this.dataURLtoBlob(image);
+					let file = this.blobToFile(blob, this.expressNo + ".jpg");
+					console.log(file) */
+					let signType = '2';
+					var file = this.dataURLtoFile(image, this.expressNo + signType +".jpg");
+					let fd = new FormData();
+					fd.append("files", file);
+					fd.append("expressNoList", this.expressNoList);
+					fd.append("signType", signType);
+          fd.append("remark",this.remark);
+					this.$http.post(this.$store.state.host + "/solic/saveEnclosureImg2.do", fd)
+						.then(res => {
+							//发送成功
+							if (res.body.msg == 'success') {
+								//签收成功
+								Toast.success('签字成功')
+
+								setTimeout(() => {
+									this.$router.push({
+										path: '/',
+										query: {}
+									});
+								}, 2000)
+							} else {
+								Toast.fail('签字失败')
+							}
+						}, res => {
+							//发送失败
+							Toast("网络错误!")
+						})
+				}
+			},
+			// 验证canvas画布是否为空函数
+			isCanvasBlank(canvas) {
+				var blank = document.createElement("canvas"); // 系统获取一个空canvas对象
+				blank.width = canvas.width;
+				blank.height = canvas.height;
+				return canvas.toDataURL() == blank.toDataURL(); // 比较值相等则为空
+			},
+			// 将base64转换为blob
+			dataURLtoBlob(dataurl) {
+				let arr = dataurl.split(","),
+					mime = arr[0].match(/:(.*?);/)[1],
+					bstr = atob(arr[1]),
+					n = bstr.length,
+					u8arr = new Uint8Array(n);
+				while (n--) {
+					u8arr[n] = bstr.charCodeAt(n);
+				}
+				return new Blob([u8arr], {
+					type: mime
+				});
+			},
+			// 将blob转换为file
+			blobToFile(theBlob, fileName) {
+				theBlob.lastModifiedDate = new Date();
+				theBlob.name = fileName;
+				return theBlob;
+			},
+			//将base64转换为文件
+			dataURLtoFile(dataurl, filename) {
+				var arr = dataurl.split(','),
+					mime = arr[0].match(/:(.*?);/)[1],
+					bstr = atob(arr[1]),
+					n = bstr.length,
+					u8arr = new Uint8Array(n);
+				while (n--) {
+					u8arr[n] = bstr.charCodeAt(n);
+				}
+				return new File([u8arr], filename, {
+					type: mime
+				});
+			},
+		},
+	};
+</script>
+
+<style lang="less" scoped>
+	.page {
+		// width: 400px;
+		padding-bottom: .3rem;
+
+		.content {
+			text-align: center;
+			padding: 0rem .37rem;
+
+      .sm {
+        display: flex;
+        margin-bottom: .2rem;
+        justify-content: space-between;
+        align-items: center;
+
+        img {
+          width: .4rem;
+          height: .4rem;
+
+        }
+      }
+
+			.title {
+				font-size: .36rem;
+				padding: .3rem 0rem;
+			}
+
+			.whrite-content {
+				background: white;
+				width: 100%;
+				margin: 0 auto;
+				padding: .3rem 0rem;
+				border-radius: .05rem;
+
+				>p {
+					font-size: .3rem;
+					text-align: left;
+					width: 85%;
+					display: block;
+					margin: 0 auto;
+					padding-bottom: .3rem;
+				}
+			}
+
+			background-size: 100% 100%;
+			background-position: center center;
+
+			.sign-wrap {
+				box-shadow: 0px 0px .1rem #e3e3e3;
+				width: 85%;
+				margin: 0 auto;
+				height: 400px;
+			}
+		}
+
+		.con-btn {
+			width: 85%;
+			margin: .5rem auto 0px;
+			display: flex;
+			align-content: center;
+			justify-content: space-between;
+			opacity: 0.75;
+
+			span {
+				font-size: 0.14rem;
+				width: 45%;
+				height: 0.48rem;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding: .2rem 0rem;
+				border-radius: .05rem;
+			}
+
+			.staging-btn {
+				color: #02bfb3;
+				background: #fff;
+				border: .01rem solid #02bfb3
+			}
+
+			.submit-btn {
+				color: #fff;
+				background: #02bfb3;
+			}
+		}
+	}
+</style>

+ 666 - 0
src/pages/sjdj.vue

@@ -0,0 +1,666 @@
+<template>
+  <div>
+    <backindex :title="titlename"></backindex>
+    <div class="content">
+      <div class="sm">
+        <van-search v-model="value" @search="onSearch" placeholder="点击搜索单号" />
+        <img src="../assets/user/sm.png" alt="" @click="wxScanCode()">
+      </div>
+      <!-- 收件登记 -->
+      <div class="kdtype">
+        <ul>
+          <li :class="sdata == 0?'active':''">
+            <img src="../assets/user/kd1.png" alt="" @click="setExpressCompanyName('顺丰快递')">
+            <p>顺丰</p>
+          </li>
+          <li :class="sdata == 1?'active':''">
+            <img src="../assets/user/kd2.png" alt="" @click="setExpressCompanyName('中通快递')">
+            <p>中通</p>
+          </li>
+          <li :class="sdata == 2?'active':''">
+            <img style="width: 1rem;height: auto;padding-top: .22rem;" src="../assets/user/kd3.png" alt=""
+              @click="setExpressCompanyName('京东快递')">
+            <p>京东</p>
+          </li>
+          <li :class="sdata == 3?'active':''">
+            <img src="../assets/user/kd4.png" alt="" @click="setExpressCompanyName('闪送快递')">
+            <p>闪送</p>
+          </li>
+          <li :class="sdata == 4?'active':''">
+            <img style="width: 1.24rem;height: auto;padding: .3rem 0rem .1rem;" src="../assets/user/kd5.png" alt=""
+              @click="setExpressCompanyName('EMS')">
+            <p>EMS</p>
+          </li>
+          <li :class="sdata == 5?'active':''">
+            <img style="width: 1.1rem;height: auto;padding-top: .15rem;" src="../assets/user/kd6.png" alt=""
+              @click="setExpressCompanyName('DHL')">
+            <p>DHL</p>
+          </li>
+        </ul>
+
+        <van-field type="text" v-model="expressNo" label="快递单号" placeholder="填写快递单号" />
+        <van-field type="text" v-model="expressCompanyName" label="快递公司" placeholder="填写快递公司" />
+      </div>
+      <!-- 快递属性 -->
+      <div class="ktsx">
+        <van-field readonly clickable name="picker" :value="phone" label="收件人手机" placeholder="输入手机号后四位查询"
+          @click="addshow=true" />
+        <van-field readonly type="text" v-model="recipient" label="收件人" />
+        <van-field readonly type="text" v-model="company" label="公司" />
+        <van-field readonly type="text" v-model="department" label="部门" />
+        <van-field readonly type="text" v-model="costCenterName" label="成本中心" />
+        <van-field readonly type="text" v-model="sendSeat" label="派件座位" />
+        <van-field readonly clickable :value="expressType" label="快件类型" placeholder="选择快件类型" @click="wpshow=true" />
+        <van-popup v-model="wpshow" position="bottom">
+          <van-picker title="快件类型" show-toolbar :columns="wplist" @confirm="onConfirm1" @cancel="wpshow=false" />
+        </van-popup>
+        <van-field readonly clickable :value="isPayOnDelivery" label="是否到付件" placeholder="选择是否到付件"
+          @click="payshow=true" />
+        <van-popup v-model="payshow" position="bottom">
+          <van-picker title="是否到付件" show-toolbar :columns="paylist" @confirm="onConfirm2" @cancel="payshow=false" />
+        </van-popup>
+        <van-field v-if="payMoneyShow" type="number" v-model="payMoney" label="到付件金额" placeholder="输入到付件金额" />
+        <van-field readonly clickable :value="isIncludeChldren" label="是否包含子件" placeholder="选择是否包含子件"
+          @click="chldrenshow=true" />
+        <van-popup v-model="chldrenshow" position="bottom">
+          <van-picker title="是否包含子件" show-toolbar :columns="paylist" @confirm="onConfirm3"
+            @cancel="chldrenshow=false" />
+        </van-popup>
+        <van-field type="text" v-model="shelfAndFloorNum" label="货架号" placeholder="如1-2(1号柜2层)" />
+        <van-field type="text" v-model="remark" label="快递备注" placeholder="输入快递备注" />
+        <div>
+          <button @click="clear()">清空</button>
+          <button @click="addPer()">新增临时收件人</button>
+        </div>
+      </div>
+      <div style="text-align:center;margin-top: .3rem;">
+        <button
+          style="color: #fff;background: #02bfb3;border:.01rem solid #02bfb3;width: 50%;height: 40px;border-radius: 0.1rem;"
+          @click="saveDj()">保存</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;">填写号码</p>
+          <van-form @submit="onSubmit">
+            <van-field v-model="phone" name="收件人手机" label="收件人手机" type="number" maxlength="20" placeholder="输入手机号后四位"
+              @change="searchList()" />
+            <ul>
+              <li v-for="(item,i) in employeeList" @click="choose(i,item)">
+                <p>{{item.name}}</p>
+                <p>{{item.department}}</p>
+                <van-icon v-if="index == i" name="passed" />
+              </li>
+            </ul>
+            <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 round v-model="tjshow" class="whrite_add" closeabl="false" :close-on-click-overlay="false"
+        closed="close">
+        <div>
+          <p style="font-size: 16px;text-align: center;margin-bottom: 16px;">登记成功</p>
+          <img src="../assets/user/success.png" alt="" style="display: block;margin: 0 auto;width: 1.76rem;">
+
+          <p style="text-align: center;">登记成功,是否继续登记下一单?</p>
+          <div style="margin-top: 16px;">
+            <van-button color="#00c4b8" block type="info" native-type="submit" @click="clear()">确定</van-button>
+          </div>
+        </div>
+
+      </van-popup>
+    </div>
+  </div>
+</template>
+
+<script>
+  import {
+    Toast,
+    Dialog
+  } from 'vant'
+  export default {
+    inject: ['reload'],
+    data() {
+      return {
+        chldrenshow: false,
+        payMoneyShow: false,
+        payshow: false,
+        paylist: ["是", "否"],
+        wpshow: false,
+        wplist: ["物品", "文件"],
+        titlename: "收件登记",
+        addshow: false,
+        tjshow: false,
+        value: '',
+        sdata: '-1',
+        employeeList: [], //员工列表
+        index: '-1',
+        recipient: '', //人名
+        department: '', //部门
+        costCenterName: '',
+        mailRoomId: '',
+        expressCompanyName: '', //快递公司名字
+        expressCompany: '',//快递公司
+        expressNo: '',
+        recipient: '',
+        phone: '',
+        company: '',
+        sendSeat: '', //派件座位
+        isPayOnDelivery: '', //是否到付件
+        payMoney: '', //到付件金额
+        isIncludeChldren: '', //是否包含子件
+        expressType: '', //快件类型
+        shelfAndFloorNum: '1-1', //货架号
+        remark: '', //快递备注
+        expressNo: '', //快递号
+        sendexpressCompany: '', //快递公司发送数据
+        user_id: '', //收件人id
+      }
+    },
+    created: function() {
+      this.isLogin();
+      this.isPayOnDelivery= '否'; //是否到付件
+      this.isIncludeChldren='否'; //是否包含子件
+      this.expressType='文件'; //快件类型
+    },
+    methods: {
+      //点击图片填入快递公司
+      setExpressCompanyName(e) {
+        this.expressCompanyName = e;
+        console.log("e:" + e);
+      },
+      //快件类型
+      onConfirm1(e) {
+        this.expressType = e;
+        this.wpshow = false;
+      },
+      //是否到付件
+      onConfirm2(e) {
+        this.isPayOnDelivery = e;
+        if (this.isPayOnDelivery == '是') {
+          this.payMoneyShow = true;
+        } else {
+          this.payMoneyShow = false;
+        }
+        this.payshow = false;
+      },
+      //是否包含子件
+      onConfirm3(e) {
+        this.isIncludeChldren = e;
+        this.chldrenshow = false;
+      },
+      //微信扫码
+      wxScanCode() {
+        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];
+                  }
+
+                  // location.href=res.resultStr;//扫描结果传递到的处理页面,跳转到这个页面
+                  // alert(result);
+                  // location.href=res.resultStr;//扫描结果传递到的处理页面,跳转到这个页面
+                  // sessionStorage.setItem('saomiao_result',result);
+                  //其它网页调用二维码扫描结果:
+                  // var result = sessionStorage.getItem("saomiao_result");
+
+                  this.onSearch(result)
+                },
+                error: function(res) {
+                  console.log(res);
+                }
+              });
+            });
+          }, res => {
+            //发送失败
+            Toast("加载中!")
+          })
+
+      },
+
+      //选择员工
+      choose(val, item) {
+        this.index = val
+        this.recipient = item.name
+        this.department = item.department
+        this.company = item.company
+        this.phone = item.phone
+        this.costCenterName = item.costCenterName
+        this.user_id = item.user_id
+        this.sendSeat = item.seat
+      },
+      //手机号后四位搜索
+      searchList() {
+        this.$http.post(this.$store.state.host + "/solic/getEmployeeInfoByPhone", {
+            phone: this.phone
+          }, {
+            emulateJSON: true
+          })
+          .then(res => {
+            //发送成功
+            if (res.body.msg == 'success') {
+              this.employeeList = res.body.employeeList
+              console.log("员工:" + this.employeeList.length);
+            }
+          }, res => {
+            //发送失败
+            Toast("网络错误!")
+          })
+      },
+      //搜索
+      onSearch(val) {
+        this.expressNo = val;
+        this.$http.post(this.$store.state.host + "/solic/getExpressDetail", {
+            expressNo: val,
+            type: 2
+          }, {
+            emulateJSON: true
+          })
+          .then(res => {
+            //发送成功
+            if (res.body.msg == 'success') {
+              if (res.body.expressInfo != undefined && res.body.expressInfo != null) {
+                switch (res.body.expressInfo.expressInfo) {
+                  case "1":
+                    this.sdata = 0;
+                    this.expressCompanyName = '顺丰快递';
+                    break;
+                  case "2":
+                    this.sdata = 1;
+                    this.expressCompanyName = '中通快递';
+                    break;
+                  case "6":
+                    this.sdata = 2;
+                    this.expressCompanyName = '京东快递';
+                    break;
+                  case "5":
+                    this.sdata = 3;
+                    this.expressCompanyName = '闪送快递';
+                    break;
+                  case "4":
+                    this.sdata = 4;
+                    this.expressCompanyName = 'EMS';
+                    break;
+                  case "3":
+                    this.sdata = 5;
+                    this.expressCompanyName = 'DHL';
+                    break;
+                  default:
+                    this.sdata = -1;
+                    break;
+                }
+                this.company = res.body.expressInfo.company;
+                this.department = res.body.expressInfo.department;
+
+                this.recipient = res.body.expressInfo.receiver;
+                this.user_id = res.body.expressInfo.user_id;
+                this.phone = res.body.expressInfo.expressPhone;
+                this.expressType = res.body.expressInfo.itemType;
+                this.isPayOnDelivery = res.body.expressInfo.isPayOnDelivery;
+                this.costCenterName = res.body.expressInfo.costCenterName;
+                this.sendSeat = res.body.expressInfo.seat;
+                this.isIncludeChldren = res.body.expressInfo.isIncludeChldren;
+                this.isPayOnDelivery = res.body.expressInfo.isPayOnDelivery;
+                if (this.isPayOnDelivery == '是') {
+                  this.payMoneyShow = true;
+                }
+                this.payMoney = res.body.expressInfo.payMoney;
+              } else {
+                Toast("查无此单!");
+              }
+            } else {
+              Toast(res.body.msg);
+            }
+
+          }, res => {
+            //发送失败
+            Toast("加载中!")
+          })
+      },
+      //新增临时收件人
+      addPer(val) {
+        this.$router.push({
+          path: '/Addper'
+        })
+      },
+      //选择快递
+      active(val) {
+        this.sdata = val
+      },
+      onSubmit() {
+        if (this.recipient == '') {
+          Toast('请选择收件人')
+          return
+        }
+        this.addshow = false
+        //this.tjshow=true
+      },
+      close() {
+        //this.phone = ''
+        //this.name = ''
+        //this.department = ''
+        this.index = ''
+      },
+      //清空
+      clear() {
+        this.reload();
+      },
+      //保存
+      saveDj() {
+        if (localStorage.getItem('roomId') == '' || localStorage.getItem('roomId') == undefined) {
+          Toast('请重新登录!');
+          return;
+        }
+        if (this.expressNo == '' || this.expressNo == undefined) {
+          Toast('请填写快递单号!');
+          return;
+        }
+
+        if (this.expressCompanyName == '' || this.expressCompanyName == undefined) {
+          Toast('请填写快递公司!');
+          return;
+        }else{
+          switch (this.expressCompanyName) {
+            case "顺丰快递":
+              this.expressCompany = '1';
+              break;
+            case "中通快递":
+              this.expressCompany = '2';
+              break;
+            case "京东快递":
+              this.expressCompany = '6';
+              break;
+            case "闪送":
+              this.expressCompany = '0';//数据库里面快递公司没有闪送
+              break;
+            case "EMS":
+              this.expressCompany = '0';//数据库里面快递公司没有EMS
+              break;
+            case "DHL":
+              this.expressCompany = '3';
+              break;
+            default:
+              this.expressCompany = '0';
+              break;
+          }
+        }
+
+        if (this.sdata != '' && this.sdata != -1) {
+          this.sendexpressCompany = this.sdata;
+        } else {
+          this.sendexpressCompany = this.expressCompany
+        }
+
+        if (this.recipient == '' || this.recipient == undefined) {
+          Toast('请选择收件人!');
+          return;
+        }
+        if (this.shelfAndFloorNum == '' || this.shelfAndFloorNum == undefined) {
+          Toast('请填写货架号!');
+          return;
+        } else {
+          if (!this.shelfAndFloorNum.match("-") || this.shelfAndFloorNum.split("-")[1] == '') {
+            Toast('货架号-层号输入格式有误!');
+            return;
+          }
+        }
+
+        this.$http.post(this.$store.state.host + "/solic/saveExpressRecord", {
+            mailRoomId: localStorage.getItem('roomId'),
+            expressCompany: this.sendexpressCompany,
+            expressCompanyName: this.expressCompanyName,
+            user_id: this.user_id,
+            expressNo: this.expressNo,
+            recipient: this.recipient,
+            phone: this.phone,
+            company: this.company,
+            sendSeat: this.sendSeat,
+            isPayOnDelivery: this.isPayOnDelivery,
+            payMoney: this.payMoney,
+            isIncludeChldren: this.isIncludeChldren,
+            expressType: this.expressType,
+            shelfAndFloorNum: this.shelfAndFloorNum,
+            remark: this.remark,
+          }, {
+            emulateJSON: true
+          })
+          .then(res => {
+            //发送成功
+            if (res.body.msg == 'success') {
+              this.tjshow = true;
+            } else {
+              Toast("登记失败!")
+            }
+          }, res => {
+            //发送失败
+            Toast("网络错误!")
+          })
+        //this.tjshow=true;
+      }
+    },
+    mounted: function() {
+
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .content {
+    padding: 0.25rem .37rem;
+    font-size: .3rem;
+
+    .sm {
+      display: flex;
+      margin-bottom: .2rem;
+      justify-content: space-between;
+
+      /deep/.van-search {
+        width: 6.2rem;
+        height: .76rem;
+        border-radius: 25px;
+        overflow: hidden;
+        padding: 0rem;
+        background-color: white;
+
+        .van-search__content {
+          background-color: white;
+        }
+
+        input {
+          background-color: white;
+        }
+      }
+
+      img {
+        width: .4rem;
+        height: .4rem;
+        position: relative;
+        top: .18rem;
+      }
+    }
+
+    .kdtype {
+      background: white;
+      padding: .4rem .4rem .2rem;
+      border-radius: .05rem;
+
+      ul {
+        display: flex;
+        justify-content: space-between;
+        flex-wrap: wrap;
+        text-align: center;
+
+        li {
+          width: 1.5rem;
+          padding: .2rem 0rem;
+          border: .01rem solid #eef7ff;
+          margin-bottom: .2rem;
+          border-radius: .05rem;
+
+          img {
+            height: .7rem;
+            margin-bottom: .25rem;
+          }
+
+          p {
+            font-size: .26rem;
+            color: #666666;
+          }
+        }
+
+        .active {
+          border: .01rem solid #74bdfc;
+        }
+      }
+    }
+
+    .ktsx {
+      padding: .2rem .3rem;
+      background: white;
+      display: flex;
+      flex-wrap: wrap;
+      justify-content: space-between;
+      font-size: .28rem;
+      line-height: 200%;
+      border-radius: .05rem;
+      margin-top: .2rem;
+
+      /deep/.van-cell {
+        .van-field__label {
+          span {
+            font-size: .28rem;
+            color: #333;
+          }
+        }
+
+        padding: 0px 0rem;
+        overflow: unset;
+        border-top: unset;
+        border-bottom: .01rem solid #F6F6F6;
+        padding-bottom: .1rem;
+
+        input {
+          text-align: right;
+          height: .5rem;
+          padding-right: .25rem;
+          font-size: .28rem;
+        }
+      }
+
+      /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: 0rem;
+        bottom: .25rem;
+        width: .2rem;
+        height: .2rem;
+      }
+
+      p {
+        width: 100%;
+      }
+
+      div {
+        width: 100%;
+        border-top: .01rem solid #F6F6F6;
+        text-align: right;
+        padding-top: .2rem;
+        margin-top: .2rem;
+
+        button {
+          font-size: .28rem;
+          border: .01rem solid #00c4b8;
+          color: #00c4b8;
+          background: white;
+          padding: 0rem .3rem;
+          border-radius: .05rem;
+        }
+
+        button:nth-of-type(2) {
+          font-size: .28rem;
+          border: .01rem solid #0086c4;
+          color: #0086c4;
+          background: white;
+          padding: 0rem .3rem;
+          border-radius: .05rem;
+        }
+      }
+    }
+
+    .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;
+      }
+
+      ul {
+        li {
+          padding: 10px 36px 10px 16px;
+          display: flex;
+          justify-content: space-between;
+          position: relative;
+
+          i {
+            position: absolute;
+            right: 0px;
+            top: .25rem
+          }
+
+          i:before {
+            background: #00c4b8;
+            color: white;
+            border-radius: 50%;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 0 - 0
src/pages/sysearch.vue


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