[plg137200.] 1 год назад
Сommit
b6f1441c68
100 измененных файлов с 3943 добавлено и 0 удалено
  1. 39 0
      .babelrc
  2. 153 0
      .electron-vue/build.js
  3. 40 0
      .electron-vue/dev-client.js
  4. 191 0
      .electron-vue/dev-runner.js
  5. 83 0
      .electron-vue/webpack.main.config.js
  6. 206 0
      .electron-vue/webpack.renderer.config.js
  7. 163 0
      .electron-vue/webpack.web.config.js
  8. 3 0
      .eslintignore
  9. 26 0
      .eslintrc.js
  10. 14 0
      .gitignore
  11. 43 0
      .travis.yml
  12. 33 0
      README.md
  13. 32 0
      appveyor.yml
  14. BIN
      build/icon/newIcon.ico
  15. 56 0
      build/script/installer.nsh
  16. 32 0
      build/script/license.txt
  17. BIN
      build/script/side.bmp
  18. BIN
      icon.ico
  19. 181 0
      package.json
  20. 32 0
      src/index.ejs
  21. 639 0
      src/main/HrUtilService.js
  22. 104 0
      src/main/ServerKey.js
  23. 1369 0
      src/main/SoftKey.js
  24. 13 0
      src/main/hrUtilService_types.js
  25. 24 0
      src/main/index.dev.js
  26. 406 0
      src/main/index.js
  27. 61 0
      src/renderer/App.vue
  28. 0 0
      src/renderer/assets/.gitkeep
  29. BIN
      src/renderer/assets/200.png
  30. BIN
      src/renderer/assets/GoNogo.jpg
  31. BIN
      src/renderer/assets/about.png
  32. BIN
      src/renderer/assets/about1.png
  33. BIN
      src/renderer/assets/animal.mp3
  34. BIN
      src/renderer/assets/ban.mp3
  35. BIN
      src/renderer/assets/bang.wav
  36. BIN
      src/renderer/assets/bg.jpg
  37. BIN
      src/renderer/assets/bling.mp3
  38. BIN
      src/renderer/assets/c24rah1vny2gty4b.jpg
  39. BIN
      src/renderer/assets/close.png
  40. BIN
      src/renderer/assets/close1.png
  41. BIN
      src/renderer/assets/collect.mp3
  42. BIN
      src/renderer/assets/continuousAddition.jpg
  43. BIN
      src/renderer/assets/contropage/10223.png
  44. BIN
      src/renderer/assets/contropage/10224.png
  45. BIN
      src/renderer/assets/contropage/10225.png
  46. BIN
      src/renderer/assets/contropage/3542.png
  47. BIN
      src/renderer/assets/contropage/9912.png
  48. BIN
      src/renderer/assets/contropage/9922.png
  49. BIN
      src/renderer/assets/contropage/9923.png
  50. BIN
      src/renderer/assets/contropage/9925.png
  51. BIN
      src/renderer/assets/contropage/9927.png
  52. BIN
      src/renderer/assets/contropage/9928.png
  53. BIN
      src/renderer/assets/contropage/9929.png
  54. BIN
      src/renderer/assets/contropage/暂停服务.png
  55. BIN
      src/renderer/assets/contropage/椭圆 292(1).png
  56. BIN
      src/renderer/assets/contropage/椭圆 292.png
  57. BIN
      src/renderer/assets/contropage/椭圆 292@2x(1).png
  58. BIN
      src/renderer/assets/contropage/椭圆 292@2x.png
  59. BIN
      src/renderer/assets/contropage/组 8510.png
  60. BIN
      src/renderer/assets/contropage/组 8510@2x.png
  61. BIN
      src/renderer/assets/contropage/组 9912@2x.png
  62. BIN
      src/renderer/assets/contropage/组 9922@2x.png
  63. BIN
      src/renderer/assets/contropage/组 9923@2x.png
  64. BIN
      src/renderer/assets/contropage/组 9925@2x.png
  65. BIN
      src/renderer/assets/contropage/组 9927@2x.png
  66. BIN
      src/renderer/assets/contropage/组 9928@2x.png
  67. BIN
      src/renderer/assets/contropage/组 9929@2x.png
  68. BIN
      src/renderer/assets/contropage/路径 3542@2x.png
  69. BIN
      src/renderer/assets/duckEggTask.png
  70. BIN
      src/renderer/assets/fang.png
  71. BIN
      src/renderer/assets/fang1.png
  72. BIN
      src/renderer/assets/favicon.png
  73. BIN
      src/renderer/assets/fruits.mp3
  74. BIN
      src/renderer/assets/help.png
  75. BIN
      src/renderer/assets/help1.png
  76. BIN
      src/renderer/assets/inflate.mp3
  77. BIN
      src/renderer/assets/jian.png
  78. BIN
      src/renderer/assets/jian1.png
  79. BIN
      src/renderer/assets/left.png
  80. BIN
      src/renderer/assets/lion.png
  81. BIN
      src/renderer/assets/logo.png
  82. BIN
      src/renderer/assets/logo1.png
  83. BIN
      src/renderer/assets/logo_icon.png
  84. BIN
      src/renderer/assets/memoryAbility.jpg
  85. BIN
      src/renderer/assets/newImage/exit.png
  86. BIN
      src/renderer/assets/newImage/home_mbcj.png
  87. BIN
      src/renderer/assets/newImage/home_ndcj.png
  88. BIN
      src/renderer/assets/newImage/home_swfkxl.png
  89. BIN
      src/renderer/assets/newImage/home_xlcp.png
  90. BIN
      src/renderer/assets/newImage/home_xlfs.png
  91. BIN
      src/renderer/assets/newImage/home_zndh.png
  92. BIN
      src/renderer/assets/newImage/hxfs_bt.png
  93. BIN
      src/renderer/assets/newImage/jkcs_bt.png
  94. BIN
      src/renderer/assets/newImage/lbbgck_bt.png
  95. BIN
      src/renderer/assets/newImage/login_bg.png
  96. BIN
      src/renderer/assets/newImage/logo_icon.png
  97. BIN
      src/renderer/assets/newImage/play_bt_xlfs.png
  98. BIN
      src/renderer/assets/newImage/sp_mb.png
  99. BIN
      src/renderer/assets/newImage/sp_pic1.png
  100. BIN
      src/renderer/assets/newImage/sp_pic2.png

+ 39 - 0
.babelrc

@@ -0,0 +1,39 @@
+{
+  "comments": false,
+  "env": {
+    "test": {
+      "presets": [
+        ["env", {
+          "targets": { "node": 7 }
+        }],
+        "stage-0"
+      ],
+      "plugins": ["istanbul"]
+    },
+    "main": {
+      "presets": [
+        ["env", {
+          "targets": { "node": 7 }
+        }],
+        "stage-0"
+      ]
+    },
+    "renderer": {
+      "presets": [
+        ["env", {
+          "modules": false
+        }],
+        "stage-0"
+      ]
+    },
+    "web": {
+      "presets": [
+        ["env", {
+          "modules": false
+        }],
+        "stage-0"
+      ]
+    }
+  },
+  "plugins": ["transform-runtime"]
+}

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

@@ -0,0 +1,153 @@
+'use strict'
+
+process.env.NODE_ENV = 'production'
+
+const {
+  say
+} = require('cfonts')
+const chalk = require('chalk')
+const del = require('del')
+const {
+  spawn
+} = require('child_process')
+const webpack = require('webpack')
+const Listr = require('listr')
+
+
+const mainConfig = require('./webpack.main.config')
+const rendererConfig = require('./webpack.renderer.config')
+const webConfig = require('./webpack.web.config')
+
+const doneLog = chalk.bgGreen.white(' DONE ') + ' '
+const errorLog = chalk.bgRed.white(' ERROR ') + ' '
+const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
+const isCI = process.env.CI || false
+
+if (process.env.BUILD_TARGET === 'clean') clean()
+else if (process.env.BUILD_TARGET === 'web') web()
+else build()
+
+function clean() {
+  del.sync(['build/*', '!build/icons', '!build/icons/icon.*'])
+  console.log(`\n${doneLog}\n`)
+  process.exit()
+}
+
+async function build() {
+  greeting()
+
+  del.sync(['dist/electron/*', '!.gitkeep'])
+
+  /*const tasksed = ['main', 'renderer']
+  const m = new Multispinner(tasksed, {
+    preText: 'building',
+    postText: 'process'
+  })*/
+
+  let results = ''
+
+  const tasks = new Listr(
+    [{
+        title: 'building master process',
+        task: async () => {
+          await pack(mainConfig)
+            .then(result => {
+              results += result + '\n\n'
+            })
+            .catch(err => {
+              console.log(`\n  ${errorLog}failed to build main process`)
+              console.error(`\n${err}\n`)
+            })
+        }
+      },
+      {
+        title: 'building renderer process',
+        task: async () => {
+          await pack(rendererConfig)
+            .then(result => {
+              results += result + '\n\n'
+            })
+            .catch(err => {
+              console.log(`\n  ${errorLog}failed to build renderer process`)
+              console.error(`\n${err}\n`)
+            })
+        }
+      }
+    ], {
+      concurrent: 2
+    }
+  )
+
+  await tasks
+    .run()
+    .then(() => {
+      process.stdout.write('\x1B[2J\x1B[0f')
+      console.log(`\n\n${results}`)
+      console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
+      process.exit()
+    })
+    .catch(err => {
+      process.exit(1)
+    })
+}
+
+function pack(config) {
+  return new Promise((resolve, reject) => {
+    config.mode = 'production'
+    webpack(config, (err, stats) => {
+      if (err) reject(err.stack || err)
+      else if (stats.hasErrors()) {
+        let err = ''
+
+        stats.toString({
+            chunks: false,
+            colors: true
+          })
+          .split(/\r?\n/)
+          .forEach(line => {
+            err += `    ${line}\n`
+          })
+
+        reject(err)
+      } else {
+        resolve(stats.toString({
+          chunks: false,
+          colors: true
+        }))
+      }
+    })
+  })
+}
+
+function web() {
+  del.sync(['dist/web/*', '!.gitkeep'])
+  webConfig.mode = 'production'
+  webpack(webConfig, (err, stats) => {
+    if (err || stats.hasErrors()) console.log(err)
+
+    console.log(stats.toString({
+      chunks: false,
+      colors: true
+    }))
+
+    process.exit()
+  })
+}
+
+function greeting() {
+  const cols = process.stdout.columns
+  let text = ''
+
+  if (cols > 85) text = 'lets-build'
+  else if (cols > 60) text = 'lets-|build'
+  else text = false
+
+  if (text && !isCI) {
+    say(text, {
+      colors: ['yellow'],
+      font: 'simple3d',
+      space: false
+    })
+  } else console.log(chalk.yellow.bold('\n  lets-build'))
+  console.log()
+}

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

@@ -0,0 +1,40 @@
+const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
+
+hotClient.subscribe(event => {
+  /**
+   * Reload browser when HTMLWebpackPlugin emits a new index.html
+   *
+   * Currently disabled until jantimon/html-webpack-plugin#680 is resolved.
+   * https://github.com/SimulatedGREG/electron-vue/issues/437
+   * https://github.com/jantimon/html-webpack-plugin/issues/680
+   */
+  // if (event.action === 'reload') {
+  //   window.location.reload()
+  // }
+
+  /**
+   * Notify `mainWindow` when `main` process is compiling,
+   * giving notice for an expected reload of the `electron` process
+   */
+  if (event.action === 'compiling') {
+    document.body.innerHTML += `
+      <style>
+        #dev-client {
+          background: #4fc08d;
+          border-radius: 4px;
+          bottom: 20px;
+          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);
+          color: #fff;
+          font-family: 'Source Sans Pro', sans-serif;
+          left: 20px;
+          padding: 8px 12px;
+          position: absolute;
+        }
+      </style>
+
+      <div id="dev-client">
+        Compiling Main Process...
+      </div>
+    `
+  }
+})

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

@@ -0,0 +1,191 @@
+'use strict'
+
+const chalk = require('chalk')
+const electron = require('electron')
+const path = require('path')
+const { say } = require('cfonts')
+const { spawn } = require('child_process')
+const webpack = require('webpack')
+const WebpackDevServer = require('webpack-dev-server')
+const webpackHotMiddleware = require('webpack-hot-middleware')
+
+const mainConfig = require('./webpack.main.config')
+const rendererConfig = require('./webpack.renderer.config')
+
+let electronProcess = null
+let manualRestart = false
+let hotMiddleware
+
+function logStats (proc, data) {
+  let log = ''
+
+  log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`)
+  log += '\n\n'
+
+  if (typeof data === 'object') {
+    data.toString({
+      colors: true,
+      chunks: false
+    }).split(/\r?\n/).forEach(line => {
+      log += '  ' + line + '\n'
+    })
+  } else {
+    log += `  ${data}\n`
+  }
+
+  log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n'
+
+  console.log(log)
+}
+
+function startRenderer () {
+  return new Promise((resolve, reject) => {
+    rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer)
+    rendererConfig.mode = 'development'
+    const compiler = webpack(rendererConfig)
+    hotMiddleware = webpackHotMiddleware(compiler, {
+      log: false,
+      heartbeat: 2500
+    })
+
+    compiler.hooks.compilation.tap('compilation', compilation => {
+      compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => {
+        hotMiddleware.publish({ action: 'reload' })
+        cb()
+      })
+    })
+
+    compiler.hooks.done.tap('done', stats => {
+      logStats('Renderer', stats)
+    })
+
+    const server = new WebpackDevServer(
+      compiler,
+      {
+        contentBase: path.join(__dirname, '../'),
+        quiet: true,
+        //hot: true,
+        before (app, ctx) {
+          app.use(hotMiddleware)
+          ctx.middleware.waitUntilValid(() => {
+            resolve()
+          })
+        }
+      }
+    )
+
+    server.listen(9080)
+  })
+}
+
+function startMain () {
+  return new Promise((resolve, reject) => {
+    mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main)
+    mainConfig.mode = 'development'
+    const compiler = webpack(mainConfig)
+
+    compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => {
+      logStats('Main', chalk.white.bold('compiling...'))
+      hotMiddleware.publish({ action: 'compiling' })
+      done()
+    })
+
+    compiler.watch({}, (err, stats) => {
+      if (err) {
+        console.log(err)
+        return
+      }
+
+      logStats('Main', stats)
+
+      if (electronProcess && electronProcess.kill) {
+        manualRestart = true
+        process.kill(electronProcess.pid)
+        electronProcess = null
+        startElectron()
+
+        setTimeout(() => {
+          manualRestart = false
+        }, 5000)
+      }
+
+      resolve()
+    })
+  })
+}
+
+function startElectron () {
+  var args = [
+    '--inspect=5858',
+    path.join(__dirname, '../dist/electron/main.js')
+  ]
+
+  // detect yarn or npm and process commandline args accordingly
+  if (process.env.npm_execpath.endsWith('yarn.js')) {
+    args = args.concat(process.argv.slice(3))
+  } else if (process.env.npm_execpath.endsWith('npm-cli.js')) {
+    args = args.concat(process.argv.slice(2))
+  }
+
+  electronProcess = spawn(electron, args)
+  
+  electronProcess.stdout.on('data', data => {
+    electronLog(data, 'blue')
+  })
+  electronProcess.stderr.on('data', data => {
+    electronLog(data, 'red')
+  })
+
+  electronProcess.on('close', () => {
+    if (!manualRestart) process.exit()
+  })
+}
+
+function electronLog (data, color) {
+  let log = ''
+  data = data.toString().split(/\r?\n/)
+  data.forEach(line => {
+    log += `  ${line}\n`
+  })
+  if (/[0-9A-z]+/.test(log)) {
+    console.log(
+      chalk[color].bold('┏ Electron -------------------') +
+      '\n\n' +
+      log +
+      chalk[color].bold('┗ ----------------------------') +
+      '\n'
+    )
+  }
+}
+
+function greeting () {
+  const cols = process.stdout.columns
+  let text = ''
+
+  if (cols > 104) text = 'electron-vue'
+  else if (cols > 76) text = 'electron-|vue'
+  else text = false
+
+  if (text) {
+    say(text, {
+      colors: ['yellow'],
+      font: 'simple3d',
+      space: false
+    })
+  } else console.log(chalk.yellow.bold('\n  electron-vue'))
+  console.log(chalk.blue('  getting ready...') + '\n')
+}
+
+function init () {
+  greeting()
+
+  Promise.all([startRenderer(), startMain()])
+    .then(() => {
+      startElectron()
+    })
+    .catch(err => {
+      console.error(err)
+    })
+}
+
+init()

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

@@ -0,0 +1,83 @@
+'use strict'
+
+process.env.BABEL_ENV = 'main'
+
+const path = require('path')
+const { dependencies } = require('../package.json')
+const webpack = require('webpack')
+
+const MinifyPlugin = require("babel-minify-webpack-plugin")
+
+let mainConfig = {
+  entry: {
+    main: path.join(__dirname, '../src/main/index.js')
+  },
+  externals: [
+    ...Object.keys(dependencies || {})
+  ],
+  module: {
+    rules: [
+      // {
+      //   test: /\.(js)$/,
+      //   enforce: 'pre',
+      //   exclude: /node_modules/,
+      //   use: {
+      //     loader: 'eslint-loader',
+      //     options: {
+      //       formatter: require('eslint-friendly-formatter')
+      //     }
+      //   }
+      // },
+      {
+        test: /\.js$/,
+        use: 'babel-loader',
+        exclude: /node_modules/
+      },
+      {
+        test: /\.node$/,
+        use: 'node-loader'
+      }
+    ]
+  },
+  node: {
+    __dirname: process.env.NODE_ENV !== 'production',
+    __filename: process.env.NODE_ENV !== 'production'
+  },
+  output: {
+    filename: '[name].js',
+    libraryTarget: 'commonjs2',
+    path: path.join(__dirname, '../dist/electron')
+  },
+  plugins: [
+    new webpack.NoEmitOnErrorsPlugin()
+  ],
+  resolve: {
+    extensions: ['.js', '.json', '.node']
+  },
+  target: 'electron-main'
+}
+
+/**
+ * Adjust mainConfig for development settings
+ */
+if (process.env.NODE_ENV !== 'production') {
+  mainConfig.plugins.push(
+    new webpack.DefinePlugin({
+      '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
+    })
+  )
+}
+
+/**
+ * Adjust mainConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+  mainConfig.plugins.push(
+    new MinifyPlugin(),
+    new webpack.DefinePlugin({
+      'process.env.NODE_ENV': '"production"'
+    })
+  )
+}
+
+module.exports = mainConfig

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

@@ -0,0 +1,206 @@
+'use strict'
+
+process.env.BABEL_ENV = 'renderer'
+
+const path = require('path')
+const {
+  dependencies
+} = require('../package.json')
+const webpack = require('webpack')
+
+const MinifyPlugin = require("babel-minify-webpack-plugin")
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const {
+  VueLoaderPlugin
+} = require('vue-loader')
+
+/**
+ * List of node_modules to include in webpack bundle
+ *
+ * Required for specific packages like Vue UI libraries
+ * that provide pure *.vue files that need compiling
+ * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals
+ */
+let whiteListedModules = ['vue', 'element-ui']
+
+let rendererConfig = {
+  devtool: '#cheap-module-eval-source-map',
+  entry: {
+    renderer: path.join(__dirname, '../src/renderer/main.js')
+  },
+  externals: [
+    ...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
+  ],
+  module: {
+    rules: [
+      // {
+      //   test: /\.(js|vue)$/,
+      //   enforce: 'pre',
+      //   exclude: /node_modules/,
+      //   use: {
+      //     loader: 'eslint-loader',
+      //     options: {
+      //       formatter: require('eslint-friendly-formatter')
+      //     }
+      //   }
+      // },
+      {
+        test: /\.scss$/,
+        use: ['vue-style-loader', 'css-loader', 'sass-loader']
+      },
+      {
+        test: /\.sass$/,
+        use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
+      },
+      {
+        test: /\.less$/,
+        use: ['vue-style-loader', 'css-loader', 'less-loader']
+      },
+      {
+        test: /\.css$/,
+        use: ['vue-style-loader', 'css-loader']
+      },
+      {
+        test: /\.html$/,
+        use: 'vue-html-loader'
+      },
+      {
+        test: /\.js$/,
+        use: 'babel-loader',
+        exclude: /node_modules/
+      },
+      {
+        test: /\.node$/,
+        use: 'node-loader'
+      },
+      {
+        test: /\.vue$/,
+        use: {
+          loader: 'vue-loader',
+          options: {
+            extractCSS: process.env.NODE_ENV === 'production',
+            loaders: {
+              sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
+              scss: 'vue-style-loader!css-loader!sass-loader',
+              less: 'vue-style-loader!css-loader!less-loader'
+            }
+          }
+        }
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        use: {
+          loader: 'url-loader',
+          query: {
+            limit: 10000,
+            name: 'imgs/[name]--[folder].[ext]'
+          }
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: 'media/[name]--[folder].[ext]'
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        use: {
+          loader: 'url-loader',
+          query: {
+            limit: 10000,
+            name: 'fonts/[name]--[folder].[ext]'
+          }
+        }
+      }
+    ]
+  },
+  node: {
+    __dirname: process.env.NODE_ENV !== 'production',
+    __filename: process.env.NODE_ENV !== 'production'
+  },
+  plugins: [
+    new VueLoaderPlugin(),
+    new MiniCssExtractPlugin({
+      filename: 'styles.css'
+    }),
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: path.resolve(__dirname, '../src/index.ejs'),
+      templateParameters(compilation, assets, options) {
+        return {
+          compilation: compilation,
+          webpack: compilation.getStats().toJson(),
+          webpackConfig: compilation.options,
+          htmlWebpackPlugin: {
+            files: assets,
+            options: options,
+          },
+          process,
+        };
+      },
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true,
+        removeComments: true
+      },
+      nodeModules: process.env.NODE_ENV !== 'production' ?
+        path.resolve(__dirname, '../node_modules') : false
+      //nodeModules: path.resolve(__dirname, '../node_modules')
+    }),
+    new webpack.NoEmitOnErrorsPlugin()
+  ],
+  output: {
+    filename: '[name].js',
+    libraryTarget: 'commonjs2',
+    path: path.join(__dirname, '../dist/electron')
+  },
+  resolve: {
+    alias: {
+      '@': path.join(__dirname, '../src/renderer'),
+      'vue$': 'vue/dist/vue.esm.js'
+    },
+    extensions: ['.js', '.vue', '.json', '.css', '.node']
+  },
+  target: 'electron-renderer'
+}
+
+/**
+ * Adjust rendererConfig for development settings
+ */
+if (process.env.NODE_ENV !== 'production') {
+  rendererConfig.plugins.push(
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.DefinePlugin({
+      '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
+    })
+  )
+}
+
+/**
+ * Adjust rendererConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+  rendererConfig.devtool = ''
+
+  rendererConfig.plugins.push(
+    new MinifyPlugin(),
+    new CopyWebpackPlugin([{
+      from: path.join(__dirname, '../static'),
+      to: path.join(__dirname, '../dist/electron/static'),
+      ignore: ['.*']
+    }]),
+    new webpack.DefinePlugin({
+      'process.env.NODE_ENV': '"production"'
+    }),
+    new webpack.LoaderOptionsPlugin({
+      minimize: true
+    })
+  )
+}
+
+module.exports = rendererConfig

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

@@ -0,0 +1,163 @@
+'use strict'
+
+process.env.BABEL_ENV = 'web'
+
+const path = require('path')
+const webpack = require('webpack')
+
+const MinifyPlugin = require("babel-minify-webpack-plugin")
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const { VueLoaderPlugin } = require('vue-loader')
+
+let webConfig = {
+  devtool: '#cheap-module-eval-source-map',
+  entry: {
+    web: path.join(__dirname, '../src/renderer/main.js')
+  },
+  module: {
+    rules: [
+      // {
+      //   test: /\.(js|vue)$/,
+      //   enforce: 'pre',
+      //   exclude: /node_modules/,
+      //   use: {
+      //     loader: 'eslint-loader',
+      //     options: {
+      //       formatter: require('eslint-friendly-formatter')
+      //     }
+      //   }
+      // },
+      {
+        test: /\.scss$/,
+        use: ['vue-style-loader', 'css-loader', 'sass-loader']
+      },
+      {
+        test: /\.sass$/,
+        use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
+      },
+      {
+        test: /\.less$/,
+        use: ['vue-style-loader', 'css-loader', 'less-loader']
+      },
+      {
+        test: /\.css$/,
+        use: ['vue-style-loader', 'css-loader']
+      },
+      {
+        test: /\.html$/,
+        use: 'vue-html-loader'
+      },
+      {
+        test: /\.js$/,
+        use: 'babel-loader',
+        include: [ path.resolve(__dirname, '../src/renderer') ],
+        exclude: /node_modules/
+      },
+      {
+        test: /\.vue$/,
+        use: {
+          loader: 'vue-loader',
+          options: {
+            extractCSS: true,
+            loaders: {
+              sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
+              scss: 'vue-style-loader!css-loader!sass-loader',
+              less: 'vue-style-loader!css-loader!less-loader'
+            }
+          }
+        }
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        use: {
+          loader: 'url-loader',
+          query: {
+            limit: 10000,
+            name: 'imgs/[name].[ext]'
+          }
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        use: {
+          loader: 'url-loader',
+          query: {
+            limit: 10000,
+            name: 'fonts/[name].[ext]'
+          }
+        }
+      }
+    ]
+  },
+  plugins: [
+    new VueLoaderPlugin(),
+    new MiniCssExtractPlugin({filename: 'styles.css'}),
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: path.resolve(__dirname, '../src/index.ejs'),
+      templateParameters(compilation, assets, options) {
+        return {
+          compilation: compilation,
+          webpack: compilation.getStats().toJson(),
+          webpackConfig: compilation.options,
+          htmlWebpackPlugin: {
+            files: assets,
+            options: options,
+          },
+          process,
+        };
+      },
+      minify: {
+        collapseWhitespace: true,
+        removeAttributeQuotes: true,
+        removeComments: true
+      },
+      nodeModules: false
+    }),
+    new webpack.DefinePlugin({
+      'process.env.IS_WEB': 'true'
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NoEmitOnErrorsPlugin()
+  ],
+  output: {
+    filename: '[name].js',
+    path: path.join(__dirname, '../dist/web')
+  },
+  resolve: {
+    alias: {
+      '@': path.join(__dirname, '../src/renderer'),
+      'vue$': 'vue/dist/vue.esm.js'
+    },
+    extensions: ['.js', '.vue', '.json', '.css']
+  },
+  target: 'web'
+}
+
+/**
+ * Adjust webConfig for production settings
+ */
+if (process.env.NODE_ENV === 'production') {
+  webConfig.devtool = ''
+
+  webConfig.plugins.push(
+    new MinifyPlugin(),
+    new CopyWebpackPlugin([
+      {
+        from: path.join(__dirname, '../static'),
+        to: path.join(__dirname, '../dist/web/static'),
+        ignore: ['.*']
+      }
+    ]),
+    new webpack.DefinePlugin({
+      'process.env.NODE_ENV': '"production"'
+    }),
+    new webpack.LoaderOptionsPlugin({
+      minimize: true
+    })
+  )
+}
+
+module.exports = webConfig

+ 3 - 0
.eslintignore

@@ -0,0 +1,3 @@
+test/unit/coverage/**
+test/unit/*.js
+test/e2e/*.js

+ 26 - 0
.eslintrc.js

@@ -0,0 +1,26 @@
+module.exports = {
+  root: true,
+  parser: 'babel-eslint',
+  parserOptions: {
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true
+  },
+  extends: 'standard',
+  globals: {
+    __static: true
+  },
+  plugins: [
+    'html'
+  ],
+  'rules': {
+    // allow paren-less arrow functions
+    'arrow-parens': 0,
+    // allow async-await
+    'generator-star-spacing': 0,
+    // allow debugger during development
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
+  }
+}

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+.DS_Store
+dist/electron/*
+dist/web/*
+build/*
+!build/icon
+!build/script
+coverage
+exe/*
+node_modules/
+npm-debug.log
+npm-debug.log.*
+thumbs.db
+/dist
+!.gitkeep

+ 43 - 0
.travis.yml

@@ -0,0 +1,43 @@
+# Commented sections below can be used to run tests on the CI server
+# https://simulatedgreg.gitbooks.io/electron-vue/content/en/testing.html#on-the-subject-of-ci-testing
+osx_image: xcode8.3
+sudo: required
+dist: trusty
+language: c
+matrix:
+  include:
+  - os: osx
+  - os: linux
+    env: CC=clang CXX=clang++ npm_config_clang=1
+    compiler: clang
+cache:
+  directories:
+  - node_modules
+  - "$HOME/.electron"
+  - "$HOME/.cache"
+addons:
+  apt:
+    packages:
+    - libgnome-keyring-dev
+    - icnsutils
+    #- xvfb
+before_install:
+- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install git-lfs; fi
+- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils; fi
+install:
+#- export DISPLAY=':99.0'
+#- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
+- nvm install 10
+- curl -o- -L https://yarnpkg.com/install.sh | bash
+- source ~/.bashrc
+- npm install -g xvfb-maybe
+- yarn
+before_script:
+- git lfs pull
+script:
+#- xvfb-maybe node_modules/.bin/karma start test/unit/karma.conf.js
+#- yarn run pack && xvfb-maybe node_modules/.bin/mocha test/e2e
+- yarn run build
+branches:
+  only:
+  - master

+ 33 - 0
README.md

@@ -0,0 +1,33 @@
+# pilot-project
+
+> An electron-vue project
+
+#### Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:9080
+npm run dev
+
+# build electron application for production
+npm run build
+
+# run unit & end-to-end tests     
+npm test
+# "requestedExecutionLevel": "requireAdministrator"   admin
+
+# lint all JS/Vue component files in `src/`
+
+#perMachine  是否显示辅助安装程序--选择每台机器或每个用户,或者是否总是按所有用户安装
+#     "installerHeader":"build/script/side.bmp",
+#     "installerSidebar":"build/script/side.bmp",
+#    "uninstallerSidebar":"build/script/side.bmp"
+npm run lint
+
+```
+
+---
+
+This project was generated with [electron-vue](https://github.com/SimulatedGREG/electron-vue)@[8d4ed60](https://github.com/SimulatedGREG/electron-vue/tree/8d4ed607d65300381a8f47d97923eb07832b1a9a) 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 @@
+# Commented sections below can be used to run tests on the CI server
+# https://simulatedgreg.gitbooks.io/electron-vue/content/en/testing.html#on-the-subject-of-ci-testing
+version: 0.1.{build}
+
+branches:
+  only:
+    - master
+
+image: Visual Studio 2017
+platform:
+  - x64
+
+cache:
+  - node_modules
+  - '%APPDATA%\npm-cache'
+  - '%USERPROFILE%\.electron'
+  - '%USERPROFILE%\AppData\Local\Yarn\cache'
+
+init:
+  - git config --global core.autocrlf input
+
+install:
+  - ps: Install-Product node 8 x64
+  - git reset --hard HEAD
+  - yarn
+  - node --version
+
+build_script:
+  #- yarn test
+  - yarn build
+
+test: off

BIN
build/icon/newIcon.ico


+ 56 - 0
build/script/installer.nsh

@@ -0,0 +1,56 @@
+
+
+
+; RequestExecutionLevel admin
+!macro preInit
+    SetRegView 64
+    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\kjb"
+    WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\kjb"
+    SetRegView 32
+    WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\kjb"
+    WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "C:\Program Files\kjb"
+    ; CreateDirectory $%USERPROFILE%\*mentalEfficiencyData*
+    ; CopyFiles $INSTDIR\user.config $%USERPROFILE%\*mentalEfficiencyData*
+    ${If} ${FileExists} $%USERPROFILE%\*mentalEfficiencyData*
+    ; file is a directory    如果目录存在就不执行
+    ; SetOutPath $%USERPROFILE%\*mentalEfficiencyData*
+    ; File  $%USERPROFILE%\3.txt
+    ; CopyFiles $%USERPROFILE%\3.txt $%USERPROFILE%\*mentalEfficiencyData*
+    ${Else}
+    ;如果目录不存在就执行创建copy动作
+    ;CreateDirectory $INSTDIR\*mentalEfficiencyData*
+    ;CreateDirectory $%USERPROFILE%\*mentalEfficiencyData*
+    ; SetOutPath $%USERPROFILE%\*mentalEfficiencyData*
+    ; File /r user.config
+    ; File $INSTDIR\exe\mysql\mysql-5.7.24-winx64\Data\ibdata1
+   
+    
+    ; CopyFiles user.config $%USERPROFILE%\*mentalEfficiencyData*
+    ;CopyFiles $%USERPROFILE%\3.txt $%USERPROFILE%\*mentalEfficiencyData*
+    ; Delete $INSTDIR\user.config
+    ${EndIf}
+!macroend
+; !macro customUnInstall
+;     nsExec::Exec '"C:\Windows\System32\cmd.exe" sc stop psychological'
+;     nsExec::Exec '"C:\Windows\System32\cmd.exe" sc delete psychological'
+    
+; !macroend
+
+!macro customUnInit
+; 卸载页面出现前执行
+    # 提示窗
+        nsExec::Exec "sc stop kjb" "" "SW_HIDE"
+        nsExec::Exec "sc delete kjb" "" "SW_HIDE"
+        nsExec::Exec "taskkill /f /im rpc_thrift.exe" "" "SW_HIDE"
+        ;  ExecWait "sc stop psychological"
+        ;  ExecWait "sc delete psychological"
+        ;  ExecWait "taskkill /f /im rpc_thrift.exe"
+        ;  MessageBox MB_OKCANCEL "是否删除用户数据?" IDOK label_ok  IDCANCEL  label_cancel
+        ;  label_ok:
+        ;     # 删除固定文件夹
+        ;      RMDir /r $PROFILE\iConfig_TEST
+        ;      Goto end
+        ;  label_cancel:
+        ;      Goto end
+        ;  end:
+!macroend

+ 32 - 0
build/script/license.txt

@@ -0,0 +1,32 @@
+最终用户软件许可协议
+重要提示:本协议是您(个人、公司或其他任何实体)与北京决明科技有限公司(以下简称“决明”)签订的关于使用本软件(参见本协议中第 1.1 条)的最终用户软件许可协议(以下简称本“协议”)。在使用您的决明软件或下载本协议中所述软件更新前,请仔细阅读本协议。您使用决明软件或下载本软件更新将被视为您已同意接受本协议中所述的约束条件。如您不同意本协议,请勿使用任何决明软件或下载本软件更新。
+1.一般规定
+1.1 本协议中所述的软件是指: (1) 连同本软件一起提供给您的软件组件,包括但不限于存储在本软件上的代码和其他嵌入式软件、文档、界面、内容、字体以及任何受决明或其许可方版权保护的数据;(2) 对 (1) 中所述的软件进行的更新或升级。这些软件不包含第 1.2 节中定义的开源软件组件。
+1.2 本软件和/或其更新或升级可能还含有受第三方版权保护并由第三方授予开源软件许可证的软件组件(以下简称“开源软件组件”)。此类开源软件组件通过软件中提供的许可证信息加以区分,这些信息同时还指明了各组件所适用的开源软件许可证。因此,当您使用这些开源软件组件时,应适用开源软件许可证的条款和条件。本协议并不会改变您依据此类开源软件许可证所能享有的任何权利或义务。如果本协议中所述的许可条件与开源软件许可证中有关任何开源软件组件的内容存在任何冲突,应以开源软件许可证为准。
+1.3 除非另有其他约定,本协议中所述的软件应受本协议约束,不论其是存储于只读存储器、任何其他介质或属于其他形式。
+2.最终用户软件许可
+在遵守本协议条款和条件的情况下,您有权在电脑上以有限的、非独家的方式使用本软件(如第 1.1 节所定义)。不得出售、转让或用于其他任何商业用途。
+3.使用限制
+3.1 未经决明事先许可,不得使用决明的技术或知识产权来开发软件,或者设计、开发、制造、销售与本软件相关联的第三方软件/附件或授予许可。
+3.2 您可以制作软件副本并保存在计算机硬盘或其他存储介质上,但不得通过网络分发或提供本软件。
+3.3 未经决明事先书面许可,不得向第三方出售、出租、租赁、出借、再许可或分发全部或部分软件。
+3.4 除非另有明示许可,您不得且同意不会或促使其他任何人复制、反向工程、反编译、反汇编或创作软件的衍生作品。
+3.5 您同意在使用软件时遵守软件驻留或使用的国家或地区的所有适用法律和法规。
+4.权利保留
+4.1 决明享有和保留对软件的所有权利和资格,并保留本协议未明确授予您的其他任何权利。
+5.更新
+5.1 虽然决明无义务为您提供更新服务,但仍可能为您提供软件更新。决明提供的替换或补充软件的更新受本协议约束,除非此类更新随附单独的最终用户许可协议,此情况下将受后者约束。如果您决定不接受并使用决明提供的更新,您理解,您可能使软件置于严重安全风险并可能导致软件不可用或不稳定。
+6.终止和持续有效性
+6.1 本协议自您安装软件的首日生效。您可以随时终止本协议,方法是永久删除、销毁并归还软件、所有备份副本以及决明提供的所有相关材料,并自行承担相应的成本。如果您未能遵守本协议中的任一条款或条件,决明或其许可方有权在不预先通知的情况下随时终止本协议。终止后,您必须立即停止使用本软件,并删除所有已经复制和/或安装在您计算机上的软件及相关材料。
+6.2 本协议终止后,第 7、8、9和10 条继续有效。
+7.免责条款
+7.1 您确认本软件是“按原样”提供,不存在任何形式的明示或暗示担保,并且在适用法律允许的最大范围内,决明不提供任何明示或暗示的陈述或保证,包括但不限于有关适销性、满意质量、适用于特定目的、准确性、保密权以及不侵犯第三方权利的保证。决明或任何其他方均不保证软件中所含的功能将满足您的要求,也不保证软件的运行不会中断或出错。选择本软件来达到预期结果,以及安装、使用本软件并获取结果所带来的所有责任和风险由您承担。
+7.2 安装本软件可能会影响第三方软件、应用程序或服务的可用性。决明不保证本软件所包含的功能或服务将能满足您的要求,也不保证本软件及其服务能完全无错/无漏洞或将提供连续持久的服务。此外,决明也不保证本软件将与任何第三方软件或服务兼容。
+8.责任限制
+8.1 对于因滥用、错误使用或未经授权修改所引起的软件使用问题,决明不承担任何责任。
+8.2 在适用法律未明令禁止的程度下,对于因使用或无法使用本软件而引起的任何利润、收入、销售损失、数据丢失或采购替代商品或服务的成本、财产损害、人身伤害、业务中断、商业信息损失,或者任何特殊的、直接的、间接的、附带的、经济性、覆盖性、惩罚性、特殊或从属损害,无论是基于何种责任理论(合同、侵权、过失或其他),决明及其员工、许可方或附属公司都不承担赔偿责任,即使其已被告知存在此种损害的可能性也是如此。某些司法管辖区不允许对人身伤害、附带或从属损害等进行责任限制,则此限制可能不适用于您。
+8.3 决明对您的所有损害承担的总责任限额(除了因决明过失导致人身伤亡的情况,需遵循适用法律规定)不超过您购买决明软件所支付的价款。
+9.争议解决和所依据法律
+本协议的验证、解释、修改、履行和争议受中华人民共和国法律的管辖。您同意,本协议将在北京海淀区签订。如果发生任何有关本协议的内容或履行的争议,则应通过友好协商解决。如果无法通过协商解决,任何一方均可以将争议提交到协议签署地具有管辖权的人民法院诉讼解决。
+10.完整协议
+本协议的验证、解释、修改、履行和争议受中华人民共和国法律的管辖。您同意,本协议将在北京海淀区签订。如果发生任何有关本协议的内容或履行的争议,则应通过友好协商解决。如果无法通过协商解决,任何一方均可以将争议提交到协议签署地具有管辖权的人民法院诉讼解决。

BIN
build/script/side.bmp



+ 181 - 0
package.json

@@ -0,0 +1,181 @@
+{
+  "name": "projectKJB",
+  "version": "1.1.7",
+  "author": "北京决明科技有限公司",
+  "description": "KJB",
+  "license": null,
+  "main": "./dist/electron/main.js",
+  "scripts": {
+    "build": "node .electron-vue/build.js && electron-builder",
+    "build:dir": "node .electron-vue/build.js && electron-builder --dir",
+    "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js",
+    "build:web": "cross-env BUILD_TARGET=web node .electron-vue/build.js",
+    "dev": "node .electron-vue/dev-runner.js",
+    "e2e": "npm run pack && mocha test/e2e",
+    "lint": "",
+    "lint:fix": "",
+    "pack": "npm run pack:main && npm run pack:renderer",
+    "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js",
+    "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js",
+    "test": "npm run unit && npm run e2e",
+    "unit": "karma start test/unit/karma.conf.js",
+    "postinstall": "npm run lint:fix",
+    "postcpp": "electron-builder install-app-deps"
+  },
+  "build": {
+    "nsis": {
+      "allowElevation": true,
+      "perMachine": true,
+      "include": "build/script/installer.nsh",
+      "oneClick": false,
+      "allowToChangeInstallationDirectory": true,
+      "createDesktopShortcut": true,
+      "runAfterFinish": true,
+      "license": "build/script/license.txt",
+      "deleteAppDataOnUninstall": false
+    },
+    "productName": "心理效能增强系统",
+    "appId": "com.examplesingletask.yourapp.projectkjb",
+    "directories": {
+      "output": "build"
+    },
+    "files": [
+      "dist/electron/**/*"
+    ],
+    "dmg": {
+      "contents": [
+        {
+          "x": 410,
+          "y": 150,
+          "type": "link",
+          "path": "/Applications"
+        },
+        {
+          "x": 130,
+          "y": 150,
+          "type": "file"
+        }
+      ]
+    },
+    "mac": {
+      "icon": "build/icons/icon.icns"
+    },
+    "win": {
+      "icon": "build/icon/newIcon.ico",
+      "requestedExecutionLevel": "requireAdministrator"
+    },
+    "linux": {
+      "icon": "build/icons"
+    },
+    "extraResources": [
+      "./exe/**"
+    ]
+  },
+  "dependencies": {
+    "async-lock": "^1.4.0",
+    "axios": "^0.18.0",
+    "core-js": "^3.15.1",
+    "createjs-npm": "^0.2.0",
+    "crypto-js": "^4.1.1",
+    "echarts": "^5.1.2",
+    "echarts-stat": "^1.2.0",
+    "electron-log": "^4.4.8",
+    "electron-package": "^0.1.0",
+    "electron-packager": "^14.2.1",
+    "electron-updater": "^4.3.9",
+    "element-ui": "^2.15.2",
+    "excel-export": "^0.5.1",
+    "intro.js": "^6.0.0",
+    "js-file-download": "^0.4.12",
+    "js-md5": "^0.7.3",
+    "jwchat": "^1.0.8",
+    "mysql": "^2.18.1",
+    "node-cmd": "^4.0.0",
+    "node-hid": "^2.1.1",
+    "ringbufferjs": "^2.0.0",
+    "serialport": "^9.2.8",
+    "sm3": "^1.0.3",
+    "sqlite3": "^5.0.2",
+    "thrift": "^0.14.2",
+    "video.js": "^7.19.2",
+    "videojs-contrib-hls": "^5.15.0",
+    "vue": "^2.5.16",
+    "vue-electron": "^1.0.6",
+    "vue-qr": "^4.0.9",
+    "vue-router": "^3.0.1",
+    "vue-unity-webgl": "^1.2.0",
+    "vuex": "^3.0.1",
+    "vuex-electron": "^1.0.0",
+    "vuex-persistedstate": "^4.1.0",
+    "ws": "7.5.1"
+  },
+  "devDependencies": {
+    "@types/serialport": "^8.0.1",
+    "@types/sqlite3": "^3.1.7",
+    "@types/thrift": "^0.10.10",
+    "@types/ws": "^7.4.5",
+    "ajv": "^6.5.0",
+    "babel-core": "^6.26.3",
+    "babel-eslint": "^8.2.3",
+    "babel-loader": "^7.1.4",
+    "babel-minify-webpack-plugin": "^0.3.1",
+    "babel-plugin-istanbul": "^4.1.6",
+    "babel-plugin-transform-runtime": "^6.23.0",
+    "babel-preset-env": "^1.7.0",
+    "babel-preset-stage-0": "^6.24.1",
+    "babel-register": "^6.26.0",
+    "cfonts": "^2.1.2",
+    "chai": "^4.1.2",
+    "chalk": "^2.4.1",
+    "copy-webpack-plugin": "^4.5.1",
+    "cross-env": "^5.1.6",
+    "css-loader": "^0.28.11",
+    "del": "^3.0.0",
+    "devtron": "^1.4.0",
+    "electron": "^8.0.0",
+    "electron-builder": "^22.11.7",
+    "electron-debug": "^3.2.0",
+    "electron-devtools-installer": "^2.0.0",
+    "electron-rebuild": "^2.3.5",
+    "eslint": "^4.19.1",
+    "eslint-config-standard": "^11.0.0",
+    "eslint-friendly-formatter": "^4.0.1",
+    "eslint-loader": "^2.0.0",
+    "eslint-plugin-html": "^4.0.3",
+    "eslint-plugin-import": "^2.12.0",
+    "eslint-plugin-node": "^6.0.1",
+    "eslint-plugin-promise": "^3.8.0",
+    "eslint-plugin-standard": "^3.1.0",
+    "file-loader": "^1.1.11",
+    "html-webpack-plugin": "^3.2.0",
+    "inject-loader": "^4.0.1",
+    "karma": "^2.0.2",
+    "karma-chai": "^0.1.0",
+    "karma-coverage": "^1.1.2",
+    "karma-electron": "^6.0.0",
+    "karma-mocha": "^1.3.0",
+    "karma-sourcemap-loader": "^0.3.7",
+    "karma-spec-reporter": "^0.0.32",
+    "karma-webpack": "^3.0.0",
+    "listr": "^0.14.3",
+    "mini-css-extract-plugin": "0.4.0",
+    "mocha": "^5.2.0",
+    "node-loader": "^0.6.0",
+    "node-sass": "^4.9.2",
+    "require-dir": "^1.0.0",
+    "sass-loader": "^7.0.3",
+    "spectron": "^3.8.0",
+    "style-loader": "^0.21.0",
+    "url-loader": "^1.0.1",
+    "vue-html-loader": "^1.2.4",
+    "vue-loader": "^15.2.4",
+    "vue-style-loader": "^4.1.0",
+    "vue-template-compiler": "^2.5.16",
+    "webpack": "^4.15.1",
+    "webpack-cli": "^3.0.8",
+    "webpack-dev-server": "^3.1.4",
+    "webpack-hot-middleware": "^2.22.2",
+    "webpack-merge": "^4.1.3"
+  },
+  "__npminstall_done": false
+}

+ 32 - 0
src/index.ejs

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <title>心理效能增强系统</title>
+  <% if (htmlWebpackPlugin.options.nodeModules) { %>
+    <!-- Add `node_modules/` to global paths so `require` works properly in development -->
+    <script>
+      require('module').globalPaths.push('<%= htmlWebpackPlugin.options.nodeModules.replace(/\\/g, '\\\\') %>')
+    </script>
+    <% } %>
+</head>
+
+<body>
+  <div id="app"></div>
+  <!-- Set `__static` path to static files in production -->
+  <% if (!process.browser) { %>
+    <script>
+      if (process.env.NODE_ENV !== 'development') window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
+    </script>
+    <% } %>
+
+      <!-- webpack builds are automatically injected -->
+</body>
+
+</html>
+<style>
+  body {
+    margin: 0px !important;
+  }
+</style>

+ 639 - 0
src/main/HrUtilService.js

@@ -0,0 +1,639 @@
+//
+// Autogenerated by Thrift Compiler (0.14.2)
+//
+// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+//
+'use strict'
+
+var thrift = require('thrift')
+var Thrift = thrift.Thrift
+var Q = thrift.Q
+var Int64 = require('node-int64')
+
+var ttypes = require('./hrUtilService_types')
+// HELPER FUNCTIONS AND STRUCTURES
+
+var HrUtilService_get_hrv_features_args = function (args) {
+  this.raw_data = null
+  this.low = 0.5000000000000000
+  this.high = 0.5000000000000000
+  this.sample_rate = 100
+  if (args) {
+    if (args.raw_data !== undefined && args.raw_data !== null) {
+      this.raw_data = Thrift.copyList(args.raw_data, [null])
+    }
+    if (args.low !== undefined && args.low !== null) {
+      this.low = args.low
+    }
+    if (args.high !== undefined && args.high !== null) {
+      this.high = args.high
+    }
+    if (args.sample_rate !== undefined && args.sample_rate !== null) {
+      this.sample_rate = args.sample_rate
+    }
+  }
+}
+HrUtilService_get_hrv_features_args.prototype = {}
+HrUtilService_get_hrv_features_args.prototype.read = function (input) {
+  input.readStructBegin()
+  while (true) {
+    var ret = input.readFieldBegin()
+    var ftype = ret.ftype
+    var fid = ret.fid
+    if (ftype == Thrift.Type.STOP) {
+      break
+    }
+    switch (fid) {
+      case 1:
+        if (ftype == Thrift.Type.LIST) {
+          this.raw_data = []
+          var _rtmp31 = input.readListBegin()
+          var _size0 = _rtmp31.size || 0
+          for (var _i2 = 0; _i2 < _size0; ++_i2) {
+            var elem3 = null
+            elem3 = input.readI32()
+            this.raw_data.push(elem3)
+          }
+          input.readListEnd()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 2:
+        if (ftype == Thrift.Type.DOUBLE) {
+          this.low = input.readDouble()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 3:
+        if (ftype == Thrift.Type.DOUBLE) {
+          this.high = input.readDouble()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 4:
+        if (ftype == Thrift.Type.I32) {
+          this.sample_rate = input.readI32()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      default:
+        input.skip(ftype)
+    }
+    input.readFieldEnd()
+  }
+  input.readStructEnd()
+}
+
+HrUtilService_get_hrv_features_args.prototype.write = function (output) {
+  output.writeStructBegin('HrUtilService_get_hrv_features_args')
+  if (this.raw_data !== null && this.raw_data !== undefined) {
+    output.writeFieldBegin('raw_data', Thrift.Type.LIST, 1)
+    output.writeListBegin(Thrift.Type.I32, this.raw_data.length)
+    for (var iter4 in this.raw_data) {
+      if (this.raw_data.hasOwnProperty(iter4)) {
+        iter4 = this.raw_data[iter4]
+        output.writeI32(iter4)
+      }
+    }
+    output.writeListEnd()
+    output.writeFieldEnd()
+  }
+  if (this.low !== null && this.low !== undefined) {
+    output.writeFieldBegin('low', Thrift.Type.DOUBLE, 2)
+    output.writeDouble(this.low)
+    output.writeFieldEnd()
+  }
+  if (this.high !== null && this.high !== undefined) {
+    output.writeFieldBegin('high', Thrift.Type.DOUBLE, 3)
+    output.writeDouble(this.high)
+    output.writeFieldEnd()
+  }
+  if (this.sample_rate !== null && this.sample_rate !== undefined) {
+    output.writeFieldBegin('sample_rate', Thrift.Type.I32, 4)
+    output.writeI32(this.sample_rate)
+    output.writeFieldEnd()
+  }
+  output.writeFieldStop()
+  output.writeStructEnd()
+}
+
+var HrUtilService_get_hrv_features_result = function (args) {
+  this.success = null
+  if (args) {
+    if (args.success !== undefined && args.success !== null) {
+      this.success = Thrift.copyMap(args.success, [null])
+    }
+  }
+}
+HrUtilService_get_hrv_features_result.prototype = {}
+HrUtilService_get_hrv_features_result.prototype.read = function (input) {
+  input.readStructBegin()
+  while (true) {
+    var ret = input.readFieldBegin()
+    var ftype = ret.ftype
+    var fid = ret.fid
+    if (ftype == Thrift.Type.STOP) {
+      break
+    }
+    switch (fid) {
+      case 0:
+        if (ftype == Thrift.Type.MAP) {
+          this.success = {}
+          var _rtmp36 = input.readMapBegin()
+          var _size5 = _rtmp36.size || 0
+          for (var _i7 = 0; _i7 < _size5; ++_i7) {
+            var key8 = null
+            var val9 = null
+            key8 = input.readString()
+            val9 = input.readDouble()
+            this.success[key8] = val9
+          }
+          input.readMapEnd()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 0:
+        input.skip(ftype)
+        break
+      default:
+        input.skip(ftype)
+    }
+    input.readFieldEnd()
+  }
+  input.readStructEnd()
+}
+
+HrUtilService_get_hrv_features_result.prototype.write = function (output) {
+  output.writeStructBegin('HrUtilService_get_hrv_features_result')
+  if (this.success !== null && this.success !== undefined) {
+    output.writeFieldBegin('success', Thrift.Type.MAP, 0)
+    output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.DOUBLE, Thrift.objectLength(this.success))
+    for (var kiter10 in this.success) {
+      if (this.success.hasOwnProperty(kiter10)) {
+        var viter11 = this.success[kiter10]
+        output.writeString(kiter10)
+        output.writeDouble(viter11)
+      }
+    }
+    output.writeMapEnd()
+    output.writeFieldEnd()
+  }
+  output.writeFieldStop()
+  output.writeStructEnd()
+}
+
+var HrUtilService_filter_signal_args = function (args) {
+  this.y = null
+  this.cutoff = null
+  this.filtertype = 'bandpass'
+  this.sample_rate = 100
+  this.order = 3
+  this.return_top = false
+  if (args) {
+    if (args.y !== undefined && args.y !== null) {
+      this.y = Thrift.copyList(args.y, [null])
+    }
+    if (args.cutoff !== undefined && args.cutoff !== null) {
+      this.cutoff = Thrift.copyList(args.cutoff, [null])
+    }
+    if (args.filtertype !== undefined && args.filtertype !== null) {
+      this.filtertype = args.filtertype
+    }
+    if (args.sample_rate !== undefined && args.sample_rate !== null) {
+      this.sample_rate = args.sample_rate
+    }
+    if (args.order !== undefined && args.order !== null) {
+      this.order = args.order
+    }
+    if (args.return_top !== undefined && args.return_top !== null) {
+      this.return_top = args.return_top
+    }
+  }
+}
+HrUtilService_filter_signal_args.prototype = {}
+HrUtilService_filter_signal_args.prototype.read = function (input) {
+  input.readStructBegin()
+  while (true) {
+    var ret = input.readFieldBegin()
+    var ftype = ret.ftype
+    var fid = ret.fid
+    if (ftype == Thrift.Type.STOP) {
+      break
+    }
+    switch (fid) {
+      case 1:
+        if (ftype == Thrift.Type.LIST) {
+          this.y = []
+          var _rtmp313 = input.readListBegin()
+          var _size12 = _rtmp313.size || 0
+          for (var _i14 = 0; _i14 < _size12; ++_i14) {
+            var elem15 = null
+            elem15 = input.readI32()
+            this.y.push(elem15)
+          }
+          input.readListEnd()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 2:
+        if (ftype == Thrift.Type.LIST) {
+          this.cutoff = []
+          var _rtmp317 = input.readListBegin()
+          var _size16 = _rtmp317.size || 0
+          for (var _i18 = 0; _i18 < _size16; ++_i18) {
+            var elem19 = null
+            elem19 = input.readDouble()
+            this.cutoff.push(elem19)
+          }
+          input.readListEnd()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 3:
+        if (ftype == Thrift.Type.STRING) {
+          this.filtertype = input.readString()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 4:
+        if (ftype == Thrift.Type.I32) {
+          this.sample_rate = input.readI32()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 5:
+        if (ftype == Thrift.Type.I32) {
+          this.order = input.readI32()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 6:
+        if (ftype == Thrift.Type.BOOL) {
+          this.return_top = input.readBool()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      default:
+        input.skip(ftype)
+    }
+    input.readFieldEnd()
+  }
+  input.readStructEnd()
+}
+
+HrUtilService_filter_signal_args.prototype.write = function (output) {
+  output.writeStructBegin('HrUtilService_filter_signal_args')
+  if (this.y !== null && this.y !== undefined) {
+    output.writeFieldBegin('y', Thrift.Type.LIST, 1)
+    output.writeListBegin(Thrift.Type.I32, this.y.length)
+    for (var iter20 in this.y) {
+      if (this.y.hasOwnProperty(iter20)) {
+        iter20 = this.y[iter20]
+        output.writeI32(iter20)
+      }
+    }
+    output.writeListEnd()
+    output.writeFieldEnd()
+  }
+  if (this.cutoff !== null && this.cutoff !== undefined) {
+    output.writeFieldBegin('cutoff', Thrift.Type.LIST, 2)
+    output.writeListBegin(Thrift.Type.DOUBLE, this.cutoff.length)
+    for (var iter21 in this.cutoff) {
+      if (this.cutoff.hasOwnProperty(iter21)) {
+        iter21 = this.cutoff[iter21]
+        output.writeDouble(iter21)
+      }
+    }
+    output.writeListEnd()
+    output.writeFieldEnd()
+  }
+  if (this.filtertype !== null && this.filtertype !== undefined) {
+    output.writeFieldBegin('filtertype', Thrift.Type.STRING, 3)
+    output.writeString(this.filtertype)
+    output.writeFieldEnd()
+  }
+  if (this.sample_rate !== null && this.sample_rate !== undefined) {
+    output.writeFieldBegin('sample_rate', Thrift.Type.I32, 4)
+    output.writeI32(this.sample_rate)
+    output.writeFieldEnd()
+  }
+  if (this.order !== null && this.order !== undefined) {
+    output.writeFieldBegin('order', Thrift.Type.I32, 5)
+    output.writeI32(this.order)
+    output.writeFieldEnd()
+  }
+  if (this.return_top !== null && this.return_top !== undefined) {
+    output.writeFieldBegin('return_top', Thrift.Type.BOOL, 6)
+    output.writeBool(this.return_top)
+    output.writeFieldEnd()
+  }
+  output.writeFieldStop()
+  output.writeStructEnd()
+}
+
+var HrUtilService_filter_signal_result = function (args) {
+  this.success = null
+  if (args) {
+    if (args.success !== undefined && args.success !== null) {
+      this.success = Thrift.copyList(args.success, [null])
+    }
+  }
+}
+HrUtilService_filter_signal_result.prototype = {}
+HrUtilService_filter_signal_result.prototype.read = function (input) {
+  input.readStructBegin()
+  while (true) {
+    var ret = input.readFieldBegin()
+    var ftype = ret.ftype
+    var fid = ret.fid
+    if (ftype == Thrift.Type.STOP) {
+      break
+    }
+    switch (fid) {
+      case 0:
+        if (ftype == Thrift.Type.LIST) {
+          this.success = []
+          var _rtmp323 = input.readListBegin()
+          var _size22 = _rtmp323.size || 0
+          for (var _i24 = 0; _i24 < _size22; ++_i24) {
+            var elem25 = null
+            elem25 = input.readDouble()
+            this.success.push(elem25)
+          }
+          input.readListEnd()
+        } else {
+          input.skip(ftype)
+        }
+        break
+      case 0:
+        input.skip(ftype)
+        break
+      default:
+        input.skip(ftype)
+    }
+    input.readFieldEnd()
+  }
+  input.readStructEnd()
+}
+
+HrUtilService_filter_signal_result.prototype.write = function (output) {
+  output.writeStructBegin('HrUtilService_filter_signal_result')
+  if (this.success !== null && this.success !== undefined) {
+    output.writeFieldBegin('success', Thrift.Type.LIST, 0)
+    output.writeListBegin(Thrift.Type.DOUBLE, this.success.length)
+    for (var iter26 in this.success) {
+      if (this.success.hasOwnProperty(iter26)) {
+        iter26 = this.success[iter26]
+        output.writeDouble(iter26)
+      }
+    }
+    output.writeListEnd()
+    output.writeFieldEnd()
+  }
+  output.writeFieldStop()
+  output.writeStructEnd()
+}
+
+var HrUtilServiceClient = exports.Client = function (output, pClass) {
+  this.output = output
+  this.pClass = pClass
+  this._seqid = 0
+  this._reqs = {}
+}
+HrUtilServiceClient.prototype = {}
+HrUtilServiceClient.prototype.seqid = function () { return this._seqid }
+HrUtilServiceClient.prototype.new_seqid = function () { return this._seqid += 1 }
+
+HrUtilServiceClient.prototype.get_hrv_features = function (raw_data, low, high, sample_rate, callback) {
+  this._seqid = this.new_seqid()
+  if (callback === undefined) {
+    var _defer = Q.defer()
+    this._reqs[this.seqid()] = function (error, result) {
+      if (error) {
+        _defer.reject(error)
+      } else {
+        _defer.resolve(result)
+      }
+    }
+    this.send_get_hrv_features(raw_data, low, high, sample_rate)
+    return _defer.promise
+  } else {
+    this._reqs[this.seqid()] = callback
+    this.send_get_hrv_features(raw_data, low, high, sample_rate)
+  }
+}
+
+HrUtilServiceClient.prototype.send_get_hrv_features = function (raw_data, low, high, sample_rate) {
+  var output = new this.pClass(this.output)
+  var params = {
+    raw_data: raw_data,
+    low: low,
+    high: high,
+    sample_rate: sample_rate
+  }
+  var args = new HrUtilService_get_hrv_features_args(params)
+  try {
+    output.writeMessageBegin('get_hrv_features', Thrift.MessageType.CALL, this.seqid())
+    args.write(output)
+    output.writeMessageEnd()
+    return this.output.flush()
+  } catch (e) {
+    delete this._reqs[this.seqid()]
+    if (typeof output.reset === 'function') {
+      output.reset()
+    }
+    throw e
+  }
+}
+
+HrUtilServiceClient.prototype.recv_get_hrv_features = function (input, mtype, rseqid) {
+  var callback = this._reqs[rseqid] || function () {}
+  delete this._reqs[rseqid]
+  if (mtype == Thrift.MessageType.EXCEPTION) {
+    var x = new Thrift.TApplicationException()
+    x.read(input)
+    input.readMessageEnd()
+    return callback(x)
+  }
+  var result = new HrUtilService_get_hrv_features_result()
+  result.read(input)
+  input.readMessageEnd()
+
+  if (result.success !== null) {
+    return callback(null, result.success)
+  }
+  return callback('get_hrv_features failed: unknown result')
+}
+
+HrUtilServiceClient.prototype.filter_signal = function (y, cutoff, filtertype, sample_rate, order, return_top, callback) {
+  this._seqid = this.new_seqid()
+  if (callback === undefined) {
+    var _defer = Q.defer()
+    this._reqs[this.seqid()] = function (error, result) {
+      if (error) {
+        _defer.reject(error)
+      } else {
+        _defer.resolve(result)
+      }
+    }
+    this.send_filter_signal(y, cutoff, filtertype, sample_rate, order, return_top)
+    return _defer.promise
+  } else {
+    this._reqs[this.seqid()] = callback
+    this.send_filter_signal(y, cutoff, filtertype, sample_rate, order, return_top)
+  }
+}
+
+HrUtilServiceClient.prototype.send_filter_signal = function (y, cutoff, filtertype, sample_rate, order, return_top) {
+  var output = new this.pClass(this.output)
+  var params = {
+    y: y,
+    cutoff: cutoff,
+    filtertype: filtertype,
+    sample_rate: sample_rate,
+    order: order,
+    return_top: return_top
+  }
+  var args = new HrUtilService_filter_signal_args(params)
+  try {
+    output.writeMessageBegin('filter_signal', Thrift.MessageType.CALL, this.seqid())
+    args.write(output)
+    output.writeMessageEnd()
+    return this.output.flush()
+  } catch (e) {
+    delete this._reqs[this.seqid()]
+    if (typeof output.reset === 'function') {
+      output.reset()
+    }
+    throw e
+  }
+}
+
+HrUtilServiceClient.prototype.recv_filter_signal = function (input, mtype, rseqid) {
+  var callback = this._reqs[rseqid] || function () {}
+  delete this._reqs[rseqid]
+  if (mtype == Thrift.MessageType.EXCEPTION) {
+    var x = new Thrift.TApplicationException()
+    x.read(input)
+    input.readMessageEnd()
+    return callback(x)
+  }
+  var result = new HrUtilService_filter_signal_result()
+  result.read(input)
+  input.readMessageEnd()
+
+  if (result.success !== null) {
+    return callback(null, result.success)
+  }
+  return callback('filter_signal failed: unknown result')
+}
+var HrUtilServiceProcessor = exports.Processor = function (handler) {
+  this._handler = handler
+}
+HrUtilServiceProcessor.prototype.process = function (input, output) {
+  var r = input.readMessageBegin()
+  if (this['process_' + r.fname]) {
+    return this['process_' + r.fname].call(this, r.rseqid, input, output)
+  } else {
+    input.skip(Thrift.Type.STRUCT)
+    input.readMessageEnd()
+    var x = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, 'Unknown function ' + r.fname)
+    output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid)
+    x.write(output)
+    output.writeMessageEnd()
+    output.flush()
+  }
+}
+HrUtilServiceProcessor.prototype.process_get_hrv_features = function (seqid, input, output) {
+  var args = new HrUtilService_get_hrv_features_args()
+  args.read(input)
+  input.readMessageEnd()
+  if (this._handler.get_hrv_features.length === 4) {
+    Q.fcall(this._handler.get_hrv_features.bind(this._handler),
+      args.raw_data,
+      args.low,
+      args.high,
+      args.sample_rate
+    ).then(function (result) {
+      var result_obj = new HrUtilService_get_hrv_features_result({success: result})
+      output.writeMessageBegin('get_hrv_features', Thrift.MessageType.REPLY, seqid)
+      result_obj.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    }).catch(function (err) {
+      var result
+      result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message)
+      output.writeMessageBegin('get_hrv_features', Thrift.MessageType.EXCEPTION, seqid)
+      result.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    })
+  } else {
+    this._handler.get_hrv_features(args.raw_data, args.low, args.high, args.sample_rate, function (err, result) {
+      var result_obj
+      if ((err === null || typeof err === 'undefined')) {
+        result_obj = new HrUtilService_get_hrv_features_result((err !== null || typeof err === 'undefined') ? err : {success: result})
+        output.writeMessageBegin('get_hrv_features', Thrift.MessageType.REPLY, seqid)
+      } else {
+        result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message)
+        output.writeMessageBegin('get_hrv_features', Thrift.MessageType.EXCEPTION, seqid)
+      }
+      result_obj.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    })
+  }
+}
+HrUtilServiceProcessor.prototype.process_filter_signal = function (seqid, input, output) {
+  var args = new HrUtilService_filter_signal_args()
+  args.read(input)
+  input.readMessageEnd()
+  if (this._handler.filter_signal.length === 6) {
+    Q.fcall(this._handler.filter_signal.bind(this._handler),
+      args.y,
+      args.cutoff,
+      args.filtertype,
+      args.sample_rate,
+      args.order,
+      args.return_top
+    ).then(function (result) {
+      var result_obj = new HrUtilService_filter_signal_result({success: result})
+      output.writeMessageBegin('filter_signal', Thrift.MessageType.REPLY, seqid)
+      result_obj.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    }).catch(function (err) {
+      var result
+      result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message)
+      output.writeMessageBegin('filter_signal', Thrift.MessageType.EXCEPTION, seqid)
+      result.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    })
+  } else {
+    this._handler.filter_signal(args.y, args.cutoff, args.filtertype, args.sample_rate, args.order, args.return_top, function (err, result) {
+      var result_obj
+      if ((err === null || typeof err === 'undefined')) {
+        result_obj = new HrUtilService_filter_signal_result((err !== null || typeof err === 'undefined') ? err : {success: result})
+        output.writeMessageBegin('filter_signal', Thrift.MessageType.REPLY, seqid)
+      } else {
+        result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message)
+        output.writeMessageBegin('filter_signal', Thrift.MessageType.EXCEPTION, seqid)
+      }
+      result_obj.write(output)
+      output.writeMessageEnd()
+      output.flush()
+    })
+  }
+}

+ 104 - 0
src/main/ServerKey.js

@@ -0,0 +1,104 @@
+import SoftKey from './SoftKey'
+
+const {ipcMain} = require('electron')
+
+var usbDetect = require('usb-detection')
+
+// Do some detection
+usbDetect.startMonitoring()
+// var SoftKey=require('./SoftKey.js');
+
+var lasterror
+
+var mSoftKey = new SoftKey()
+
+var g_Event
+
+function SendErrMsg (event, ErrMsg) {
+  event.sender.send('ErrMsg', ErrMsg)
+}
+
+function SendMsg (event, Msg) {
+  event.sender.send('Msg', Msg)
+}
+
+function SendErrMsgEx (event, ErrMsg) {
+  event.sender.send('ErrMsgEx', ErrMsg, lasterror)
+}
+
+function FindUsbKey () {
+  var MsgNoUKey = '未能在系统中发现加密锁.'
+
+  var KeyPath = mSoftKey.FindPort(0)
+  lasterror = mSoftKey.GetLastError()
+  if (lasterror != 0) {
+    SendErrMsg(g_Event, MsgNoUKey)
+  }
+}
+
+ipcMain.on('onFindPort', (event, arg) => {
+  g_Event = event
+
+  FindUsbKey()
+})
+
+ipcMain.on('OnFindPort_2Bnt', (event, arg) => {
+  lasterror = mSoftKey.CheckKeyByFindort_2()
+  if (lasterror == 2) {
+    SendMsg(event, '该锁的版本太低,不支持此功能')
+    return
+  }
+  if (lasterror != 0) { SendErrMsgEx(event, '未找到指定的加密锁,错误码是:') } else { SendMsg(event, '找到指定的加密锁') }
+})
+
+ipcMain.on('OnCheckKeyByReadEpromBnt', (event, arg) => {
+  lasterror = mSoftKey.CheckKeyByReadEprom()
+  if (lasterror == 1) {
+    SendMsg(event, '你没有对该功能进行设置,不使用该功能。')
+    return
+  }
+  if (lasterror != 0) { SendErrMsgEx(event, '未找到指定的加密锁,错误码是:') } else { SendMsg(event, '找到指定的加密锁') }
+})
+
+ipcMain.on('OnCheckKeyByEncstringBnt', (event, arg) => {
+  lasterror = mSoftKey.CheckKeyByEncstring()
+  if (lasterror == 1) {
+    SendMsg(event, '你没有对该功能进行设置,不使用该功能。')
+    return
+  }
+  if (lasterror == 2) {
+    SendMsg(event, '该锁的版本太低,不支持此功能')
+    return
+  }
+  if (lasterror != 0) { SendErrMsgEx(event, '未找到指定的加密锁,错误码是:') } else { SendMsg(event, '找到指定的加密锁') }
+})
+
+ipcMain.on('OnCheckKeyByEncstring_NewBnt', (event, arg) => {
+  lasterror = mSoftKey.CheckKeyByEncstring_New()
+  if (lasterror == 1) {
+    SendMsg(event, '你没有对该功能进行设置,不使用该功能。')
+    return
+  }
+  if (lasterror == 2) {
+    SendMsg(event, '该锁的版本太低,不支持此功能')
+    return
+  }
+  if (lasterror != 0) { SendErrMsgEx(event, '未找到指定的加密锁,错误码是:') } else { SendMsg(event, '找到指定的加密锁') }
+})
+
+/// UsbKey pnp event
+usbDetect.on('add', function (device) {
+  if (mSoftKey.MacthUKeyID(device)) {
+    if (mSoftKey.CheckKeyByFindort_2() == 0)SendMsg(g_Event, '收到有加密锁初插入的消息')
+  }
+})
+
+usbDetect.on('remove', function (device) {
+  if (mSoftKey.MacthUKeyID(device)) {
+    if (mSoftKey.CheckKeyByFindort_2() != 0)SendMsg(g_Event, '收到有加密锁被拨出的消息')
+  }
+})
+
+module.exports.mSoftKey = mSoftKey
+module.exports.lasterror = lasterror
+module.exports.usbDetect = usbDetect

+ 1369 - 0
src/main/SoftKey.js

@@ -0,0 +1,1369 @@
+// JScript source code
+
+var HID = require('node-hid')
+const sm3 = require('sm3')
+
+var GETVERSION = 0x01
+var GETID = 0x02
+var GETVEREX = 0x05
+var CAL_TEA = 0x08
+var SET_TEAKEY = 0x09
+var READBYTE = 0x10
+var WRITEBYTE = 0x11
+var YTREADBUF = 0x12
+var YTWRITEBUF = 0x13
+var MYRESET = 0x20
+var YTREBOOT = 0x24
+var SET_ECC_PARA = 0x30
+var GET_ECC_PARA = 0x31
+var SET_ECC_KEY = 0x32
+var GET_ECC_KEY = 0x33
+var MYENC = 0x34
+var MYDEC = 0X35
+var SET_PIN = 0X36
+var GEN_KEYPAIR = 0x37
+var YTVERIFY = 0x52
+var GET_CHIPID = 0x53
+
+// errcode
+var FAILEDGENKEYPAIR = -21
+var FAILENC = -22
+var FAILDEC = -23
+var FAILPINPWD = -24
+var USBStatusFail = -50
+var ERR_SET_REPORT = -94
+var ERR_GET_REPORT = -93
+
+var MAX_LEN = 2031
+
+var SM2_ADDBYTE = 97//
+var MAX_ENCLEN = 128 //
+var MAX_DECLEN = (MAX_ENCLEN + SM2_ADDBYTE) //
+var SM2_USENAME_LEN = 80//
+
+var ECC_MAXLEN = 32
+var PIN_LEN = 16
+
+var MAX_TRANSE_LEN = 21
+var SM2_MAX_TRANSE_LEN = 255
+
+var ID_LEN = 16
+
+var mSoftKey = class SoftKey {
+  SoftKey () {
+    // connection object
+    SoftKey.connection = null
+  }
+
+  GetLastError () {
+    return this.lasterror
+  }
+
+  StrEnc (InString, Key) {
+    var n; var m
+    var nlen
+
+    var b = Buffer.from(InString)
+    var zero_buf = Buffer.from([0])
+    b = Buffer.concat([b, zero_buf])
+    nlen = b.length
+    if (b.length < 8) {
+      nlen = 8
+    }
+
+    var outb = Buffer.alloc(nlen)
+    var inb = Buffer.alloc(nlen)
+    b.copy(inb)// ???????8?????0????????????????0
+    b.copy(outb)
+
+    for (n = 0; n <= (nlen - 8); n = n + 8) {
+      var tmpoutb = this.sub_EnCode(inb, n, Key)
+      for (m = 0; m < 8; m++) {
+        outb[m + n] = tmpoutb[m]
+      }
+    }
+
+    return outb.toString('hex')
+  }
+
+  StrDec (InString, Key)//
+  {
+    var n, m
+    var inb = new Buffer(InString, 'hex')
+    var outb = Buffer.alloc(inb.length)
+    inb.copy(outb)
+
+    for (n = 0; n <= inb.length - 8; n = n + 8) {
+      var tmpoutb = this.sub_DeCode(inb, n, Key)
+      for (m = 0; m < 8; m++) {
+        outb[m + n] = tmpoutb[m]
+      }
+    }
+
+    return outb.toString()
+  }
+
+  EnCode (inb, Key) {
+    this.sub_EnCode(inb, 0, Key)
+  }
+
+  sub_EnCode (inb, pos, Key) {
+    var cnDelta, y, z, a, b, c, d
+    var outb = new Uint8Array(8)
+    var n, i, nlen
+    var sum
+    var temp, temp_1
+
+    var buf = new Array(16)
+    var temp_string
+
+    cnDelta = 2654435769
+    sum = 0
+
+    nlen = Key.length
+    i = 0
+    for (n = 1; n <= nlen; n = n + 2) {
+      temp_string = Key.substring(n - 1, n - 1 + 2)
+      buf[i] = this.HexToInt(temp_string)
+      i = i + 1
+    }
+    a = 0; b = 0; c = 0; d = 0
+    for (n = 0; n <= 3; n++) {
+      a = (buf[n] << (n * 8)) | a
+      b = (buf[n + 4] << (n * 8)) | b
+      c = (buf[n + 4 + 4] << (n * 8)) | c
+      d = (buf[n + 4 + 4 + 4] << (n * 8)) | d
+    }
+
+    y = 0
+    z = 0
+    for (n = 0; n <= 3; n++) {
+      y = (inb[n + pos] << (n * 8)) | y
+      z = (inb[n + 4 + pos] << (n * 8)) | z
+    }
+
+    n = 32
+
+    while (n > 0) {
+      sum = cnDelta + sum
+
+      temp = (z << 4) & 0xFFFFFFFF
+
+      temp = (temp + a) & 0xFFFFFFFF
+      temp_1 = (z + sum) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp_1 = (z >>> 5) & 0xFFFFFFFF
+      temp_1 = (temp_1 + b) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp = (temp + y) & 0xFFFFFFFF
+      y = temp & 0xFFFFFFFF
+      // y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
+
+      temp = (y << 4) & 0xFFFFFFFF
+      temp = (temp + c) & 0xFFFFFFFF
+      temp_1 = (y + sum) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp_1 = (y >>> 5) & 0xFFFFFFFF
+      temp_1 = (temp_1 + d) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp = (z + temp) & 0xFFFFFFFF
+      z = temp & 0xFFFFFFFF
+      //  z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+
+      n = n - 1
+    }
+
+    for (n = 0; n <= 3; n++) {
+      outb[n] = ((y >>> (n * 8)) & 255)
+      outb[n + 4] = ((z >>> (n * 8)) & 255)
+    }
+    return outb
+  }
+
+  DeCode () {
+    sub_DeCode(inb, 0, Key)
+  }
+
+  sub_DeCode (inb, pos, Key) {
+    var cnDelta, y, z, a, b, c, d
+    var outb = new Uint8Array(8)
+    var n, i, nlen
+    var sum
+    var temp, temp_1
+
+    var buf = new Array(16)
+    var temp_string
+
+    cnDelta = 2654435769
+    sum = 3337565984
+
+    nlen = Key.length
+    i = 0
+    for (n = 1; n <= nlen; n = n + 2) {
+      temp_ = Key.substring(n - 1, n - 1 + 2)
+      buf[i] = this.HexToInt(temp_string)
+      i = i + 1
+    }
+    a = 0; b = 0; c = 0; d = 0
+    for (n = 0; n <= 3; n++) {
+      a = (buf[n] << (n * 8)) | a
+      b = (buf[n + 4] << (n * 8)) | b
+      c = (buf[n + 4 + 4] << (n * 8)) | c
+      d = (buf[n + 4 + 4 + 4] << (n * 8)) | d
+    }
+
+    y = 0
+    z = 0
+    for (n = 0; n <= 3; n++) {
+      y = (inb[n + pos] << (n * 8)) | y
+      z = (inb[n + 4 + pos] << (n * 8)) | z
+    }
+
+    n = 32
+
+    while (n > 0) {
+      temp = (y << 4) & 0xFFFFFFFF
+      temp = (temp + c) & 0xFFFFFFFF
+      temp_1 = (y + sum) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp_1 = (y >>> 5) & 0xFFFFFFFF
+      temp_1 = (temp_1 + d) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp = (z - temp) & 0xFFFFFFFF
+      z = temp & 0xFFFFFFFF
+      //  z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
+
+      temp = (z << 4) & 0xFFFFFFFF
+      temp = (temp + a) & 0xFFFFFFFF
+      temp_1 = (z + sum) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp_1 = (z >>> 5) & 0xFFFFFFFF
+      temp_1 = (temp_1 + b) & 0xFFFFFFFF
+      temp = (temp ^ temp_1) & 0xFFFFFFFF
+      temp = (y - temp) & 0xFFFFFFFF
+      y = temp & 0xFFFFFFFF
+      // y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
+
+      sum = sum - cnDelta
+      n = n - 1
+    }
+
+    for (n = 0; n <= 3; n++) {
+      outb[n] = ((y >>> (n * 8)) & 255)
+      outb[n + 4] = ((z >>> (n * 8)) & 255)
+    }
+    return outb
+  }
+
+  MacthUKeyID (mDevices) {
+    if ((mDevices.vendorId == mSoftKey.VID && mDevices.productId == mSoftKey.PID) ||
+        (mDevices.vendorId == mSoftKey.VID_NEW && mDevices.productId == mSoftKey.PID_NEW) ||
+        (mDevices.vendorId == mSoftKey.VID_NEW_2 && mDevices.productId == mSoftKey.PID_NEW_2)) {
+      return true
+    }
+    return false
+  }
+
+  /// //////////////////
+  AddZero (InKey) {
+    var nlen
+    var n
+    nlen = InKey.length
+    for (n = nlen; n <= 7; n++) {
+      InKey = '0' + InKey
+    }
+    return InKey
+  }
+
+  myconvert (HKey, LKey) {
+    HKey = this.AddZero(HKey)
+    LKey = this.AddZero(LKey)
+    var out_data = new Uint8Array(8)
+    var n
+    for (n = 0; n <= 3; n++) {
+      out_data[n] = this.HexToInt(HKey.substring(n * 2, n * 2 + 2))
+    }
+    for (n = 0; n <= 3; n++) {
+      out_data[n + 4] = this.HexToInt(LKey.substring(n * 2, n * 2 + 2))
+    }
+    return out_data
+  }
+
+  /// /bin2hex  & hex2bin
+  ByteArrayToHexString (Inb, len) {
+    var outstring = ''
+    for (var n = 0; n <= len - 1; n++) {
+      outstring = outstring + this.myhex(Inb[n])
+    }
+    return outstring
+  }
+
+  HexStringToByteArray (InString) {
+    var nlen
+    var retutn_len
+    var n, i
+    var b
+    var temp
+    nlen = InString.length
+    if (nlen < 16) retutn_len = 16
+    retutn_len = nlen / 2
+    b = new Uint8Array(retutn_len)
+    i = 0
+    for (n = 0; n < nlen; n = n + 2) {
+      temp = InString.substring(n, n + 2)
+      b[i] = this.HexToInt(temp)
+      i = i + 1
+    }
+    return b
+  }
+  /// /////
+
+  // decimal to hex && hex2dec
+  myhex (value) {
+    if (value < 16) { return '0' + value.toString(16) }
+    return value.toString(16)
+  };
+
+  HexToInt (s) {
+    var hexch = '0123456789ABCDEF'
+    var i, j
+    var r, n, k
+    var ch
+    s = s.toUpperCase()
+
+    k = 1; r = 0
+    for (i = s.length; i > 0; i--) {
+      ch = s.substring(i - 1, i - 1 + 1)
+      n = 0
+      for (j = 0; j < 16; j++) {
+        if (ch == hexch.substring(j, j + 1)) {
+          n = j
+        }
+      }
+      r += (n * k)
+      k *= 16
+    }
+    return r
+  };
+  /// /////////////
+
+  /// //////////// send cmd only ,no carry data
+  SendNoWithData (CmdFlag) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    this.SendWithData(CmdFlag, array_in)
+    return this.lasterror
+  };
+  /// ////////////////////////
+  /* SendWithDataNoErr(CmdFlag,array_in,KeyPath) {
+
+    this.lasterror=0;
+    var featureReport = [2, 0];
+
+    featureReport[1] = CmdFlag;
+
+    for (var i = 1; i < array_in.length; i++) {
+        featureReport[i + 1] =array_in[i];
+    }
+    if(KeyPath==null)
+    {
+        this.lasterror= -92;
+        return array_out;
+    }
+    this.connection = new  HID.HID(KeyPath)
+    if(this.connection==null)
+    {
+        this.lasterror= -92;
+        return array_out;
+    }
+    var Outlen=this.connection.sendFeatureReport( featureReport);
+    if(Outlen<2) {this.connection.close();this.lasterror= ERR_SET_REPORT;return undefined;}
+    var array_out=this.connection.getFeatureReport(1,SM2_MAX_TRANSE_LEN) ;
+    this.connection.close();
+    if(array_out.length<1){this.lasterror=ERR_GET_REPORT; return undefined;}
+
+    return array_out;
+
+} */
+  /// ////////send cmd and data
+  SendWithDataNoErr (CmdFlag, array_in, KeyPath) {
+    this.lasterror = 0
+    var featureReport = [2]
+    for (var n = 1; n <= SM2_MAX_TRANSE_LEN + 1; n++) {
+      featureReport[n] = 0
+    }
+
+    featureReport[1] = CmdFlag
+
+    for (var i = 1; i < array_in.length; i++) {
+      featureReport[i + 1] = array_in[i]
+    }
+    if (KeyPath == null) {
+      this.lasterror = -92
+      return array_out
+    }
+    this.connection = new HID.HID(KeyPath)
+    if (this.connection == null) {
+      this.lasterror = -92
+      return array_out
+    }
+    var Outlen = this.connection.sendFeatureReport(featureReport)
+    if (Outlen < 2) { this.connection.close(); this.lasterror = ERR_SET_REPORT; return undefined }
+    var array_out = this.connection.getFeatureReport(1, 510)
+    this.connection.close()
+    if (array_out.length < 1) { this.lasterror = ERR_GET_REPORT; return undefined }
+
+    return array_out
+  }
+
+  SendWithData (CmdFlag, array_in, KeyPath) {
+    var array_out = this.SendWithDataNoErr(CmdFlag, array_in, KeyPath)
+
+    if (array_out[0] != 0) {
+      this.lasterror = array_out[0] - 256
+    } else {
+      this.lasterror = 0
+    }
+
+    return array_out
+  }
+  /// ////////////
+  GetOneByteDataFromUsbKey (cmd, KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var array_out
+    array_out = this.SendWithDataNoErr(cmd, array_in, KeyPath)
+    if (this.lasterror) return undefined
+    return array_out[0]
+  }
+  /// /////
+
+  FindPort (start) {
+    this.lasterror = 0
+    var KeyPath = ''
+    var count = 0
+    var devices = HID.devices()
+    devices.forEach(mDevice => {
+      if (this.MacthUKeyID(mDevice)) {
+        if (count == start) {
+          KeyPath = mDevice.path
+          return KeyPath
+        }
+        count++
+      }
+    })
+    if (KeyPath != '') {
+      this.lasterror = 0
+    } else {
+      this.lasterror = -92
+    }
+    return KeyPath
+  }
+
+  /// /////////////////////////////////////////////////////////////////////////////////
+
+  NT_GetIDVersionEx (KeyPath) {
+    return this.GetOneByteDataFromUsbKey(5, KeyPath)
+  };
+
+  NT_GetIDVersion (KeyPath) {
+    return this.GetOneByteDataFromUsbKey(1, KeyPath)
+  };
+  /// //
+
+  GetID (KeyPath) {
+    var IDInfo = {
+      ID_1: '',
+      ID_2: ''
+    }
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var array_out
+    var t1 = new Buffer.alloc(4)
+    var t2 = new Buffer.alloc(4)
+    array_out = this.SendWithDataNoErr(2, array_in, KeyPath)
+    if (this.lasterror != 0) { return '' }
+    t1[0] = array_out[0]; t1[1] = array_out[1]; t1[2] = array_out[2]; t1[3] = array_out[3]
+    t2[0] = array_out[4]; t2[1] = array_out[5]; t2[2] = array_out[6]; t2[3] = array_out[7]
+    IDInfo.ID_1 = t1.toString('hex')
+    IDInfo.ID_2 = t2.toString('hex')
+    return IDInfo
+  }
+
+  GetChipID (KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var array_out
+
+    var OutChipID = ''; var outb = new Uint8Array(ID_LEN)
+
+    array_out = this.SendWithDataNoErr(GET_CHIPID, array_in, KeyPath)
+    if (this.lasterror != 0) { return '' }
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail
+      return OutChipID
+    }
+
+    outb = array_out.slice(1, ID_LEN + 1)
+
+    OutChipID = this.ByteArrayToHexString(outb, 16)
+    OutChipID = OutChipID.toUpperCase()
+    return OutChipID
+  };
+  /// /////
+
+  /// //
+  FindPort_2 (start, in_data, verf_data) {
+    var n
+    var count = 0
+    var out_data = 0
+    for (n = 0; n < 256; n++) {
+      var KeyPath = this.FindPort(n)
+      if (this.lasterror != 0) return null
+      out_data = this.sWriteEx(in_data, KeyPath)
+      if (this.lasterror != 0) return null
+      if (out_data == verf_data) {
+        if (start == count) return KeyPath
+        count++
+      }
+    }
+    return null
+  };
+
+  SetWritePassword (W_HKey, W_LKey, new_HKey, new_LKey, KeyPath) {
+    var address
+    var ary1 = this.myconvert(W_HKey, W_LKey)
+    var ary2 = this.myconvert(new_HKey, new_LKey)
+    address = 504
+
+    this.lasterror = this.Sub_WriteByte(ary2, address, 8, ary1, 0, KeyPath)
+
+    return this.lasterror
+  }
+
+  SetReadPassword (W_HKey, W_LKey, new_HKey, new_LKey, KeyPath) {
+    var address
+    var ary1 = this.myconvert(W_HKey, W_LKey)
+    var ary2 = this.myconvert(new_HKey, new_LKey)
+    address = 496
+
+    this.lasterror = this.Sub_WriteByte(ary2, address, 8, ary1, 0, KeyPath)
+
+    return this.lasterror
+  }
+
+  NT_SetCal (cmd, indata, IsHi, pos, KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var n
+    array_in[1] = IsHi
+    for (n = 0; n < 8; n++) {
+      array_in[2 + n] = indata[n + pos]
+    }
+
+    var array_out = this.SendWithData(cmd, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      this.lasterror = -82
+    }
+    return this.lasterror
+  }
+
+  Sub_SetCal (cmd, Key, KeyPath) {
+    var KeyBuf = this.HexStringToByteArray(Key)
+    this.lasterror = this.NT_SetCal(cmd, KeyBuf, 0, 8, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    return this.NT_SetCal(cmd, KeyBuf, 1, 0, KeyPath)
+  }
+
+  SetCal_2 (Key, KeyPath) {
+    return this.Sub_SetCal(SET_TEAKEY, Key, KeyPath)
+  }
+
+  SetCal_New (Key, KeyPath) {
+    return this.Sub_SetCal(13, Key, KeyPath)
+  }
+
+  Sub_EncString (cmd, InString, KeyPath) {
+    var n; var m
+    var nlen
+
+    var b = Buffer.from(InString)
+    var zero_buf = Buffer.from([0])
+    b = Buffer.concat([b, zero_buf])
+    nlen = b.length
+    if (b.length < 8) {
+      nlen = 8
+    }
+
+    var outb = Buffer.alloc(nlen)
+    var inb = Buffer.alloc(nlen)
+    b.copy(inb)// ???????8?????0????????????????0
+    b.copy(outb)
+
+    for (n = 0; n <= (nlen - 8); n = n + 8) {
+      var tmpoutb = this.NT_Cal(cmd, inb, n, KeyPath)
+      for (m = 0; m < 8; m++) {
+        outb[m + n] = tmpoutb[m]
+      }
+      if (this.lasterror != 0) ''
+    }
+
+    return outb.toString('hex')
+  }
+
+  EncString (InString, KeyPath) {
+    return this.Sub_EncString(8, InString, KeyPath)
+  }
+
+  EncString_New (InString, KeyPath) {
+    return this.Sub_EncString(12, InString, KeyPath)
+  }
+
+  NT_Cal (cmd, InBuf, pos, KeyPath) {
+    var n
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var outbuf = new Uint8Array(8)
+    for (n = 1; n <= 8; n++) {
+      array_in[n] = InBuf[n - 1 + pos]
+    }
+    var array_out = this.SendWithDataNoErr(cmd, array_in, KeyPath)
+    if (this.lasterror != 0) return undefined
+    for (n = 0; n < 8; n++) {
+      outbuf[n + pos] = array_out[n]
+    }
+    if (array_out[8] != 0x55) {
+      this.lasterror = -20
+    }
+    return outbuf
+  }
+
+  Cal (Inbuf, KeyPath) {
+    return this.NT_Cal(8, Inbuf, 0, KeyPath)
+  }
+
+  Cal_New (Inbuf, KeyPath) {
+    return this.NT_Cal(12, Inbuf, 0, KeyPath)
+  }
+
+  SimpleCalData (cmd, in_data, KeyPath) {
+    var t1
+    var t2
+    var t3
+    var t4
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    array_in[1] = (in_data & 255)
+    array_in[2] = ((in_data >> 8) & 255)
+    array_in[3] = ((in_data >> 16) & 255)
+    array_in[4] = ((in_data >> 24) & 255)
+
+    var array_out
+    array_out = this.SendWithDataNoErr(cmd, array_in, KeyPath)
+    if (this.lasterror != 0) { return 0 }
+    t1 = array_out[0]
+    t2 = array_out[1]
+    t3 = array_out[2]
+    t4 = array_out[3]
+
+    return t1 | (t2 << 8) | (t3 << 16) | (t4 << 24)
+  }
+
+  sWriteEx (in_data, KeyPath) {
+    return this.SimpleCalData(0x03, in_data, KeyPath)
+  }
+
+  sWrite_2Ex (in_data, KeyPath) {
+    return this.SimpleCalData(0x04, in_data, KeyPath)
+  }
+
+  /// //////////////////
+  Sub_WriteByte (indata, address, nlen, password, pos, KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var addr_l
+    var addr_h
+    var n
+    if ((address + nlen - 1) > (MAX_LEN + 17) || (address < 0)) return -81
+    addr_h = (address >> 8) * 2
+    addr_l = address & 255
+
+    array_in[1] = addr_h
+    array_in[2] = addr_l
+    array_in[3] = nlen
+
+    for (n = 0; n <= 7; n++) {
+      array_in[4 + n] = password[n]
+    }
+    for (n = 0; n < nlen; n++) {
+      array_in[12 + n] = indata[n + pos]
+    }
+
+    var array_out = this.SendWithDataNoErr(0x13, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      this.lasterror = -82
+    }
+    return this.lasterror
+  }
+  /// ///////////
+
+  Sub_ReadByte (address, nlen, password, KeyPath) {
+    var outData = new Uint8Array(nlen)
+    var array_out
+    var ret
+    if (nlen > MAX_TRANSE_LEN) {
+      this.lasterror = ERR_OVER_SEC_MAX_LEN
+      return outData
+    }
+    if ((address + nlen > MAX_LEN)) {
+      this.lasterror == ERR_OVER_SEC_MAX_LEN
+      return outData
+    }
+
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var addr_l
+    var addr_h
+    var n
+
+    addr_h = (address >> 8) * 2
+    addr_l = address & 255
+
+    array_in[1] = addr_h
+    array_in[2] = addr_l
+    array_in[3] = nlen
+
+    for (n = 0; n <= 7; n++) {
+      array_in[4 + n] = password[n]
+    }
+
+    array_out = this.SendWithDataNoErr(0x12, array_in, KeyPath)
+    if (this.lasterror != 0) return undefined
+    if (array_out[0] != 0) {
+      this.lasterror = -82; return outData
+    }
+    for (n = 0; n < (nlen); n++) {
+      outData[n] = array_out[n + 1]
+    }
+    return outData
+  }
+
+  /// //////////////////////////
+  YWriteEx (indata, address, nlen, HKey, LKey, KeyPath) {
+    var ret = 0
+    var n, trashLen = 16
+
+    if ((address + nlen - 1 > MAX_LEN) || (address < 0)) return -81
+
+    trashLen = trashLen - 8
+
+    var password = this.myconvert(HKey, LKey)
+    var tmplen
+    var pos = 0
+    while (nlen > 0) {
+      if (nlen > trashLen) { tmplen = trashLen } else { tmplen = nlen }
+      this.lasterror = this.Sub_WriteByte(indata, address + pos, tmplen, password, pos, KeyPath)
+      if (this.lasterror != 0) { return this.lasterror }
+      nlen = nlen - trashLen
+      pos = pos + trashLen
+    }
+
+    return this.lasterror
+  }
+
+  /// ////////////////////////////
+  YWriteString (InString, Address, HKey, LKey, KeyPath) {
+    var Buf = Buffer.from(InString)
+    this.YWriteEx(Buf, Address, Buf.length, HKey, LKey, KeyPath)
+    if (this.lasterror < 0) return this.lasterror
+    return Buf.length
+  }
+
+  /// ////////////
+  YReadEx (address, nlen, HKey, LKey, KeyPath) {
+    var ret = 0
+    var password = new Uint8Array(8)
+    var n, trashLen = 16
+    var OutData = Buffer.alloc(0)
+    var tmp_OutData
+
+    if ((address + nlen - 1 > MAX_LEN) || (address < 0)) return (-81)
+
+    password = this.myconvert(HKey, LKey)
+    var tmplen
+    var pos = 0
+    while (nlen > 0) {
+      if (nlen > trashLen) { tmplen = trashLen } else { tmplen = nlen }
+      tmp_OutData = this.Sub_ReadByte(address + pos, tmplen, password, KeyPath)
+      if (this.lasterror != 0) { return OutData }
+      OutData = Buffer.concat([OutData, tmp_OutData])
+      nlen = nlen - trashLen
+      pos = pos + trashLen
+    }
+
+    return OutData
+  }
+  /// ///////////
+
+  YReadString (Address, nlen, HKey, LKey, KeyPath) {
+    var outData = this.YReadEx(Address, nlen, HKey, LKey, KeyPath)
+
+    return outData.toString()
+  }
+
+  /// ////////////////////////////////////////////////// other api
+  NT_ReSet (KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var array_out = this.SendWithDataNoErr(MYRESET, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      this.lasterror = -82
+    }
+    return this.lasterror
+  }
+
+  ReSet (KeyPath) {
+    this.lasterror = this.NT_ReSet(KeyPath)
+    return this.lasterror
+  }
+
+  y_setcal (indata, password, KeyPath) {
+    var n
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+
+    array_in[1] = 0
+    array_in[2] = 0
+    array_in[3] = 8
+    for (n = 0; n <= 7; n++) {
+      array_in[4 + n] = password[n]
+    }
+    for (n = 0; n < 8; n++) {
+      array_in[12 + n] = indata[n]
+    }
+    var array_out = this.SendWithDataNoErr(6, array_in, KeyPath)
+    if (this.lasterror) return this.lasterror
+    if (array_out[0] != 0) {
+      this.lasterror = -82
+    }
+    return this.lasterror
+  }
+
+  SetCal (HKey, LKey, new_HKey, new_LKey, KeyPath) {
+    var ary1 = this.myconvert(HKey, LKey)
+    var ary2 = this.myconvert(new_HKey, new_LKey)
+
+    this.lasterror = this.y_setcal(ary2, ary1, KeyPath)
+
+    return this.lasterror
+  }
+
+  NT_SetID (InBuf, KeyPath) {
+    var n
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    for (n = 1; n <= 8; n++) {
+      array_in[n] = InBuf[n - 2]
+    }
+    var array_out = this.SendWithDataNoErr(7, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      this.lasterror = -82
+    }
+    return this.lasterror
+  }
+
+  SetID (Seed, KeyPath) {
+    var KeyBuf = this.HexStringToByteArray(Seed)
+
+    return this.NT_SetID(KeyBuf, KeyPath)
+  }
+
+  GetProduceDate (KeyPath) {
+    var n
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var OutProduceDate = Buffer.alloc(8)
+    var array_out = this.SendWithDataNoErr(15, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    for (n = 0; n < 8; n++) {
+      OutProduceDate[n] = array_out[n]
+    }
+    return OutProduceDate.toString('hex')
+  }
+
+  SetHidOnly (IsHidOnly, KeyPath) {
+    return this.NT_SetHidOnly(IsHidOnly, KeyPath)
+  }
+  NT_SetHidOnly (IsHidOnly, KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+
+    if (IsHidOnly) array_in[1] = 0; else array_in[1] = 0xff
+    var array_out = this.SendWithDataNoErr(0x55, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      return -82
+    }
+    return 0
+  }
+
+  SetUReadOnly (KeyPath) {
+    return this.NT_SetUReadOnly(KeyPath)
+  }
+  NT_SetUReadOnly (KeyPath) {
+    var array_in = new Uint8Array(MAX_TRANSE_LEN)
+    var array_out = this.SendWithDataNoErr(0x56, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0) {
+      return -82
+    }
+    return 0
+  }
+
+  NT_Set_SM2_KeyPair (PriKey, PubKeyX, PubKeyY, sm2_UerName, KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    for (n = 0; n < ECC_MAXLEN; n++) {
+      array_in[1 + n + ECC_MAXLEN * 0] = PriKey[n]
+      array_in[1 + n + ECC_MAXLEN * 1] = PubKeyX[n]
+      array_in[1 + n + ECC_MAXLEN * 2] = PubKeyY[n]
+    }
+    for (n = 0; n < SM2_USENAME_LEN; n++) {
+      array_in[1 + n + ECC_MAXLEN * 3] = sm2_UerName[n]
+    }
+
+    var array_out = this.SendWithDataNoErr(0x32, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0x20) this.lasterror = USBStatusFail
+
+    return this.lasterror
+  }
+
+  NT_GenKeyPair (KeyPath) {
+    var KEYPAIR = {
+      PriKey: null,
+      PubKeyX: null,
+      PubKeyY: null
+    }
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    var array_out = this.SendWithDataNoErr(GEN_KEYPAIR, array_in, KeyPath)
+    if (this.lasterror != 0) return undefined
+    if (array_out[0] != 0x20) {
+      this.lasterror = FAILEDGENKEYPAIR; return undefined
+    }
+    KEYPAIR.PriKey = array_out.slice(1, 1 + ECC_MAXLEN)
+    KEYPAIR.PubKeyX = array_out.slice(1 + ECC_MAXLEN, ECC_MAXLEN * 2 + 1)
+    KEYPAIR.PubKeyY = array_out.slice(1 + ECC_MAXLEN * 2, ECC_MAXLEN * 3 + 1)
+    return KEYPAIR
+  }
+
+  NT_Get_SM2_PubKey (KeyPath) {
+    var SM2_PubKeyInfo = {
+      KGx: null,
+      KGy: null,
+      sm2_UerName: null
+    }
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    var array_out = this.SendWithDataNoErr(0x33, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail; return this.lasterror
+    }
+
+    SM2_PubKeyInfo.KGx = array_out.slice(1, 1 + ECC_MAXLEN * 1)
+    SM2_PubKeyInfo.KGy = array_out.slice(1 + ECC_MAXLEN * 1, 1 + ECC_MAXLEN * 2)
+
+    SM2_PubKeyInfo.sm2_UerName = array_out.slice(1 + ECC_MAXLEN * 2, 1 + ECC_MAXLEN * 2 + SM2_USENAME_LEN)
+
+    return SM2_PubKeyInfo
+  }
+
+  NT_Set_Pin (old_pin, new_pin, KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    var b_oldpin = Buffer.from(old_pin)
+    var b_newpin = Buffer.from(new_pin)
+    for (n = 0; n < PIN_LEN; n++) {
+      array_in[1 + PIN_LEN * 0 + n] = b_oldpin[n]
+      array_in[1 + PIN_LEN * 1 + n] = b_newpin[n]
+    }
+
+    var array_out = this.SendWithDataNoErr(SET_PIN, array_in, KeyPath)
+    if (this.lasterror != 0) return this.lasterror
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail; return this.lasterror
+    }
+    if (array_out[1] != 0x20) {
+      this.lasterror = FAILPINPWD
+    }
+    return this.lasterror
+  }
+
+  NT_SM2_Enc (inbuf, inlen, KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var outbuf = new Uint8Array(inlen + SM2_ADDBYTE)
+    var n = 0
+
+    array_in[1] = inlen
+    for (n = 0; n < inlen; n++) {
+      array_in[2 + n] = inbuf[n]
+    }
+    var array_out = this.SendWithDataNoErr(MYENC, array_in, KeyPath)
+    if (this.lasterror != 0) {
+      return outbuf
+    }
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail
+      return outbuf
+    }
+    if (array_out[1] == 0) {
+      this.lasterror = FAILENC
+      return outbuf
+    }
+
+    for (n = 0; n < (inlen + SM2_ADDBYTE); n++) {
+      outbuf[n] = array_out[2 + n]
+    }
+
+    return outbuf
+  }
+
+  NT_SM2_Dec (inbuf, inlen, pin, KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var outbuf = new Uint8Array(inlen - SM2_ADDBYTE)
+    var n = 0
+
+    var b_pin = Buffer.from(pin)
+    for (n = 0; n < PIN_LEN; n++) {
+      array_in[1 + PIN_LEN * 0 + n] = b_pin[n]
+    }
+    array_in[1 + PIN_LEN] = inlen
+    for (n = 0; n < inlen; n++) {
+      array_in[1 + PIN_LEN + 1 + n] = inbuf[n]
+    }
+    var array_out = this.SendWithDataNoErr(MYDEC, array_in, KeyPath)
+    if (this.lasterror != 0) {
+      return outbuf
+    }
+    if (array_out[2] != 0x20) {
+      this.lasterror = FAILPINPWD; return outbuf
+    }
+    if (array_out[1] == 0) {
+      this.lasterror = FAILENC; return outbuf
+    }
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail; return outbuf
+    }
+    for (n = 0; n < (inlen - SM2_ADDBYTE); n++) {
+      outbuf[n] = array_out[3 + n]
+    }
+
+    return outbuf
+  }
+
+  sub_NT_Sign (cmd, inbuf, pin, KeyPath) {
+    var outbuf = new Uint8Array(ECC_MAXLEN * 2)
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    var b_pin = Buffer.from(pin)
+    for (n = 0; n < PIN_LEN; n++) {
+      array_in[1 + PIN_LEN * 0 + n] = b_pin[n]
+    }
+    for (n = 0; n < 32; n++) {
+      array_in[1 + PIN_LEN + n] = inbuf[n]
+    }
+    var array_out = this.SendWithDataNoErr(cmd, array_in, KeyPath)
+    if (this.lasterror != 0) {
+      return outbuf
+    }
+    if (array_out[1] != 0x20) {
+      this.lasterror = FAILPINPWD
+      return outbuf
+    }
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail
+      return outbuf
+    }
+    for (n = 0; n < ECC_MAXLEN * 2; n++) {
+      outbuf[n] = array_out[2 + n]
+    }
+
+    return outbuf
+  }
+
+  NT_Sign (inbuf, pin, KeyPath) {
+    return this.sub_NT_Sign(0x51, inbuf, pin, KeyPath)
+  }
+
+  NT_Sign_2 (inbuf, pin, KeyPath) {
+    return this.sub_NT_Sign(0x53, inbuf, pin, KeyPath)
+  }
+
+  NT_Verfiy (inbuf, InSignBuf, KeyPath) {
+    var array_in = new Uint8Array(SM2_MAX_TRANSE_LEN)
+    var n = 0
+
+    for (n = 0; n < ECC_MAXLEN; n++) {
+      array_in[1 + n] = inbuf[n]
+    }
+    for (n = 0; n < ECC_MAXLEN * 2; n++) {
+      array_in[1 + ECC_MAXLEN + n] = InSignBuf[n]
+    }
+    var array_out = this.SendWithDataNoErr(YTVERIFY, array_in, KeyPath)
+    if (this.lasterror != 0) return false
+    var outbiao = (array_out[1] != 0)
+    if (array_out[0] != 0x20) {
+      this.lasterror = USBStatusFail; return false
+    }
+
+    return outbiao
+  }
+
+  YT_GenKeyPair (KeyPath) {
+    var n
+    var KeyPairInfo = {
+      PriKey: '',
+      PubKeyX: '',
+      PubKeyY: ''
+    }
+    var KEYPAIR = this.NT_GenKeyPair(KeyPath)
+    if (this.lasterror) return KeyPairInfo
+    KeyPairInfo.PriKey = this.ByteArrayToHexString(KEYPAIR.PriKey, ECC_MAXLEN)
+    KeyPairInfo.PubKeyX = this.ByteArrayToHexString(KEYPAIR.PubKeyX, ECC_MAXLEN)
+    KeyPairInfo.PubKeyY = this.ByteArrayToHexString(KEYPAIR.PubKeyY, ECC_MAXLEN)
+
+    return KeyPairInfo
+  }
+
+  Set_SM2_KeyPair (PriKey, PubKeyX, PubKeyY, SM2_UserName, KeyPath) {
+    var b_PriKey = this.HexStringToByteArray(PriKey)
+    var b_PubKeyX = this.HexStringToByteArray(PubKeyX)
+    var b_PubKeyY = this.HexStringToByteArray(PubKeyY)
+
+    var b_SM2UserName = Buffer.from(SM2_UserName)
+
+    return this.NT_Set_SM2_KeyPair(b_PriKey, b_PubKeyX, b_PubKeyY, b_SM2UserName, KeyPath)
+  }
+
+  Get_SM2_PubKey (KeyPath) {
+    var PubKeyInfo = {
+      PubKeyX: '',
+      PubKeyY: '',
+      sm2UserName: ''
+    }
+
+    var SM2_PubKeyInfo = this.NT_Get_SM2_PubKey(KeyPath)
+
+    PubKeyInfo.PubKeyX = this.ByteArrayToHexString(SM2_PubKeyInfo.KGx, ECC_MAXLEN)
+    PubKeyInfo.PubKeyY = this.ByteArrayToHexString(SM2_PubKeyInfo.KGy, ECC_MAXLEN)
+    PubKeyInfo.sm2UserName = new Buffer(SM2_PubKeyInfo.sm2_UerName).toString()
+    return PubKeyInfo
+  }
+
+  SM2_EncBuf (InBuf, inlen, KeyPath) {
+    var n, temp_inlen, incount = 0, outcount = 0
+    var temp_InBuf = new Uint8Array(MAX_ENCLEN + SM2_ADDBYTE)
+    var OutBuf = Buffer.alloc(0)
+    // InBuf.copy(OutBuf);
+    while (inlen > 0) {
+      if (inlen > MAX_ENCLEN) { temp_inlen = MAX_ENCLEN } else { temp_inlen = inlen }
+      for (n = 0; n < temp_inlen; n++) {
+        temp_InBuf[n] = InBuf[incount + n]
+      }
+      var temp_OutBuf = this.NT_SM2_Enc(temp_InBuf, temp_inlen, KeyPath)
+      if (this.lasterror) return OutBuf
+      OutBuf = Buffer.concat([OutBuf, temp_OutBuf])
+      inlen = inlen - MAX_ENCLEN
+      incount = incount + MAX_ENCLEN
+      outcount = outcount + MAX_DECLEN
+    }
+
+    return OutBuf
+  }
+
+  SM2_DecBuf (InBuf, inlen, pin, KeyPath) {
+    var temp_inlen, n, incount = 0, outcount = 0
+    var temp_InBuf = new Uint8Array(MAX_ENCLEN + SM2_ADDBYTE)
+    var OutBuf = Buffer.alloc(InBuf.length)
+    // var b=new Buffer(InBuf)
+    // b.copy(OutBuf);
+    var OutBuf = Buffer.alloc(0)
+    while (inlen > 0) {
+      if (inlen > MAX_DECLEN) { temp_inlen = MAX_DECLEN } else { temp_inlen = inlen }
+      for (n = 0; n < temp_inlen; n++) {
+        temp_InBuf[n] = InBuf[incount + n]
+      }
+      var temp_OutBuf = this.NT_SM2_Dec(InBuf, temp_inlen, pin, KeyPath)
+      if (this.lasterror) return OutBuf
+      OutBuf = Buffer.concat([OutBuf, temp_OutBuf])
+      inlen = inlen - MAX_DECLEN
+      incount = incount + MAX_DECLEN
+      outcount = outcount + MAX_ENCLEN
+    }
+    return OutBuf
+  }
+
+  SM2_EncString (InString, KeyPath) {
+    var InBuf = Buffer.from(InString)
+    var OutBuf = this.SM2_EncBuf(InBuf, InBuf.length, KeyPath)
+    if (this.lasterror) return OutBuf
+    return this.ByteArrayToHexString(OutBuf, OutBuf.length)
+  }
+
+  SM2_DecString (InString, pin, KeyPath) {
+    var InBuf = this.HexStringToByteArray(InString)
+
+    var OutBuf = this.SM2_DecBuf(InBuf, InBuf.length, pin, KeyPath)
+
+    return OutBuf.toString()
+  }
+
+  YtSetPin (old_pin, new_pin, KeyPath) {
+    return this.NT_Set_Pin(old_pin, new_pin, KeyPath)
+  }
+
+  Sub_YtSign (cmd, msg, pin, KeyPath) {
+    var OutSign
+
+    var MsgHashValue = sm3(msg)
+    var Inbuf = new Buffer.from(MsgHashValue, 'hex')
+    var OutBuf = this.sub_NT_Sign(cmd, Inbuf, pin, KeyPath)
+    if (this.lasterror != 0) return OutSign
+    OutSign = new Buffer(OutBuf).toString('hex')
+    return OutSign
+  }
+
+  YtSign (msg, pin, KeyPath) {
+    return this.Sub_YtSign(0x51, msg, pin, KeyPath)
+  }
+
+  YtSign_2 (msg, pin, KeyPath) {
+    return this.Sub_YtSign(0x53, msg, pin, KeyPath)
+  }
+
+  CheckKeyByFindort_2 () {
+    // ??????????????????????
+    var DevicePath = '' // ??????????????��??
+    DevicePath = this.FindPort_2(0, 1, -909931691)
+    return this.lasterror
+  }
+
+  // ??????????????????????��???????
+  ReadStringEx (addr, DevicePath) {
+    var nlen
+    // ?????0??????��????????????
+    var OutData = this.YReadEx(addr, 1, '6398277A', '8388014E', DevicePath)
+    if (this.lasterror != 0) return ''
+    nlen = OutData[0]
+    // ?????????????????
+    return this.YReadString(addr + 1, nlen, '6398277A', '8388014E', DevicePath)
+  }
+  // ??????????????????????????????????????????
+  CheckKeyByReadEprom () {
+    var n, ret
+
+    // @NoUseCode_data return 1;//???????????????????????1
+    for (n = 0; n < 255; n++) {
+      var DevicePath = this.FindPort(n)// ??????????????��??
+      if (this.lasterror != 0) return this.lasterror
+      var outString = this.ReadStringEx(0, DevicePath)
+      if ((this.lasterror == 0) && (outString == 'FM1XhyDQ5z0DIISIhvu6uwTP8uBUxtnK')) return 0
+    }
+    return -92
+  }
+  // ????????????????????????????????��????????
+  CheckKeyByEncstring () {
+    // ???????????????????????????????????????????????????????????????????????��??
+
+    var n, ret
+
+    var InString
+
+    // @NoUseKeyEx return 1;//???????????????????????1
+    var number1 = Math.floor(Math.random() * 65535)
+    var number2 = Math.floor(Math.random() * 65535)
+
+    InString = number1.toString() + number2.toString()
+
+    for (n = 0; n < 255; n++) {
+      var DevicePath = this.FindPort(n)// ??????????????��??
+      if (this.lasterror != 0) return this.lasterror
+      if (this.Sub_CheckKeyByEncString(InString, DevicePath) == 0) return 0
+    }
+    return -92
+  }
+
+  Sub_CheckKeyByEncString (InString, DevicePath) {
+    // ???????????????????��???
+
+    var outString = this.EncString(InString, DevicePath)
+    if (this.lasterror != 0) return this.lasterror
+    var outString_2 = this.StrEnc(InString, '4326BBDEB43352C31FED71B466A0E879')
+    if (outString_2.toUpperCase() == outString.toUpperCase())// ???????????
+    {
+      return 0
+    }
+
+    return -92
+  }
+
+  // ??????????????????????????????????��??????????
+  CheckKeyByEncstring_New () {
+    var n, ret
+    var myrnd = Math.floor(Math.random() * 500)
+    var EncInString = ['3464', '523', '19087', '14042', '30839', '6180', '9099', '31244', '25703', '21437', '4745', '26555', '2913', '11960', '12769', '6362', '27278', '22933', '30735', '4601', '15419', '19833', '428', '25929', '4559', '32292', '31602', '29855', '3542', '11258',
+      '11323', '21356', '15864', '22010', '7938', '18625', '5377', '19400', '27871', '29008', '1242', '24486', '9998', '366', '14476', '14453', '24807', '9992', '28227', '17336', '23014', '2996', '29000', '18321', '18340', '30370', '13317', '5314', '16347', '3749',
+      '2565', '22699', '16997', '15406', '497', '3921', '25404', '11089', '24465', '5461', '5243', '28093', '13780', '23031', '4187', '15559', '8384', '12572', '25397', '23390', '8064', '17732', '5509', '6168', '3678', '10641', '30179', '28450', '16580', '3015',
+      '780', '19538', '15164', '1606', '30166', '27929', '3441', '4624', '27455', '25224', '19499', '6345', '11871', '13138', '11094', '9904', '8815', '7625', '14331', '15530', '19659', '31197', '12868', '16951', '32491', '15139', '1915', '6010', '8300', '4812',
+      '27658', '18228', '6405', '12712', '5500', '22727', '23184', '10796', '5241', '16951', '2826', '29287', '20172', '31268', '20106', '1551', '6496', '10705', '12620', '10354', '29246', '32543', '12713', '18052', '23184', '7826', '27162', '30934', '20640', '13641',
+      '23355', '9628', '27096', '11017', '21957', '17062', '3267', '29745', '1171', '14182', '19209', '967', '5789', '24303', '23413', '23912', '2303', '10739', '13298', '18266', '4337', '24771', '17289', '7294', '9679', '1363', '19556', '15957', '11025', '21810',
+      '24013', '9986', '14931', '27540', '28206', '6982', '3406', '844', '5394', '31875', '2013', '22728', '25889', '15037', '25079', '11295', '26151', '26260', '29114', '25343', '12045', '25419', '5470', '19133', '8157', '14532', '15676', '31304', '15297', '1408',
+      '5584', '21557', '8963', '4258', '20915', '10421', '11533', '31722', '5023', '30616', '8809', '5566', '30830', '21075', '5826', '19228', '16666', '24054', '25312', '14761', '7358', '30004', '16047', '24996', '4755', '27230', '31543', '30705', '3058', '26983',
+      '23717', '22547', '32342', '31201', '5184', '5674', '13659', '8446', '23155', '12536', '15544', '9103', '10441', '25568', '27208', '26629', '5098', '6372', '2054', '30837', '17826', '31396', '7690', '9361', '5850', '9830', '23695', '17320', '18843', '32263',
+      '9712', '5806', '25361', '6670', '14502', '18997', '9605', '23449', '31050', '6254', '10850', '7789', '23704', '2860', '7216', '2794', '29033', '24032', '4251', '2067', '2744', '32669', '619', '19849', '2462', '13589', '27531', '5519', '18260', '23193',
+      '32518', '28422', '7990', '17949', '774', '12145', '6333', '18736', '19154', '1266', '12674', '21254', '20696', '10314', '18241', '12914', '28831', '11996', '8660', '30690', '16595', '31913', '7475', '30573', '3389', '22101', '29561', '27329', '28870', '4896',
+      '9953', '13107', '3962', '28396', '3012', '15283', '28801', '31804', '29339', '31443', '30759', '13874', '29186', '5319', '471', '12943', '20658', '7519', '6679', '29622', '3974', '31245', '22675', '23208', '4982', '25572', '23061', '14601', '28573', '2455',
+      '23176', '793', '20277', '20853', '28405', '8634', '32665', '15218', '24454', '25711', '6722', '25375', '8581', '4954', '20170', '8624', '29020', '8508', '19691', '20468', '3222', '32120', '20095', '10336', '3036', '1552', '16768', '18692', '23799', '6565',
+      '4617', '21907', '23762', '18810', '5203', '14686', '4473', '11120', '3767', '2393', '1043', '19466', '25521', '1555', '15083', '16490', '23514', '15808', '21355', '22609', '4076', '20018', '15389', '28706', '29377', '18139', '3756', '25310', '31571', '10956',
+      '2529', '7209', '28348', '4792', '11173', '19011', '18999', '28400', '27395', '12302', '19741', '26983', '4647', '5902', '8936', '26542', '14424', '24930', '11570', '11513', '23553', '15310', '28084', '7192', '7341', '28596', '4171', '6525', '5380', '21782',
+      '5358', '3388', '21713', '25749', '6585', '1285', '31487', '26995', '17636', '30249', '28567', '21396', '20171', '8094', '15811', '10616', '11239', '3058', '3534', '6722', '22225', '13145', '16159', '12211', '14917', '15781', '8772', '8239', '15133', '25671',
+      '21220', '16565', '25169', '29778', '12747', '5865', '9980', '28792', '32481', '2829', '22617', '21259', '4915', '14850', '10177', '28668', '15079', '26443', '21165', '30429' ]
+    var EncOutString = [ '9109AF1823AC1B2E', '8FF16FAD925B3F01', '0F891E813D230312', '257E088892733D04', 'FA9922B0A1360B55', 'B33DC34B81BF0017', '6EA56A939D566A16', 'B6B162FF1539EBB0', 'A5BA1E6EC1EBA566', '672E13C6688B11D3', 'F8AF5D4DF00176EC', '4307A9A17B8EB534', '0A6B1CE1505C9C3B', '36BCBB60DF4CFA34', 'E244F1EB013BB416', '42779C67BAAF1BB8', 'A6D11367F6C30D8B', 'FED1AAFFB2962B9C', '36106445DC6D995B', '9E6F5DAC8D2D0815', '63EF28166C337645', '8138CA0B6675D476', 'CFA083CF7498FD0D', '9EC8D85B8F67042E', '34E4058C84993C80', '001A5F5230FF7A5A', 'FDDEAFB2790EED2E', '3F61E125F5946565', 'DFA6772958457B8E', '557F68AF936EEB8D',
+      '0590AF328DBB842B', '11B7488F86A4A4EC', '9F70C5CA4216ADA2', '867920BB3489258A', 'B945A47F59BBBC21', '435E1AF8D13ADE16', '97593D5A962EF62A', '941499AC5C618F51', '305C73D522685F28', '50C3414075DD8DE3', 'ABC42C7BF1A72242', '68517095358C6BEC', '3C6D3EDEECC9ACB5', '4BD9A9EAEBA22305', '3A6D25CF7409F7D5', '30519449D9EE1174', 'D7A6B461F4814AC3', 'D0DEC28879A715FB', '14C1FE8C5D8367EA', '6FED8696332CC371', '22A6E4861BACDD11', 'F16C8F46F302073B', 'D4851145AA118AF6', '675EB5D4249B6998', 'DF28039FD617F567', '195DBF181C213583', '71E2EEA862F68E98', '17F603A8852C5E19', 'D71F94BE53748C69', '24E7ABD2DD834F71',
+      'E7AEDC577C43F04C', 'FA2B7886075BA9C3', '12BAEA8F2E75C36A', '12D730FDB8A63F23', '0ADC5A1B05B36C1A', '81E2C39C49BA395E', '72A12EFF93FE7659', '55378A6AF863AA37', '976CB44922D4CF4D', 'A5F287AED3434A46', 'FF2217A567B5C5FA', '695DF1B2FBEF7207', 'B93DFD16D17CD63F', '4A77B25EFC8D1418', '7E6BB6B266340F5E', '0B01D2FF27B44FA2', 'D46900702E397CF2', 'AF2F8562DA76DCDE', '6FC76138432E9AAE', '860BCDD8F8E596D6', '1F108E52BB9E8738', '97D9FEF60E79309C', '789E6E77CB2579B8', 'DBF4BEF4EECA4723', '4A708F83B5123736', '41CBEBC704E7EBEC', '5CC832301C175AAC', '78E1DDFB8023B4BB', '7065341838BF606C', 'D9A8A20000B8DAA9',
+      'A6DBD8B98698EEC9', '3CF88FDF56B45C1F', 'E30978D817904E68', 'DCAC124DFBD35CEC', '902FAA95DB1D3270', '230A65A7A496ACA4', '7385F440092E372B', '90CBACE316035F8E', '50994BC4299EC6DC', '8424F2E73F604057', 'D80B988E03F04780', '62CE1BF4DC365EF1', 'C9908B62E3F085CE', '88873BBEF73BF30E', '8CBBC7503A8BFD34', 'A3799B33291B5B3C', '33C12E0095A3E770', 'E5678E0752C8DA10', '6362445CAD3E6D1A', 'F5F318F5C2A14231', '1820A3639E460A1A', '4AAC5FF2533EFE2E', '1BB9B116834D5527', '08C26B9170FB25F1', '05E13D9D171391A9', 'E01788AA0E8AC92C', '2D9707C3F6867450', 'ABA34ED5057E611F', '8D3A5C823544FC25', 'C4BD6150F95C6512',
+      'C63B7CEE613CA5EA', '1F82AD8E1BF14ED0', '5AAA170F91EA6595', 'EBC54EB3571DBB16', '21B9585E4C75BE63', '33A1245417514454', '0182B1F20FDB2D8C', '7F2F3CF43867D1F5', 'AF8D318040A2AD86', '08C26B9170FB25F1', '91427B9C522CA50E', '0229CBC450CC1C14', 'B2637DA1062357E5', '806D8DE027B9B401', '1D610CA06FE2C0C2', 'C913AF1C90ACC767', '23CF7623D399C55F', '428DC5DD541F507A', '9A3A3CD81A9B0CE5', '748848D61E21A1EB', '712B25D2AD1E170E', '3AA776043C539267', '71836383483B168A', '1345707DCFCF0AEB', '0182B1F20FDB2D8C', '2FF3851CCCE70D40', '37CEE8E6EDAA088E', 'F9BF0824EF9887D7', '015461758A8F9B19', '2089DCA339260CEB',
+      '16131BBA8F123952', 'B906CF8635082E48', '238295F5A5D3499C', '1B2ACEFE1FBBCF30', 'C358E6A0BEF7B9AC', 'D20F3C7E6A4B2675', 'C272F71ADCA93FC1', '33D02C5A3CD909C4', '22147AAA0732FD4C', '93148F917AA3F697', '9E1C2EA52DC38C61', '39A2ED0E45BE86E2', 'F4AA970F93A70193', 'CC06EF42AB185316', '10B7AB3F48E0AA1B', 'BC1CE46DBE02E955', '3A76C0563C36E14D', '25BABDA75CDE95B0', '246FE5E85FC1604A', '2D78FB9DE70DA314', 'F2CA9C3BF0B8B776', '8553F4097A1D2BED', 'F1AC0344EB0F6F9B', '77DF640C0549A36D', '9F06A95158595BF0', '5D410787B63B00D5', '926E7577FD4971B9', '2781534EE8C7B2F0', '37043E43B7F1AF10', '5F8D68B53BBE3472',
+      '44FE191ECD2AC685', '455C5BA1D0E02EBE', 'C4F22B60EA5E5661', '2F66D8DEC556674F', 'EEACADB2B2E99886', '41E222611A10A18D', '86F6F28BE8ED55D4', 'BFDB93998246EAE9', '52FF950729722F03', '6C4BE5362B6BB35B', 'A91A8F0CAF84B84F', '661374EE955A0C31', '8720006A408F1E45', 'D360E64C21DFB154', '2F14CE39829C87A9', '13F31E2E54FAAA83', '6E29AE456BB428E4', '09320C7F72E5BF59', 'B8421A351C21BC82', 'AA2F338A4DC6EB0A', 'DC4E96D7F1D55AE3', '75F7D4C5FA53605D', 'C4DBB8907A8FEEB7', '619AE245350826EC', 'BC804ABAED584712', '8E35C2E23EDA5BDB', '709021194FEDDF28', 'B265C50C1F8BE10E', '4C1E7C9AE97848F8', 'E28DC8C07390F122',
+      '7FB8992410306291', '745302008FEE1B4E', '4CCD11CDC3AEFE86', '2F61235EF81060F1', 'DC1BE3414B698270', '8057C8D2C0709945', '3AA6F9D326EA98AA', '68D7F76DE46DC061', 'E35A68AA39E19A9D', '132DAA287820ABE9', '6401924840708E05', 'D008DB76D6147877', '5DFF0592EC2BE440', '7618F774869E3859', 'E1732890E482FFCE', '8ED4B800220FC19D', '781E3959A0BB7C8C', '310095EA9D11840D', '5DD63DB90BDA3E1D', 'A631075E70DCCAAE', 'E587616F17D3588D', '66980CDA7A1F7586', '9131FDCAB4518A05', 'F67835137BA612B1', '7E11329982E76B64', 'DD5135143797EC59', '5DA154ECC59C397C', '367C28F8986C6445', '82158F47205BA3CB', 'CC7A432B9DDC131D',
+      'EDB58268D9C6C1E8', 'B5CF7B85B7A1CFA4', '54AF5C48EC8FE006', '2B47818C7B252A8C', '0931D257398A1836', 'CE126263E38D4310', '347CC924E131C7CC', '1C2EAD3FAA1E0A2E', 'F7572A6C6A625169', '2CA98893790E5BC9', 'C5AC8D426914C6DB', 'F25C688CB9DA6239', '80FEF695B1985711', 'A02FEBCF76F3C930', 'DA28075647864781', 'D2182A6F7F569F21', '7D95E2FFE847EB3A', '15BD219DC43EE2D3', '09F70979C0283C75', '433F658ED7332461', 'F37B73D266809E10', 'E68AF5E9CDC97275', '4CF08D24A01D6E5C', 'A318B464B807074C', '444EA572CDE886AB', '00BEF4620A2049EA', '4AF48665C2AD05BE', 'F4A084DA44647B86', '3C447473854F4F07', '3E2ECDAC57863C40',
+      '366CB6DA2945E888', 'E6C81E67611B394C', '516FA7AC61430E65', 'F6CCBF83F092772D', 'FAE6D63DCEDC7424', '4B29E8C16AFFD465', 'B49EE159212A8CD4', '395AA8CAF344444D', 'FD20B9EA744B67C2', '665D69A50A2312FD', '6964D3398A466895', '3EFC7384869C1A15', '677B184F9126CC24', '41C20BC7A73D751D', '52570795B4CE4100', '07F300B70799185F', '6CF45C252C756C4F', '318B78FAE5AEC7B4', '8A80AD140399DFB1', 'A9EFBF416F03A688', 'D4EF919C0A63A0D9', '20170DC07738F8EE', '622305DD424115B2', 'EC6A80BB7DC7DC76', '20C161340675924F', '97DF542ADB1EE36A', 'F2651FFA2E98C945', '25099BC221CD55DC', 'DFBEB6ED6F47A4F6', 'BED58AA37233B61B',
+      '471A0C433AE6E3F5', '809EB6B2652403B8', '06FDD21E1A34AE95', 'FE900FE205DB6804', 'CB17AE9595BB0CAF', 'D79CED999BAB308D', '6C206895EC5FB2AE', 'C1EBEEC719DCA782', '27A89EEE892525DC', '7FC9EF897AF53946', '65924B77A261D8D5', '4287581DFB54553A', '080CB3BC0CC73FE0', '4EF883D8B8E890F7', '8AAB9E45BE6F2A8B', '2A967F887CF6B932', '183B7F2F806C7A08', '497766D7E43FBC90', 'ACF6CEF60D067F31', '60C945085AD30388', '6839CE42FEF1D8EC', 'E6DDAAC68E266B43', '5345A0878CAB40D6', '838E2D23F4A689F4', '52A3F0B4E326DE1C', '12B9EDAC4DB689E9', 'DE70F460116E12EB', '0DA823A7232CAEEF', '8FEB9A481FDA0F6C', 'D3B91004CC7547A0',
+      '42886EA50E47AE4A', '350FB8D722C9253E', '72771743F76AFF85', '0B86E907E32820F0', '9471F81DE765BD0E', '20C9683E86618129', '6BDE6248C521A55D', '0C0BE96C6C68CC70', '2719F87B104B5374', '74CC2CAF52F6603D', '8BCCD192DABFA0AC', '93D60806FEDEC822', '7D53A5BFACFDD15E', 'CC2D855B5AE06856', 'F1E8124583D6CE0D', '84AE3B11BEA8FAAF', 'A51FB879A36DE970', '3CCFC90915D701B7', '6E29EB5554007F0D', 'DF4FAF51894CC584', 'ED31043EA5573B80', 'CC342292E3E483BB', '1B14F0ECCF1CBFFD', 'CE13596F6A4663CB', '6D6331DAE4542041', '8670DF086AADBC0B', '4E91335D3E709D9F', '422C0A5604DD0902', '98BBE7F47CDD5B60', '30B911E6D60DAC7E',
+      'D590AF64FFCE67AB', '55A4ABBA6654A329', 'B8D48F2A6EB51854', 'E993F6CA6392FE1D', '6443EF045C53DFD9', '9D7952BCA9E663F0', '5A1F24E4877BAFB7', '91425ACD75BD5471', '14BBA0F6D5289D6E', '936FD61582B9659F', '1703786B5945840C', 'E48F8102B13B5120', '80662E3785BB16D8', '76FE236AE34CDE51', 'FA1E6E2B2BB5FA30', '56C3431E8B460660', '99F5112AD55DD450', '1374AD80CD3BE628', 'AE11E4275FC6B16E', 'BEAAEB8471DB6B5A', '4D7B7F69F0918D14', '87E2AED61D6BDD95', '231D016B6C446987', 'D03ADDCF8449F653', 'BE861C24231A29AA', '894942FBD77332AD', '1A0C03E662EE8CEE', '53872FE34867AC3A', '1BCC1737F5030D08', 'F6A1D639EF409699',
+      'AF6F6866911F77B5', '3420F592EBA5CEE0', '4D186DF8111520F6', '1D24B43879130953', 'CE6495E67CE887F4', 'F198EFEB33654EF0', '8A08112132477BE5', '87537FB5B16B6970', '7C0470752CEF0104', 'C2B6417168D77CC7', '64628F5DD2066BCF', 'E9756AAD11124B51', 'C385EFC79BB2D2DB', '83CCE9AE3B4AACFA', '45D954E5C89FB04B', 'C4EA3C2FFDB75969', '3CE04C80B2603484', '14C8E18205C77E83', 'E6BF69428438246C', 'F9A51079E3839423', 'FF601291926770B2', '382915FD6974687D', '0B436D1FF525897C', '33FEC0C69A6B521C', '3F0383147954B970', '82158DC00B34B64B', '1B2913C253E9A7A0', '087E2ED4E6C68EB3', '069F387B79486C16', '908B1EC06F4DAFD8',
+      'E66FD6C356D37025', 'A3AFB73F065DA381', '45A0A98E6B43DCDF', '7FD74197CAB0ED1C', '920674678A535DC7', '386A97F23FE00DFF', '073591D56E5FB97D', '11FCA1ABE7503115', '3CC18C351D2F3D3B', 'AB5ED67F4B81A024', 'A1B370E17B570EC5', 'CC7A432B9DDC131D', '0B28343ED5F86A9A', 'C35ABF268FCB08A3', '3D16F2A00A88B45F', '08152E9185236708', 'ECA008BBF999C9DE', 'BB549502AB2C1AFB', '2E185A6F70FC104E', '5530B9A31955ED8B', 'B8F8AD2DBF1226F3', '0B74BB443E791846', 'E7EAEB7775C6FF9D', '38CD5BEB83A10949', '9F989C60B6045FEE', 'F63DF45127E2FA23', '3F0C6A7DFF63AB34', '36CA7DB96600D6BE', 'BCAA6B147AF2621E', 'CB84E662169BA0DF',
+      '497F4B224093229D', '37D4B24EE7FF28E7', '8B517D62554774A6', 'E34FE5AEFA4D798D', '85F99642BD9F2505', '1F6EE5A34C6DC5FA', 'D152E21A5E58BA94', '9CA1D6BC180201E4', '3D1D610BF080F355', '9D540F4B1ADF16B2', '413F0CF75960608C', '97689572FF8AE161', '30B287B328525255', '7B396A12DAB2E67C', '3B7867F3C16FF33E', 'A956BC99B4126A43', 'A8CE493ABCF95C02', '82158F47205BA3CB', 'F4BC1993A777E62C', '1703786B5945840C', 'D005228533E6F5EA', 'E4A42CC57A571F44', 'C4E95924BF7F82B3', '80EF3AE803D178DC', 'D8C405F6759361D1', '80B5ECCF06E95383', '6DBD8FC81E4BEB6A', 'AC305B5880061E5E', '54659114A08EE52B', 'FC1285CA30E06B24',
+      '5FCA2A8523983788', '09AD2AD3630656D9', 'BFAF8BE5DFDC6C53', '06BE62AEBB8EC40E', 'B0E68E7A21762CEE', '6CC82CFBBDDD7AB6', '30CC28851C745E19', '901A7611BB5D9F44', 'D76E0E705F830FFA', '0F13602C99462F16', '43B72D9F1963D646', '9FB0769CCB26AE45', '9B12999075597D2F', 'C62395CF5A3FFAEF', '6C9C943CC52D8325', 'F5B48F8384BCA968', '4314CCE0E9F230E6', '0368A40BDA81480A', '3DEC51FD2C223A7E', '71989114D1B74DC7' ]
+    // @NoUseNewKeyEx return 1;//???????????????????????1
+    // @NoSupNewKeyEx  return 2;//???????????????????????2
+
+    var mEncInString = EncInString[myrnd]
+    var mEncOutString = EncOutString[myrnd]
+    for (n = 0; n < 255; n++) {
+      var DevicePath = this.FindPort(n)// ??????????????��??
+      if (this.lasterror != 0) return this.lasterror
+
+      var outString = this.EncString_New(mEncInString, DevicePath)
+      if ((this.lasterror == 0) && (outString.toUpperCase() == mEncOutString.toUpperCase())) return 0
+    }
+    return -92
+  }
+}
+
+// vid,pid
+mSoftKey.VID = 0x3689
+mSoftKey.PID = 0x8762
+mSoftKey.PID_NEW = 0X2020
+mSoftKey.VID_NEW = 0X3689
+mSoftKey.PID_NEW_2 = 0X2020
+mSoftKey.VID_NEW_2 = 0X2020
+
+export default mSoftKey

+ 13 - 0
src/main/hrUtilService_types.js

@@ -0,0 +1,13 @@
+//
+// Autogenerated by Thrift Compiler (0.14.2)
+//
+// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+//
+'use strict'
+
+var thrift = require('thrift')
+var Thrift = thrift.Thrift
+var Q = thrift.Q
+var Int64 = require('node-int64')
+
+var ttypes = module.exports = {}

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

@@ -0,0 +1,24 @@
+/**
+ * This file is used specifically and only for development. It installs
+ * `electron-debug` & `vue-devtools`. There shouldn't be any need to
+ *  modify this file, but it can be used to extend your development
+ *  environment.
+ */
+
+/* eslint-disable */
+
+// Install `electron-debug` with `devtron`
+require('electron-debug')({ showDevTools: true })
+
+// Install `vue-devtools`
+require('electron').app.on('ready', () => {
+  let installExtension = require('electron-devtools-installer')
+  installExtension.default(installExtension.VUEJS_DEVTOOLS)
+    .then(() => {})
+    .catch(err => {
+      console.log('Unable to install `vue-devtools`: \n', err)
+    })
+})
+
+// Require `main` process to boot app
+require('./index')

Разница между файлами не показана из-за своего большого размера
+ 406 - 0
src/main/index.js


+ 61 - 0
src/renderer/App.vue

@@ -0,0 +1,61 @@
+<template>
+  <div id="app">
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+const { ipcRenderer } = require("electron");
+export default {
+  name: "pilot-project",
+  data() {
+    return {};
+  },
+  // created() {
+  //   console.log(
+  //     "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
+  //   );
+  //   //先发个信息调用python.exe文件
+  //   ipcRenderer.on("main-windows-python-exe-run", (event, arg) => {
+  //     if (arg.type === "exe") {
+  //       this.startserve("dbInit");
+  //     }
+  //     if (arg.type === "dbInit") {
+  //       this.startserve("startDb");
+  //     }
+  //     if (arg.type === "startDb") {
+  //       this.startserve("startJar");
+  //     }
+  //     // if (arg.type === "startJar") {
+  //     //   this.startserve("webGlobal");
+  //     // }
+  //     // if (arg.type === "webGlobal") {
+  //     //   //可以关闭动画,打开mainwindows
+  //     //   this.showMainWindows();
+  //     // }
+  //   });
+  //   this.startserve("exe");
+  //   // this.showMainWindows();
+  //   // ipcRenderer.send("close-loading-window", {
+  //   //   isClose: true,
+  //   // });
+  // },
+  methods: {
+    //startServe
+    startserve(val) {
+      ipcRenderer.send("main-windows-python-exe", {
+        type: val,
+      });
+    },
+    showMainWindows() {
+      ipcRenderer.send("close-loading-window", {
+        isClose: true,
+      });
+    },
+  },
+};
+</script>
+
+<style>
+/* CSS */
+</style>

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


BIN
src/renderer/assets/200.png


BIN
src/renderer/assets/GoNogo.jpg


BIN
src/renderer/assets/about.png


BIN
src/renderer/assets/about1.png


BIN
src/renderer/assets/animal.mp3


BIN
src/renderer/assets/ban.mp3


BIN
src/renderer/assets/bang.wav


BIN
src/renderer/assets/bg.jpg


BIN
src/renderer/assets/bling.mp3


BIN
src/renderer/assets/c24rah1vny2gty4b.jpg


BIN
src/renderer/assets/close.png


BIN
src/renderer/assets/close1.png


BIN
src/renderer/assets/collect.mp3


BIN
src/renderer/assets/continuousAddition.jpg


BIN
src/renderer/assets/contropage/10223.png


BIN
src/renderer/assets/contropage/10224.png


BIN
src/renderer/assets/contropage/10225.png


BIN
src/renderer/assets/contropage/3542.png


BIN
src/renderer/assets/contropage/9912.png


BIN
src/renderer/assets/contropage/9922.png


BIN
src/renderer/assets/contropage/9923.png


BIN
src/renderer/assets/contropage/9925.png


BIN
src/renderer/assets/contropage/9927.png


BIN
src/renderer/assets/contropage/9928.png


BIN
src/renderer/assets/contropage/9929.png


BIN
src/renderer/assets/contropage/暂停服务.png


BIN
src/renderer/assets/contropage/椭圆 292(1).png


BIN
src/renderer/assets/contropage/椭圆 292.png


BIN
src/renderer/assets/contropage/椭圆 292@2x(1).png


BIN
src/renderer/assets/contropage/椭圆 292@2x.png


BIN
src/renderer/assets/contropage/组 8510.png


BIN
src/renderer/assets/contropage/组 8510@2x.png


BIN
src/renderer/assets/contropage/组 9912@2x.png


BIN
src/renderer/assets/contropage/组 9922@2x.png


BIN
src/renderer/assets/contropage/组 9923@2x.png


BIN
src/renderer/assets/contropage/组 9925@2x.png


BIN
src/renderer/assets/contropage/组 9927@2x.png


BIN
src/renderer/assets/contropage/组 9928@2x.png


BIN
src/renderer/assets/contropage/组 9929@2x.png


BIN
src/renderer/assets/contropage/路径 3542@2x.png


BIN
src/renderer/assets/duckEggTask.png


BIN
src/renderer/assets/fang.png


BIN
src/renderer/assets/fang1.png


BIN
src/renderer/assets/favicon.png


BIN
src/renderer/assets/fruits.mp3


BIN
src/renderer/assets/help.png


BIN
src/renderer/assets/help1.png


BIN
src/renderer/assets/inflate.mp3


BIN
src/renderer/assets/jian.png


BIN
src/renderer/assets/jian1.png


BIN
src/renderer/assets/left.png


BIN
src/renderer/assets/lion.png


BIN
src/renderer/assets/logo.png


BIN
src/renderer/assets/logo1.png


BIN
src/renderer/assets/logo_icon.png


BIN
src/renderer/assets/memoryAbility.jpg


BIN
src/renderer/assets/newImage/exit.png


BIN
src/renderer/assets/newImage/home_mbcj.png


BIN
src/renderer/assets/newImage/home_ndcj.png


BIN
src/renderer/assets/newImage/home_swfkxl.png


BIN
src/renderer/assets/newImage/home_xlcp.png


BIN
src/renderer/assets/newImage/home_xlfs.png


BIN
src/renderer/assets/newImage/home_zndh.png


BIN
src/renderer/assets/newImage/hxfs_bt.png


BIN
src/renderer/assets/newImage/jkcs_bt.png


BIN
src/renderer/assets/newImage/lbbgck_bt.png


BIN
src/renderer/assets/newImage/login_bg.png


BIN
src/renderer/assets/newImage/logo_icon.png


BIN
src/renderer/assets/newImage/play_bt_xlfs.png


BIN
src/renderer/assets/newImage/sp_mb.png


BIN
src/renderer/assets/newImage/sp_pic1.png


BIN
src/renderer/assets/newImage/sp_pic2.png


Некоторые файлы не были показаны из-за большого количества измененных файлов