xiaoyuzhang hace 4 años
commit
594dc88a0b
Se han modificado 52 ficheros con 21339 adiciones y 0 borrados
  1. 39 0
      .babelrc
  2. 132 0
      .electron-vue/build.js
  3. 40 0
      .electron-vue/dev-client.js
  4. 190 0
      .electron-vue/dev-runner.js
  5. 72 0
      .electron-vue/webpack.main.config.js
  6. 179 0
      .electron-vue/webpack.renderer.config.js
  7. 140 0
      .electron-vue/webpack.web.config.js
  8. 11 0
      .gitignore
  9. 11 0
      .idea/electronVueDemo.iml
  10. 6 0
      .idea/misc.xml
  11. 8 0
      .idea/modules.xml
  12. 451 0
      .idea/workspace.xml
  13. 43 0
      .travis.yml
  14. 25 0
      README.md
  15. 32 0
      appveyor.yml
  16. BIN
      build/icons/256x256.png
  17. BIN
      build/icons/icon.icns
  18. BIN
      build/icons/icon.ico
  19. 0 0
      dist/electron/.gitkeep
  20. 0 0
      dist/web/.gitkeep
  21. 17981 0
      package-lock.json
  22. 119 0
      package.json
  23. 24 0
      src/index.ejs
  24. 24 0
      src/main/index.dev.js
  25. 80 0
      src/main/index.js
  26. 15 0
      src/renderer/App.vue
  27. 0 0
      src/renderer/assets/.gitkeep
  28. BIN
      src/renderer/assets/logo.png
  29. 128 0
      src/renderer/components/LandingPage.vue
  30. 74 0
      src/renderer/components/LandingPage/SystemInformation.vue
  31. 35 0
      src/renderer/main.js
  32. 18 0
      src/renderer/router/index.js
  33. 18 0
      src/renderer/store/index.js
  34. 25 0
      src/renderer/store/modules/Counter.js
  35. 14 0
      src/renderer/store/modules/index.js
  36. 633 0
      src/renderer/store/modules/socket.js
  37. 0 0
      static/.gitkeep
  38. 32 0
      static/server/app.js
  39. 86 0
      static/server/bin/www.js
  40. 7 0
      static/server/protocal/checksum.js
  41. 16 0
      static/server/protocal/command.js
  42. 6 0
      static/server/protocal/global.js
  43. 292 0
      static/server/protocal/protocal.js
  44. 82 0
      static/server/protocal/sendProtocal.js
  45. 98 0
      static/server/socketClient.js
  46. 11 0
      test/.eslintrc
  47. 18 0
      test/e2e/index.js
  48. 13 0
      test/e2e/specs/Launch.spec.js
  49. 23 0
      test/e2e/utils.js
  50. 13 0
      test/unit/index.js
  51. 62 0
      test/unit/karma.conf.js
  52. 13 0
      test/unit/specs/LandingPage.spec.js

+ 39 - 0
.babelrc

@@ -0,0 +1,39 @@
1
+{
2
+  "comments": false,
3
+  "env": {
4
+    "test": {
5
+      "presets": [
6
+        ["env", {
7
+          "targets": { "node": 7 }
8
+        }],
9
+        "stage-0"
10
+      ],
11
+      "plugins": ["istanbul"]
12
+    },
13
+    "main": {
14
+      "presets": [
15
+        ["env", {
16
+          "targets": { "node": 7 }
17
+        }],
18
+        "stage-0"
19
+      ]
20
+    },
21
+    "renderer": {
22
+      "presets": [
23
+        ["env", {
24
+          "modules": false
25
+        }],
26
+        "stage-0"
27
+      ]
28
+    },
29
+    "web": {
30
+      "presets": [
31
+        ["env", {
32
+          "modules": false
33
+        }],
34
+        "stage-0"
35
+      ]
36
+    }
37
+  },
38
+  "plugins": ["transform-runtime"]
39
+}

+ 132 - 0
.electron-vue/build.js

@@ -0,0 +1,132 @@
1
+'use strict'
2
+
3
+process.env.NODE_ENV = 'production'
4
+
5
+const { say } = require('cfonts')
6
+const chalk = require('chalk')
7
+const del = require('del')
8
+const { spawn } = require('child_process')
9
+const webpack = require('webpack')
10
+const Multispinner = require('multispinner')
11
+
12
+
13
+const mainConfig = require('./webpack.main.config')
14
+const rendererConfig = require('./webpack.renderer.config')
15
+const webConfig = require('./webpack.web.config')
16
+
17
+const doneLog = chalk.bgGreen.white(' DONE ') + ' '
18
+const errorLog = chalk.bgRed.white(' ERROR ') + ' '
19
+const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
20
+const isCI = process.env.CI || false
21
+
22
+if (process.env.BUILD_TARGET === 'clean') clean()
23
+else if (process.env.BUILD_TARGET === 'web') web()
24
+else build()
25
+
26
+function clean () {
27
+  del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
28
+  console.log(`\n${doneLog}\n`)
29
+  process.exit()
30
+}
31
+
32
+function build () {
33
+  greeting()
34
+
35
+  del.sync(['dist/electron/*', '!.gitkeep'])
36
+
37
+  const tasks = ['main', 'renderer']
38
+  const m = new Multispinner(tasks, {
39
+    preText: 'building',
40
+    postText: 'process'
41
+  })
42
+
43
+  let results = ''
44
+
45
+  m.on('success', () => {
46
+    process.stdout.write('\x1B[2J\x1B[0f')
47
+    console.log(`\n\n${results}`)
48
+    console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
49
+    process.exit()
50
+  })
51
+
52
+  pack(mainConfig).then(result => {
53
+    results += result + '\n\n'
54
+    m.success('main')
55
+  }).catch(err => {
56
+    m.error('main')
57
+    console.log(`\n  ${errorLog}failed to build main process`)
58
+    console.error(`\n${err}\n`)
59
+    process.exit(1)
60
+  })
61
+
62
+  pack(rendererConfig).then(result => {
63
+    results += result + '\n\n'
64
+    m.success('renderer')
65
+  }).catch(err => {
66
+    m.error('renderer')
67
+    console.log(`\n  ${errorLog}failed to build renderer process`)
68
+    console.error(`\n${err}\n`)
69
+    process.exit(1)
70
+  })
71
+}
72
+
73
+function pack (config) {
74
+  return new Promise((resolve, reject) => {
75
+    config.mode = 'production'
76
+    webpack(config, (err, stats) => {
77
+      if (err) reject(err.stack || err)
78
+      else if (stats.hasErrors()) {
79
+        let err = ''
80
+
81
+        stats.toString({
82
+          chunks: false,
83
+          colors: true
84
+        })
85
+        .split(/\r?\n/)
86
+        .forEach(line => {
87
+          err += `    ${line}\n`
88
+        })
89
+
90
+        reject(err)
91
+      } else {
92
+        resolve(stats.toString({
93
+          chunks: false,
94
+          colors: true
95
+        }))
96
+      }
97
+    })
98
+  })
99
+}
100
+
101
+function web () {
102
+  del.sync(['dist/web/*', '!.gitkeep'])
103
+  webConfig.mode = 'production'
104
+  webpack(webConfig, (err, stats) => {
105
+    if (err || stats.hasErrors()) console.log(err)
106
+
107
+    console.log(stats.toString({
108
+      chunks: false,
109
+      colors: true
110
+    }))
111
+
112
+    process.exit()
113
+  })
114
+}
115
+
116
+function greeting () {
117
+  const cols = process.stdout.columns
118
+  let text = ''
119
+
120
+  if (cols > 85) text = 'lets-build'
121
+  else if (cols > 60) text = 'lets-|build'
122
+  else text = false
123
+
124
+  if (text && !isCI) {
125
+    say(text, {
126
+      colors: ['yellow'],
127
+      font: 'simple3d',
128
+      space: false
129
+    })
130
+  } else console.log(chalk.yellow.bold('\n  lets-build'))
131
+  console.log()
132
+}

+ 40 - 0
.electron-vue/dev-client.js

@@ -0,0 +1,40 @@
1
+const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
2
+
3
+hotClient.subscribe(event => {
4
+  /**
5
+   * Reload browser when HTMLWebpackPlugin emits a new index.html
6
+   *
7
+   * Currently disabled until jantimon/html-webpack-plugin#680 is resolved.
8
+   * https://github.com/SimulatedGREG/electron-vue/issues/437
9
+   * https://github.com/jantimon/html-webpack-plugin/issues/680
10
+   */
11
+  // if (event.action === 'reload') {
12
+  //   window.location.reload()
13
+  // }
14
+
15
+  /**
16
+   * Notify `mainWindow` when `main` process is compiling,
17
+   * giving notice for an expected reload of the `electron` process
18
+   */
19
+  if (event.action === 'compiling') {
20
+    document.body.innerHTML += `
21
+      <style>
22
+        #dev-client {
23
+          background: #4fc08d;
24
+          border-radius: 4px;
25
+          bottom: 20px;
26
+          box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
27
+          color: #fff;
28
+          font-family: 'Source Sans Pro', sans-serif;
29
+          left: 20px;
30
+          padding: 8px 12px;
31
+          position: absolute;
32
+        }
33
+      </style>
34
+
35
+      <div id="dev-client">
36
+        Compiling Main Process...
37
+      </div>
38
+    `
39
+  }
40
+})

+ 190 - 0
.electron-vue/dev-runner.js

@@ -0,0 +1,190 @@
1
+'use strict'
2
+
3
+const chalk = require('chalk')
4
+const electron = require('electron')
5
+const path = require('path')
6
+const { say } = require('cfonts')
7
+const { spawn } = require('child_process')
8
+const webpack = require('webpack')
9
+const WebpackDevServer = require('webpack-dev-server')
10
+const webpackHotMiddleware = require('webpack-hot-middleware')
11
+
12
+const mainConfig = require('./webpack.main.config')
13
+const rendererConfig = require('./webpack.renderer.config')
14
+
15
+let electronProcess = null
16
+let manualRestart = false
17
+let hotMiddleware
18
+
19
+function logStats (proc, data) {
20
+  let log = ''
21
+
22
+  log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`)
23
+  log += '\n\n'
24
+
25
+  if (typeof data === 'object') {
26
+    data.toString({
27
+      colors: true,
28
+      chunks: false
29
+    }).split(/\r?\n/).forEach(line => {
30
+      log += '  ' + line + '\n'
31
+    })
32
+  } else {
33
+    log += `  ${data}\n`
34
+  }
35
+
36
+  log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n'
37
+
38
+  console.log(log)
39
+}
40
+
41
+function startRenderer () {
42
+  return new Promise((resolve, reject) => {
43
+    rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
44
+    rendererConfig.mode = 'development'
45
+    const compiler = webpack(rendererConfig)
46
+    hotMiddleware = webpackHotMiddleware(compiler, {
47
+      log: false,
48
+      heartbeat: 2500
49
+    })
50
+
51
+    compiler.hooks.compilation.tap('compilation', compilation => {
52
+      compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
53
+        hotMiddleware.publish({ action: 'reload' })
54
+        cb()
55
+      })
56
+    })
57
+
58
+    compiler.hooks.done.tap('done', stats => {
59
+      logStats('Renderer', stats)
60
+    })
61
+
62
+    const server = new WebpackDevServer(
63
+      compiler,
64
+      {
65
+        contentBase: path.join(__dirname, '../'),
66
+        quiet: true,
67
+        before (app, ctx) {
68
+          app.use(hotMiddleware)
69
+          ctx.middleware.waitUntilValid(() => {
70
+            resolve()
71
+          })
72
+        }
73
+      }
74
+    )
75
+
76
+    server.listen(9080)
77
+  })
78
+}
79
+
80
+function startMain () {
81
+  return new Promise((resolve, reject) => {
82
+    mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
83
+    mainConfig.mode = 'development'
84
+    const compiler = webpack(mainConfig)
85
+
86
+    compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
87
+      logStats('Main', chalk.white.bold('compiling...'))
88
+      hotMiddleware.publish({ action: 'compiling' })
89
+      done()
90
+    })
91
+
92
+    compiler.watch({}, (err, stats) => {
93
+      if (err) {
94
+        console.log(err)
95
+        return
96
+      }
97
+
98
+      logStats('Main', stats)
99
+
100
+      if (electronProcess && electronProcess.kill) {
101
+        manualRestart = true
102
+        process.kill(electronProcess.pid)
103
+        electronProcess = null
104
+        startElectron()
105
+
106
+        setTimeout(() => {
107
+          manualRestart = false
108
+        }, 5000)
109
+      }
110
+
111
+      resolve()
112
+    })
113
+  })
114
+}
115
+
116
+function startElectron () {
117
+  var args = [
118
+    '--inspect=5858',
119
+    path.join(__dirname, '../dist/electron/main.js')
120
+  ]
121
+
122
+  // detect yarn or npm and process commandline args accordingly
123
+  if (process.env.npm_execpath.endsWith('yarn.js')) {
124
+    args = args.concat(process.argv.slice(3))
125
+  } else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
126
+    args = args.concat(process.argv.slice(2))
127
+  }
128
+
129
+  electronProcess = spawn(electron, args)
130
+  
131
+  electronProcess.stdout.on('data', data => {
132
+    electronLog(data, 'blue')
133
+  })
134
+  electronProcess.stderr.on('data', data => {
135
+    electronLog(data, 'red')
136
+  })
137
+
138
+  electronProcess.on('close', () => {
139
+    if (!manualRestart) process.exit()
140
+  })
141
+}
142
+
143
+function electronLog (data, color) {
144
+  let log = ''
145
+  data = data.toString().split(/\r?\n/)
146
+  data.forEach(line => {
147
+    log += `  ${line}\n`
148
+  })
149
+  if (/[0-9A-z]+/.test(log)) {
150
+    console.log(
151
+      chalk[color].bold('┏ Electron -------------------') +
152
+      '\n\n' +
153
+      log +
154
+      chalk[color].bold('┗ ----------------------------') +
155
+      '\n'
156
+    )
157
+  }
158
+}
159
+
160
+function greeting () {
161
+  const cols = process.stdout.columns
162
+  let text = ''
163
+
164
+  if (cols > 104) text = 'electron-vue'
165
+  else if (cols > 76) text = 'electron-|vue'
166
+  else text = false
167
+
168
+  if (text) {
169
+    say(text, {
170
+      colors: ['yellow'],
171
+      font: 'simple3d',
172
+      space: false
173
+    })
174
+  } else console.log(chalk.yellow.bold('\n  electron-vue'))
175
+  console.log(chalk.blue('  getting ready...') + '\n')
176
+}
177
+
178
+function init () {
179
+  greeting()
180
+
181
+  Promise.all([startRenderer(), startMain()])
182
+    .then(() => {
183
+      startElectron()
184
+    })
185
+    .catch(err => {
186
+      console.error(err)
187
+    })
188
+}
189
+
190
+init()

+ 72 - 0
.electron-vue/webpack.main.config.js

@@ -0,0 +1,72 @@
1
+'use strict'
2
+
3
+process.env.BABEL_ENV = 'main'
4
+
5
+const path = require('path')
6
+const { dependencies } = require('../package.json')
7
+const webpack = require('webpack')
8
+
9
+const MinifyPlugin = require("babel-minify-webpack-plugin")
10
+
11
+let mainConfig = {
12
+  entry: {
13
+    main: path.join(__dirname, '../src/main/index.js')
14
+  },
15
+  externals: [
16
+    ...Object.keys(dependencies || {})
17
+  ],
18
+  module: {
19
+    rules: [
20
+      {
21
+        test: /\.js$/,
22
+        use: 'babel-loader',
23
+        exclude: /node_modules/
24
+      },
25
+      {
26
+        test: /\.node$/,
27
+        use: 'node-loader'
28
+      }
29
+    ]
30
+  },
31
+  node: {
32
+    __dirname: process.env.NODE_ENV !== 'production',
33
+    __filename: process.env.NODE_ENV !== 'production'
34
+  },
35
+  output: {
36
+    filename: '[name].js',
37
+    libraryTarget: 'commonjs2',
38
+    path: path.join(__dirname, '../dist/electron')
39
+  },
40
+  plugins: [
41
+    new webpack.NoEmitOnErrorsPlugin()
42
+  ],
43
+  resolve: {
44
+    extensions: ['.js', '.json', '.node']
45
+  },
46
+  target: 'electron-main'
47
+}
48
+
49
+/**
50
+ * Adjust mainConfig for development settings
51
+ */
52
+if (process.env.NODE_ENV !== 'production') {
53
+  mainConfig.plugins.push(
54
+    new webpack.DefinePlugin({
55
+      '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
56
+    })
57
+  )
58
+}
59
+
60
+/**
61
+ * Adjust mainConfig for production settings
62
+ */
63
+if (process.env.NODE_ENV === 'production') {
64
+  mainConfig.plugins.push(
65
+    new MinifyPlugin(),
66
+    new webpack.DefinePlugin({
67
+      'process.env.NODE_ENV': '"production"'
68
+    })
69
+  )
70
+}
71
+
72
+module.exports = mainConfig

+ 179 - 0
.electron-vue/webpack.renderer.config.js

@@ -0,0 +1,179 @@
1
+'use strict'
2
+
3
+process.env.BABEL_ENV = 'renderer'
4
+
5
+const path = require('path')
6
+const { dependencies } = require('../package.json')
7
+const webpack = require('webpack')
8
+
9
+const MinifyPlugin = require("babel-minify-webpack-plugin")
10
+const CopyWebpackPlugin = require('copy-webpack-plugin')
11
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
12
+const HtmlWebpackPlugin = require('html-webpack-plugin')
13
+const { VueLoaderPlugin } = require('vue-loader')
14
+
15
+/**
16
+ * List of node_modules to include in webpack bundle
17
+ *
18
+ * Required for specific packages like Vue UI libraries
19
+ * that provide pure *.vue files that need compiling
20
+ * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals
21
+ */
22
+let whiteListedModules = ['vue']
23
+
24
+let rendererConfig = {
25
+  devtool: '#cheap-module-eval-source-map',
26
+  entry: {
27
+    renderer: path.join(__dirname, '../src/renderer/main.js')
28
+  },
29
+  externals: [
30
+    ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
31
+  ],
32
+  module: {
33
+    rules: [
34
+      {
35
+        test: /\.scss$/,
36
+        use: ['vue-style-loader', 'css-loader', 'sass-loader']
37
+      },
38
+      {
39
+        test: /\.sass$/,
40
+        use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
41
+      },
42
+      {
43
+        test: /\.less$/,
44
+        use: ['vue-style-loader', 'css-loader', 'less-loader']
45
+      },
46
+      {
47
+        test: /\.css$/,
48
+        use: ['vue-style-loader', 'css-loader']
49
+      },
50
+      {
51
+        test: /\.html$/,
52
+        use: 'vue-html-loader'
53
+      },
54
+      {
55
+        test: /\.js$/,
56
+        use: 'babel-loader',
57
+        exclude: /node_modules/
58
+      },
59
+      {
60
+        test: /\.node$/,
61
+        use: 'node-loader'
62
+      },
63
+      {
64
+        test: /\.vue$/,
65
+        use: {
66
+          loader: 'vue-loader',
67
+          options: {
68
+            extractCSS: process.env.NODE_ENV === 'production',
69
+            loaders: {
70
+              sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
71
+              scss: 'vue-style-loader!css-loader!sass-loader',
72
+              less: 'vue-style-loader!css-loader!less-loader'
73
+            }
74
+          }
75
+        }
76
+      },
77
+      {
78
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
79
+        use: {
80
+          loader: 'url-loader',
81
+          query: {
82
+            limit: 10000,
83
+            name: 'imgs/[name]--[folder].[ext]'
84
+          }
85
+        }
86
+      },
87
+      {
88
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
89
+        loader: 'url-loader',
90
+        options: {
91
+          limit: 10000,
92
+          name: 'media/[name]--[folder].[ext]'
93
+        }
94
+      },
95
+      {
96
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
97
+        use: {
98
+          loader: 'url-loader',
99
+          query: {
100
+            limit: 10000,
101
+            name: 'fonts/[name]--[folder].[ext]'
102
+          }
103
+        }
104
+      }
105
+    ]
106
+  },
107
+  node: {
108
+    __dirname: process.env.NODE_ENV !== 'production',
109
+    __filename: process.env.NODE_ENV !== 'production'
110
+  },
111
+  plugins: [
112
+    new VueLoaderPlugin(),
113
+    new MiniCssExtractPlugin({filename: 'styles.css'}),
114
+    new HtmlWebpackPlugin({
115
+      filename: 'index.html',
116
+      template: path.resolve(__dirname, '../src/index.ejs'),
117
+      minify: {
118
+        collapseWhitespace: true,
119
+        removeAttributeQuotes: true,
120
+        removeComments: true
121
+      },
122
+      nodeModules: process.env.NODE_ENV !== 'production'
123
+        ? path.resolve(__dirname, '../node_modules')
124
+        : false
125
+    }),
126
+    new webpack.HotModuleReplacementPlugin(),
127
+    new webpack.NoEmitOnErrorsPlugin()
128
+  ],
129
+  output: {
130
+    filename: '[name].js',
131
+    libraryTarget: 'commonjs2',
132
+    path: path.join(__dirname, '../dist/electron')
133
+  },
134
+  resolve: {
135
+    alias: {
136
+      '@': path.join(__dirname, '../src/renderer'),
137
+      'vue$': 'vue/dist/vue.esm.js'
138
+    },
139
+    extensions: ['.js', '.vue', '.json', '.css', '.node']
140
+  },
141
+  target: 'electron-renderer'
142
+}
143
+
144
+/**
145
+ * Adjust rendererConfig for development settings
146
+ */
147
+if (process.env.NODE_ENV !== 'production') {
148
+  rendererConfig.plugins.push(
149
+    new webpack.DefinePlugin({
150
+      '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
151
+    })
152
+  )
153
+}
154
+
155
+/**
156
+ * Adjust rendererConfig for production settings
157
+ */
158
+if (process.env.NODE_ENV === 'production') {
159
+  rendererConfig.devtool = ''
160
+
161
+  rendererConfig.plugins.push(
162
+    new MinifyPlugin(),
163
+    new CopyWebpackPlugin([
164
+      {
165
+        from: path.join(__dirname, '../static'),
166
+        to: path.join(__dirname, '../dist/electron/static'),
167
+        ignore: ['.*']
168
+      }
169
+    ]),
170
+    new webpack.DefinePlugin({
171
+      'process.env.NODE_ENV': '"production"'
172
+    }),
173
+    new webpack.LoaderOptionsPlugin({
174
+      minimize: true
175
+    })
176
+  )
177
+}
178
+
179
+module.exports = rendererConfig

+ 140 - 0
.electron-vue/webpack.web.config.js

@@ -0,0 +1,140 @@
1
+'use strict'
2
+
3
+process.env.BABEL_ENV = 'web'
4
+
5
+const path = require('path')
6
+const webpack = require('webpack')
7
+
8
+const MinifyPlugin = require("babel-minify-webpack-plugin")
9
+const CopyWebpackPlugin = require('copy-webpack-plugin')
10
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
11
+const HtmlWebpackPlugin = require('html-webpack-plugin')
12
+const { VueLoaderPlugin } = require('vue-loader')
13
+
14
+let webConfig = {
15
+  devtool: '#cheap-module-eval-source-map',
16
+  entry: {
17
+    web: path.join(__dirname, '../src/renderer/main.js')
18
+  },
19
+  module: {
20
+    rules: [
21
+      {
22
+        test: /\.scss$/,
23
+        use: ['vue-style-loader', 'css-loader', 'sass-loader']
24
+      },
25
+      {
26
+        test: /\.sass$/,
27
+        use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
28
+      },
29
+      {
30
+        test: /\.less$/,
31
+        use: ['vue-style-loader', 'css-loader', 'less-loader']
32
+      },
33
+      {
34
+        test: /\.css$/,
35
+        use: ['vue-style-loader', 'css-loader']
36
+      },
37
+      {
38
+        test: /\.html$/,
39
+        use: 'vue-html-loader'
40
+      },
41
+      {
42
+        test: /\.js$/,
43
+        use: 'babel-loader',
44
+        include: [ path.resolve(__dirname, '../src/renderer') ],
45
+        exclude: /node_modules/
46
+      },
47
+      {
48
+        test: /\.vue$/,
49
+        use: {
50
+          loader: 'vue-loader',
51
+          options: {
52
+            extractCSS: true,
53
+            loaders: {
54
+              sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
55
+              scss: 'vue-style-loader!css-loader!sass-loader',
56
+              less: 'vue-style-loader!css-loader!less-loader'
57
+            }
58
+          }
59
+        }
60
+      },
61
+      {
62
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
63
+        use: {
64
+          loader: 'url-loader',
65
+          query: {
66
+            limit: 10000,
67
+            name: 'imgs/[name].[ext]'
68
+          }
69
+        }
70
+      },
71
+      {
72
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
73
+        use: {
74
+          loader: 'url-loader',
75
+          query: {
76
+            limit: 10000,
77
+            name: 'fonts/[name].[ext]'
78
+          }
79
+        }
80
+      }
81
+    ]
82
+  },
83
+  plugins: [
84
+    new VueLoaderPlugin(),
85
+    new MiniCssExtractPlugin({filename: 'styles.css'}),
86
+    new HtmlWebpackPlugin({
87
+      filename: 'index.html',
88
+      template: path.resolve(__dirname, '../src/index.ejs'),
89
+      minify: {
90
+        collapseWhitespace: true,
91
+        removeAttributeQuotes: true,
92
+        removeComments: true
93
+      },
94
+      nodeModules: false
95
+    }),
96
+    new webpack.DefinePlugin({
97
+      'process.env.IS_WEB': 'true'
98
+    }),
99
+    new webpack.HotModuleReplacementPlugin(),
100
+    new webpack.NoEmitOnErrorsPlugin()
101
+  ],
102
+  output: {
103
+    filename: '[name].js',
104
+    path: path.join(__dirname, '../dist/web')
105
+  },
106
+  resolve: {
107
+    alias: {
108
+      '@': path.join(__dirname, '../src/renderer'),
109
+      'vue$': 'vue/dist/vue.esm.js'
110
+    },
111
+    extensions: ['.js', '.vue', '.json', '.css']
112
+  },
113
+  target: 'web'
114
+}
115
+
116
+/**
117
+ * Adjust webConfig for production settings
118
+ */
119
+if (process.env.NODE_ENV === 'production') {
120
+  webConfig.devtool = ''
121
+
122
+  webConfig.plugins.push(
123
+    new MinifyPlugin(),
124
+    new CopyWebpackPlugin([
125
+      {
126
+        from: path.join(__dirname, '../static'),
127
+        to: path.join(__dirname, '../dist/web/static'),
128
+        ignore: ['.*']
129
+      }
130
+    ]),
131
+    new webpack.DefinePlugin({
132
+      'process.env.NODE_ENV': '"production"'
133
+    }),
134
+    new webpack.LoaderOptionsPlugin({
135
+      minimize: true
136
+    })
137
+  )
138
+}
139
+
140
+module.exports = webConfig

+ 11 - 0
.gitignore

@@ -0,0 +1,11 @@
1
+.DS_Store
2
+dist/electron/*
3
+dist/web/*
4
+build/*
5
+!build/icons
6
+coverage
7
+node_modules/
8
+npm-debug.log
9
+npm-debug.log.*
10
+thumbs.db
11
+!.gitkeep

+ 11 - 0
.idea/electronVueDemo.iml

@@ -0,0 +1,11 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<module type="WEB_MODULE" version="4">
3
+  <component name="NewModuleRootManager">
4
+    <content url="file://$MODULE_DIR$">
5
+      <excludeFolder url="file://$MODULE_DIR$/node_modules" />
6
+    </content>
7
+    <content url="file://$MODULE_DIR$/node_modules" />
8
+    <orderEntry type="inheritedJdk" />
9
+    <orderEntry type="sourceFolder" forTests="false" />
10
+  </component>
11
+</module>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project version="4">
3
+  <component name="JavaScriptSettings">
4
+    <option name="languageLevel" value="ES6" />
5
+  </component>
6
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project version="4">
3
+  <component name="ProjectModuleManager">
4
+    <modules>
5
+      <module fileurl="file://$PROJECT_DIR$/.idea/electronVueDemo.iml" filepath="$PROJECT_DIR$/.idea/electronVueDemo.iml" />
6
+    </modules>
7
+  </component>
8
+</project>

+ 451 - 0
.idea/workspace.xml

@@ -0,0 +1,451 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project version="4">
3
+  <component name="ChangeListManager">
4
+    <list default="true" id="9ae72f43-a1a0-4e71-8c9a-da776f48ee97" name="Default" comment="" />
5
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
6
+    <option name="TRACKING_ENABLED" value="true" />
7
+    <option name="SHOW_DIALOG" value="false" />
8
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
9
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
10
+    <option name="LAST_RESOLUTION" value="IGNORE" />
11
+  </component>
12
+  <component name="FileEditorManager">
13
+    <leaf>
14
+      <file leaf-file-name="package.json" pinned="false" current-in-tab="false">
15
+        <entry file="file://$PROJECT_DIR$/package.json">
16
+          <provider selected="true" editor-type-id="text-editor">
17
+            <state relative-caret-position="-14">
18
+              <caret line="36" column="33" lean-forward="false" selection-start-line="36" selection-start-column="33" selection-end-line="36" selection-end-column="33" />
19
+              <folding />
20
+            </state>
21
+          </provider>
22
+        </entry>
23
+      </file>
24
+      <file leaf-file-name="index.js" pinned="false" current-in-tab="false">
25
+        <entry file="file://$PROJECT_DIR$/src/renderer/router/index.js">
26
+          <provider selected="true" editor-type-id="text-editor">
27
+            <state relative-caret-position="0">
28
+              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
29
+              <folding>
30
+                <element signature="e#0#21#0" expanded="true" />
31
+              </folding>
32
+            </state>
33
+          </provider>
34
+        </entry>
35
+      </file>
36
+      <file leaf-file-name="SystemInformation.vue" pinned="false" current-in-tab="false">
37
+        <entry file="file://$PROJECT_DIR$/src/renderer/components/LandingPage/SystemInformation.vue">
38
+          <provider selected="true" editor-type-id="text-editor">
39
+            <state relative-caret-position="357">
40
+              <caret line="33" column="27" lean-forward="false" selection-start-line="33" selection-start-column="27" selection-end-line="33" selection-end-column="27" />
41
+              <folding />
42
+            </state>
43
+          </provider>
44
+        </entry>
45
+      </file>
46
+      <file leaf-file-name="main.js" pinned="false" current-in-tab="false">
47
+        <entry file="file://$PROJECT_DIR$/src/renderer/main.js">
48
+          <provider selected="true" editor-type-id="text-editor">
49
+            <state relative-caret-position="391">
50
+              <caret line="23" column="27" lean-forward="false" selection-start-line="23" selection-start-column="27" selection-end-line="23" selection-end-column="27" />
51
+              <folding>
52
+                <element signature="e#0#21#0" expanded="true" />
53
+              </folding>
54
+            </state>
55
+          </provider>
56
+        </entry>
57
+      </file>
58
+      <file leaf-file-name="app.js" pinned="false" current-in-tab="false">
59
+        <entry file="file://$PROJECT_DIR$/static/server/app.js">
60
+          <provider selected="true" editor-type-id="text-editor">
61
+            <state relative-caret-position="340">
62
+              <caret line="20" column="28" lean-forward="false" selection-start-line="20" selection-start-column="28" selection-end-line="20" selection-end-column="28" />
63
+              <folding />
64
+            </state>
65
+          </provider>
66
+        </entry>
67
+      </file>
68
+      <file leaf-file-name="socket.js" pinned="false" current-in-tab="false">
69
+        <entry file="file://$PROJECT_DIR$/src/renderer/store/modules/socket.js">
70
+          <provider selected="true" editor-type-id="text-editor">
71
+            <state relative-caret-position="765">
72
+              <caret line="102" column="41" lean-forward="true" selection-start-line="102" selection-start-column="41" selection-end-line="102" selection-end-column="41" />
73
+              <folding />
74
+            </state>
75
+          </provider>
76
+        </entry>
77
+      </file>
78
+      <file leaf-file-name="index.js" pinned="false" current-in-tab="true">
79
+        <entry file="file://$PROJECT_DIR$/src/renderer/store/index.js">
80
+          <provider selected="true" editor-type-id="text-editor">
81
+            <state relative-caret-position="272">
82
+              <caret line="16" column="47" lean-forward="true" selection-start-line="16" selection-start-column="47" selection-end-line="16" selection-end-column="47" />
83
+              <folding>
84
+                <element signature="e#0#21#0" expanded="true" />
85
+              </folding>
86
+            </state>
87
+          </provider>
88
+        </entry>
89
+      </file>
90
+      <file leaf-file-name="global.js" pinned="false" current-in-tab="false">
91
+        <entry file="file://$PROJECT_DIR$/static/server/protocal/global.js">
92
+          <provider selected="true" editor-type-id="text-editor">
93
+            <state relative-caret-position="0">
94
+              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
95
+              <folding />
96
+            </state>
97
+          </provider>
98
+        </entry>
99
+      </file>
100
+      <file leaf-file-name="socketClient.js" pinned="false" current-in-tab="false">
101
+        <entry file="file://$PROJECT_DIR$/static/server/socketClient.js">
102
+          <provider selected="true" editor-type-id="text-editor">
103
+            <state relative-caret-position="-125">
104
+              <caret line="34" column="0" lean-forward="false" selection-start-line="34" selection-start-column="0" selection-end-line="34" selection-end-column="0" />
105
+              <folding>
106
+                <element signature="e#1275#2365#0" expanded="false" />
107
+              </folding>
108
+            </state>
109
+          </provider>
110
+        </entry>
111
+      </file>
112
+      <file leaf-file-name="www.js" pinned="false" current-in-tab="false">
113
+        <entry file="file://$PROJECT_DIR$/static/server/bin/www.js">
114
+          <provider selected="true" editor-type-id="text-editor">
115
+            <state relative-caret-position="374">
116
+              <caret line="22" column="37" lean-forward="false" selection-start-line="22" selection-start-column="37" selection-end-line="22" selection-end-column="37" />
117
+              <folding />
118
+            </state>
119
+          </provider>
120
+        </entry>
121
+      </file>
122
+    </leaf>
123
+  </component>
124
+  <component name="FileTemplateManagerImpl">
125
+    <option name="RECENT_TEMPLATES">
126
+      <list>
127
+        <option value="JavaScript File" />
128
+      </list>
129
+    </option>
130
+  </component>
131
+  <component name="IdeDocumentHistory">
132
+    <option name="CHANGED_PATHS">
133
+      <list>
134
+        <option value="$PROJECT_DIR$/src/renderer/components/LandingPage/SystemInformation.vue" />
135
+        <option value="$PROJECT_DIR$/src/main/index.js" />
136
+        <option value="$PROJECT_DIR$/static/socketClient.js" />
137
+        <option value="$PROJECT_DIR$/static/server/socketClient.js" />
138
+        <option value="$PROJECT_DIR$/static/server/bin/www.js" />
139
+        <option value="$PROJECT_DIR$/static/server/app.js" />
140
+        <option value="$PROJECT_DIR$/src/renderer/main.js" />
141
+        <option value="$PROJECT_DIR$/src/renderer/store/modules/socket.js" />
142
+        <option value="$PROJECT_DIR$/src/renderer/store/index.js" />
143
+      </list>
144
+    </option>
145
+  </component>
146
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
147
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
148
+    <package-json value="$PROJECT_DIR$/package.json" />
149
+  </component>
150
+  <component name="JsFlowSettings">
151
+    <service-enabled>false</service-enabled>
152
+    <exe-path />
153
+    <annotation-enable>false</annotation-enable>
154
+    <other-services-enabled>false</other-services-enabled>
155
+    <auto-save>true</auto-save>
156
+  </component>
157
+  <component name="JsGulpfileManager">
158
+    <detection-done>true</detection-done>
159
+    <sorting>DEFINITION_ORDER</sorting>
160
+  </component>
161
+  <component name="PhpWorkspaceProjectConfiguration" backward_compatibility_performed="true" interpreter_name="PHP" />
162
+  <component name="ProjectFrameBounds" extendedState="6">
163
+    <option name="x" value="-11" />
164
+    <option name="width" value="1874" />
165
+    <option name="height" value="1039" />
166
+  </component>
167
+  <component name="ProjectView">
168
+    <navigator currentView="ProjectPane" proportions="" version="1">
169
+      <flattenPackages />
170
+      <showMembers />
171
+      <showModules />
172
+      <showLibraryContents />
173
+      <hideEmptyPackages />
174
+      <abbreviatePackageNames />
175
+      <autoscrollToSource />
176
+      <autoscrollFromSource />
177
+      <sortByType />
178
+      <manualOrder />
179
+      <foldersAlwaysOnTop value="true" />
180
+    </navigator>
181
+    <panes>
182
+      <pane id="Scope" />
183
+      <pane id="Scratches" />
184
+      <pane id="ProjectPane">
185
+        <subPane>
186
+          <expand>
187
+            <path>
188
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
189
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
190
+            </path>
191
+            <path>
192
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
193
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
194
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
195
+            </path>
196
+            <path>
197
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
198
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
199
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
200
+              <item name="renderer" type="2a2b976b:PhpTreeStructureProvider$1" />
201
+            </path>
202
+            <path>
203
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
204
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
205
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
206
+              <item name="renderer" type="2a2b976b:PhpTreeStructureProvider$1" />
207
+              <item name="store" type="2a2b976b:PhpTreeStructureProvider$1" />
208
+            </path>
209
+            <path>
210
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
211
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
212
+              <item name="src" type="2a2b976b:PhpTreeStructureProvider$1" />
213
+              <item name="renderer" type="2a2b976b:PhpTreeStructureProvider$1" />
214
+              <item name="store" type="2a2b976b:PhpTreeStructureProvider$1" />
215
+              <item name="modules" type="2a2b976b:PhpTreeStructureProvider$1" />
216
+            </path>
217
+            <path>
218
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
219
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
220
+              <item name="static" type="2a2b976b:PhpTreeStructureProvider$1" />
221
+            </path>
222
+            <path>
223
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
224
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
225
+              <item name="static" type="2a2b976b:PhpTreeStructureProvider$1" />
226
+              <item name="server" type="2a2b976b:PhpTreeStructureProvider$1" />
227
+            </path>
228
+            <path>
229
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
230
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
231
+              <item name="static" type="2a2b976b:PhpTreeStructureProvider$1" />
232
+              <item name="server" type="2a2b976b:PhpTreeStructureProvider$1" />
233
+              <item name="protocal" type="2a2b976b:PhpTreeStructureProvider$1" />
234
+            </path>
235
+            <path>
236
+              <item name="electronVueDemo" type="b2602c69:ProjectViewProjectNode" />
237
+              <item name="electronVueDemo" type="2a2b976b:PhpTreeStructureProvider$1" />
238
+              <item name="test" type="2a2b976b:PhpTreeStructureProvider$1" />
239
+            </path>
240
+          </expand>
241
+          <select />
242
+        </subPane>
243
+      </pane>
244
+    </panes>
245
+  </component>
246
+  <component name="PropertiesComponent">
247
+    <property name="settings.editor.selected.configurable" value="reference.webide.settings.project.settings.php" />
248
+    <property name="WebServerToolWindowFactoryState" value="false" />
249
+    <property name="nodejs_interpreter_path" value="C:/Program Files/nodejs/node" />
250
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
251
+  </component>
252
+  <component name="RecentsManager">
253
+    <key name="CopyFile.RECENT_KEYS">
254
+      <recent name="E:\electronVueDemo\src\renderer\store\modules" />
255
+      <recent name="E:\electronVueDemo\static\server" />
256
+    </key>
257
+    <key name="MoveFile.RECENT_KEYS">
258
+      <recent name="E:\electronVueDemo\static\server" />
259
+    </key>
260
+  </component>
261
+  <component name="RunDashboard">
262
+    <option name="ruleStates">
263
+      <list>
264
+        <RuleState>
265
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
266
+        </RuleState>
267
+        <RuleState>
268
+          <option name="name" value="StatusDashboardGroupingRule" />
269
+        </RuleState>
270
+      </list>
271
+    </option>
272
+  </component>
273
+  <component name="RunManager" selected="npm.run">
274
+    <configuration name="run" type="js.build_tools.npm" factoryName="npm">
275
+      <package-json value="$PROJECT_DIR$/package.json" />
276
+      <command value="run" />
277
+      <scripts>
278
+        <script value="dev" />
279
+      </scripts>
280
+      <node-interpreter value="project" />
281
+      <envs />
282
+    </configuration>
283
+  </component>
284
+  <component name="ShelveChangesManager" show_recycled="false">
285
+    <option name="remove_strategy" value="false" />
286
+  </component>
287
+  <component name="TaskManager">
288
+    <task active="true" id="Default" summary="Default task">
289
+      <changelist id="9ae72f43-a1a0-4e71-8c9a-da776f48ee97" name="Default" comment="" />
290
+      <created>1587454790583</created>
291
+      <option name="number" value="Default" />
292
+      <option name="presentableId" value="Default" />
293
+      <updated>1587454790583</updated>
294
+      <workItem from="1587454791924" duration="6275000" />
295
+    </task>
296
+    <servers />
297
+  </component>
298
+  <component name="TimeTrackingManager">
299
+    <option name="totallyTimeSpent" value="6275000" />
300
+  </component>
301
+  <component name="ToolWindowManager">
302
+    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
303
+    <editor active="true" />
304
+    <layout>
305
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24147122" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
306
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
307
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
308
+      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
309
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.38586956" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
310
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
311
+      <window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
312
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
313
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32934782" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
314
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
315
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
316
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
317
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
318
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
319
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
320
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
321
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
322
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
323
+    </layout>
324
+  </component>
325
+  <component name="TypeScriptGeneratedFilesManager">
326
+    <option name="version" value="1" />
327
+  </component>
328
+  <component name="VcsContentAnnotationSettings">
329
+    <option name="myLimit" value="2678400000" />
330
+  </component>
331
+  <component name="XDebuggerManager">
332
+    <breakpoint-manager />
333
+    <watches-manager />
334
+  </component>
335
+  <component name="editorHistoryManager">
336
+    <entry file="file://$PROJECT_DIR$/src/renderer/App.vue">
337
+      <provider selected="true" editor-type-id="text-editor">
338
+        <state relative-caret-position="170">
339
+          <caret line="10" column="9" lean-forward="false" selection-start-line="10" selection-start-column="9" selection-end-line="10" selection-end-column="9" />
340
+          <folding />
341
+        </state>
342
+      </provider>
343
+    </entry>
344
+    <entry file="file://$PROJECT_DIR$/src/renderer/components/LandingPage.vue">
345
+      <provider selected="true" editor-type-id="text-editor">
346
+        <state relative-caret-position="-561">
347
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
348
+          <folding />
349
+        </state>
350
+      </provider>
351
+    </entry>
352
+    <entry file="file://$PROJECT_DIR$/src/main/index.js">
353
+      <provider selected="true" editor-type-id="text-editor">
354
+        <state relative-caret-position="272">
355
+          <caret line="43" column="30" lean-forward="false" selection-start-line="43" selection-start-column="23" selection-end-line="43" selection-end-column="30" />
356
+          <folding>
357
+            <element signature="e#0#45#0" expanded="false" />
358
+          </folding>
359
+        </state>
360
+      </provider>
361
+    </entry>
362
+    <entry file="file://$PROJECT_DIR$/static/server/socketClient.js">
363
+      <provider selected="true" editor-type-id="text-editor">
364
+        <state relative-caret-position="-125">
365
+          <caret line="34" column="0" lean-forward="false" selection-start-line="34" selection-start-column="0" selection-end-line="34" selection-end-column="0" />
366
+          <folding>
367
+            <element signature="e#1275#2365#0" expanded="false" />
368
+          </folding>
369
+        </state>
370
+      </provider>
371
+    </entry>
372
+    <entry file="file://$PROJECT_DIR$/static/server/protocal/global.js">
373
+      <provider selected="true" editor-type-id="text-editor">
374
+        <state relative-caret-position="0">
375
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
376
+          <folding />
377
+        </state>
378
+      </provider>
379
+    </entry>
380
+    <entry file="file://$PROJECT_DIR$/static/server/bin/www.js">
381
+      <provider selected="true" editor-type-id="text-editor">
382
+        <state relative-caret-position="374">
383
+          <caret line="22" column="37" lean-forward="false" selection-start-line="22" selection-start-column="37" selection-end-line="22" selection-end-column="37" />
384
+          <folding />
385
+        </state>
386
+      </provider>
387
+    </entry>
388
+    <entry file="file://$PROJECT_DIR$/package.json">
389
+      <provider selected="true" editor-type-id="text-editor">
390
+        <state relative-caret-position="-14">
391
+          <caret line="36" column="33" lean-forward="false" selection-start-line="36" selection-start-column="33" selection-end-line="36" selection-end-column="33" />
392
+          <folding />
393
+        </state>
394
+      </provider>
395
+    </entry>
396
+    <entry file="file://$PROJECT_DIR$/src/renderer/router/index.js">
397
+      <provider selected="true" editor-type-id="text-editor">
398
+        <state relative-caret-position="0">
399
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
400
+          <folding>
401
+            <element signature="e#0#21#0" expanded="true" />
402
+          </folding>
403
+        </state>
404
+      </provider>
405
+    </entry>
406
+    <entry file="file://$PROJECT_DIR$/src/renderer/components/LandingPage/SystemInformation.vue">
407
+      <provider selected="true" editor-type-id="text-editor">
408
+        <state relative-caret-position="357">
409
+          <caret line="33" column="27" lean-forward="false" selection-start-line="33" selection-start-column="27" selection-end-line="33" selection-end-column="27" />
410
+          <folding />
411
+        </state>
412
+      </provider>
413
+    </entry>
414
+    <entry file="file://$PROJECT_DIR$/src/renderer/store/modules/socket.js">
415
+      <provider selected="true" editor-type-id="text-editor">
416
+        <state relative-caret-position="765">
417
+          <caret line="102" column="41" lean-forward="true" selection-start-line="102" selection-start-column="41" selection-end-line="102" selection-end-column="41" />
418
+          <folding />
419
+        </state>
420
+      </provider>
421
+    </entry>
422
+    <entry file="file://$PROJECT_DIR$/static/server/app.js">
423
+      <provider selected="true" editor-type-id="text-editor">
424
+        <state relative-caret-position="340">
425
+          <caret line="20" column="28" lean-forward="false" selection-start-line="20" selection-start-column="28" selection-end-line="20" selection-end-column="28" />
426
+          <folding />
427
+        </state>
428
+      </provider>
429
+    </entry>
430
+    <entry file="file://$PROJECT_DIR$/src/renderer/main.js">
431
+      <provider selected="true" editor-type-id="text-editor">
432
+        <state relative-caret-position="391">
433
+          <caret line="23" column="27" lean-forward="false" selection-start-line="23" selection-start-column="27" selection-end-line="23" selection-end-column="27" />
434
+          <folding>
435
+            <element signature="e#0#21#0" expanded="true" />
436
+          </folding>
437
+        </state>
438
+      </provider>
439
+    </entry>
440
+    <entry file="file://$PROJECT_DIR$/src/renderer/store/index.js">
441
+      <provider selected="true" editor-type-id="text-editor">
442
+        <state relative-caret-position="272">
443
+          <caret line="16" column="47" lean-forward="true" selection-start-line="16" selection-start-column="47" selection-end-line="16" selection-end-column="47" />
444
+          <folding>
445
+            <element signature="e#0#21#0" expanded="true" />
446
+          </folding>
447
+        </state>
448
+      </provider>
449
+    </entry>
450
+  </component>
451
+</project>

+ 43 - 0
.travis.yml

@@ -0,0 +1,43 @@
1
+# Commented sections below can be used to run tests on the CI server
2
+# https://simulatedgreg.gitbooks.io/electron-vue/content/en/testing.html#on-the-subject-of-ci-testing
3
+osx_image: xcode8.3
4
+sudo: required
5
+dist: trusty
6
+language: c
7
+matrix:
8
+  include:
9
+  - os: osx
10
+  - os: linux
11
+    env: CC=clang CXX=clang++ npm_config_clang=1
12
+    compiler: clang
13
+cache:
14
+  directories:
15
+  - node_modules
16
+  - "$HOME/.electron"
17
+  - "$HOME/.cache"
18
+addons:
19
+  apt:
20
+    packages:
21
+    - libgnome-keyring-dev
22
+    - icnsutils
23
+    #- xvfb
24
+before_install:
25
+- mkdir -p /tmp/git-lfs && curl -L https://github.com/github/git-lfs/releases/download/v1.2.1/git-lfs-$([
26
+  "$TRAVIS_OS_NAME" == "linux" ] && echo "linux" || echo "darwin")-amd64-1.2.1.tar.gz
27
+  | tar -xz -C /tmp/git-lfs --strip-components 1 && /tmp/git-lfs/git-lfs pull
28
+- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils; fi
29
+install:
30
+#- export DISPLAY=':99.0'
31
+#- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
32
+- nvm install 10
33
+- curl -o- -L https://yarnpkg.com/install.sh | bash
34
+- source ~/.bashrc
35
+- npm install -g xvfb-maybe
36
+- yarn
37
+script:
38
+#- xvfb-maybe node_modules/.bin/karma start test/unit/karma.conf.js
39
+#- yarn run pack && xvfb-maybe node_modules/.bin/mocha test/e2e
40
+- yarn run build
41
+branches:
42
+  only:
43
+  - master

+ 25 - 0
README.md

@@ -0,0 +1,25 @@
1
+# zxy
2
+
3
+> An electron-vue project
4
+
5
+#### Build Setup
6
+
7
+``` bash
8
+# install dependencies
9
+npm install
10
+
11
+# serve with hot reload at localhost:9080
12
+npm run dev
13
+
14
+# build electron application for production
15
+npm run build
16
+
17
+# run unit & end-to-end tests
18
+npm test
19
+
20
+
21
+```
22
+
23
+---
24
+
25
+This project was generated with [electron-vue](https://github.com/SimulatedGREG/electron-vue) using [vue-cli](https://github.com/vuejs/vue-cli). Documentation about the original structure can be found [here](https://simulatedgreg.gitbooks.io/electron-vue/content/index.html).

+ 32 - 0
appveyor.yml

@@ -0,0 +1,32 @@
1
+# Commented sections below can be used to run tests on the CI server
2
+# https://simulatedgreg.gitbooks.io/electron-vue/content/en/testing.html#on-the-subject-of-ci-testing
3
+version: 0.1.{build}
4
+
5
+branches:
6
+  only:
7
+    - master
8
+
9
+image: Visual Studio 2017
10
+platform:
11
+  - x64
12
+
13
+cache:
14
+  - node_modules
15
+  - '%APPDATA%\npm-cache'
16
+  - '%USERPROFILE%\.electron'
17
+  - '%USERPROFILE%\AppData\Local\Yarn\cache'
18
+
19
+init:
20
+  - git config --global core.autocrlf input
21
+
22
+install:
23
+  - ps: Install-Product node 8 x64
24
+  - git reset --hard HEAD
25
+  - yarn
26
+  - node --version
27
+
28
+build_script:
29
+  #- yarn test
30
+  - yarn build
31
+
32
+test: off

BIN
build/icons/256x256.png


BIN
build/icons/icon.icns


BIN
build/icons/icon.ico


+ 0 - 0
dist/electron/.gitkeep


+ 0 - 0
dist/web/.gitkeep


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 17981 - 0
package-lock.json


+ 119 - 0
package.json

@@ -0,0 +1,119 @@
1
+{
2
+  "name": "zxy",
3
+  "version": "0.0.1",
4
+  "author": "xiaoyuzhang <771799477@qq.com>",
5
+  "description": "An electron-vue project",
6
+  "license": null,
7
+  "main": "./dist/electron/main.js",
8
+  "scripts": {
9
+    "build": "node .electron-vue/build.js && electron-builder",
10
+    "build:dir": "node .electron-vue/build.js && electron-builder --dir",
11
+    "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js",
12
+    "build:web": "cross-env BUILD_TARGET=web node .electron-vue/build.js",
13
+    "dev": "node .electron-vue/dev-runner.js",
14
+    "e2e": "npm run pack && mocha test/e2e",
15
+    "pack": "npm run pack:main && npm run pack:renderer",
16
+    "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js",
17
+    "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js",
18
+    "test": "npm run unit && npm run e2e",
19
+    "unit": "karma start test/unit/karma.conf.js",
20
+    "postinstall": ""
21
+  },
22
+  "build": {
23
+    "productName": "zxy",
24
+    "appId": "com.example.yourapp",
25
+    "directories": {
26
+      "output": "build"
27
+    },
28
+    "files": [
29
+      "dist/electron/**/*"
30
+    ],
31
+    "dmg": {
32
+      "contents": [
33
+        {
34
+          "x": 410,
35
+          "y": 150,
36
+          "type": "link",
37
+          "path": "/Applications"
38
+        },
39
+        {
40
+          "x": 130,
41
+          "y": 150,
42
+          "type": "file"
43
+        }
44
+      ]
45
+    },
46
+    "mac": {
47
+      "icon": "build/icons/icon.icns"
48
+    },
49
+    "win": {
50
+      "icon": "build/icons/icon.ico"
51
+    },
52
+    "linux": {
53
+      "icon": "build/icons"
54
+    }
55
+  },
56
+  "dependencies": {
57
+    "axios": "^0.18.0",
58
+    "koa": "^2.2.0",
59
+    "vue": "^2.5.16",
60
+    "vue-electron": "^1.0.6",
61
+    "vue-router": "^3.0.1",
62
+    "vue-socket.io": "^3.0.7",
63
+    "vuex": "^3.0.1",
64
+    "vuex-electron": "^1.0.0"
65
+  },
66
+  "devDependencies": {
67
+    "ajv": "^6.5.0",
68
+    "babel-core": "^6.26.3",
69
+    "babel-loader": "^7.1.4",
70
+    "babel-plugin-transform-runtime": "^6.23.0",
71
+    "babel-preset-env": "^1.7.0",
72
+    "babel-preset-stage-0": "^6.24.1",
73
+    "babel-register": "^6.26.0",
74
+    "babel-minify-webpack-plugin": "^0.3.1",
75
+    "cfonts": "^2.1.2",
76
+    "chalk": "^2.4.1",
77
+    "copy-webpack-plugin": "^4.5.1",
78
+    "cross-env": "^5.1.6",
79
+    "css-loader": "^0.28.11",
80
+    "del": "^3.0.0",
81
+    "devtron": "^1.4.0",
82
+    "electron": "^2.0.4",
83
+    "electron-debug": "^1.5.0",
84
+    "electron-devtools-installer": "^2.2.4",
85
+    "electron-builder": "^20.19.2",
86
+    "mini-css-extract-plugin": "0.4.0",
87
+    "file-loader": "^1.1.11",
88
+    "html-webpack-plugin": "^3.2.0",
89
+    "inject-loader": "^4.0.1",
90
+    "karma": "^2.0.2",
91
+    "karma-chai": "^0.1.0",
92
+    "karma-coverage": "^1.1.2",
93
+    "karma-electron": "^6.0.0",
94
+    "karma-mocha": "^1.3.0",
95
+    "karma-sourcemap-loader": "^0.3.7",
96
+    "karma-spec-reporter": "^0.0.32",
97
+    "karma-webpack": "^3.0.0",
98
+    "require-dir": "^1.0.0",
99
+    "spectron": "^3.8.0",
100
+    "babel-plugin-istanbul": "^4.1.6",
101
+    "chai": "^4.1.2",
102
+    "mocha": "^5.2.0",
103
+    "multispinner": "^0.2.1",
104
+    "node-loader": "^0.6.0",
105
+    "node-sass": "^4.9.2",
106
+    "sass-loader": "^7.0.3",
107
+    "style-loader": "^0.21.0",
108
+    "url-loader": "^1.0.1",
109
+    "vue-html-loader": "^1.2.4",
110
+    "vue-loader": "^15.2.4",
111
+    "vue-style-loader": "^4.1.0",
112
+    "vue-template-compiler": "^2.5.16",
113
+    "webpack-cli": "^3.0.8",
114
+    "webpack": "^4.15.1",
115
+    "webpack-dev-server": "^3.1.4",
116
+    "webpack-hot-middleware": "^2.22.2",
117
+    "webpack-merge": "^4.1.3"
118
+  }
119
+}

+ 24 - 0
src/index.ejs

@@ -0,0 +1,24 @@
1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <title>zxy</title>
6
+    <% if (htmlWebpackPlugin.options.nodeModules) { %>
7
+      <!-- Add `node_modules/` to global paths so `require` works properly in development -->
8
+      <script>
9
+        require('module').globalPaths.push('<%= htmlWebpackPlugin.options.nodeModules.replace(/\\/g, '\\\\') %>')
10
+      </script>
11
+    <% } %>
12
+  </head>
13
+  <body>
14
+    <div id="app"></div>
15
+    <!-- Set `__static` path to static files in production -->
16
+    <% if (!process.browser) { %>
17
+      <script>
18
+        if (process.env.NODE_ENV !== 'development') window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
19
+      </script>
20
+    <% } %>
21
+
22
+    <!-- webpack builds are automatically injected -->
23
+  </body>
24
+</html>

+ 24 - 0
src/main/index.dev.js

@@ -0,0 +1,24 @@
1
+/**
2
+ * This file is used specifically and only for development. It installs
3
+ * `electron-debug` & `vue-devtools`. There shouldn't be any need to
4
+ *  modify this file, but it can be used to extend your development
5
+ *  environment.
6
+ */
7
+
8
+/* eslint-disable */
9
+
10
+// Install `electron-debug` with `devtron`
11
+require('electron-debug')({ showDevTools: true })
12
+
13
+// Install `vue-devtools`
14
+require('electron').app.on('ready', () => {
15
+  let installExtension = require('electron-devtools-installer')
16
+  installExtension.default(installExtension.VUEJS_DEVTOOLS)
17
+    .then(() => {})
18
+    .catch(err => {
19
+      console.log('Unable to install `vue-devtools`: \n', err)
20
+    })
21
+})
22
+
23
+// Require `main` process to boot app
24
+require('./index')

+ 80 - 0
src/main/index.js

@@ -0,0 +1,80 @@
1
+import { app, BrowserWindow } from 'electron'
2
+import path from 'path'
3
+/**
4
+ * Set `__static` path to static files in production
5
+ * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
6
+ */
7
+if (process.env.NODE_ENV !== 'development') {
8
+  global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
9
+}
10
+
11
+let mainWindow
12
+const winURL = process.env.NODE_ENV === 'development'
13
+  ? `http://localhost:9080`
14
+  : `file://${__dirname}/index.html`
15
+
16
+function createWindow () {
17
+  /**
18
+   * Initial window options
19
+   */
20
+  mainWindow = new BrowserWindow({
21
+    height: 563,
22
+    useContentSize: true,
23
+    width: 1000
24
+  })
25
+
26
+  mainWindow.loadURL(winURL)
27
+  mainWindow.on('closed', () => {
28
+    mainWindow = null
29
+  })
30
+
31
+}
32
+
33
+let serverpath = process.env.NODE_ENV === 'development'
34
+    ? path.join(__dirname, '..', '..', 'static', 'server', 'bin', 'www.js')
35
+    : `${app.getAppPath()}/dist/electron/static/server/bin/www`
36
+
37
+app.server = require("child_process")
38
+    .fork(serverpath,
39
+        [], {
40
+            stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
41
+            silent: false
42
+        })
43
+
44
+app.server.stderr.pipe(process.stderr)
45
+app.server.stdout.pipe(process.stdout)
46
+
47
+console.log("backend now running on : " + app.server.pid)
48
+app.on('ready', createWindow)
49
+
50
+app.on('window-all-closed', () => {
51
+  if (process.platform !== 'darwin') {
52
+    app.quit()
53
+  }
54
+})
55
+
56
+app.on('activate', () => {
57
+  if (mainWindow === null) {
58
+    createWindow()
59
+  }
60
+})
61
+
62
+/**
63
+ * Auto Updater
64
+ *
65
+ * Uncomment the following code below and install `electron-updater` to
66
+ * support auto updating. Code Signing with a valid certificate is required.
67
+ * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating
68
+ */
69
+
70
+/*
71
+import { autoUpdater } from 'electron-updater'
72
+
73
+autoUpdater.on('update-downloaded', () => {
74
+  autoUpdater.quitAndInstall()
75
+})
76
+
77
+app.on('ready', () => {
78
+  if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates()
79
+})
80
+ */

+ 15 - 0
src/renderer/App.vue

@@ -0,0 +1,15 @@
1
+<template>
2
+  <div id="app">
3
+    <router-view></router-view>
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+  export default {
9
+    name: 'zxy'
10
+  }
11
+</script>
12
+
13
+<style>
14
+  /* CSS */
15
+</style>

+ 0 - 0
src/renderer/assets/.gitkeep


BIN
src/renderer/assets/logo.png


+ 128 - 0
src/renderer/components/LandingPage.vue

@@ -0,0 +1,128 @@
1
+<template>
2
+  <div id="wrapper">
3
+    <img id="logo" src="~@/assets/logo.png" alt="electron-vue">
4
+    <main>
5
+      <div class="left-side">
6
+        <span class="title">
7
+          Welcome to your new project!
8
+        </span>
9
+        <system-information></system-information>
10
+      </div>
11
+
12
+      <div class="right-side">
13
+        <div class="doc">
14
+          <div class="title">Getting Started</div>
15
+          <p>
16
+            electron-vue comes packed with detailed documentation that covers everything from
17
+            internal configurations, using the project structure, building your application,
18
+            and so much more.
19
+          </p>
20
+          <button @click="open('https://simulatedgreg.gitbooks.io/electron-vue/content/')">Read the Docs</button><br><br>
21
+        </div>
22
+        <div class="doc">
23
+          <div class="title alt">Other Documentation</div>
24
+          <button class="alt" @click="open('https://electron.atom.io/docs/')">Electron</button>
25
+          <button class="alt" @click="open('https://vuejs.org/v2/guide/')">Vue.js</button>
26
+        </div>
27
+      </div>
28
+    </main>
29
+  </div>
30
+</template>
31
+
32
+<script>
33
+  import SystemInformation from './LandingPage/SystemInformation'
34
+
35
+  export default {
36
+    name: 'landing-page',
37
+    components: { SystemInformation },
38
+    methods: {
39
+      open (link) {
40
+        this.$electron.shell.openExternal(link)
41
+      }
42
+    }
43
+  }
44
+</script>
45
+
46
+<style>
47
+  @import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro');
48
+
49
+  * {
50
+    box-sizing: border-box;
51
+    margin: 0;
52
+    padding: 0;
53
+  }
54
+
55
+  body { font-family: 'Source Sans Pro', sans-serif; }
56
+
57
+  #wrapper {
58
+    background:
59
+      radial-gradient(
60
+        ellipse at top left,
61
+        rgba(255, 255, 255, 1) 40%,
62
+        rgba(229, 229, 229, .9) 100%
63
+      );
64
+    height: 100vh;
65
+    padding: 60px 80px;
66
+    width: 100vw;
67
+  }
68
+
69
+  #logo {
70
+    height: auto;
71
+    margin-bottom: 20px;
72
+    width: 420px;
73
+  }
74
+
75
+  main {
76
+    display: flex;
77
+    justify-content: space-between;
78
+  }
79
+
80
+  main > div { flex-basis: 50%; }
81
+
82
+  .left-side {
83
+    display: flex;
84
+    flex-direction: column;
85
+  }
86
+
87
+  .welcome {
88
+    color: #555;
89
+    font-size: 23px;
90
+    margin-bottom: 10px;
91
+  }
92
+
93
+  .title {
94
+    color: #2c3e50;
95
+    font-size: 20px;
96
+    font-weight: bold;
97
+    margin-bottom: 6px;
98
+  }
99
+
100
+  .title.alt {
101
+    font-size: 18px;
102
+    margin-bottom: 10px;
103
+  }
104
+
105
+  .doc p {
106
+    color: black;
107
+    margin-bottom: 10px;
108
+  }
109
+
110
+  .doc button {
111
+    font-size: .8em;
112
+    cursor: pointer;
113
+    outline: none;
114
+    padding: 0.75em 2em;
115
+    border-radius: 2em;
116
+    display: inline-block;
117
+    color: #fff;
118
+    background-color: #4fc08d;
119
+    transition: all 0.15s ease;
120
+    box-sizing: border-box;
121
+    border: 1px solid #4fc08d;
122
+  }
123
+
124
+  .doc button.alt {
125
+    color: #42b983;
126
+    background-color: transparent;
127
+  }
128
+</style>

+ 74 - 0
src/renderer/components/LandingPage/SystemInformation.vue

@@ -0,0 +1,74 @@
1
+<template>
2
+  <div>
3
+    <div class="title">Information</div>
4
+    <div class="items">
5
+      <div class="item">
6
+        <div class="name">Path:</div>
7
+        <div class="value">{{ path }}</div>
8
+      </div>
9
+      <div class="item">
10
+        <div class="name">Route Name:</div>
11
+        <div class="value">{{ name }}</div>
12
+      </div>
13
+      <div class="item">
14
+        <div class="name">Vue.js:</div>
15
+        <div class="value">{{ vue }}</div>
16
+      </div>
17
+      <div class="item">
18
+        <div class="name">Electron:</div>
19
+        <div class="value">{{ electron }}</div>
20
+      </div>
21
+      <div class="item">
22
+        <div class="name">Node:</div>
23
+        <div class="value">{{ node }}</div>
24
+      </div>
25
+      <div class="item">
26
+        <div class="name">Platform:</div>
27
+        <div class="value">{{ platform }}</div>
28
+      </div>
29
+    </div>
30
+  </div>
31
+</template>
32
+
33
+<script>
34
+  var net = require('net');
35
+  export default {
36
+    data () {
37
+      return {
38
+        electron: process.versions.electron,
39
+        name: this.$route.name,
40
+        node: process.versions.node,
41
+        path: this.$route.path,
42
+        platform: require('os').platform(),
43
+        vue: require('vue/package.json').version
44
+      }
45
+    }
46
+  }
47
+</script>
48
+
49
+<style scoped>
50
+  .title {
51
+    color: #888;
52
+    font-size: 18px;
53
+    font-weight: initial;
54
+    letter-spacing: .25px;
55
+    margin-top: 10px;
56
+  }
57
+
58
+  .items { margin-top: 8px; }
59
+
60
+  .item {
61
+    display: flex;
62
+    margin-bottom: 6px;
63
+  }
64
+
65
+  .item .name {
66
+    color: #6a6a6a;
67
+    margin-right: 6px;
68
+  }
69
+
70
+  .item .value {
71
+    color: #35495e;
72
+    font-weight: bold;
73
+  }
74
+</style>

+ 35 - 0
src/renderer/main.js

@@ -0,0 +1,35 @@
1
+import Vue from 'vue'
2
+import axios from 'axios'
3
+
4
+import App from './App'
5
+import router from './router'
6
+import store from './store'
7
+import io from 'socket.io-client';
8
+import VueSocketio from 'vue-socket.io'
9
+if (!process.env.IS_WEB) Vue.use(require('vue-electron'))
10
+Vue.http = Vue.prototype.$http = axios
11
+Vue.config.productionTip = false
12
+const SocketInstance = io.connect('http://localhost:3000', {
13
+    query: {
14
+        token: window.localStorage.getItem('auth')
15
+    }
16
+});
17
+
18
+Vue.use(new VueSocketio({
19
+    debug: true,
20
+    connection: SocketInstance,
21
+    vuex: {
22
+        store,
23
+        actionPrefix: 'SOCKET_',
24
+        mutationPrefix: 'SOCKET_'
25
+    },
26
+}),store);
27
+//Vue.use(VueSocketio, 'http://localhost:3000', store)
28
+
29
+/* eslint-disable no-new */
30
+new Vue({
31
+  components: { App },
32
+  router,
33
+  store,
34
+  template: '<App/>'
35
+}).$mount('#app')

+ 18 - 0
src/renderer/router/index.js

@@ -0,0 +1,18 @@
1
+import Vue from 'vue'
2
+import Router from 'vue-router'
3
+
4
+Vue.use(Router)
5
+
6
+export default new Router({
7
+  routes: [
8
+    {
9
+      path: '/',
10
+      name: 'landing-page',
11
+      component: require('@/components/LandingPage').default
12
+    },
13
+    {
14
+      path: '*',
15
+      redirect: '/'
16
+    }
17
+  ]
18
+})

+ 18 - 0
src/renderer/store/index.js

@@ -0,0 +1,18 @@
1
+import Vue from 'vue'
2
+import Vuex from 'vuex'
3
+import socket from './modules/socket'
4
+import { createPersistedState } from 'vuex-electron'
5
+
6
+
7
+Vue.use(Vuex)
8
+
9
+export default new Vuex.Store({
10
+  modules: {
11
+    socket,
12
+  },
13
+  plugins: [
14
+    createPersistedState(),
15
+  //  createSharedMutations()
16
+  ],
17
+  strict: process.env.NODE_ENV !== 'production'
18
+})

+ 25 - 0
src/renderer/store/modules/Counter.js

@@ -0,0 +1,25 @@
1
+const state = {
2
+  main: 0
3
+}
4
+
5
+const mutations = {
6
+  DECREMENT_MAIN_COUNTER (state) {
7
+    state.main--
8
+  },
9
+  INCREMENT_MAIN_COUNTER (state) {
10
+    state.main++
11
+  }
12
+}
13
+
14
+const actions = {
15
+  someAsyncTask ({ commit }) {
16
+    // do something async
17
+    commit('INCREMENT_MAIN_COUNTER')
18
+  }
19
+}
20
+
21
+export default {
22
+  state,
23
+  mutations,
24
+  actions
25
+}

+ 14 - 0
src/renderer/store/modules/index.js

@@ -0,0 +1,14 @@
1
+/**
2
+ * The file enables `@/store/index.js` to import all vuex modules
3
+ * in a one-shot manner. There should not be any reason to edit this file.
4
+ */
5
+
6
+const files = require.context('.', false, /\.js$/)
7
+const modules = {}
8
+
9
+files.keys().forEach(key => {
10
+  if (key === './index.js') return
11
+  modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
12
+})
13
+
14
+export default modules

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 633 - 0
src/renderer/store/modules/socket.js


+ 0 - 0
static/.gitkeep


+ 32 - 0
static/server/app.js

@@ -0,0 +1,32 @@
1
+const socketClient = require('./socketClient')
2
+const Koa = require('koa')
3
+const app = new Koa()
4
+var http = require('http');
5
+var server = http.createServer(app.callback());
6
+
7
+io = require('socket.io').listen(server);
8
+var protocal = require('./protocal/protocal')
9
+var sendProtocal = require('./protocal/sendProtocal')
10
+var command = require('./protocal/command')
11
+// 为这个socket实例添加一个"data"事件处理函数
12
+socketClient.on('validData', function (data) {
13
+    var dataStrs = "";
14
+    data.forEach(function (t) {
15
+        dataStrs += t.toString(16);
16
+    })
17
+
18
+    // 第二位command位转换成对应协议名
19
+    const protocalType = command[data[1]];
20
+    const json = protocal[protocalType](data);
21
+    console.log(protocalType)
22
+    if (protocalType === undefined) {
23
+        console.log('Uknown command')
24
+        return;
25
+    }
26
+    io.sockets.emit(protocalType, json);
27
+});
28
+module.exports = server
29
+
30
+
31
+
32
+

+ 86 - 0
static/server/bin/www.js

@@ -0,0 +1,86 @@
1
+/**
2
+ * Module dependencies.
3
+ */
4
+
5
+var server = require('../app');
6
+var debug = require('debug')('demo:server');
7
+
8
+/**
9
+ * Get port from environment and store in Express.
10
+ */
11
+
12
+var port = normalizePort(process.env.PORT || '3000');
13
+// app.set('port', port);
14
+server.listen(port);
15
+server.on('error', onError);
16
+server.on('listening', onListening);
17
+
18
+/**
19
+ * Create HTTP server.
20
+ */
21
+
22
+/**
23
+ * Listen on provided port, on all network interfaces.
24
+ */
25
+
26
+
27
+/**
28
+ * Normalize a port into a number, string, or false.
29
+ */
30
+
31
+function normalizePort(val) {
32
+    var port = parseInt(val, 10);
33
+
34
+    if (isNaN(port)) {
35
+        // named pipe
36
+        return val;
37
+    }
38
+
39
+    if (port >= 0) {
40
+        // port number
41
+        return port;
42
+    }
43
+
44
+    return false;
45
+}
46
+
47
+/**
48
+ * Event listener for HTTP server "error" event.
49
+ */
50
+
51
+function onError(error) {
52
+    if (error.syscall !== 'listen') {
53
+        throw error;
54
+    }
55
+
56
+    var bind = typeof port === 'string'
57
+        ? 'Pipe ' + port
58
+        : 'Port ' + port;
59
+
60
+    // handle specific listen errors with friendly messages
61
+    switch (error.code) {
62
+        case 'EACCES':
63
+            console.error(bind + ' requires elevated privileges');
64
+            process.exit(1);
65
+            break;
66
+        case 'EADDRINUSE':
67
+            console.error(bind + ' is already in use');
68
+            process.exit(1);
69
+            break;
70
+        default:
71
+            throw error;
72
+    }
73
+}
74
+
75
+/**
76
+ * Event listener for HTTP server "listening" event.
77
+ */
78
+
79
+function onListening() {
80
+    var addr = server.address();
81
+    var bind = typeof addr === 'string'
82
+        ? 'pipe ' + addr
83
+        : 'port ' + addr.port;
84
+    debug('Listening on ' + bind);
85
+    console.log("Listening on:" + port)
86
+}

+ 7 - 0
static/server/protocal/checksum.js

@@ -0,0 +1,7 @@
1
+module.exports = function (data) {
2
+  let sum = 0;
3
+  data.forEach(element => {
4
+    sum = element + sum;
5
+  });
6
+  return 0x100 - sum % 0x100;
7
+}

+ 16 - 0
static/server/protocal/command.js

@@ -0,0 +1,16 @@
1
+module.exports = {
2
+    0x00: "reconTest",
3
+    0x21: "standArea",
4
+    0x22: "pressCop",
5
+    0x23: "pressRatio",
6
+    0x20: "pressure",
7
+    0x24: "collectionDataOver",
8
+    0x01: "rePressReset",
9
+    0x03: "reStopScan",
10
+    0x04: "pressScanAbnormal",
11
+    0x05: "reSocketPressReStart",
12
+    0x06: "equipmentFault",
13
+    0x07: "faultRepaired",
14
+    0x08: "errorType",
15
+    0x0a: "reCheckCamera"
16
+}

+ 6 - 0
static/server/protocal/global.js

@@ -0,0 +1,6 @@
1
+var machineInfo = {
2
+    'sn': '',
3
+    'connect':2
4
+};
5
+
6
+module.exports = machineInfo;

+ 292 - 0
static/server/protocal/protocal.js

@@ -0,0 +1,292 @@
1
+var log4js = require('log4js');
2
+var machineInfo = require('./global');
3
+
4
+function validate(data) {
5
+    // 公用协议校验
6
+    // HEADER部分
7
+    //TODO 待完善
8
+}
9
+function asiciiToString (arr) {
10
+    let str = ''
11
+    if(arr.length >0) {
12
+        for(var i of arr) {
13
+            str += String.fromCharCode(i)
14
+        }
15
+    }
16
+    return str
17
+}
18
+
19
+Buffer.prototype.toByteArray = function () {
20
+    return Array.prototype.slice.call(this, 0)
21
+}
22
+const logger = log4js.getLogger('protocal');
23
+
24
+module.exports = {
25
+    reconTest: function (data) {
26
+        let json = {};
27
+        let snLength = data[5] - 1
28
+        let sn = data.slice(6, 6 + snLength).toByteArray();
29
+        //console.log(asiciiToString(sn))
30
+        json.device = asiciiToString(sn);
31
+        machineInfo.sn = sn;
32
+        json.status = data[6 + snLength];
33
+        return json;
34
+    },
35
+    rePressReset:function(data){
36
+        let json = {};
37
+        let snLength = data[5] - 1
38
+        let sn = data.slice(6, 6 + snLength).toByteArray();
39
+        json.device = sn;
40
+        machineInfo.sn = sn;
41
+        json.status = data[6 + snLength];
42
+        return json;
43
+    },
44
+    reStopScan:function(data) {
45
+        let json = {};
46
+        let snLength = data[5] - 1
47
+        let sn = data.slice(6, 6 + snLength).toByteArray();
48
+        json.device = sn;
49
+        machineInfo.sn = sn;
50
+        json.status = data[6 + snLength];
51
+        return json;
52
+    },
53
+    reSocketPressReStart:function (data) {
54
+        let json = {};
55
+        let snLength = data[5] - 1
56
+        let sn = data.slice(6, 6 + snLength).toByteArray();
57
+        json.device = asiciiToString(sn);
58
+        machineInfo.sn = sn;
59
+        json.status = data[6 + snLength];
60
+        return json;
61
+    },
62
+    pressScanAbnormal:function(data) {
63
+        let json = {};
64
+        let snLength = data[5] - 1
65
+        let sn = data.slice(6, 6 + snLength).toByteArray();
66
+        json.device = sn;
67
+        machineInfo.sn = sn;
68
+        json.status = data[6 + snLength];
69
+        return json;
70
+    },
71
+    reCheckCamera:function (data) {
72
+        let json = {};
73
+        let snLength = data[5] - 1
74
+        let sn = data.slice(6, 6 + snLength).toByteArray();
75
+        json.device = sn;
76
+        machineInfo.sn = sn;
77
+        json.status = data[6 + snLength];
78
+        return json;
79
+    },
80
+    equipmentFault:function (data) {
81
+        let json = {};
82
+        let snLength = data[5] - 1
83
+        let sn = data.slice(6, 6 + snLength).toByteArray();
84
+        json.device = sn;
85
+        machineInfo.sn = sn;
86
+        json.status = data[6 + snLength];
87
+        return json;
88
+    },
89
+    faultRepaired:function (data) {
90
+        let json = {};
91
+        let snLength = data[5] - 1
92
+        let sn = data.slice(6, 6 + snLength).toByteArray();
93
+        json.device = sn;
94
+        machineInfo.sn = sn;
95
+        json.status = data[6 + snLength];
96
+        return json;
97
+    },
98
+    standArea: function (data) {
99
+        let json = {};
100
+        json.standArea = data[5 + data[5]];
101
+        return json;
102
+    },
103
+    pressCop: function (data) {
104
+        let json = {};
105
+        json.pressCop = {};
106
+        json.pressCop.leftFoot = {};
107
+        let temp = []
108
+        for (let index = 0; index < 2; index++) {
109
+            let dataArray = [];
110
+            for (let i = 0; i < 8; i++) {
111
+                dataArray.push(data[10 + index * 8 + i]);
112
+            }
113
+            let ratio = new Float64Array(new Uint8Array(dataArray).buffer)[0];
114
+            temp.push(ratio);
115
+        }
116
+        json.pressCop.leftFoot.x = temp[0];
117
+        json.pressCop.leftFoot.y = temp[1];
118
+        json.pressCop.rightFoot = {};
119
+        let temp2 = []
120
+        for (let index = 0; index < 2; index++) {
121
+            let dataArray = [];
122
+            for (let i = 0; i < 8; i++) {
123
+                dataArray.push(data[26 + index * 8 + i]);
124
+            }
125
+            let ratio2 = new Float64Array(new Uint8Array(dataArray).buffer)[0];
126
+            temp2.push(ratio2);
127
+        }
128
+        json.pressCop.rightFoot.x = temp2[0];
129
+        json.pressCop.rightFoot.y = temp2[1];
130
+        json.pressCop.body = {};
131
+        let temp3 = []
132
+        for (let index = 0; index < 2; index++) {
133
+            let dataArray = [];
134
+            for (let i = 0; i < 8; i++) {
135
+                dataArray.push(data[42 + index * 8 + i]);
136
+            }
137
+            let ratio3 = new Float64Array(new Uint8Array(dataArray).buffer)[0];
138
+            temp3.push(ratio3);
139
+        }
140
+        json.pressCop.body.x = temp3[0];
141
+        json.pressCop.body.y = temp3[1];
142
+        json.pressCop.bbody = {}
143
+        let temp4 = []
144
+        for (let index = 0; index < 2; index++) {
145
+            let dataArray = [];
146
+            for (let i = 0; i < 8; i++) {
147
+                dataArray.push(data[58 + index * 8 + i]);
148
+            }
149
+            let ratio4 = new Float64Array(new Uint8Array(dataArray).buffer)[0];
150
+            temp4.push(ratio4);
151
+        }
152
+        json.pressCop.bbody.x = temp4[0];
153
+        json.pressCop.bbody.y = temp4[1];
154
+        return json;
155
+    },
156
+    pressRatio: function (data) {
157
+        let json = {};
158
+        json.line = {};
159
+        json.line.leftLine = [];
160
+        for (let index = 11; index < 19; index = index + 4) {
161
+            let line = [];
162
+            line.push({ "x": data[index], "y": data[index + 1] });
163
+            line.push({ "x": data[index + 2], "y": data[index + 3] });
164
+            json.line.leftLine.push(line);
165
+        }
166
+        json.line.rightLine = [];
167
+        for (let index = 19; index < 27; index = index + 4) {
168
+            json.line.rightLine.push([{ "x": data[index], "y": data[index + 1] }, {
169
+                "x": data[index + 2],
170
+                "y": data[index + 3]
171
+            }]);
172
+        }
173
+        json.pressRatio = {};
174
+        json.pressRatio.area = {};
175
+        json.pressRatio.area.left = [];
176
+        for (let index = 0; index < 3; index++) {
177
+            let dataArray = [];
178
+            for (let i = 0; i < 8; i++) {
179
+                dataArray.push(data[27 + index * 8 + i]);
180
+            }
181
+            let ratio = new Float64Array(new Uint8Array(dataArray).buffer)[0];
182
+            json.pressRatio.area.left.push(ratio);
183
+        }
184
+        json.pressRatio.area.right = [];
185
+        for (let index = 0; index < 3; index++) {
186
+            let dataArray = [];
187
+            for (let i = 0; i < 8; i++) {
188
+                dataArray.push(data[51 + index * 8 + i]);
189
+            }
190
+            let ratio = new Float64Array(new Uint8Array(dataArray).buffer)[0];
191
+            json.pressRatio.area.right.push(ratio);
192
+        }
193
+        {
194
+            let dataArray = [];
195
+            for (let i = 0; i < 8; i++) {
196
+                dataArray.push(data[75 + i]);
197
+            }
198
+            json.pressRatio.general = new Float64Array(new Uint8Array(dataArray).buffer)[0];
199
+        }
200
+        return json;
201
+    },
202
+    pressure: function (data) {
203
+        let validNumByteArray = new Uint8Array(data.slice(10, 14));
204
+        let validNum = new DataView(validNumByteArray.buffer).getInt32();
205
+        let json = {};
206
+        var offset = 14;
207
+        json.pressureData = [];
208
+        //json.temp = [];
209
+        for (let j =0;j<60;j++) {
210
+            json.pressureData[j] = []
211
+            for (let k =0;k<60;k++) {
212
+               json.pressureData[j][k] = 0
213
+            }
214
+        }
215
+        for (let i = 0; i < validNum; i++) {
216
+            json.pressureData[data[offset + i * 3 + 1]][data[offset + i * 3]] = data[offset + i * 3 + 2]
217
+            //let press = { x: data[offset + i * 3 + 1]*11, y: data[offset + i * 3]*10, value: data[offset + i * 3 + 2]};
218
+            //json.temp.push(press);
219
+            //json.pressureData.push(press)
220
+        }
221
+        // 点数放大1.2倍 横坐标值放大9倍 纵坐标值放大8倍
222
+       // json.pressureData = pressureDataProcess(json.pressureData,1.2,9)
223
+        return json;
224
+    },
225
+
226
+    // 收集数据结束
227
+    collectionDataOver:function (data) {
228
+        let json = {};
229
+        let snLength = data[5] - 1
230
+        let sn = data.slice(6, 6 + snLength).toByteArray();
231
+        json.device = sn;
232
+        machineInfo.sn = sn;
233
+        json.status = data[6 + snLength];
234
+        console.log('collectionStatus'+json.status)
235
+        return json;
236
+    },
237
+    errorType:function(data){
238
+        let json = {};
239
+        let snLength = data[5] - 1
240
+        let sn = data.slice(6, 6 + snLength).toByteArray();
241
+        json.device = asiciiToString(sn);
242
+        machineInfo.sn = sn;
243
+        json.status = data[6 + snLength];
244
+        return json;
245
+    } 
246
+}
247
+// 压力值扩散方法
248
+function pressureDataProcess(a,scale,size) {
249
+    var height = 60;
250
+    var width = 60;
251
+    var newHeight = 60*scale;
252
+    var newWidth = 60*scale;
253
+    var u =0.0;
254
+    var v = 0.0;
255
+    var x = 0.0;
256
+    var y = 0.0;
257
+    var m = 0;
258
+    var n = 0;
259
+    let temp = new Array()
260
+    let rearr = []
261
+    for(let i = 0;i<newHeight;++i) {
262
+        temp[i] = new Array()
263
+        for(let j=0;j<newWidth;++j) {
264
+            y = i/scale;
265
+            x = j/scale;
266
+            m = parseInt(y);
267
+            n = parseInt(x);
268
+            v = y-m;
269
+            u = x-n;
270
+            let tt = {}
271
+            if(m<height-1 &&n<width-1){
272
+                temp[i][j] = parseInt((1.0-v)*((1.0-u)*a[m][n]+u*a[m][n+1])
273
+                    + v*((1.0-u)*a[m+1][n] + u*a[m+1][n+1])
274
+                )
275
+            } else {
276
+                temp[i][j] = a[m][n]
277
+            }
278
+            tt.x = i*size
279
+            tt.y = j*size
280
+            if(temp[i][j]>0) {
281
+                tt.value = temp[i][j]
282
+                rearr.push(tt)
283
+            }
284
+        }
285
+    }
286
+    return rearr
287
+
288
+}
289
+function randomFrom(lowerValue = 180,upperValue = 250)
290
+{
291
+    return Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue);
292
+}

+ 82 - 0
static/server/protocal/sendProtocal.js

@@ -0,0 +1,82 @@
1
+var machineInfo = require('./global')
2
+var checksum = require('./checksum')
3
+
4
+module.exports = {
5
+  conTest: function () {
6
+    let data = [];
7
+    data.push(0x3a);
8
+    data.push(0);
9
+    data.push(0);
10
+    data.push(0xc6);
11
+    return Buffer(data);
12
+  },
13
+  socketPressReset: function () {
14
+    let data = [];
15
+    let snLength = machineInfo.sn.length;
16
+    data.push(0x3a);
17
+    data.push(1);
18
+    data.push(snLength);
19
+    data = data.concat(machineInfo.sn);
20
+    console.log(data)
21
+    let checkSum = checksum(data);
22
+    data.push(checkSum);
23
+    return Buffer(data);
24
+  },
25
+  beginScan: function () {
26
+    let data = [];
27
+    let snLength = machineInfo.sn.length;
28
+    data.push(0x3a);
29
+    data.push(2);
30
+    data.push(snLength);
31
+    data = data.concat(machineInfo.sn);
32
+    let checkSum = checksum(data);
33
+    data.push(checkSum);
34
+    return Buffer(data);
35
+  },
36
+  stopScan: function () {
37
+    let data = [];
38
+    let snLength = machineInfo.sn.length;
39
+    data.push(0x3a);
40
+    data.push(3);
41
+    data.push(snLength);
42
+    data = data.concat(machineInfo.sn);
43
+    let checkSum = checksum(data);
44
+    data.push(checkSum);
45
+    return Buffer(data);
46
+  },
47
+  reStartScan:function () {
48
+      let data = [];
49
+      let snLength = machineInfo.sn.length;
50
+      data.push(0x3a);
51
+      data.push(5);
52
+      data.push(snLength);
53
+      data = data.concat(machineInfo.sn);
54
+      let checkSum = checksum(data);
55
+      data.push(checkSum);
56
+      return Buffer(data);
57
+  },
58
+  // 关闭软件时发送协议 通知对方关闭
59
+  closeShoesServer:function(){
60
+      let data = [];
61
+      let snLength = machineInfo.sn.length;
62
+      data.push(0x3a);
63
+      data.push(9);
64
+      data.push(snLength);
65
+      data = data.concat(machineInfo.sn);
66
+      let checkSum = checksum(data);
67
+      data.push(checkSum);
68
+      return Buffer(data);
69
+  },
70
+  // 检查相机
71
+  checkCamera:function () {
72
+      let data = [];
73
+      let snLength = machineInfo.sn.length;
74
+      data.push(0x3a);
75
+      data.push(10);
76
+      data.push(snLength);
77
+      data = data.concat(machineInfo.sn);
78
+      let checkSum = checksum(data);
79
+      data.push(checkSum);
80
+      return Buffer(data);
81
+  }
82
+}

+ 98 - 0
static/server/socketClient.js

@@ -0,0 +1,98 @@
1
+var net = require('net');
2
+var fs = require('fs'); // 载入fs模块
3
+
4
+
5
+var HOST = '192.168.2.100';
6
+var PORT = 43212;
7
+
8
+// var HOST = '192.168.2.109';
9
+// var PORT = 43212;
10
+
11
+
12
+
13
+var client = new net.Socket();
14
+
15
+//const log = require('simple-node-logger').createSimpleFileLogger('./server.log');
16
+
17
+var lastBuffer = null;
18
+// 连接状态码首次连接没连接上 一直等待 等接上了再发送连通性测试
19
+var connectFlag = 1
20
+
21
+client.connect(PORT, HOST, function () {
22
+    connectFlag = 2
23
+    console.log('connected')
24
+    //一开始就连接上 发送连通性测试
25
+    client.emit('initConnect','1');
26
+});
27
+
28
+var flag = 0
29
+var time = 0
30
+
31
+
32
+client.on('error', function (ex) {
33
+    console.log("Socket Client Connect error");
34
+    console.log(ex);
35
+
36
+});
37
+// 为这个socket实例添加一个"close"事件处理函数
38
+client.on('close', function () {
39
+    if(flag == 0){
40
+        client.emit('disconnect','0');
41
+        time = new Date();
42
+    }
43
+    flag = 1;
44
+    connectFlag = 1
45
+    if(connectFlag == 1) {
46
+        // 有连接过才能进行等待重连操作
47
+        console.log('Socket CLOSED,1 seconds retry connect');
48
+        setTimeout(function () {
49
+            client.connect(PORT, HOST,function () {
50
+                if(flag == 1){
51
+                    flag = 2;
52
+                }
53
+            });
54
+        }, 1000);
55
+    }
56
+    // client.emit('reconnectClose','3');
57
+
58
+});
59
+
60
+let start = new Date().getTime()
61
+
62
+client.on('data', function (data) {
63
+    //console.log("data",new Date().getTime()-start);
64
+    //log.info("data",new Date().getTime()-start);
65
+    start = new Date().getTime();
66
+    if (lastBuffer !== null) {
67
+        data = Buffer.concat([lastBuffer, data]);
68
+    }
69
+    let flag = 1;
70
+    while(flag){
71
+        // 上一条数据流正常
72
+        // 先读取长度
73
+        //log.info('demo')
74
+        let validNumByteArray = new Uint8Array(data.slice(2, 6));
75
+        let validNum = new DataView(validNumByteArray.buffer).getInt32();
76
+        // 接收到的数据长度大于有效数据长度,说明后面有新的协议
77
+        if (data.length > 6 + validNum + 1) {
78
+            let validData = data.slice(0, 6 + validNum + 1);
79
+            client.emit('validData', validData);
80
+            // 将多余部分存起来
81
+            lastBuffer = data.slice(6 + validNum + 1);
82
+            if(lastBuffer.length >6){
83
+                data = lastBuffer;
84
+                continue;
85
+            }
86
+        } else if (data.length === 6 + validNum + 1) {
87
+            client.emit('validData', data);
88
+            lastBuffer = null;
89
+        } else {
90
+            // 存起来下次拼接
91
+            lastBuffer = data;
92
+        }
93
+        flag = 0;
94
+    }
95
+
96
+});
97
+
98
+module.exports = client;

+ 11 - 0
test/.eslintrc

@@ -0,0 +1,11 @@
1
+{
2
+  "env": {
3
+    "mocha": true
4
+  },
5
+  "globals": {
6
+    "assert": true,
7
+    "expect": true,
8
+    "should": true,
9
+    "__static": true
10
+  }
11
+}

+ 18 - 0
test/e2e/index.js

@@ -0,0 +1,18 @@
1
+'use strict'
2
+
3
+// Set BABEL_ENV to use proper env config
4
+process.env.BABEL_ENV = 'test'
5
+
6
+// Enable use of ES6+ on required files
7
+require('babel-register')({
8
+  ignore: /node_modules/
9
+})
10
+
11
+// Attach Chai APIs to global scope
12
+const { expect, should, assert } = require('chai')
13
+global.expect = expect
14
+global.should = should
15
+global.assert = assert
16
+
17
+// Require all JS files in `./specs` for Mocha to consume
18
+require('require-dir')('./specs')

+ 13 - 0
test/e2e/specs/Launch.spec.js

@@ -0,0 +1,13 @@
1
+import utils from '../utils'
2
+
3
+describe('Launch', function () {
4
+  beforeEach(utils.beforeEach)
5
+  afterEach(utils.afterEach)
6
+
7
+  it('shows the proper application title', function () {
8
+    return this.app.client.getTitle()
9
+      .then(title => {
10
+        expect(title).to.equal('zxy')
11
+      })
12
+  })
13
+})

+ 23 - 0
test/e2e/utils.js

@@ -0,0 +1,23 @@
1
+import electron from 'electron'
2
+import { Application } from 'spectron'
3
+
4
+export default {
5
+  afterEach () {
6
+    this.timeout(10000)
7
+
8
+    if (this.app && this.app.isRunning()) {
9
+      return this.app.stop()
10
+    }
11
+  },
12
+  beforeEach () {
13
+    this.timeout(10000)
14
+    this.app = new Application({
15
+      path: electron,
16
+      args: ['dist/electron/main.js'],
17
+      startTimeout: 10000,
18
+      waitTimeout: 10000
19
+    })
20
+
21
+    return this.app.start()
22
+  }
23
+}

+ 13 - 0
test/unit/index.js

@@ -0,0 +1,13 @@
1
+import Vue from 'vue'
2
+Vue.config.devtools = false
3
+Vue.config.productionTip = false
4
+
5
+// require all test files (files that ends with .spec.js)
6
+const testsContext = require.context('./specs', true, /\.spec$/)
7
+testsContext.keys().forEach(testsContext)
8
+
9
+// require all src files except main.js for coverage.
10
+// you can also change this to match only the subset of files that
11
+// you want coverage for.
12
+const srcContext = require.context('../../src/renderer', true, /^\.\/(?!main(\.js)?$)/)
13
+srcContext.keys().forEach(srcContext)

+ 62 - 0
test/unit/karma.conf.js

@@ -0,0 +1,62 @@
1
+'use strict'
2
+
3
+const path = require('path')
4
+const merge = require('webpack-merge')
5
+const webpack = require('webpack')
6
+
7
+const baseConfig = require('../../.electron-vue/webpack.renderer.config')
8
+const projectRoot = path.resolve(__dirname, '../../src/renderer')
9
+
10
+// Set BABEL_ENV to use proper preset config
11
+process.env.BABEL_ENV = 'test'
12
+
13
+let webpackConfig = merge(baseConfig, {
14
+  devtool: '#inline-source-map',
15
+  plugins: [
16
+    new webpack.DefinePlugin({
17
+      'process.env.NODE_ENV': '"testing"'
18
+    })
19
+  ]
20
+})
21
+
22
+// don't treat dependencies as externals
23
+delete webpackConfig.entry
24
+delete webpackConfig.externals
25
+delete webpackConfig.output.libraryTarget
26
+
27
+// apply vue option to apply isparta-loader on js
28
+webpackConfig.module.rules
29
+  .find(rule => rule.use.loader === 'vue-loader').use.options.loaders.js = 'babel-loader'
30
+
31
+module.exports = config => {
32
+  config.set({
33
+    browsers: ['visibleElectron'],
34
+    client: {
35
+      useIframe: false
36
+    },
37
+    coverageReporter: {
38
+      dir: './coverage',
39
+      reporters: [
40
+        { type: 'lcov', subdir: '.' },
41
+        { type: 'text-summary' }
42
+      ]
43
+    },
44
+    customLaunchers: {
45
+      'visibleElectron': {
46
+        base: 'Electron',
47
+        flags: ['--show']
48
+      }
49
+    },
50
+    frameworks: ['mocha', 'chai'],
51
+    files: ['./index.js'],
52
+    preprocessors: {
53
+      './index.js': ['webpack', 'sourcemap']
54
+    },
55
+    reporters: ['spec', 'coverage'],
56
+    singleRun: true,
57
+    webpack: webpackConfig,
58
+    webpackMiddleware: {
59
+      noInfo: true
60
+    }
61
+  })
62
+}

+ 13 - 0
test/unit/specs/LandingPage.spec.js

@@ -0,0 +1,13 @@
1
+import Vue from 'vue'
2
+import LandingPage from '@/components/LandingPage'
3
+
4
+describe('LandingPage.vue', () => {
5
+  it('should render correct contents', () => {
6
+    const vm = new Vue({
7
+      el: document.createElement('div'),
8
+      render: h => h(LandingPage)
9
+    }).$mount()
10
+
11
+    expect(vm.$el.querySelector('.title').textContent).to.contain('Welcome to your new project!')
12
+  })
13
+})