Browse Source

功能完善

Your Name 7 years ago
parent
commit
5e5b178f13

+ 129 - 19
build/build.js

@@ -8,28 +8,138 @@ var path = require('path')
 var chalk = require('chalk')
 var webpack = require('webpack')
 var config = require('../config')
-var webpackConfig = require('./webpack.prod.conf')
+// var webpackConfig = require('./webpack.prod.conf')
 
-var spinner = ora('building for production...')
-spinner.start()
+var configMap = require('../config/config-map')
+var readline = require('readline')
+var envConfig;
 
-rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
-  if (err) throw err
-  webpack(webpackConfig, function (err, stats) {
+/**
+ * 设置打包环境
+ * stable 测试
+ * release 正式包
+ * */
+var doZip = false;
+
+var rl = readline.createInterface({
+  input: process.stdin,
+  output: process.stdout
+});
+
+var typeList = [{key: 'stable', value: '测试(连接测试环境接口)'}];
+typeList.push({key: 'release', value: '正式'});
+
+var config_argv = process.argv;
+if (config_argv.length == 2) {
+  configMap.forEach(function (item, index) {
+    console.log(index + 1 + ': ' + item.value);
+  });
+
+  initPackageConfig();
+} else if (config_argv.length == 4) {
+  var key = config_argv[2];
+  var typeKey = config_argv[3];
+  configMap.forEach(function (item, index) {
+    if (item.key == key) {
+      config.packageConfig['packageKey'] = item.key;
+      config.packageConfig['packageName'] = item.value;
+      console.log('提供方:', item.value);
+      typeList.forEach(function (item, index) {
+        if (item.key == typeKey) {
+          console.log('打包类型:', item.value);
+          config.packageConfig['packageType'] = typeKey;
+          doZip = typeKey === 'release';
+          doPackage();
+          rl.close();
+        }
+      });
+    }
+  });
+
+} else {
+  console.log('打包参数不正确,请确认?', config_argv.slice(2, config_argv.length));
+  return;
+}
+
+
+function initPackageConfig() {
+  rl.question('请选择打包的提供方:', function (input) {
+    var idx = Number(input) - 1;
+
+    if (isNaN(idx) || idx < 0 || idx >= configMap.length) {
+      console.log('请输入正确的编号')
+    } else {
+      var c = configMap[idx]
+      config.packageConfig['packageKey'] = c.key;
+      config.packageConfig['packageName'] = c.value;
+
+      typeList.forEach(function (item, index) {
+        console.log(index + 1 + ': ' + item.value + ' ' + item.key);
+      });
+
+      rl.question('请选择打包类型:', function (typeStr) {
+        var typeIdx = Number(typeStr) - 1;
+        if (isNaN(typeIdx) || typeIdx < 0 || typeIdx >= typeList.length) {
+          console.log('请输入正确的编号')
+        } else {
+          config.packageConfig['packageType'] = typeList[typeIdx].key;
+          doZip = typeList[typeIdx].key === 'release'
+          doPackage();
+          rl.close();
+        }
+      });
+    }
+  });
+}
+
+function doPackage() {
+  var ora = require('ora')
+  var webpack = require('webpack')
+  envConfig = require('./../config/env-config').getCustomConfig();
+
+  console.log('------------------------------')
+  var spinner = ora('----- 正在打包 ' + config.packageConfig.packageName + ' ' + config.packageConfig.packageType + '包 -----\n')
+  spinner.start()
+
+  rm(path.resolve(config.build.assetsRoot), function (err) {
+    if (err) throw err;
+
+    spinner.stop()
+    // baseModulePackage(webpack, spinner)
+    processMainPackage(webpack, spinner)
+  })
+}
+
+function baseModulePackage(webpack, spinner) {
+  var webpackProdBaseConfig = require('./webpack.prod.base.conf')
+  // 打包基本模块
+  webpack(webpackProdBaseConfig, function (err, stats) {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+          colors: true,
+          modules: false,
+          children: false,
+          chunks: false,
+          chunkModules: false
+        }) + '\n')
+
+    processMainPackage(webpack, spinner)
+  })
+}
+
+function processMainPackage(webpack, spinner) {
+  var webpackProdMainConfig = require('./webpack.prod.main.conf')
+  // 打包基本模块
+  webpack(webpackProdMainConfig, function (err, stats) {
     spinner.stop()
     if (err) throw err
     process.stdout.write(stats.toString({
-      colors: true,
-      modules: false,
-      children: false,
-      chunks: false,
-      chunkModules: false
-    }) + '\n\n')
-
-    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'
-    ))
+          colors: true,
+          modules: false,
+          children: false,
+          chunks: false,
+          chunkModules: false
+        }) + '\n')
   })
-})
+}

+ 108 - 17
build/dev-server.js

@@ -10,6 +10,26 @@ var path = require('path')
 var express = require('express')
 var webpack = require('webpack')
 var proxyMiddleware = require('http-proxy-middleware')
+// var webpackConfig = require('./webpack.dev.conf')
+var configMap = require('../config/config-map');
+
+var arguments = process.argv.splice(2)
+if(arguments.length > 0) {
+  var key = arguments[0];
+  var k = configMap.filter(function(item){
+    return key === item.key;
+  });
+
+  if(k && k.length > 0) {
+    config.packageConfig.packageKey = k[0].key;
+  } else {
+    throw new Error('invalid env parameter ' + key);
+  }
+} else {
+  config.packageConfig.packageKey = 'wswin'
+}
+config.packageConfig.packageType = 'dev'
+
 var webpackConfig = require('./webpack.dev.conf')
 
 // default port where dev server listens for incoming traffic
@@ -29,12 +49,14 @@ var devMiddleware = require('webpack-dev-middleware')(compiler, {
 })
 
 var hotMiddleware = require('webpack-hot-middleware')(compiler, {
-  log: () => {}
+  log: function () {
+
+  }
 })
 // force page reload when html-webpack-plugin template changes
 compiler.plugin('compilation', function (compilation) {
   compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
-    hotMiddleware.publish({ action: 'reload' })
+    hotMiddleware.publish({action: 'reload'})
     cb()
   })
 })
@@ -43,7 +65,7 @@ compiler.plugin('compilation', function (compilation) {
 Object.keys(proxyTable).forEach(function (context) {
   var options = proxyTable[context]
   if (typeof options === 'string') {
-    options = { target: options }
+    options = {target: options}
   }
   app.use(proxyMiddleware(options.filter || context, options))
 })
@@ -64,26 +86,95 @@ app.use(staticPath, express.static('./static'))
 
 var uri = 'http://localhost:' + port
 
-var _resolve
-var readyPromise = new Promise(resolve => {
-  _resolve = resolve
+devMiddleware.waitUntilValid(function () {
+  console.log('> Listening at ' + uri + '\n')
 })
 
-console.log('> Starting dev server...')
-devMiddleware.waitUntilValid(() => {
-  console.log('> Listening at ' + uri + '\n')
+module.exports = app.listen(port, function (err) {
+  if (err) {
+    console.log(err)
+    return
+  }
+
   // when env is testing, don't need open it
   if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
     opn(uri)
   }
-  _resolve()
 })
 
-var server = app.listen(port)
 
-module.exports = {
-  ready: readyPromise,
-  close: () => {
-    server.close()
-  }
-}
+// // default port where dev server listens for incoming traffic
+// var port = process.env.PORT || config.dev.port
+// // automatically open browser, if not set will be false
+// var autoOpenBrowser = !!config.dev.autoOpenBrowser
+// // Define HTTP proxies to your custom API backend
+// // https://github.com/chimurai/http-proxy-middleware
+// var proxyTable = config.dev.proxyTable
+//
+// var app = express()
+// var compiler = webpack(webpackConfig)
+//
+// var devMiddleware = require('webpack-dev-middleware')(compiler, {
+//   publicPath: webpackConfig.output.publicPath,
+//   quiet: true
+// })
+//
+// var hotMiddleware = require('webpack-hot-middleware')(compiler, {
+//   log: () => {}
+// })
+// // force page reload when html-webpack-plugin template changes
+// compiler.plugin('compilation', function (compilation) {
+//   compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
+//     hotMiddleware.publish({ action: 'reload' })
+//     cb()
+//   })
+// })
+//
+// // proxy api requests
+// Object.keys(proxyTable).forEach(function (context) {
+//   var options = proxyTable[context]
+//   if (typeof options === 'string') {
+//     options = { target: options }
+//   }
+//   app.use(proxyMiddleware(options.filter || context, options))
+// })
+//
+// // handle fallback for HTML5 history API
+// app.use(require('connect-history-api-fallback')())
+//
+// // serve webpack bundle output
+// app.use(devMiddleware)
+//
+// // enable hot-reload and state-preserving
+// // compilation error display
+// app.use(hotMiddleware)
+//
+// // serve pure static assets
+// var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
+// app.use(staticPath, express.static('./static'))
+//
+// var uri = 'http://localhost:' + port
+//
+// var _resolve
+// var readyPromise = new Promise(resolve => {
+//   _resolve = resolve
+// })
+//
+// console.log('> Starting dev server...')
+// devMiddleware.waitUntilValid(() => {
+//   console.log('> Listening at ' + uri + '\n')
+//   // when env is testing, don't need open it
+//   if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
+//     opn(uri)
+//   }
+//   _resolve()
+// })
+//
+// var server = app.listen(port)
+//
+// module.exports = {
+//   ready: readyPromise,
+//   close: () => {
+//     server.close()
+//   }
+// }

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

@@ -3,6 +3,7 @@ var utils = require('./utils')
 var config = require('../config')
 var webpack = require('webpack')
 var vueLoaderConfig = require('./vue-loader.conf')
+var envConfig = require('./../config/env-config').getCustomConfig();
 
 function resolve(dir) {
     return path.join(__dirname, '..', dir)
@@ -65,6 +66,16 @@ module.exports = {
             _: 'lodash',
             Vue: 'vue',
             moment: 'moment'
+        }),
+        new webpack.DefinePlugin({
+            // apihost
+            'envConfig.apiHost': JSON.stringify(envConfig.apiHost),
+            //assetsPublicPath
+            'envConfig.assetsPublicPath': JSON.stringify(envConfig.assetsPublicPath),
+            //companyName
+            'envConfig.companyName': JSON.stringify(envConfig.companyName),
+            //companyEnName
+            'envConfig.companyEnName': JSON.stringify(envConfig.companyEnName)
         })
     ]
 }

+ 31 - 23
build/webpack.prod.conf.js

@@ -8,10 +8,14 @@ var CopyWebpackPlugin = require('copy-webpack-plugin')
 var HtmlWebpackPlugin = require('html-webpack-plugin')
 var ExtractTextPlugin = require('extract-text-webpack-plugin')
 var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+var ZipFilesPlugin = require('webpack-zip-files-plugin');
 
 var env = config.build.env
 
 var webpackConfig = merge(baseWebpackConfig, {
+  entry: {
+    app: './src/main.js'
+  },
   module: {
     rules: utils.styleLoaders({
       sourceMap: config.build.productionSourceMap,
@@ -41,11 +45,7 @@ var webpackConfig = merge(baseWebpackConfig, {
     }),
     // Compress extracted CSS. We are using this plugin so that possible
     // duplicated CSS from different components can be deduped.
-    new OptimizeCSSPlugin({
-      cssProcessorOptions: {
-        safe: true
-      }
-    }),
+    new OptimizeCSSPlugin(),
     // 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
@@ -53,6 +53,7 @@ var webpackConfig = merge(baseWebpackConfig, {
       filename: config.build.index,
       template: 'index.html',
       inject: true,
+      // zeptoPath: config.build.assetsPublicPath + 'static/js/zepto.min.js',
       minify: {
         removeComments: true,
         collapseWhitespace: true,
@@ -69,11 +70,11 @@ var webpackConfig = merge(baseWebpackConfig, {
       minChunks: function (module, count) {
         // 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
+            module.resource &&
+            /\.js$/.test(module.resource) &&
+            module.resource.indexOf(
+                path.join(__dirname, '../node_modules')
+            ) === 0
         )
       }
     }),
@@ -90,7 +91,14 @@ var webpackConfig = merge(baseWebpackConfig, {
         to: config.build.assetsSubDirectory,
         ignore: ['.*']
       }
-    ])
+    ]),
+    new ZipFilesPlugin({
+      entries: [
+        { src: path.join(__dirname, '../dist'), dist: '../' }
+      ],
+      output: path.join(__dirname, '../dist'),
+      format: 'zip'
+    })
   ]
 })
 
@@ -98,17 +106,17 @@ if (config.build.productionGzip) {
   var 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
-    })
+      new CompressionWebpackPlugin({
+        asset: '[path].gz[query]',
+        algorithm: 'gzip',
+        test: new RegExp(
+            '\\.(' +
+            config.build.productionGzipExtensions.join('|') +
+            ')$'
+        ),
+        threshold: 10240,
+        minRatio: 0.8
+      })
   )
 }
 
@@ -117,4 +125,4 @@ if (config.build.bundleAnalyzerReport) {
   webpackConfig.plugins.push(new BundleAnalyzerPlugin())
 }
 
-module.exports = webpackConfig
+module.exports = webpackConfig

+ 6 - 0
config/config-map.js

@@ -0,0 +1,6 @@
+module.exports = [
+    {
+        key: 'wswin',
+        value: '万赛出品'
+    }
+]

+ 12 - 0
config/custom/wswin.js

@@ -0,0 +1,12 @@
+/**
+ * Created by majw on 2018/3/25.
+ */
+module.exports = {
+    appVersion: '1.0.1',
+    //stable api
+    stableApi: '//115.29.3.73',
+    //实例名称
+    companyName: '万赛出品',
+    //英文名称
+    companyEnName: 'wswin'
+};

+ 71 - 0
config/env-config.js

@@ -0,0 +1,71 @@
+var lodashExtend = require('lodash/extend');
+var config = require('../config');
+var path = require('path');
+var fs = require('fs');
+var moment = require('moment');
+var resultConfig;
+
+module.exports = {
+    getCustomConfig: getCustomConfig
+};
+
+function getCustomConfig() {
+    if(resultConfig) {
+        return resultConfig;
+    }
+    console.log('============= 当前的打包环境变量 =============')
+    console.log(config.packageConfig)
+    console.log('==============================================')
+
+    var packageKey = config.packageConfig.packageKey;
+    var packageType = config.packageConfig.packageType;
+    var configPath = path.resolve(__dirname, './custom/' + packageKey + '.js');
+    if(fs.existsSync(configPath)) {
+        var defaultConfig = require('./custom/wswin')
+        resultConfig = defaultConfig;
+
+        resultConfig.apiHost = '';
+        if(packageType === 'dev' || packageType === 'stable' || packageType === 'release') {
+            if(packageType === 'dev') {
+                // 开发环境的代理匹配关键字 2个端口用域名
+                resultConfig.apiHost = '/115.29.3.73';
+                console.error('++++++++++++++++++++++++++++555555555555555555555555555555555');
+            }else if(packageType === 'stable'){
+                if (packageKey == 'wswin') {
+                    resultConfig.apiHost = resultConfig.stableApi
+                } else {
+                    var stableConfig = require('./custom/'+ packageKey + '-stable')
+                    resultConfig = stableConfig
+                    resultConfig.apiHost = stableConfig.stableApi
+                }
+            }else if(packageType === 'release'){
+                var settingConfig = require('./custom/'+ packageKey)
+                resultConfig.apiHost = settingConfig.releaseApi
+                resultConfig.appVersion = settingConfig.appVersion
+                resultConfig.companyName = settingConfig.companyName
+                resultConfig.companyEnName = settingConfig.companyEnName
+                // resultConfig.imgPath = settingConfig.imgPath
+            }
+        }
+
+        resultConfig.assetsPublicPath = '/'
+
+        if(packageType === 'release' || packageType === 'stable' ) {
+            resultConfig.assetsPublicPath = config.build.assetsPublicPath
+        }
+
+        resultConfig.enableDebugLog = packageType != 'release'
+
+        resultConfig.appVersion += '.' + moment().format('YYYYMMDD')
+        config.packageConfig.appVersion = resultConfig.appVersion
+
+        console.log('')
+        console.log('============= 当前的打包配置变量 =============')
+        console.log(resultConfig)
+        console.log('==============================================')
+
+        return resultConfig;
+    } else {
+        throw new Error(packageKey + '.js file not exists!!!!!');
+    }
+}

+ 12 - 2
config/index.js

@@ -7,7 +7,7 @@ module.exports = {
     index: path.resolve(__dirname, '../dist/index.html'),
     assetsRoot: path.resolve(__dirname, '../dist'),
     assetsSubDirectory: 'static',
-    assetsPublicPath: '/font/',
+    assetsPublicPath: '/',
     productionSourceMap: false,
     // Gzip off by default as many popular static hosts such as
     // Surge or Netlify already gzip all static assets for you.
@@ -27,12 +27,22 @@ module.exports = {
     autoOpenBrowser: true,
     assetsSubDirectory: 'static',
     assetsPublicPath: '/',
-    proxyTable: {},
+    proxyTable: {
+      '/115.29.3.73': {
+        target: 'http://115.29.3.73',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/115.29.3.73': ''
+        }
+      }
+    },
     // CSS Sourcemaps off by default because relative paths are "buggy"
     // with this option, according to the CSS-Loader README
     // (https://github.com/webpack/css-loader#sourcemaps)
     // In our experience, they generally work as expected,
     // just be aware of this issue when enabling this option.
     cssSourceMap: false
+  },
+  packageConfig: {
   }
 }

BIN
dist.zip


+ 60 - 1
index.html

@@ -9,7 +9,10 @@
     <meta name="apple-mobile-web-app-status-bar-style" content="black">
     <meta name="format-detection" content="telephone=no"/>
     <link rel="stylesheet" href="//g.alicdn.com/msui/sm/0.6.2/css/sm.min.css">
-    <title>办证查询</title>
+    <title>办件查询</title>
+    <style>
+        body{height:100%;overflow: hidden;}
+    </style>
 </head>
 <body>
 <div id="app"></div>
@@ -24,5 +27,61 @@
     }
 </script>
 <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm.min.js' charset='utf-8'></script>
+<script>
+    function prevent() {
+        var startX = 0, startY = 0;
+        //touchstart事件
+        function touchSatrtFunc(evt) {
+            try
+            {
+                //evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等
+
+                var touch = evt.touches[0]; //获取第一个触点
+                var x = Number(touch.pageX); //页面触点X坐标
+                var y = Number(touch.pageY); //页面触点Y坐标
+                //记录触点初始位置
+                startX = x;
+                startY = y;
+
+            } catch (e) {
+                alert('touchSatrtFunc:' + e.message);
+            }
+        }
+        document.addEventListener('touchstart', touchSatrtFunc, false);
+        var _ss = document.getElementById('app');
+        _ss.ontouchmove = function (ev) {
+            var _point = ev.touches[0],
+                    _top = _ss.scrollTop;
+            // 什么时候到底部
+            var _bottomFaVal = _ss.scrollHeight - _ss.offsetHeight;
+            // 到达顶端
+            if (_top === 0) {
+                // 阻止向下滑动
+                if (_point.clientY > startY) {
+                    ev.preventDefault();
+                } else {
+                    // 阻止冒泡
+                    // 正常执行
+                    ev.stopPropagation();
+                }
+            } else if (_top === _bottomFaVal) {
+                // 到达底部
+                // 阻止向上滑动
+                if (_point.clientY < startY) {
+                    ev.preventDefault();
+                } else {
+                    // 阻止冒泡
+                    // 正常执行
+                    ev.stopPropagation();
+                }
+            } else if (_top > 0 && _top < _bottomFaVal) {
+                ev.stopPropagation();
+            } else {
+                ev.preventDefault();
+            }
+        };
+    }
+    prevent();
+</script>
 </body>
 </html>

+ 125 - 38
package-lock.json

@@ -396,6 +396,35 @@
       "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
       "dev": true
     },
+    "archiver": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+      "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+      "requires": {
+        "archiver-utils": "1.3.0",
+        "async": "2.6.0",
+        "buffer-crc32": "0.2.13",
+        "glob": "7.1.2",
+        "lodash": "4.17.5",
+        "readable-stream": "2.3.5",
+        "tar-stream": "1.5.5",
+        "walkdir": "0.0.11",
+        "zip-stream": "1.2.0"
+      }
+    },
+    "archiver-utils": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+      "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+      "requires": {
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "lazystream": "1.0.0",
+        "lodash": "4.17.5",
+        "normalize-path": "2.1.1",
+        "readable-stream": "2.3.5"
+      }
+    },
     "argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -494,7 +523,6 @@
       "version": "2.6.0",
       "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
       "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
-      "dev": true,
       "requires": {
         "lodash": "4.17.5"
       }
@@ -1355,8 +1383,7 @@
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "base": {
       "version": "0.11.2",
@@ -1432,6 +1459,15 @@
       "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
       "dev": true
     },
+    "bl": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+      "requires": {
+        "readable-stream": "2.3.5",
+        "safe-buffer": "5.1.1"
+      }
+    },
     "blob": {
       "version": "0.0.4",
       "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
@@ -1499,7 +1535,6 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "1.0.0",
         "concat-map": "0.0.1"
@@ -1621,6 +1656,11 @@
         }
       }
     },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+    },
     "buffer-from": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
@@ -2207,11 +2247,21 @@
       "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
       "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
     },
+    "compress-commons": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+      "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+      "requires": {
+        "buffer-crc32": "0.2.13",
+        "crc32-stream": "2.0.0",
+        "normalize-path": "2.1.1",
+        "readable-stream": "2.3.5"
+      }
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
@@ -2382,8 +2432,7 @@
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
     },
     "cosmiconfig": {
       "version": "2.2.2",
@@ -2408,6 +2457,20 @@
         }
       }
     },
+    "crc": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+      "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ="
+    },
+    "crc32-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+      "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+      "requires": {
+        "crc": "3.5.0",
+        "readable-stream": "2.3.5"
+      }
+    },
     "create-ecdh": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
@@ -2944,7 +3007,6 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
       "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-      "dev": true,
       "requires": {
         "once": "1.4.0"
       }
@@ -3719,8 +3781,7 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
       "version": "1.1.3",
@@ -4663,7 +4724,6 @@
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
       "requires": {
         "fs.realpath": "1.0.0",
         "inflight": "1.0.6",
@@ -4749,8 +4809,7 @@
     "graceful-fs": {
       "version": "4.1.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
     },
     "gzip-size": {
       "version": "4.1.0",
@@ -5089,7 +5148,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "1.4.0",
         "wrappy": "1.0.2"
@@ -5098,8 +5156,7 @@
     "inherits": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
     },
     "ini": {
       "version": "1.3.5",
@@ -5562,6 +5619,14 @@
       "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
       "dev": true
     },
+    "lazystream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+      "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+      "requires": {
+        "readable-stream": "2.3.5"
+      }
+    },
     "lcid": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
@@ -5934,7 +5999,6 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "1.1.11"
       }
@@ -6168,7 +6232,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
-      "dev": true,
       "requires": {
         "remove-trailing-separator": "1.1.0"
       }
@@ -6345,7 +6408,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1.0.2"
       }
@@ -6679,8 +6741,7 @@
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-is-inside": {
       "version": "1.0.2",
@@ -7390,8 +7451,7 @@
     "process-nextick-args": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
-      "dev": true
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
     },
     "progress": {
       "version": "1.1.8",
@@ -7634,7 +7694,6 @@
       "version": "2.3.5",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
       "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
-      "dev": true,
       "requires": {
         "core-util-is": "1.0.2",
         "inherits": "2.0.3",
@@ -7648,8 +7707,7 @@
         "isarray": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
-          "dev": true
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
         }
       }
     },
@@ -7806,8 +7864,7 @@
     "remove-trailing-separator": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
-      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
-      "dev": true
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
     },
     "renderkid": {
       "version": "2.0.1",
@@ -8025,8 +8082,7 @@
     "safe-buffer": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-      "dev": true
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -8663,7 +8719,6 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
       "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
-      "dev": true,
       "requires": {
         "safe-buffer": "5.1.1"
       }
@@ -8766,6 +8821,17 @@
       "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
       "dev": true
     },
+    "tar-stream": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz",
+      "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==",
+      "requires": {
+        "bl": "1.2.2",
+        "end-of-stream": "1.4.1",
+        "readable-stream": "2.3.5",
+        "xtend": "4.0.1"
+      }
+    },
     "text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -9190,8 +9256,7 @@
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-      "dev": true
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "utila": {
       "version": "0.4.0",
@@ -9324,6 +9389,11 @@
       "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==",
       "dev": true
     },
+    "walkdir": {
+      "version": "0.0.11",
+      "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+      "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI="
+    },
     "watchpack": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
@@ -9524,6 +9594,14 @@
         }
       }
     },
+    "webpack-zip-files-plugin": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-zip-files-plugin/-/webpack-zip-files-plugin-1.0.0.tgz",
+      "integrity": "sha1-ues9MhHEXCtVqna5SzHy63m5Gi0=",
+      "requires": {
+        "archiver": "1.3.0"
+      }
+    },
     "whet.extend": {
       "version": "0.9.9",
       "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
@@ -9561,8 +9639,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "write": {
       "version": "0.2.1",
@@ -9601,8 +9678,7 @@
     "xtend": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
-      "dev": true
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
     },
     "y18n": {
       "version": "4.0.0",
@@ -9683,6 +9759,17 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
       "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
+    },
+    "zip-stream": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+      "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+      "requires": {
+        "archiver-utils": "1.3.0",
+        "compress-commons": "1.2.2",
+        "lodash": "4.17.5",
+        "readable-stream": "2.3.5"
+      }
     }
   }
 }

+ 2 - 1
package.json

@@ -17,7 +17,8 @@
     "promise-polyfill": "^6.0.2",
     "socket.io-client": "^1.7.3",
     "vue": "^2.2.2",
-    "vue-router": "^2.2.0"
+    "vue-router": "^2.2.0",
+    "webpack-zip-files-plugin": "^1.0.0"
   },
   "devDependencies": {
     "autoprefixer": "^6.7.2",

+ 13 - 0
src/api/admin-api.js

@@ -0,0 +1,13 @@
+/**
+ * Created by majw on 2018/3/22.
+ */
+var apiUser = require('./impl/query-api');
+
+module.exports = {
+
+    /** -----------  query api -------------- */
+
+    // 注册用户
+    getAuditProjectByNoAndPwd: apiUser.getAuditProjectByNoAndPwd
+
+};

+ 121 - 0
src/api/api-base.js

@@ -0,0 +1,121 @@
+/**
+ * Created by majw on 2018/3/15.
+ */
+
+var apiConfig = require('./api-config');
+//var utils = require('utils/utils');
+// var appConfig = require('config/app-config');
+
+function sendRequest (reqParam, data, async, success, fail, contentType) {
+  data = data || {};
+  //TODO leo
+  // data['token'] = encodeURIComponent(utils.getFormatToken());
+  if (typeof (contentType) == 'undefined') {
+    contentType = 'application/x-www-form-urlencoded; charset=utf-8';
+  }
+  if (contentType == 'json') {
+    contentType = 'application/json';
+    data = JSON.stringify(data);
+  }
+  async = async === false ? async : (async || true);
+
+  // contentType: 'application/x-www-form-urlencoded; charset=utf-8',
+  // contentType: 'application/json',
+
+  var reqObj = {
+    reqParam: reqParam,
+    data: data,
+    async: async || false,
+    success: success,
+    fail: fail,
+    contentType: contentType
+  };
+
+  sendAjaxRequest(reqObj);
+}
+
+module.exports = {
+  sendRequest: sendRequest
+};
+
+function sendAjaxRequest (reqObj) {
+  var type = reqObj.reqParam[0];
+  var url = reqObj.reqParam[1];
+  var reqName = reqObj.reqParam[2] + ': ' + url;
+  //TODO leo
+  // var enableLog = envConfig.enableDebugLog || window.enableDebugLog;
+  var enableLog = true || window.enableDebugLog;
+
+  var successFun = function (resp) {
+    if (enableLog) {
+      console.debug('[RES] => %s => ', reqName, JSON.stringify(resp));
+    }
+
+    //$.hideIndicator();
+    if (resp) {
+      if (resp.BussinessInfo.Code && resp.ReturnInfo.Code) {
+        (reqObj.success || defaultAjaxSuccess)(resp.UserArea, reqName);
+      } else {
+        if (resp.errorCode === 9999) {
+          var router = require('../router');
+          router.push('/query');
+        } else {
+          (reqObj.fail || defaultAjaxFail)(resp.BussinessInfo, resp.ReturnInfo, reqName);
+        }
+      }
+    } else {
+      (reqObj.fail || defaultAjaxFail)(apiConfig.RES_CommonError[0], apiConfig.RES_CommonError[1], reqName);
+    }
+  };
+
+  var failFun = function (xhr, errorType, error) {
+    //$.hideIndicator();
+    // TODO handle specific error code
+    (reqObj.fail || defaultAjaxFail)(apiConfig.RES_CommonError[0], apiConfig.RES_CommonError[1], reqName);
+  };
+
+  if (enableLog) {
+    console.debug('[SEND] => %s => %s', reqName, JSON.stringify(reqObj.data));
+  }
+
+  // 如果是post请求, 要把数据json序列化
+  // if(type === 'POST') {
+  // reqObj.data = JSON.stringify(reqObj.data);
+  // }
+
+  ajaxRequest(type, url, reqObj.data, reqObj.async, successFun, failFun, reqObj.contentType);
+}
+
+function defaultAjaxFail (errorCode, errorMsg, reqName) {
+  console.log('request error ======== [%s] => %s: %s', reqName, errorCode, errorMsg);
+}
+
+function defaultAjaxSuccess (data, reqName) {
+  console.log('request success ======== [%s] => %s: %s', reqName, JSON.stringify(data));
+}
+
+function ajaxRequest (type, url, data, async, success, fail, contentType) {
+  // var timestamp = new Date().getTime(); //+ '?stamp=' + timestamp
+  // data.timestamp = timestamp;
+  $.ajax({
+    type: type,
+    url: apiConfig.apiHost + url,
+    data: data,
+    dataType: 'json',
+    contentType: contentType,
+    // contentType: 'application/x-www-form-urlencoded; charset=utf-8',
+    // contentType: 'application/json',
+    timeout: 10 * 1000,
+    async: async,
+    success: function (data) {
+      if (typeof success === 'function') {
+        success(data);
+      }
+    },
+    error: function (xhr, errorType, error) {
+      if (typeof fail === 'function') {
+        fail(xhr, errorType, error);
+      }
+    }
+  });
+}

+ 17 - 0
src/api/api-config.js

@@ -0,0 +1,17 @@
+/**
+ * Created by majw on 2018/3/22.
+ */
+var queryApiPrefix = '/QT/rest/auditProjectAction/';
+
+module.exports = {
+    // apiHost: envConfig.apiHost,
+    apiHost: '/115.29.3.73',
+    RES_CommonError: ['999999', '系统繁忙,请稍后再试'],
+
+    /** -----------  query api -------------- */
+
+    queryApi: {
+        //查询
+        REQ_getAuditProjectByNoAndPwd: ['POST', queryApiPrefix + '/getAuditProjectByNoAndPwd', 'getAuditProjectByNoAndPwd']
+    }
+};

+ 18 - 0
src/api/impl/query-api.js

@@ -0,0 +1,18 @@
+/**
+ * Created by majw on 2018/3/29.
+ */
+
+var config = require('./../api-config');
+var api = require('./../api-base');
+
+module.exports = {
+
+    /**
+     *  根据办件编号和密码查办件详情(暂不支持密码查询)
+     */
+    getAuditProjectByNoAndPwd: function (obj, success, fail, async) {
+        var data = obj;
+        api.sendRequest(config.queryApi.REQ_getAuditProjectByNoAndPwd, data, async, success, fail, 'json');
+    }
+
+};

+ 4 - 0
src/assets/common.css

@@ -78,3 +78,7 @@ ul, li {
     box-sizing: border-box;
     pointer-events: none;
 }
+
+.input-title-blur {
+    color: #0894ec;
+}

+ 10 - 0
src/router/index.js

@@ -6,7 +6,17 @@ var router = new VueRouter({
         {
             path: '/',
             component: require('views/prepare')
+        },
+        {
+            path: '/query',
+            component: require('views/accreditation-query')
+        },
+        {
+            path: '/searchResult',
+            component: require('views/accreditation-search-result')
         }
+
+
     ]
 });
 module.exports = router;

+ 36 - 1
src/utils/utils.js

@@ -3,6 +3,41 @@
  */
 // var md5Lib = require('blueimp-md5')
 
-module.exports = {
 
+//对象深拷贝
+function deepClone(data){
+    var obj = {};
+    var originQueue = [data];
+    var copyQueue = [obj];
+    //以下两个队列用来保存复制过程中访问过的对象,以此来避免对象环的问题(对象的某个属性值是对象本身)
+    var visitQueue = [];
+    var copyVisitQueue = [];
+    while(originQueue.length > 0){
+        var _data = originQueue.shift();
+        var _obj = copyQueue.shift();
+        visitQueue.push(_data);
+        copyVisitQueue.push(_obj);
+        for(var key in _data){
+            var _value = _data[key]
+            if(typeof _value !== 'object'){
+                _obj[key] = _value;
+            } else {
+                //使用indexOf可以发现数组中是否存在相同的对象(实现indexOf的难点就在于对象比较)
+                var index = visitQueue.indexOf(_value);
+                if(index >= 0){
+                    // 出现环的情况不需要再取出遍历
+                    _obj[key] = copyVisitQueue[index];
+                } else {
+                    originQueue.push(_value);
+                    _obj[key] = {};
+                    copyQueue.push(_obj[key]);
+                }
+            }
+        }
+    }
+    return obj;
 }
+
+module.exports = {
+    deepClone: deepClone
+};

+ 168 - 0
src/views/accreditation-query.vue

@@ -0,0 +1,168 @@
+<template>
+    <div class="content query-box">
+        <div class="content-block tag-box">
+            <div class="buttons-row">
+                <a href="#tab1" class="tab-link active button">办件查询</a>
+                <a href="#tab2" class="tab-link button">搜索事项</a>
+            </div>
+        </div>
+        <div class="tabs">
+            <div id="tab1" class="tab active">
+                <div class="content-block">
+                    <div class="list-block">
+                        <ul>
+                            <div class="content-block-title input-title-blur">
+                                <div class="item-media"><i class="icon icon-card"></i>&nbsp;&nbsp;申 报 号:</div>
+                            </div>
+                            <li>
+                                <div class="item-content">
+                                    <div class="item-inner">
+                                        <div class="item-input">
+                                            <input v-model="cardNum" class="input-box" type="text"
+                                                   placeholder="请输入您的申报号">
+                                        </div>
+                                    </div>
+                                </div>
+                            </li>
+                            <div class="content-block-title input-title-blur">
+                                <div class="item-media"><i class="icon icon-star"></i>&nbsp;&nbsp;查 询 密 码:</div>
+                            </div>
+                            <li>
+                                <div class="item-content">
+                                    <div class="item-inner">
+                                        <div class="item-input">
+                                            <input v-model="cardPwd" type="password" placeholder="请输入您的查询密码">
+                                        </div>
+                                    </div>
+                                </div>
+                            </li>
+
+                            <li>
+                                <div class="item-content">
+                                    <div class="item-inner btn-box">
+                                        <button class="button button-fill" @click="query"><i
+                                                class="icon icon-search"></i>&nbsp;&nbsp;&nbsp;查&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;询
+                                        </button>
+                                    </div>
+                                </div>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+            <div id="tab2" class="tab">
+                <div class="content-block list-block">
+                    <div class="content-block-title input-title-blur">
+                        <div class="item-media"><i class="icon icon-browser"></i>&nbsp;&nbsp;查 询 事 项:</div>
+                    </div>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-input">
+                                <input v-model="matter" class="input-box" type="text"
+                                       placeholder="请输入您的事项名称">
+                            </div>
+                        </div>
+                    </div>
+                    <div class="item-content">
+                        <div class="item-inner btn-box">
+                            <button class="button button-fill" @click="matterQuery"><i class="icon icon-search"></i>&nbsp;&nbsp;&nbsp;查&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;询
+                            </button>
+                        </div>
+                    </div>
+
+                    <div class="content-block-title input-title-blur">
+                        <div class="item-media"><i class="icon icon-emoji"></i>&nbsp;&nbsp;热 点 事 项</div>
+                    </div>
+                    <div class="hot-spot-box">
+                        <div class="a-wrap clearfix">
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/社保" class="button fl button-danger">社 保</a>
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/公积金" class="button button-danger fr">公 积 金</a>
+                        </div>
+                        <div class="a-wrap clearfix">
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/户口" class="fl button button-warning">户 口</a>
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/身份证" class="fr button button-warning">身 份 证</a>
+                        </div>
+                        <div class="a-wrap clearfix">
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/档案" class="fl button button-success">档 案</a>
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/驾驶证" class="fr button button-success">驾 驶 证</a>
+                        </div>
+                        <div class="a-wrap clearfix">
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/工商" class="button fl">工 商</a>
+                            <a href="http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/企业设立" class="button fr">企 业 设 立</a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+    var self;
+    module.exports = {
+        data: function () {
+            return {
+                cardNum: '',
+                cardPwd: '',
+                matter: ''
+            }
+        },
+
+        created: function () {
+            self = this;
+        },
+
+        mounted: function () {
+            $.hidePreloader();
+        },
+
+        methods: {
+            query: function () {
+                if (self.cardNum) {
+                    self.$router.push({path: '/searchResult', query: {cardNum: self.cardNum, cardPwd: self.cardPwd}});
+                } else {
+                    $.alert('必须输入申报号');
+                }
+            },
+            matterQuery: function () {
+                if (self.matter) {
+                    location.href = 'http://ws12345.lszszw.gov.cn/lszw12345/index.html#!/webChat/search/' + self.matter;
+                } else {
+                    $.alert('必须输入查询事项名称');
+                }
+            }
+        }
+    };
+</script>
+
+<style scoped>
+    .query-box {
+        background: -webkit-linear-gradient(90deg, #F5F5F9, #FFFFFF);
+    }
+
+    .query-box .list-block ul {
+        background-color: rgba(255, 255, 255, 0);
+    }
+
+    .query-box .tag-box {
+        margin-top: 1rem;
+    }
+
+    .query-box .list-block ul:before, .query-box .list-block ul:after, .list-block .item-inner.btn-box:after {
+        height: 0;
+    }
+
+    .query-box .btn-box {
+        margin-top: 2rem;
+    }
+
+    .query-box .btn-box button {
+        height: 1.6rem;
+        width: 100%;
+    }
+
+    .query-box .hot-spot-box .a-wrap {
+        width: 100%;
+        padding: 0 2.2rem 1rem;
+    }
+</style>

+ 236 - 0
src/views/accreditation-search-result.vue

@@ -0,0 +1,236 @@
+<template>
+    <div class="content result-box">
+        <div class="list-block">
+            <div class="query-title">查 询 结 果&nbsp;&nbsp;</div>
+            <ul>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-app"></i>&nbsp;办件名称:
+                            </div>
+                            <div class="item-input">{{queryData.projectName || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-friends"></i>&nbsp;办理部门:
+                            </div>
+                            <div class="item-input">{{queryData.ouname || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-clock"></i>&nbsp;收件时间:
+                            </div>
+                            <div class="item-input">{{queryData.receivedate || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-me"></i>&nbsp;联系人:</div>
+                            <div class="item-input">{{queryData.contactperson || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-phone"></i>&nbsp;联系电话:
+                            </div>
+                            <div class="item-input">{{queryData.contactmobile || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-computer"></i>&nbsp;办理窗口:
+                            </div>
+                            <div class="item-input">{{queryData.windowname || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-star"></i>&nbsp;办件类型:
+                            </div>
+                            <div class="item-input">{{task[queryData.tasktype-1] || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-clock"></i>&nbsp;承诺时限:
+                            </div>
+                            <div class="item-input">{{queryData.promiseday || 0}}&nbsp;个工作日</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-edit"></i>&nbsp;办件状态:
+                            </div>
+                            <div class="item-input">{{statusData[queryData.status] || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-card"></i>&nbsp;申请人:
+                            </div>
+                            <div class="item-input">{{queryData.applyername || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+                <li>
+                    <div class="item-content">
+                        <div class="item-inner">
+                            <div class="item-title label input-title-blur"><i class="icon icon-clock"></i>&nbsp;办理用时:
+                            </div>
+                            <div class="item-input">{{queryData.spendminutes || '无数据'}}</div>
+                        </div>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</template>
+
+<script>
+    var self;
+    var api = require('api/admin-api');
+    var utils = require('utils/utils');
+    module.exports = {
+        data: function () {
+            return {
+                queryData: {
+                    applyername: '',
+                    certnum: '',
+                    contactmobile: '',
+                    contactperson: '',
+                    flowsn: '',
+                    ouguid: '',
+                    ouname: '',
+                    projectName: '',
+                    promiseday: '',
+                    promiseenddate: '',
+                    receivedate: '',
+                    spendminutes: '',
+                    status: '',
+                    taskguid: '',
+                    tasktype: '',
+                    windowguid: '',
+                    windowname: '',
+                    xiangmubh: ''
+                },
+                task: ['即办件', '承诺件', '上报件'],
+                statusData: {
+                    '8': '外网申报初始化',
+                    '10': '外网申报未提交',
+                    '12': '外网申报已提交',
+                    '14': '外网申报预审退回',
+                    '16': '外网申报预审通过',
+                    '20': '初始化',
+                    '22': '预登记',
+                    '24': '待接件',
+                    '26': '已接件',
+                    '28': '待补办',
+                    '30': '已受理',
+                    '40': '审批不通过',
+                    '50': '审批通过',
+                    '90': '正常办结',
+                    '97': '不予受理',
+                    '98': '撤销申请',
+                    '99': '异常终止'
+                }
+            }
+        },
+
+        created: function () {
+            self = this;
+        },
+
+        mounted: function () {
+            getAuditProjectByNoAndPwd();
+        },
+
+        methods: {}
+    };
+
+    function getAuditProjectByNoAndPwd() {
+        $.showPreloader();
+        var data = {
+            ValidateData: "epointtaizhouXVCJ9",
+            Paras: {
+                auditProjectGuid: self.$route.query.cardNum,
+                password: self.$route.query.cardPwd
+            }
+        };
+        api.getAuditProjectByNoAndPwd(data, function (UserArea) {
+            if(UserArea.projects.length){
+                self.queryData = utils.deepClone(UserArea.projects[0]);
+            } else {
+                $.alert('未检索到记录....');
+            }
+            $.hidePreloader();
+        }, function (BussinessInfo, ReturnInfo) {
+            $.alert('暂无数据,请稍后重试...');
+            $.hidePreloader();
+        })
+    }
+</script>
+
+<style scoped>
+    .result-box {
+        background: -webkit-linear-gradient(90deg, #F5F5F9, #FFFFFF);
+    }
+
+    .result-box .list-block {
+        margin-top: 0;
+    }
+
+    .result-box .list-block .query-title {
+        text-align: center;
+        font-size: .75rem;
+        line-height: 2rem;
+        background-color: #F5F5F9;
+        margin-bottom: .3rem;
+        color: #0894ec;
+    }
+
+    .result-box .list-block ul {
+        background-color: rgba(255, 255, 255, 0);
+    }
+
+    .result-box .list-block ul:before, .query-box .list-block ul:after {
+        height: 0;
+    }
+
+    .result-box .item-inner {
+        font-size: .7rem;;
+        box-shadow: 0.05rem 0.05rem 0.05rem -0.01rem rgba(0, 0, 0, .2);
+        margin: 0 .5rem 0 0;
+        position: relative;
+        border-radius: .1rem;
+    }
+
+    .result-box ul li {
+        margin-bottom: .7rem;
+    }
+
+    .result-box .list-block .item-content {
+        padding-left: .5rem;
+    }
+
+</style>

+ 9 - 5
src/views/prepare.vue

@@ -1,6 +1,10 @@
 <template>
-    <div class="content">
-        <div class="prepare"></div>
+    <div class="content mianBg">
+        <div class="prepare">
+            <div class="content-block">
+                <p><a href="#/query" class="button button-fill button-warning">进入办证查询系统</a></p>
+            </div>
+        </div>
     </div>
 </template>
 
@@ -8,8 +12,7 @@
     var self;
     module.exports = {
         data: function () {
-            return {
-            }
+            return {}
         },
 
         created: function () {
@@ -20,12 +23,13 @@
         },
 
         methods: {
+
         }
     };
 </script>
 
 <style scoped>
-    .prepare {
+    .mianBg {
         width: 100%;
         height: 100%;
         background: url('../assets/images/timg.jpg') no-repeat;