dense-analysis / ale

Check syntax in Vim/Neovim asynchronously and fix files, with Language Server Protocol (LSP) support
BSD 2-Clause "Simplified" License
13.52k stars 1.43k forks source link

eslint linter overwrite all my javascript part when linting .vue files #2707

Closed Karmenzind closed 5 years ago

Karmenzind commented 5 years ago

Information

VIM version NVIM v0.2.2 Build type: RelWithDebInfo LuaJIT 2.1.0-beta3

Operating System: ubuntu1804

What went wrong

During lintng some .vue file, eslint automatically applied the fixes and overwrite all the javascript lines. See the ALEInfo below.

Reproducing the bug

  1. I opened a .vue file.
  2. did nothing and then ':w'
  3. "WARNING: The file has been changed since reading it!!!"
  4. then git-diff told me 800 lines (all javascript code inside <script> tag) had changed

:ALEInfo


 Current Filetype: vue
Available Linters: ['vls', 'eslint', 'fecs', 'flow', 'flow-language-server', 'jscs', 'jshint', 'standard', 'tsserver', 'xo', 'alex', 'fecs', 'htmlhint', 'proselint', 'stylelint', 'tidy', 'writegood']
   Linter Aliases:
'writegood' -> ['write-good']
  Enabled Linters: ['vls', 'eslint']
 Suggested Fixers: 
  'prettier' - Apply prettier to a file.
  'remove_trailing_lines' - Remove all blank lines at the end of a file.
  'trim_whitespace' - Remove all trailing whitespace characters at the end of every line.
 Linter Variables:

let g:ale_vue_vls_executable = 'vls'
let g:ale_vue_vls_use_global = 0
 Global Variables:

let g:ale_cache_executable_check_failures = v:null
let g:ale_change_sign_column_color = 0
let g:ale_command_wrapper = ''
let g:ale_completion_delay = v:null
let g:ale_completion_enabled = 0
let g:ale_completion_max_suggestions = v:null
let g:ale_echo_cursor = 1
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_format = '(%severity% %linter%) %code:% %s'
let g:ale_echo_msg_info_str = 'I'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_enabled = 1
let g:ale_fix_on_save = 0
let g:ale_fixers = {'c': ['clang-format'], 'vue': ['eslint', 'prettier'], 'json': ['fixjson', 'prettier'], 'sh': ['shfmt'], '*': ['trim_whitespace'], 'javascript': ['prettier', 'importjs'], 'sql': ['sqlfmt'], 'python': ['autopep8', 'isort', 'FixSurroundedWhiteSpaces']}
let g:ale_history_enabled = 1
let g:ale_history_log_output = 1
let g:ale_keep_list_window_open = 0
let g:ale_lint_delay = 200
let g:ale_lint_on_enter = 1
let g:ale_lint_on_filetype_changed = 1
let g:ale_lint_on_insert_leave = 1
let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 'normal'
let g:ale_linter_aliases = {'vue': ['vue', 'javascript', 'html']}
let g:ale_linters = {'vim': ['vint'], 'cpp': ['gcc'], 'markdown': ['mdl', 'prettier', 'proselint', 'alex'], 'vue': ['eslint', 'prettier', 'vls'], 'dockerfile': ['hadolint'], 'html': ['prettier', 'htmlhint'], 'javascript': ['eslint', 'prettier', 'importjs'], 'sql': ['sqlint'], 'text': ['proselint', 'alex', 'redpen'], 'python': ['pydocstyle', 'flake8', 'pylint'], 'gitcommit': ['gitlint']}
let g:ale_linters_explicit = 0
let g:ale_list_vertical = 0
let g:ale_list_window_size = 10
let g:ale_loclist_msg_format = '(%severity% %linter%) %code:% %s'
let g:ale_lsp_root = {}
let g:ale_max_buffer_history_size = 20
let g:ale_max_signs = -1
let g:ale_maximum_file_size = 1048576
let g:ale_open_list = 0
let g:ale_pattern_options = v:null
let g:ale_pattern_options_enabled = v:null
let g:ale_set_balloons = 0
let g:ale_set_highlights = 1
let g:ale_set_loclist = 1
let g:ale_set_quickfix = 0
let g:ale_set_signs = 1
let g:ale_sign_column_always = 0
let g:ale_sign_error = '>>'
let g:ale_sign_info = '--'
let g:ale_sign_offset = 1000000
let g:ale_sign_style_error = '>>'
let g:ale_sign_style_warning = '--'
let g:ale_sign_warning = '--'
let g:ale_statusline_format = v:null
let g:ale_type_map = {}
let g:ale_use_global_executables = v:null
let g:ale_virtualtext_cursor = 0
let g:ale_warn_about_trailing_blank_lines = 1
let g:ale_warn_about_trailing_whitespace = 0
  Command History:

(executable check - success) vls
(executable check - success) /home/qk/Workspace/stability/vue/branch/v0.0.1/node_modules/eslint/bin/eslint.js
(started) ['/usr/bin/zsh', '-c', '''/home/qk/Workspace/stability/vue/branch/v0.0.1/node_modules/eslint/bin/eslint.js'' -f json --stdin --stdin-filename ''/home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/deviceOperation.vue'' < ''/tmp/nvimOrV6LA/2/deviceOperation.vue''']
(finished - exit code 1) ['/usr/bin/zsh', '-c', '''/home/qk/Workspace/stability/vue/branch/v0.0.1/node_modules/eslint/bin/eslint.js'' -f json --stdin --stdin-filename ''/home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/deviceOperation.vue'' < ''/tmp/nvimOrV6LA/3/deviceOperation.vue''']

<<<OUTPUT STARTS>>>
Found fixes to apply
[{"filePath":"/home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/deviceOperation.vue","messages":[{"ruleId":"no-irregular-whitespace","severity":2,"message":"Irregular whitespace not allowed.","line":638,"column":15,"nodeType":"Program","endLine":201,"source":"      let row = {...this.testObjSelData}"},{"ruleId":"no-empty","severity":2,"message":"Empty block statement.","line":1023,"column":6,"nodeType":"BlockStatement","messageId":"unexpected","endLine":1022,"endColumn":8,"source":"    },"},{"ruleId":"prettier/prettier","severity":2,"message":"Delete `;`","line":1079,"column":6,"nodeType":null,"endLine":1079,"endColumn":7,"fix":{"range":[35634,35635],"text":""},"source":"      let data = {"}],"errorCount":3,"warningCount":0,"fixableErrorCount":1,"fixableWarningCount":0,"source":"<template>\r\n  <span class=\"deviceOperation\">\r\n    <el-dropdown >\r\n      <el-button class=\"el-dropdown-link\" type=\"text\" :disabled=\"testObjSelDataList.length <= 0\" style=\"border-left:none;height: 32.5px;\">\r\n        更多操作\r\n        <i class=\"el-icon-arrow-down el-icon--right\"></i>\r\n      </el-button>\r\n      <el-dropdown-menu slot=\"dropdown\" ref=\"dropmenu\">\r\n        <el-dropdown-item >\r\n          <div @click=\"modifyRestartFlag\">\r\n            设备重启\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceReset(testObjSelData)\">\r\n            设备恢复\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceUpgrade(testObjSelData)\">\r\n            设备升级\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceStatus(testObjSelData)\">\r\n            设备硬件状态\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceExportConfig(testObjSelData)\">\r\n            设备配置导出\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceHddManage(testObjSelData)\">\r\n            设备磁盘管理\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceUserAdd(testObjSelData)\">\r\n            设备用户添加\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceUserModify(testObjSelData)\">\r\n            设备用户修改\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceChanels(testObjSelData)\">\r\n            设备数字通道配置\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceSetTime(testObjSelData)\">\r\n            设备校时\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceSSh(testObjSelData)\">\r\n            开启SSH服务\r\n          </div>\r\n        </el-dropdown-item>\r\n      </el-dropdown-menu>\r\n    </el-dropdown>\r\n\r\n    <el-dialog\r\n      title=\"提示\"\r\n      :visible.sync=\"rebootDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"20%\">\r\n      <img v-show=\"currentDevice['uploading']\" src=\"@/assets/imgs/reboot_loading.gif\">\r\n      <span >{{currentDevice['name']}}</span>\r\n      <span >{{currentDevice['dialogMsg']}}</span>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"rebootDialogVisible = false\">确 定</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      :title=\"'设备升级'\"\r\n      :visible.sync=\"uploadDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-upload\r\n        class=\"upload-demo\"\r\n        ref=\"upload\"\r\n        :action=\"uploadFileUrl\"\r\n        :before-upload=\"beforeUpload\"\r\n        :on-change=\"onChange\"\r\n        :headers=\"headers\"\r\n        :on-success=\"uploadSuccess\"\r\n        :auto-upload=\"false\"\r\n        :limit=\"1\"\r\n        :file-list=\"fileList\">\r\n        <el-button size=\"small\" type=\"danger\">浏览文件</el-button>\r\n        <div v-show=\"currentUpload['data']&&currentUpload['data']['method']!=='importConfig'\" slot=\"tip\" class=\"el-upload__tip\">注意:升级过程将是1到10分钟,在此过程中请不要断开设备的电源。该设备在升级后自动重新启动。</div>\r\n      </el-upload>\r\n\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%; margin-top:10px\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"升级次数:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"updateDict['operation_num']\" placeholder=\"输入升级次数\" :min=\"1\" :controls=\"false\"></el-input-number>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"升级间隔:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"updateDict['interval']\" placeholder=\"输入升级间隔\" :min=\"0\" :controls=\"false\" ></el-input-number><span> (单位:分)</span>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"submitUpload\">开 始</el-button>\r\n        <el-button @click=\"(_)=>{$refs.upload.clearFiles();uploadDialogVisible = false}\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"设备硬件状态\"\r\n      :visible.sync=\"statusDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"40%\">\r\n      <el-table\r\n        :data=\"deviceStatusData\"\r\n        style=\"width: 100%\">\r\n        <el-table-column\r\n          prop=\"id\"\r\n          label=\"ID\"\r\n          width=\"180\">\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"temperature\"\r\n          label=\"温度\"\r\n          width=\"180\">\r\n          <template slot-scope=\"scope\">\r\n            {{scope.row.temperature.split('.')[0]}}℃\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"type\"\r\n          label=\"设备类型\">\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"isOnline\"\r\n          label=\"是否在线\">\r\n          <template slot-scope=\"scope\">\r\n              <span :class=\"scope.row.isOnline=='true'? 'serverStatus normal':'serverStatus abnormal_network'\"></span>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button  @click=\"statusDialogVisible = false\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      :title=\"currentFormat['name']\"\r\n      :visible.sync=\"hddDialogVisible\"\r\n      width=\"40%\"\r\n      :show-close=\"false\"\r\n      :close-on-click-modal=\"false\"\r\n      :close-on-press-escape=\"false\"\r\n      >\r\n        <el-button :disabled=\"forMating\" type=\"danger\" @click=\"deviceHddFormat\">格式化</el-button>\r\n        <el-table\r\n          :data=\"deviceHddData\"\r\n          @selection-change=\"handleHddSelectChange\"\r\n          style=\"width: 100%\">\r\n          <el-table-column\r\n            type=\"selection\"\r\n            width=\"55\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"id\"\r\n            label=\"磁盘号\"\r\n            width=\"80\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"capacity\"\r\n            label=\"容量\"\r\n            width=\"180\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.capacity>1024\">\r\n              {{(scope.row.capacity/1024).toFixed(2)}}GB\r\n              </span>\r\n              <span v-else>\r\n                {{scope.row.capacity}}MB\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"freeSpace\"\r\n            label=\"剩余空间\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.freeSpace>1024\">\r\n              {{(scope.row.freeSpace/1024).toFixed(2)}}GB\r\n              </span>\r\n              <span v-else>\r\n                {{scope.row.freeSpace}}MB\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"status\"\r\n            label=\"状态\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.status=='ok'\">\r\n                正常\r\n              </span>\r\n              <span v-else>\r\n                不正常\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"property\"\r\n            label=\"属性\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"percent\"\r\n            label=\"格式化进度\">\r\n          </el-table-column>\r\n        </el-table>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button  @click=\"handleFormatClose\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"用户添加\"\r\n      :visible.sync=\"addUserDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input v-model=\"userDict['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户类型:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-select v-model=\"userDict['user_level']\" >\r\n            <el-option label=\"操作员\" value=\"Operator\"></el-option>\r\n            <el-option label=\"普通用户\" value=\"Viewer\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"管理员密码\" >\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['adminPassword']\" autocomplete=\"off\"></el-input>\r\n          </el-col>        \r\n        </el-form-item> -->\r\n        <el-form-item label=\"密码:\" prop=\"password\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码确认:\" prop=\"checkPass\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceUserAddConfirm\">确 定</el-button>\r\n        <el-button  @click=\"addUserDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"用户修改\"\r\n      :visible.sync=\"modifyUserDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"modifyUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input v-model=\"userDict['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户类型:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-select v-model=\"userDict['user_level']\" >\r\n            <el-option label=\"操作员\" value=\"Operator\"></el-option>\r\n            <el-option label=\"普通用户\" value=\"Viewer\"></el-option>\r\n            <el-option label=\"Administrator\" value=\"Administrator\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"管理员密码\" >\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['adminPassword']\" autocomplete=\"off\"></el-input>\r\n          </el-col>        \r\n        </el-form-item> -->\r\n        <el-form-item label=\"密码:\" prop=\"password\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input  type=\"password\" v-model=\"userDict['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码确认:\" prop=\"checkPass\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input  type=\"password\" v-model=\"userDict['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceUserModifyConfirm\">确 定</el-button>\r\n        <el-button  @click=\"modifyUserDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"数字通道配置\"\r\n      :visible.sync=\"channelsDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-form :model=\"channelItem\" style=\"padding-left: 15%;\" label-position=\"right\"  label-width=\"auto\" >\r\n        <el-form-item label=\"IP通道地址:\">\r\n          <el-col :span=\"16\" >\r\n          <el-input v-model=\"channelItem['ip']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"协议类型:\">\r\n          <el-col :span=\"16\" >\r\n          <el-select v-model=\"channelItem['protocol']\" style=\"width: 100%;\">\r\n            <el-option label=\"HIKVISION\" value=\"HIKVISION\"></el-option>\r\n            <el-option label=\"ONVIF\" value=\"ONVIF\"></el-option>\r\n            <!-- <el-option label=\"GB28181\" value=\"GB28181\"></el-option> -->\r\n            <el-option label=\"Custom 1\" value=\"Custom 1\"></el-option>\r\n            <el-option label=\"Custom 2\" value=\"Custom 2\"></el-option>\r\n            <el-option label=\"Custom 3\" value=\"Custom 3\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"管理端口:\">\r\n          <el-col :span=\"16\" >          \r\n          <el-input v-model=\"channelItem['port']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"16\" >\r\n          <el-input v-model=\"channelItem['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码:\" >\r\n          <el-col :span=\"16\" >\r\n          <el-input type=\"password\" v-model=\"channelItem['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"密码确认:\" >\r\n          <el-col :span=\"16\" >\r\n          <el-input type=\"password\" v-model=\"channelItem['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item> -->\r\n        <el-form-item label=\"传输协议:\">\r\n          <el-col :span=\"16\" >\r\n          <el-select v-model=\"channelItem['stream_type']\" style=\"width: 100%;\">\r\n            <el-option label=\"自适应\" value=\"auto\"></el-option>\r\n            <el-option label=\"tcp\" value=\"tcp\"></el-option>\r\n            <el-option label=\"udp\" value=\"udp\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceChanelsConfirm\">确 定</el-button>\r\n        <el-button  @click=\"channelsDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"设备时间查看\"\r\n      :visible.sync=\"timeDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :model=\"timeItem\" style=\"padding-left: 15%;\" label-position=\"right\"  label-width=\"auto\" >\r\n        <el-form-item label=\"设备时间:\">\r\n          <el-col :span=\"18\" >\r\n          <el-input v-model=\"timeItem['deviceTime']\" disabled></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"设置时间:\">\r\n          <el-col :span=\"16\" >\r\n            <el-date-picker\r\n              v-model=\"timeItem['deviceSetTime']\"\r\n              type=\"datetime\"\r\n              placeholder=\"选择日期时间\"\r\n              default-time=\"12:00:00\">\r\n            </el-date-picker>\r\n          </el-col>\r\n        </el-form-item> -->\r\n      </el-form>\r\n\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <!-- <el-button type=\"danger\" @click=\"setDeviceTime\">确 定</el-button> -->\r\n        <el-button  @click=\"timeDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"SSH服务\"\r\n      :visible.sync=\"sshDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <div style=\"text-align: center;\">\r\n        <el-checkbox v-model=\"checkedSSH\">启用SSH</el-checkbox>\r\n      </div>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceSSHOpen\">确 定</el-button>\r\n        <el-button  @click=\"sshDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n\r\n    <el-dialog\r\n      title=\"设备重启\"\r\n      :visible.sync=\"deviceRestartVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"重启次数:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"restartDict['operation_num']\" placeholder=\"输入重启次数\" :min=\"1\" :controls=\"false\"></el-input-number>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"重启间隔:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"restartDict['interval']\" placeholder=\"输入重启间隔\" :min=\"0\" :controls=\"false\"></el-input-number><span> (单位:分)</span>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"restartBatchDevice\">确 定</el-button>\r\n        <el-button  @click=\"deviceRestartVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n\r\n  </span>\r\n</template>\r\n\r\n<script>\r\nimport api from '@/api';\r\nimport util from '@/util';\r\nimport { mapGetters } from 'vuex';\r\nimport { md5, GetAESkey, getSecretKey } from '@/util/encrypt.js';\r\nimport { Promise } from 'q';\r\n\r\nexport default {\r\n  name: 'DeviceOperation',\r\n  props: {},\r\n  components: {\r\n  },\r\n  computed: {\r\n    ...mapGetters(['testObjSelData','userInfo', 'testObjSelDataList'])\r\n  },\r\n  data() {\r\n    var validatePass = (rule, value, callback) => {\r\n        if (value === '') {\r\n          callback(new Error('请输入密码'));\r\n        } else {\r\n          if (this.userDict.checkPass !== '') {\r\n            this.$refs.addUserForm.validateField('checkPass');\r\n            this.$refs.modifyUserForm.validateField('checkPass');\r\n          }\r\n          callback();\r\n        }\r\n      };\r\n      var validatePass2 = (rule, value, callback) => {\r\n        if (value === '') {\r\n          callback(new Error('请再次输入密码'));\r\n        } else if (value !== this.userDict.password) {\r\n          callback(new Error('两次输入密码不一致!'));\r\n        } else {\r\n          callback();\r\n        }\r\n      };\r\n    const token = util.cookies.get(\"token\");\r\n    return {\r\n      sshDialogVisible:false,\r\n      timeDialogVisible:false,\r\n      channelsDialogVisible:false,\r\n      modifyUserDialogVisible:false,\r\n      addUserDialogVisible:false,\r\n      deviceRestartVisible:false,\r\n      rebootDialogVisible:false,\r\n      uploadDialogVisible:false,\r\n      rebooting:false,\r\n      uploadFileUrl:process.env.VUE_APP_API+'record-attachment-service/v1/record-attachments/attachments/upload',\r\n      reseting:false,\r\n      currentDevice:{rebooting:false},\r\n      deviceOprates:{},\r\n      currentUpload:{},\r\n      headers: {\r\n        Authorization: token\r\n      },\r\n      fileList:[],\r\n      deviceStatusData:[],\r\n      deviceHddData:[],\r\n      statusDialogVisible:false,\r\n      hddDialogVisible:false,\r\n      currentFormat:{\r\n        name:'',\r\n        id:'',\r\n        res:'',\r\n        res_id:'',\r\n        formatList:[],\r\n      },\r\n      forMating:false,\r\n      checkedSSH:false,\r\n      DEVICE_URL:api.labApi.DEVICE_URL,\r\n      TIMER_URL: api.labApi.timerUrl,\r\n      userDictItem:{\r\n        username:'',\r\n        user_level:'Viewer',\r\n        adminPassword:'',\r\n        password:'',\r\n        checkPass:'',\r\n      },\r\n      userDict:{\r\n        username:'',\r\n        user_level:'Viewer',\r\n        adminPassword:'',\r\n        password:'',\r\n        checkPass:'',\r\n      },\r\n      restartDict:{\r\n        interval: 5,\r\n        operation_num: 1\r\n      },\r\n      updateDict:{\r\n        interval: 5,\r\n        operation_num: 1\r\n      },\r\n      channelItem:{\r\n        ip:'',\r\n        protocol:'',\r\n        port:'',\r\n        password:'',\r\n        checkPass:'',\r\n        username:'',\r\n        stream_type:'',\r\n      },\r\n      timeItem:{\r\n        deviceTime:'',\r\n        deviceSetTime:'',\r\n      },\r\n\r\n      userRules:{\r\n        password: [\r\n            { validator: validatePass, trigger: 'blur' }\r\n          ],\r\n        checkPass: [\r\n          { validator: validatePass2, trigger: 'blur' }\r\n        ],\r\n      }\r\n      \r\n    };\r\n  },\r\n  mounted() {\r\n\r\n  },\r\n  methods: {\r\n\r\n    restartBatchDevice(){\r\n      let restartData = []\r\n      let disIds = []\r\n\r\n      for (let i in this.testObjSelDataList){\r\n        restartData.push({\r\n          \"ip\": this.testObjSelDataList[i].ip,\r\n          \"asset_id\": this.testObjSelDataList[i].tlabTestObjectId\r\n        })\r\n        disIds.push(this.testObjSelDataList[i].tlabTestObjectId)\r\n      }\r\n\r\n      let data = {\r\n        \"cycleId\": parseInt(this.$route.params.id),\r\n        \"taskType\": \"设备重启\",\r\n        // \"creatorName\": this.userInfo.loginName,\r\n        \"result\": \"进行中\",\r\n        \"operationIdObject\": {\r\n          \"testObjectIdList\": disIds\r\n        }\r\n      }\r\n\r\n      api.disApi.insertTask(data).then(res=>{\r\n        if (res.success){\r\n          let taskId = res.data.id\r\n\r\n          this.timerData = {\r\n            \"job_id\": taskId, \r\n            \"kwargs\": {\r\n              \"url\": this.DEVICE_URL + \"/dis/v1/devices/operate\",\r\n              // \"url\": \"http://10.65.144.140:5000/dis/v1/devices/operate\", \r\n              \"method\": \"post\",\r\n              \"args\": {\r\n                \"method\": \"reboot\",\r\n                \"task_id\": taskId, \r\n                \"operation_num\": this.restartDict.operation_num,\r\n                \"interval\": this.restartDict.interval,\r\n                \"data\": restartData\r\n              }\r\n            },\r\n            \"trigger\": \"interval\", \r\n            \"trigger_args\": {\r\n              \"minutes\": this.restartDict.interval\r\n            },\r\n            \"execute_count\": this.restartDict.operation_num\r\n          }\r\n          api.disApi.setTimer(this.timerData)\r\n          .then(res=>{\r\n            this.deviceRestartVisible = false\r\n            if (res.success){\r\n              this.$message.info('配置下发成功,请稍后在任务管理中心查看结果')\r\n            }else{\r\n              this.$message.error('配置下发失败: ' + res.msg)\r\n              \r\n              let taskUpData = {\r\n                \"task_id\": taskId, \r\n                \"result\": \"失败\",\r\n                \"message\": '配置下发失败: ' + res.msg\r\n              }\r\n              api.disApi.insertTask(taskUpData)\r\n            }\r\n          }\r\n          )\r\n        }else{\r\n          this.$message.error('创建任务失败: ' + res.msg)\r\n        }\r\n      })\r\n\r\n    },\r\n\r\n    beforeUpload(file){\r\n      let type = file.name.split(\".\");\r\n      type = type[type.length - 1];\r\n    },\r\n\r\n    async setDeviceTime(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'checkTime',{\"time\": \"2019-07-11T20:02:26+08:00\"})\r\n      return res\r\n    },\r\n\r\n    async deviceSSHOpen(){\r\n      let row = {...this.testObjSelData}\r\n      let op = this.checkedSSH?'true':'false'\r\n      let res = await this.handelDeviceOprate(row,'networkSSH',{op:op})\r\n      if(res.success&&res.data.operate){\r\n        this.sshDialogVisible = false\r\n        this.$message.success('设置成功。')\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n    },\r\n\r\n    async getDeviceSSHOpen(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'ssh_capabilities')\r\n      if(res.success&&res.data.operate){\r\n        if(res.data['result']['SSH']['enabled']==\"true\"){\r\n          this.checkedSSH = true\r\n        }else{\r\n          this.checkedSSH = false\r\n        }\r\n      }else{\r\n        this.$message.error(res.msg)\r\n      }\r\n    },\r\n\r\n    async getDeviceTime(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'currentTime')\r\n      if(res.success&&res.data.operate){\r\n        this.$message.info('此设备已自动校时。')\r\n        this.timeItem['deviceTime'] = res.data['result']\r\n      }\r\n    },\r\n\r\n    async deviceChanelsConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let get_ipcRes = await this.handelDeviceOprate(row,'get_ipc')\r\n      if(get_ipcRes.success&&get_ipcRes.data.operate){\r\n        let ipAddress= get_ipcRes.data['result']['InputProxyChannelList']['InputProxyChannel']\r\n        let ips = []\r\n        if(ipAddress instanceof Array){\r\n          for(let ipItem of ipAddress){\r\n            ips.push(ipItem['sourceInputPortDescriptor']['ipAddress'])            \r\n          }\r\n        }else{\r\n          ips.push(ipAddress['sourceInputPortDescriptor']['ipAddress'])\r\n        }\r\n        if(ips.indexOf(this.channelItem['ip'])>-1){\r\n          this.$message.error('此IP已经增加过,请重新填写。')\r\n        }else{\r\n          let res = await this.handelDeviceOprate(row,'addIpc',this.channelItem)\r\n          if(res.success&&res.data.operate){\r\n            this.channelsDialogVisible = false\r\n            this.$message.success('添加成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }  \r\n        }\r\n      }else{\r\n        this.$message.error(`${get_ipcRes.msg}`)\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceUserAddConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let getUser = await this.handelDeviceOprate(row,'getUser')\r\n      if(getUser.success&&getUser.data.operate){\r\n        let users= getUser.data['result']['UserList']['User']\r\n        let userNames = []\r\n        if(users instanceof Array){\r\n          for(let u of users){\r\n            userNames.push(u['userName'])            \r\n          }\r\n        }else{\r\n          userNames.push(users['userName'])\r\n        }\r\n        if(userNames.indexOf(this.userDict['username'])>-1){\r\n          this.$message.error('此用户名已经增加过,请重新填写。')\r\n        }else{\r\n          let res = await this.handelDeviceOprate(row,'addUser',this.userDict)\r\n          if(res.success&&res.data.operate){\r\n            this.addUserDialogVisible = false\r\n            this.$message.success('添加用户成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }\r\n        }\r\n      }else{\r\n        this.$message.error(`${getUser.msg}`)\r\n      }\r\n\r\n    },\r\n\r\n    async deviceUserModifyConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let getUser = await this.handelDeviceOprate(row,'getUser')\r\n      if(getUser.success&&getUser.data.operate){\r\n        let users= getUser.data['result']['UserList']['User']\r\n        let userNames = []\r\n        let owlUser = {}\r\n        if(users instanceof Array){\r\n          for(let u of users){\r\n            userNames.push(u['userName'])\r\n            if(u['userName']==this.userDict['username']){\r\n              owlUser = {...u}\r\n            }         \r\n          }\r\n        }else{\r\n          userNames.push(users['userName'])\r\n          owlUser = {...users}\r\n        }\r\n        let nindex = userNames.indexOf(this.userDict['username'])\r\n        if(nindex == -1){\r\n          this.$message.error('此用户名未找到,无法修改。')\r\n        }else{\r\n          Object.assign(this.userDict,{user_id:owlUser['id']})\r\n          let res = await this.handelDeviceOprate(row,'modifyUser',this.userDict,owlUser['id'])\r\n          if(res.success&&res.data.operate){\r\n            this.modifyUserDialogVisible = false\r\n            this.modifyAisPassword(validas)\r\n            this.$message.success('修改用户成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }\r\n        }\r\n      }else{\r\n        this.$message.error(`${getUser.msg}`)\r\n      }\r\n\r\n    },\r\n\r\n    modifyAisPassword(validas){\r\n      if(validas[1]['device_username']==this.userDict['username']){\r\n        let resId = this.testObjSelData.tlabTestObjectId.split('-')[2];\r\n        let resourceType = this.testObjSelData.tlabTestObjectId.split('-')[1];\r\n        let disItem = {\r\n          res_id:resId,\r\n          res_type:resId,\r\n          device_password:this.userDict['password']\r\n        }\r\n        api.labApi.modifyResource(this.userInfo.loginName, [disItem]).then(res => {\r\n        })\r\n        .catch(err => {\r\n          console.log(err);\r\n        });\r\n      }\r\n\r\n    },\r\n\r\n    deviceSSh(row){\r\n      this.getDeviceSSHOpen()\r\n      this.sshDialogVisible = true\r\n    },\r\n\r\n    async deviceSetTime(row){\r\n      try {\r\n        await this.setDeviceTime()\r\n        this.getDeviceTime()\r\n        this.timeDialogVisible = true\r\n      } catch (error) {\r\n        this.$message.err('获取失败')\r\n      }\r\n    },\r\n\r\n    deviceChanels(row){\r\n      this.channelsDialogVisible = true\r\n    },\r\n\r\n    deviceUserModify(row){\r\n      this.userDict = {...this.userDictItem}\r\n      this.modifyUserDialogVisible = true\r\n    },\r\n    deviceUserAdd(row){\r\n      this.userDict = {...this.userDictItem}\r\n      this.addUserDialogVisible = true\r\n    },\r\n    modifyRestartFlag(){\r\n      this.deviceRestartVisible = true\r\n    },\r\n    deviceRestartConfirm(rows){\r\n      this.deviceRestartVisible = false\r\n    },\r\n    async deviceHddFormat(){\r\n      if(!this.currentFormat['formatList']){\r\n        this.$message.error('请先选择磁盘。')\r\n        return\r\n      } \r\n      for(let hdd of this.currentFormat['formatList']){\r\n        this.forMating = true\r\n        let data = {\r\n          method:'hddOneFormat',\r\n          ID:hdd.id\r\n        }\r\n        api.labApi.deviceOprate(this.currentFormat['ip'],this.currentFormat['res'],this.currentFormat['res_id'],data).then(res=>{\r\n          this.forMating = true\r\n        }).catch((err)=>{\r\n          this.forMating = false\r\n          this.$message.error('无法请求')\r\n        })\r\n        setTimeout(()=>{\r\n          let interval = setInterval(()=>{\r\n            let dataP = {\r\n              method:'hddFormatStatus',\r\n              ID:hdd.id\r\n            }\r\n    \r\n            api.labApi.deviceOprate(this.currentFormat['ip'],this.currentFormat['res'],this.currentFormat['res_id'],dataP).then(res=>{\r\n              if(res.success&&res.data.operate){\r\n                let percent = res.data.result['formatStatus']['percent']||0\r\n                this.deviceHddData.map(item=>{\r\n                  if(item.id == hdd.id){\r\n                    item.percent = percent+'%'\r\n                  }\r\n                })\r\n                if(percent==100){\r\n                  this.forMating = false\r\n                  clearInterval(interval)\r\n                }else{\r\n                  this.forMating = true\r\n                }\r\n              }\r\n            }).catch(()=>{\r\n                this.forMating = false\r\n                clearInterval(interval)\r\n            })\r\n\r\n          },2000)\r\n        },2000)\r\n\r\n      }\r\n    },\r\n\r\n    handleHddSelectChange(val){\r\n      this.currentFormat['formatList'] = val\r\n    },\r\n\r\n    async deviceHddManage(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let res = await this.handelDeviceOprate(row,'hddCapabilities')\r\n      if(res.success&&res.data.operate){\r\n        let device = row.tlabTestObjectId.split('-')\r\n        this.currentFormat = {ip:validas[1]['ip'],id:row.id,name:row.name,res:device[0],res_id:device[2]}\r\n        this.deviceHddData = res.data.result\r\n        this.hddDialogVisible = true\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n    },\r\n\r\n    handleFormatClose(){\r\n      if(this.forMating){\r\n        this.$confirm('设备正在格式化,退出后可能暂时无法再次打开此设备硬盘管理窗口,是否继续?', '提示', {\r\n                    confirmButtonText: '确定',\r\n                    cancelButtonText: '取消',\r\n                    confirmButtonClass: 'btn-red',\r\n                    type: 'warning'\r\n          }).then(() => {\r\n            this.forMating = false\r\n            this.hddDialogVisible = false\r\n          }).catch(_ => {});\r\n      }else{\r\n            this.hddDialogVisible = false\r\n      }\r\n    },\r\n\r\n    async getParamsKey(row,device_username,device_password){\r\n      let keyIterateNum = 100\r\n      let keyResNum =await this.handelDeviceOprate(row,'securityCapabilities')\r\n      if(keyResNum.success&&keyResNum.data.operate){\r\n        keyIterateNum = keyResNum.data.result.keyIterateNum\r\n      }\r\n      const encry_iv = md5(new Date().getTime().toString());\r\n      const secretKey = getSecretKey(\r\n            device_username,\r\n            device_password,\r\n            encry_iv,\r\n            keyIterateNum,\r\n            ''\r\n      );\r\n      let params = {security: 1, iv: encry_iv, secretkey: secretKey}\r\n      return params\r\n\r\n    },\r\n    \r\n    validateRow(row){\r\n      let value = JSON.parse(row.value);\r\n      let ip = ''\r\n      let device_username = ''\r\n      let device_password = ''\r\n      value.map(item=>{\r\n        if(item.key=='ip'){\r\n          ip = item.value\r\n        }\r\n        if(item.key=='device_username'){\r\n          device_username = item.value\r\n        }\r\n        if(item.key=='device_password'){\r\n          device_password = item.value\r\n        }\r\n      })\r\n      let errss = []\r\n      if(ip===''){\r\n        errss.push('IP')\r\n      }\r\n      if(device_username===''){\r\n        errss.push('设备用户名')\r\n      }\r\n      if(device_password===''){\r\n        errss.push('设备密码')\r\n      }\r\n      if(ip==''||device_username==''||device_password==''){\r\n        let errstr = String(errss)\r\n\r\n        return [false,errstr]\r\n      }else{\r\n        let res = {\r\n          ip,\r\n          device_username,\r\n          device_password,\r\n        }\r\n        return [true,res]\r\n      }\r\n    },\r\n\r\n    async handelDeviceEncryOprate(row,method){\r\n      let validas = this.validateRow(row)\r\n      let params = {}\r\n      if(validas[0]){\r\n        params =await this.getParamsKey(row,validas[1]['device_username'],validas[1]['device_password'])\r\n      }else{\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n       \r\n      let data = {\r\n        method: method,\r\n        params:params\r\n      }\r\n      let device = row.tlabTestObjectId.split('-')\r\n      return api.labApi.deviceOprate(validas[1]['ip'],device[0],device[2],data).then(res=>{\r\n        return Promise.resolve(res)\r\n      }).catch((err)=>{\r\n        this.$message.error('无法请求')\r\n        return Promise.reject(err)\r\n      })\r\n\r\n    },\r\n\r\n    async deviceExportConfig(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      try {\r\n        let res =await this.handelDeviceEncryOprate(row,'exportConfig')\r\n        if(res.success&&res.data.operate){\r\n          this.$message.info(`导出配置成功,将自动下载,请耐心等待。`);\r\n          let file_name = res.data.file_name\r\n          let download_url = res.data.result.download_url\r\n           let iframe = document.createElement(\"iframe\")\r\n            iframe.style.display = \"none\";\r\n            iframe.src = download_url;\r\n            document.body.appendChild(iframe);\r\n        }else{\r\n          this.$message.error(`${res.msg}`)\r\n        }\r\n      } catch (error) {\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceStatus(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let res =await this.handelDeviceOprate(row,'boardStatus')\r\n      if(res.success&&res.data.operate){\r\n        this.deviceStatusData =res.data.result\r\n        this.statusDialogVisible = true\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n      \r\n      \r\n    },\r\n\r\n    // todo: 单独提出一个方法\r\n    // getTaskId(disIds){\r\n    //   let data = {\r\n    //     \"cycleId\": parseInt(this.$route.params.id),\r\n    //     \"operationIdObject\": {\r\n    //       \"testObjectIdList\": disIds\r\n    //     }\r\n    //   }\r\n\r\n    //   api.disApi.insertTask(data).then(res=>{\r\n    //     console.log(res)\r\n    //     console.log(\"res.success return: \" + res.success)\r\n    //     console.log(\"res.data.id return: \" + res.data.id)\r\n    //     if (res.success){\r\n    //       console.log(\"任务id: \" + res.data.id)\r\n    //       return res.data.id\r\n    //     }else{\r\n    //       this.$message.error('创建任务失败: ' + res.msg)\r\n    //     }\r\n    //   })\r\n    // },\r\n\r\n    uploadSuccess(response, file, fileList){\r\n      // this.$message.success('文件上传成功')\r\n      this.$refs.upload.clearFiles()\r\n\r\n      let upData = []\r\n      let disIds = []\r\n      \r\n      for (let i in this.testObjSelDataList){\r\n        upData.push({\r\n          \"ip\": this.testObjSelDataList[i].ip,\r\n          \"asset_id\": this.testObjSelDataList[i].tlabTestObjectId\r\n        })\r\n        disIds.push(this.testObjSelDataList[i].tlabTestObjectId)\r\n      };\r\n\r\n      let data = {\r\n        \"cycleId\": parseInt(this.$route.params.id),\r\n        \"taskType\": \"设备升级\",\r\n        // \"creatorName\": this.userInfo.loginName,\r\n        \"result\": \"进行中\",\r\n        \"operationIdObject\": {\r\n          \"testObjectIdList\": disIds\r\n        }\r\n      }\r\n\r\n      api.disApi.insertTask(data).then(res=>{\r\n        if (res.success){\r\n          console.log(\"任务id: \" + res.data.id)\r\n          let taskId = res.data.id\r\n\r\n          let upgradeData = {\r\n            \"job_id\": taskId,\r\n            \"kwargs\": {\r\n              // \"url\": \"http://10.65.144.140:5000/dis/v1/devices/operate\", \r\n              \"url\": this.DEVICE_URL + \"/dis/v1/devices/operate\",\r\n              \"method\": \"post\",\r\n              \"args\": {\r\n                \"method\": \"updateFirmware\",\r\n                \"task_id\": taskId, \r\n                \"operation_num\": this.updateDict.operation_num,\r\n                \"interval\": this.updateDict.interval,\r\n                \"file_url\": response.data.url,\r\n                \"data\": upData\r\n              }\r\n            },\r\n            \"trigger\": \"interval\", \r\n            \"trigger_args\": {\r\n              \"minutes\": this.updateDict.interval\r\n            },\r\n            \"execute_count\": this.updateDict.operation_num\r\n          };\r\n          api.disApi.setTimer(upgradeData).then(res=>{\r\n            this.deviceRestartVisible = false\r\n            if (res.success){\r\n              this.$message.info('配置下发成功,请稍后在任务管理中心查看结果')\r\n            }else{\r\n              this.$message.error('配置下发失败: ' + res.msg)\r\n              \r\n              let taskUpData = {\r\n                \"task_id\": taskId, \r\n                \"result\": \"失败\",\r\n                \"message\": '配置下发失败: ' + res.msg\r\n              }\r\n              api.disApi.insertTask(taskUpData)\r\n            }\r\n          })\r\n        }else{\r\n          this.$message.error('创建任务失败: ' + res.msg)\r\n        }\r\n      })\r\n    },\r\n\r\n    handlePreview(file) {\r\n      this.$refs.upload.data = this.currentUpload['data']\r\n      this.upgradeFile = file\r\n      console.log(\"file is: \" + this.upgradeFile)\r\n    },\r\n\r\n    onChange(file, fileList){\r\n      if(this.currentDevice['method']=='uploading'){\r\n        let type = file.name.split(\".\");\r\n        type = type[type.length - 1];\r\n        \r\n        if (!type.match(/(dav)$/i)) {\r\n          this.$message.error(\"请上传dav格式的升级文件\");\r\n          this.$refs.upload.clearFiles()\r\n          return false;\r\n        }\r\n        this.fileList = [...fileList]\r\n      }\r\n    },\r\n\r\n    submitUpload() {\r\n      if(this.fileList.length>0){\r\n        this.$confirm('是否继续?', '提示', {\r\n                  confirmButtonText: '确定',\r\n                  cancelButtonText: '取消',\r\n                  confirmButtonClass: 'btn-red',\r\n                  type: 'warning'\r\n        }).then(async() => {\r\n          this.$refs.upload.submit();\r\n          this.uploadDialogVisible = false\r\n        })\r\n      }else{\r\n        this.$message.error('请选择文件')\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceUpgrade(row){\r\n        this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name,method:\"uploading\"}\r\n        Object.assign(this.currentUpload,{\r\n          row:row,\r\n          id:row.id,\r\n          ip:\"validas[1]['ip']\",\r\n          name:row.name,\r\n          res:\"device[0]\",\r\n          resId:\"device[2]\",\r\n          data:{}\r\n        })\r\n        console.log(this.currentUpload)\r\n        console.log(this.upgradeData)\r\n        this.uploadDialogVisible = true\r\n    },\r\n\r\n    async handelReboot(row){\r\n      let item = {\r\n        name:row.name,\r\n        dialogMsg: '设备重启中...',\r\n        rebooting:true,\r\n      }\r\n      this.deviceOprates[row.id] = item\r\n      if(this.currentDevice['name']==row.name){\r\n        this.currentDevice = this.deviceOprates[row.id]\r\n      }\r\n      let rebootRes =await this.handelDeviceOprate(row,'reboot')\r\n      if(rebootRes.success&&rebootRes.data.operate){\r\n        this.rebootDialogVisible=true\r\n        setTimeout(()=>{\r\n            let interval = setInterval(async()=>{\r\n            let res =await this.handelDeviceOprate(row,'deviceInfo')\r\n            if(res.success){\r\n              this.deviceOprates[row.id]['rebooting']=false\r\n              this.deviceOprates[row.id]['dialogMsg']='设备重启完成'\r\n              if(this.currentDevice['name']==row.name){\r\n                this.currentDevice = this.deviceOprates[row.id]\r\n              }\r\n              clearInterval(interval)\r\n            }\r\n          },3000)\r\n        },88000)\r\n      }else{\r\n        this.deviceOprates[row.id]['rebooting']=false\r\n        this.deviceOprates[row.id]['dialogMsg']='设备重启失败'\r\n        if(this.currentDevice['name']==row.name){\r\n          this.currentDevice = this.deviceOprates[row.id]\r\n        }\r\n        this.$message.error(`${rebootRes.msg}`)\r\n      }\r\n    },\r\n\r\n    deviceRboot(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name}\r\n      if(!this.currentDevice['rebooting']){\r\n        this.$confirm('是否重启设备?', '提示', {\r\n                confirmButtonText: '确定',\r\n                cancelButtonText: '取消',\r\n                confirmButtonClass: 'btn-red',\r\n                type: 'warning'\r\n        }).then(async() => {\r\n            this.handelReboot(row)\r\n        })\r\n      }else{\r\n        this.rebootDialogVisible=true\r\n      }\r\n    },\r\n\r\n    deviceReset(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name}\r\n      if(!this.currentDevice['reseting']){\r\n        this.$confirm('是否恢复设备?', '提示', {\r\n                confirmButtonText: '确定',\r\n                cancelButtonText: '取消',\r\n                confirmButtonClass: 'btn-red',\r\n                type: 'warning'\r\n        }).then(async() => {\r\n          let item = {\r\n            name:row.name,\r\n            dialogMsg: '设备恢复中...',\r\n            reseting:true,\r\n          }\r\n          this.deviceOprates[row.id] = item\r\n          if(this.currentDevice['name']==row.name){\r\n            this.currentDevice = this.deviceOprates[row.id]\r\n          }\r\n          this.rebootDialogVisible=true\r\n          let resetRes =await this.handelDeviceOprate(row,'factoryReset')\r\n          if(resetRes.success&&resetRes.data.result.statusCode=='7'){\r\n            this.deviceOprates[row.id]['reseting'] = false\r\n            this.handelDeviceOprate(row,'reboot')\r\n            let item = {\r\n              name:row.name,\r\n              dialogMsg: '设备恢复成功',\r\n              reseting:false,\r\n            }\r\n            this.deviceOprates[row.id] = item\r\n            if(this.currentDevice['name']==row.name){\r\n              this.currentDevice = this.deviceOprates[row.id]\r\n            }\r\n          }else{\r\n            let item = {\r\n              name:row.name,\r\n              dialogMsg: '设备恢复失败',\r\n              reseting:false,\r\n            }\r\n            this.deviceOprates[row.id] = item\r\n            if(this.currentDevice['name']==row.name){\r\n              this.currentDevice = this.deviceOprates[row.id]\r\n            }\r\n          }\r\n           \r\n        })\r\n      }else{\r\n        this.rebootDialogVisible=true\r\n      }\r\n\r\n    },\r\n\r\n    handelDeviceOprate(row,method,params={}){\r\n      let validas = this.validateRow(row)\r\n      let device = row.tlabTestObjectId.split('-')\r\n      let data = {\r\n        \"method\": method,\r\n        \"params\": params,\r\n      }\r\n      if(params['user_id']){\r\n        Object.assign(data,{ID:params['user_id']})\r\n      }\r\n      return api.labApi.deviceOprate(validas[1]['ip'],device[0],device[2],data).then(res=>{\r\n        return Promise.resolve(res)\r\n      }).catch((err)=>{\r\n        this.$message.error('无法请求')\r\n        return Promise.reject(err)\r\n\r\n      })\r\n\r\n    },\r\n}\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.serverStatus{\r\n  display: inline-block;\r\n  border-radius: 5px;\r\n  width: 8px;\r\n  height: 8px;\r\n  margin-right: 4px;\r\n}\r\n.normal{\r\n  background: #3bcd8d;\r\n}\r\n.abnormal_network{\r\n  background: #fe5332;\r\n}\r\n.deviceOperation .el-button{\r\n  float: none;\r\n}\r\n.deviceOperation .el-button + .el-button{\r\n  border-left: 1px solid #dddddd;\r\n}\r\n</style>\r\n"}]
<<<OUTPUT ENDS>>>

(finished - exit code 1) ['/usr/bin/zsh', '-c', '''/home/qk/Workspace/stability/vue/branch/v0.0.1/node_modules/eslint/bin/eslint.js'' -f json --stdin --stdin-filename ''/home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/deviceOperation.vue'' < ''/tmp/nvimOrV6LA/4/deviceOperation.vue''']

<<<OUTPUT STARTS>>>
No fixes to apply
[{"filePath":"/home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/deviceOperation.vue","messages":[{"ruleId":"no-empty","severity":2,"message":"Empty block statement.","line":1059,"column":23,"nodeType":"BlockStatement","messageId":"unexpected","endLine":1059,"endColumn":25,"source":"    //       this.$message.error('创建任务失败: ' + res.msg)"}],"errorCount":1,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\r\n  <span class=\"deviceOperation\">\r\n    <el-dropdown >\r\n      <el-button class=\"el-dropdown-link\" type=\"text\" :disabled=\"testObjSelDataList.length <= 0\" style=\"border-left:none;height: 32.5px;\">\r\n        更多操作\r\n        <i class=\"el-icon-arrow-down el-icon--right\"></i>\r\n      </el-button>\r\n      <el-dropdown-menu slot=\"dropdown\" ref=\"dropmenu\">\r\n        <el-dropdown-item >\r\n          <div @click=\"modifyRestartFlag\">\r\n            设备重启\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceReset(testObjSelData)\">\r\n            设备恢复\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceUpgrade(testObjSelData)\">\r\n            设备升级\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceStatus(testObjSelData)\">\r\n            设备硬件状态\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceExportConfig(testObjSelData)\">\r\n            设备配置导出\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceHddManage(testObjSelData)\">\r\n            设备磁盘管理\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceUserAdd(testObjSelData)\">\r\n            设备用户添加\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceUserModify(testObjSelData)\">\r\n            设备用户修改\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item :disabled=\"testObjSelDataList.length > 1\">\r\n          <div @click=\"deviceChanels(testObjSelData)\">\r\n            设备数字通道配置\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceSetTime(testObjSelData)\">\r\n            设备校时\r\n          </div>\r\n        </el-dropdown-item>\r\n        <el-dropdown-item >\r\n          <div @click=\"deviceSSh(testObjSelData)\">\r\n            开启SSH服务\r\n          </div>\r\n        </el-dropdown-item>\r\n      </el-dropdown-menu>\r\n    </el-dropdown>\r\n\r\n    <el-dialog\r\n      title=\"提示\"\r\n      :visible.sync=\"rebootDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"20%\">\r\n      <img v-show=\"currentDevice['uploading']\" src=\"@/assets/imgs/reboot_loading.gif\">\r\n      <span >{{currentDevice['name']}}</span>\r\n      <span >{{currentDevice['dialogMsg']}}</span>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"rebootDialogVisible = false\">确 定</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      :title=\"'设备升级'\"\r\n      :visible.sync=\"uploadDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-upload\r\n        class=\"upload-demo\"\r\n        ref=\"upload\"\r\n        :action=\"uploadFileUrl\"\r\n        :before-upload=\"beforeUpload\"\r\n        :on-change=\"onChange\"\r\n        :headers=\"headers\"\r\n        :on-success=\"uploadSuccess\"\r\n        :auto-upload=\"false\"\r\n        :limit=\"1\"\r\n        :file-list=\"fileList\">\r\n        <el-button size=\"small\" type=\"danger\">浏览文件</el-button>\r\n        <div v-show=\"currentUpload['data']&&currentUpload['data']['method']!=='importConfig'\" slot=\"tip\" class=\"el-upload__tip\">注意:升级过程将是1到10分钟,在此过程中请不要断开设备的电源。该设备在升级后自动重新启动。</div>\r\n      </el-upload>\r\n\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%; margin-top:10px\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"升级次数:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"updateDict['operation_num']\" placeholder=\"输入升级次数\" :min=\"1\" :controls=\"false\"></el-input-number>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"升级间隔:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"updateDict['interval']\" placeholder=\"输入升级间隔\" :min=\"0\" :controls=\"false\" ></el-input-number><span> (单位:分)</span>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"submitUpload\">开 始</el-button>\r\n        <el-button @click=\"(_)=>{$refs.upload.clearFiles();uploadDialogVisible = false}\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"设备硬件状态\"\r\n      :visible.sync=\"statusDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"40%\">\r\n      <el-table\r\n        :data=\"deviceStatusData\"\r\n        style=\"width: 100%\">\r\n        <el-table-column\r\n          prop=\"id\"\r\n          label=\"ID\"\r\n          width=\"180\">\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"temperature\"\r\n          label=\"温度\"\r\n          width=\"180\">\r\n          <template slot-scope=\"scope\">\r\n            {{scope.row.temperature.split('.')[0]}}℃\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"type\"\r\n          label=\"设备类型\">\r\n        </el-table-column>\r\n        <el-table-column\r\n          prop=\"isOnline\"\r\n          label=\"是否在线\">\r\n          <template slot-scope=\"scope\">\r\n              <span :class=\"scope.row.isOnline=='true'? 'serverStatus normal':'serverStatus abnormal_network'\"></span>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button  @click=\"statusDialogVisible = false\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      :title=\"currentFormat['name']\"\r\n      :visible.sync=\"hddDialogVisible\"\r\n      width=\"40%\"\r\n      :show-close=\"false\"\r\n      :close-on-click-modal=\"false\"\r\n      :close-on-press-escape=\"false\"\r\n      >\r\n        <el-button :disabled=\"forMating\" type=\"danger\" @click=\"deviceHddFormat\">格式化</el-button>\r\n        <el-table\r\n          :data=\"deviceHddData\"\r\n          @selection-change=\"handleHddSelectChange\"\r\n          style=\"width: 100%\">\r\n          <el-table-column\r\n            type=\"selection\"\r\n            width=\"55\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"id\"\r\n            label=\"磁盘号\"\r\n            width=\"80\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"capacity\"\r\n            label=\"容量\"\r\n            width=\"180\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.capacity>1024\">\r\n              {{(scope.row.capacity/1024).toFixed(2)}}GB\r\n              </span>\r\n              <span v-else>\r\n                {{scope.row.capacity}}MB\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"freeSpace\"\r\n            label=\"剩余空间\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.freeSpace>1024\">\r\n              {{(scope.row.freeSpace/1024).toFixed(2)}}GB\r\n              </span>\r\n              <span v-else>\r\n                {{scope.row.freeSpace}}MB\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"status\"\r\n            label=\"状态\">\r\n            <template slot-scope=\"scope\">\r\n              <span v-if=\"scope.row.status=='ok'\">\r\n                正常\r\n              </span>\r\n              <span v-else>\r\n                不正常\r\n              </span>\r\n            </template>\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"property\"\r\n            label=\"属性\">\r\n          </el-table-column>\r\n          <el-table-column\r\n            prop=\"percent\"\r\n            label=\"格式化进度\">\r\n          </el-table-column>\r\n        </el-table>\r\n      <span slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button  @click=\"handleFormatClose\">取 消</el-button>\r\n      </span>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"用户添加\"\r\n      :visible.sync=\"addUserDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input v-model=\"userDict['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户类型:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-select v-model=\"userDict['user_level']\" >\r\n            <el-option label=\"操作员\" value=\"Operator\"></el-option>\r\n            <el-option label=\"普通用户\" value=\"Viewer\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"管理员密码\" >\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['adminPassword']\" autocomplete=\"off\"></el-input>\r\n          </el-col>        \r\n        </el-form-item> -->\r\n        <el-form-item label=\"密码:\" prop=\"password\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码确认:\" prop=\"checkPass\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceUserAddConfirm\">确 定</el-button>\r\n        <el-button  @click=\"addUserDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"用户修改\"\r\n      :visible.sync=\"modifyUserDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"modifyUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input v-model=\"userDict['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户类型:\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-select v-model=\"userDict['user_level']\" >\r\n            <el-option label=\"操作员\" value=\"Operator\"></el-option>\r\n            <el-option label=\"普通用户\" value=\"Viewer\"></el-option>\r\n            <el-option label=\"Administrator\" value=\"Administrator\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"管理员密码\" >\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input type=\"password\" v-model=\"userDict['adminPassword']\" autocomplete=\"off\"></el-input>\r\n          </el-col>        \r\n        </el-form-item> -->\r\n        <el-form-item label=\"密码:\" prop=\"password\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input  type=\"password\" v-model=\"userDict['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码确认:\" prop=\"checkPass\">\r\n          <el-col :span=\"12\" :push=\"1\">\r\n          <el-input  type=\"password\" v-model=\"userDict['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceUserModifyConfirm\">确 定</el-button>\r\n        <el-button  @click=\"modifyUserDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"数字通道配置\"\r\n      :visible.sync=\"channelsDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-form :model=\"channelItem\" style=\"padding-left: 15%;\" label-position=\"right\"  label-width=\"auto\" >\r\n        <el-form-item label=\"IP通道地址:\">\r\n          <el-col :span=\"16\" >\r\n          <el-input v-model=\"channelItem['ip']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"协议类型:\">\r\n          <el-col :span=\"16\" >\r\n          <el-select v-model=\"channelItem['protocol']\" style=\"width: 100%;\">\r\n            <el-option label=\"HIKVISION\" value=\"HIKVISION\"></el-option>\r\n            <el-option label=\"ONVIF\" value=\"ONVIF\"></el-option>\r\n            <!-- <el-option label=\"GB28181\" value=\"GB28181\"></el-option> -->\r\n            <el-option label=\"Custom 1\" value=\"Custom 1\"></el-option>\r\n            <el-option label=\"Custom 2\" value=\"Custom 2\"></el-option>\r\n            <el-option label=\"Custom 3\" value=\"Custom 3\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"管理端口:\">\r\n          <el-col :span=\"16\" >          \r\n          <el-input v-model=\"channelItem['port']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"用户名:\">\r\n          <el-col :span=\"16\" >\r\n          <el-input v-model=\"channelItem['username']\" ></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"密码:\" >\r\n          <el-col :span=\"16\" >\r\n          <el-input type=\"password\" v-model=\"channelItem['password']\" autocomplete=\"off\"></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"密码确认:\" >\r\n          <el-col :span=\"16\" >\r\n          <el-input type=\"password\" v-model=\"channelItem['checkPass']\" autocomplete=\"off\"></el-input>\r\n          </el-col>          \r\n        </el-form-item> -->\r\n        <el-form-item label=\"传输协议:\">\r\n          <el-col :span=\"16\" >\r\n          <el-select v-model=\"channelItem['stream_type']\" style=\"width: 100%;\">\r\n            <el-option label=\"自适应\" value=\"auto\"></el-option>\r\n            <el-option label=\"tcp\" value=\"tcp\"></el-option>\r\n            <el-option label=\"udp\" value=\"udp\"></el-option>\r\n          </el-select>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceChanelsConfirm\">确 定</el-button>\r\n        <el-button  @click=\"channelsDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"设备时间查看\"\r\n      :visible.sync=\"timeDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <el-form :model=\"timeItem\" style=\"padding-left: 15%;\" label-position=\"right\"  label-width=\"auto\" >\r\n        <el-form-item label=\"设备时间:\">\r\n          <el-col :span=\"18\" >\r\n          <el-input v-model=\"timeItem['deviceTime']\" disabled></el-input>\r\n          </el-col>\r\n        </el-form-item>\r\n        <!-- <el-form-item label=\"设置时间:\">\r\n          <el-col :span=\"16\" >\r\n            <el-date-picker\r\n              v-model=\"timeItem['deviceSetTime']\"\r\n              type=\"datetime\"\r\n              placeholder=\"选择日期时间\"\r\n              default-time=\"12:00:00\">\r\n            </el-date-picker>\r\n          </el-col>\r\n        </el-form-item> -->\r\n      </el-form>\r\n\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <!-- <el-button type=\"danger\" @click=\"setDeviceTime\">确 定</el-button> -->\r\n        <el-button  @click=\"timeDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n    <el-dialog\r\n      title=\"SSH服务\"\r\n      :visible.sync=\"sshDialogVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"25%\">\r\n      <div style=\"text-align: center;\">\r\n        <el-checkbox v-model=\"checkedSSH\">启用SSH</el-checkbox>\r\n      </div>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"deviceSSHOpen\">确 定</el-button>\r\n        <el-button  @click=\"sshDialogVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n\r\n    <el-dialog\r\n      title=\"设备重启\"\r\n      :visible.sync=\"deviceRestartVisible\"\r\n      :close-on-click-modal=\"false\"\r\n      width=\"30%\">\r\n      <el-form :rules=\"userRules\" style=\"padding-left: 15%;\" label-position=\"right\" ref=\"addUserForm\" :model=\"userDict\" label-width=\"auto\" size=\"mini\">\r\n        <el-form-item label=\"重启次数:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"restartDict['operation_num']\" placeholder=\"输入重启次数\" :min=\"1\" :controls=\"false\"></el-input-number>\r\n          </el-col>\r\n        </el-form-item>\r\n        <el-form-item label=\"重启间隔:\">\r\n          <el-col :span=\"36\" :push=\"1\">\r\n          <el-input-number v-model=\"restartDict['interval']\" placeholder=\"输入重启间隔\" :min=\"0\" :controls=\"false\"></el-input-number><span> (单位:分)</span>\r\n          </el-col>\r\n        </el-form-item>\r\n      </el-form>\r\n      <div slot=\"footer\" class=\"dialog-footer\">\r\n        <el-button type=\"danger\" @click=\"restartBatchDevice\">确 定</el-button>\r\n        <el-button  @click=\"deviceRestartVisible = false\">取 消</el-button>\r\n      </div>\r\n    </el-dialog>\r\n\r\n  </span>\r\n</template>\r\n\r\n<script>\r\nimport api from '@/api';\r\nimport util from '@/util';\r\nimport { mapGetters } from 'vuex';\r\nimport { md5, GetAESkey, getSecretKey } from '@/util/encrypt.js';\r\nimport { Promise } from 'q';\r\n\r\nexport default {\r\n  name: 'DeviceOperation',\r\n  props: {},\r\n  components: {\r\n  },\r\n  computed: {\r\n    ...mapGetters(['testObjSelData','userInfo', 'testObjSelDataList'])\r\n  },\r\n  data() {\r\n    var validatePass = (rule, value, callback) => {\r\n        if (value === '') {\r\n          callback(new Error('请输入密码'));\r\n        } else {\r\n          if (this.userDict.checkPass !== '') {\r\n            this.$refs.addUserForm.validateField('checkPass');\r\n            this.$refs.modifyUserForm.validateField('checkPass');\r\n          }\r\n          callback();\r\n        }\r\n      };\r\n      var validatePass2 = (rule, value, callback) => {\r\n        if (value === '') {\r\n          callback(new Error('请再次输入密码'));\r\n        } else if (value !== this.userDict.password) {\r\n          callback(new Error('两次输入密码不一致!'));\r\n        } else {\r\n          callback();\r\n        }\r\n      };\r\n    const token = util.cookies.get(\"token\");\r\n    return {\r\n      sshDialogVisible:false,\r\n      timeDialogVisible:false,\r\n      channelsDialogVisible:false,\r\n      modifyUserDialogVisible:false,\r\n      addUserDialogVisible:false,\r\n      deviceRestartVisible:false,\r\n      rebootDialogVisible:false,\r\n      uploadDialogVisible:false,\r\n      rebooting:false,\r\n      uploadFileUrl:process.env.VUE_APP_API+'record-attachment-service/v1/record-attachments/attachments/upload',\r\n      reseting:false,\r\n      currentDevice:{rebooting:false},\r\n      deviceOprates:{},\r\n      currentUpload:{},\r\n      headers: {\r\n        Authorization: token\r\n      },\r\n      fileList:[],\r\n      deviceStatusData:[],\r\n      deviceHddData:[],\r\n      statusDialogVisible:false,\r\n      hddDialogVisible:false,\r\n      currentFormat:{\r\n        name:'',\r\n        id:'',\r\n        res:'',\r\n        res_id:'',\r\n        formatList:[],\r\n      },\r\n      forMating:false,\r\n      checkedSSH:false,\r\n      DEVICE_URL:api.labApi.DEVICE_URL,\r\n      TIMER_URL: api.labApi.timerUrl,\r\n      userDictItem:{\r\n        username:'',\r\n        user_level:'Viewer',\r\n        adminPassword:'',\r\n        password:'',\r\n        checkPass:'',\r\n      },\r\n      userDict:{\r\n        username:'',\r\n        user_level:'Viewer',\r\n        adminPassword:'',\r\n        password:'',\r\n        checkPass:'',\r\n      },\r\n      restartDict:{\r\n        interval: 5,\r\n        operation_num: 1\r\n      },\r\n      updateDict:{\r\n        interval: 5,\r\n        operation_num: 1\r\n      },\r\n      channelItem:{\r\n        ip:'',\r\n        protocol:'',\r\n        port:'',\r\n        password:'',\r\n        checkPass:'',\r\n        username:'',\r\n        stream_type:'',\r\n      },\r\n      timeItem:{\r\n        deviceTime:'',\r\n        deviceSetTime:'',\r\n      },\r\n\r\n      userRules:{\r\n        password: [\r\n            { validator: validatePass, trigger: 'blur' }\r\n          ],\r\n        checkPass: [\r\n          { validator: validatePass2, trigger: 'blur' }\r\n        ],\r\n      }\r\n      \r\n    };\r\n  },\r\n  mounted() {\r\n\r\n  },\r\n  methods: {\r\n\r\n    restartBatchDevice(){\r\n      let restartData = []\r\n      let disIds = []\r\n\r\n      for (let i in this.testObjSelDataList){\r\n        restartData.push({\r\n          \"ip\": this.testObjSelDataList[i].ip,\r\n          \"asset_id\": this.testObjSelDataList[i].tlabTestObjectId\r\n        })\r\n        disIds.push(this.testObjSelDataList[i].tlabTestObjectId)\r\n      }\r\n\r\n      let data = {\r\n        \"cycleId\": parseInt(this.$route.params.id),\r\n        \"taskType\": \"设备重启\",\r\n        // \"creatorName\": this.userInfo.loginName,\r\n        \"result\": \"进行中\",\r\n        \"operationIdObject\": {\r\n          \"testObjectIdList\": disIds\r\n        }\r\n      }\r\n\r\n      api.disApi.insertTask(data).then(res=>{\r\n        if (res.success){\r\n          let taskId = res.data.id\r\n\r\n          this.timerData = {\r\n            \"job_id\": taskId, \r\n            \"kwargs\": {\r\n              \"url\": this.DEVICE_URL + \"/dis/v1/devices/operate\",\r\n              // \"url\": \"http://10.65.144.140:5000/dis/v1/devices/operate\", \r\n              \"method\": \"post\",\r\n              \"args\": {\r\n                \"method\": \"reboot\",\r\n                \"task_id\": taskId, \r\n                \"operation_num\": this.restartDict.operation_num,\r\n                \"interval\": this.restartDict.interval,\r\n                \"data\": restartData\r\n              }\r\n            },\r\n            \"trigger\": \"interval\", \r\n            \"trigger_args\": {\r\n              \"minutes\": this.restartDict.interval\r\n            },\r\n            \"execute_count\": this.restartDict.operation_num\r\n          }\r\n          api.disApi.setTimer(this.timerData)\r\n          .then(res=>{\r\n            this.deviceRestartVisible = false\r\n            if (res.success){\r\n              this.$message.info('配置下发成功,请稍后在任务管理中心查看结果')\r\n            }else{\r\n              this.$message.error('配置下发失败: ' + res.msg)\r\n              \r\n              let taskUpData = {\r\n                \"task_id\": taskId, \r\n                \"result\": \"失败\",\r\n                \"message\": '配置下发失败: ' + res.msg\r\n              }\r\n              api.disApi.insertTask(taskUpData)\r\n            }\r\n          }\r\n          )\r\n        }else{\r\n          this.$message.error('创建任务失败: ' + res.msg)\r\n        }\r\n      })\r\n\r\n    },\r\n\r\n    beforeUpload(file){\r\n      let type = file.name.split(\".\");\r\n      type = type[type.length - 1];\r\n    },\r\n\r\n    async setDeviceTime(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'checkTime',{\"time\": \"2019-07-11T20:02:26+08:00\"})\r\n      return res\r\n    },\r\n\r\n    async deviceSSHOpen(){\r\n      let row = {...this.testObjSelData}\r\n      let op = this.checkedSSH?'true':'false'\r\n      let res = await this.handelDeviceOprate(row,'networkSSH',{op:op})\r\n      if(res.success&&res.data.operate){\r\n        this.sshDialogVisible = false\r\n        this.$message.success('设置成功。')\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n    },\r\n\r\n    async getDeviceSSHOpen(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'ssh_capabilities')\r\n      if(res.success&&res.data.operate){\r\n        if(res.data['result']['SSH']['enabled']==\"true\"){\r\n          this.checkedSSH = true\r\n        }else{\r\n          this.checkedSSH = false\r\n        }\r\n      }else{\r\n        this.$message.error(res.msg)\r\n      }\r\n    },\r\n\r\n    async getDeviceTime(){\r\n      let row = {...this.testObjSelData}\r\n      let res = await this.handelDeviceOprate(row,'currentTime')\r\n      if(res.success&&res.data.operate){\r\n        this.$message.info('此设备已自动校时。')\r\n        this.timeItem['deviceTime'] = res.data['result']\r\n      }\r\n    },\r\n\r\n    async deviceChanelsConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let get_ipcRes = await this.handelDeviceOprate(row,'get_ipc')\r\n      if(get_ipcRes.success&&get_ipcRes.data.operate){\r\n        let ipAddress= get_ipcRes.data['result']['InputProxyChannelList']['InputProxyChannel']\r\n        let ips = []\r\n        if(ipAddress instanceof Array){\r\n          for(let ipItem of ipAddress){\r\n            ips.push(ipItem['sourceInputPortDescriptor']['ipAddress'])            \r\n          }\r\n        }else{\r\n          ips.push(ipAddress['sourceInputPortDescriptor']['ipAddress'])\r\n        }\r\n        if(ips.indexOf(this.channelItem['ip'])>-1){\r\n          this.$message.error('此IP已经增加过,请重新填写。')\r\n        }else{\r\n          let res = await this.handelDeviceOprate(row,'addIpc',this.channelItem)\r\n          if(res.success&&res.data.operate){\r\n            this.channelsDialogVisible = false\r\n            this.$message.success('添加成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }  \r\n        }\r\n      }else{\r\n        this.$message.error(`${get_ipcRes.msg}`)\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceUserAddConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let getUser = await this.handelDeviceOprate(row,'getUser')\r\n      if(getUser.success&&getUser.data.operate){\r\n        let users= getUser.data['result']['UserList']['User']\r\n        let userNames = []\r\n        if(users instanceof Array){\r\n          for(let u of users){\r\n            userNames.push(u['userName'])            \r\n          }\r\n        }else{\r\n          userNames.push(users['userName'])\r\n        }\r\n        if(userNames.indexOf(this.userDict['username'])>-1){\r\n          this.$message.error('此用户名已经增加过,请重新填写。')\r\n        }else{\r\n          let res = await this.handelDeviceOprate(row,'addUser',this.userDict)\r\n          if(res.success&&res.data.operate){\r\n            this.addUserDialogVisible = false\r\n            this.$message.success('添加用户成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }\r\n        }\r\n      }else{\r\n        this.$message.error(`${getUser.msg}`)\r\n      }\r\n\r\n    },\r\n\r\n    async deviceUserModifyConfirm(){\r\n      let row = {...this.testObjSelData}\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let getUser = await this.handelDeviceOprate(row,'getUser')\r\n      if(getUser.success&&getUser.data.operate){\r\n        let users= getUser.data['result']['UserList']['User']\r\n        let userNames = []\r\n        let owlUser = {}\r\n        if(users instanceof Array){\r\n          for(let u of users){\r\n            userNames.push(u['userName'])\r\n            if(u['userName']==this.userDict['username']){\r\n              owlUser = {...u}\r\n            }         \r\n          }\r\n        }else{\r\n          userNames.push(users['userName'])\r\n          owlUser = {...users}\r\n        }\r\n        let nindex = userNames.indexOf(this.userDict['username'])\r\n        if(nindex == -1){\r\n          this.$message.error('此用户名未找到,无法修改。')\r\n        }else{\r\n          Object.assign(this.userDict,{user_id:owlUser['id']})\r\n          let res = await this.handelDeviceOprate(row,'modifyUser',this.userDict,owlUser['id'])\r\n          if(res.success&&res.data.operate){\r\n            this.modifyUserDialogVisible = false\r\n            this.modifyAisPassword(validas)\r\n            this.$message.success('修改用户成功。')\r\n          }else{\r\n            this.$message.error(`${res.msg}`)\r\n          }\r\n        }\r\n      }else{\r\n        this.$message.error(`${getUser.msg}`)\r\n      }\r\n\r\n    },\r\n\r\n    modifyAisPassword(validas){\r\n      if(validas[1]['device_username']==this.userDict['username']){\r\n        let resId = this.testObjSelData.tlabTestObjectId.split('-')[2];\r\n        let resourceType = this.testObjSelData.tlabTestObjectId.split('-')[1];\r\n        let disItem = {\r\n          res_id:resId,\r\n          res_type:resId,\r\n          device_password:this.userDict['password']\r\n        }\r\n        api.labApi.modifyResource(this.userInfo.loginName, [disItem]).then(res => {\r\n        })\r\n        .catch(err => {\r\n          console.log(err);\r\n        });\r\n      }\r\n\r\n    },\r\n\r\n    deviceSSh(row){\r\n      this.getDeviceSSHOpen()\r\n      this.sshDialogVisible = true\r\n    },\r\n\r\n    async deviceSetTime(row){\r\n      try {\r\n        await this.setDeviceTime()\r\n        this.getDeviceTime()\r\n        this.timeDialogVisible = true\r\n      } catch (error) {\r\n        this.$message.err('获取失败')\r\n      }\r\n    },\r\n\r\n    deviceChanels(row){\r\n      this.channelsDialogVisible = true\r\n    },\r\n\r\n    deviceUserModify(row){\r\n      this.userDict = {...this.userDictItem}\r\n      this.modifyUserDialogVisible = true\r\n    },\r\n    deviceUserAdd(row){\r\n      this.userDict = {...this.userDictItem}\r\n      this.addUserDialogVisible = true\r\n    },\r\n    modifyRestartFlag(){\r\n      this.deviceRestartVisible = true\r\n    },\r\n    deviceRestartConfirm(rows){\r\n      this.deviceRestartVisible = false\r\n    },\r\n    async deviceHddFormat(){\r\n      if(!this.currentFormat['formatList']){\r\n        this.$message.error('请先选择磁盘。')\r\n        return\r\n      } \r\n      for(let hdd of this.currentFormat['formatList']){\r\n        this.forMating = true\r\n        let data = {\r\n          method:'hddOneFormat',\r\n          ID:hdd.id\r\n        }\r\n        api.labApi.deviceOprate(this.currentFormat['ip'],this.currentFormat['res'],this.currentFormat['res_id'],data).then(res=>{\r\n          this.forMating = true\r\n        }).catch((err)=>{\r\n          this.forMating = false\r\n          this.$message.error('无法请求')\r\n        })\r\n        setTimeout(()=>{\r\n          let interval = setInterval(()=>{\r\n            let dataP = {\r\n              method:'hddFormatStatus',\r\n              ID:hdd.id\r\n            }\r\n    \r\n            api.labApi.deviceOprate(this.currentFormat['ip'],this.currentFormat['res'],this.currentFormat['res_id'],dataP).then(res=>{\r\n              if(res.success&&res.data.operate){\r\n                let percent = res.data.result['formatStatus']['percent']||0\r\n                this.deviceHddData.map(item=>{\r\n                  if(item.id == hdd.id){\r\n                    item.percent = percent+'%'\r\n                  }\r\n                })\r\n                if(percent==100){\r\n                  this.forMating = false\r\n                  clearInterval(interval)\r\n                }else{\r\n                  this.forMating = true\r\n                }\r\n              }\r\n            }).catch(()=>{\r\n                this.forMating = false\r\n                clearInterval(interval)\r\n            })\r\n\r\n          },2000)\r\n        },2000)\r\n\r\n      }\r\n    },\r\n\r\n    handleHddSelectChange(val){\r\n      this.currentFormat['formatList'] = val\r\n    },\r\n\r\n    async deviceHddManage(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let res = await this.handelDeviceOprate(row,'hddCapabilities')\r\n      if(res.success&&res.data.operate){\r\n        let device = row.tlabTestObjectId.split('-')\r\n        this.currentFormat = {ip:validas[1]['ip'],id:row.id,name:row.name,res:device[0],res_id:device[2]}\r\n        this.deviceHddData = res.data.result\r\n        this.hddDialogVisible = true\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n    },\r\n\r\n    handleFormatClose(){\r\n      if(this.forMating){\r\n        this.$confirm('设备正在格式化,退出后可能暂时无法再次打开此设备硬盘管理窗口,是否继续?', '提示', {\r\n                    confirmButtonText: '确定',\r\n                    cancelButtonText: '取消',\r\n                    confirmButtonClass: 'btn-red',\r\n                    type: 'warning'\r\n          }).then(() => {\r\n            this.forMating = false\r\n            this.hddDialogVisible = false\r\n          }).catch(_ => {});\r\n      }else{\r\n            this.hddDialogVisible = false\r\n      }\r\n    },\r\n\r\n    async getParamsKey(row,device_username,device_password){\r\n      let keyIterateNum = 100\r\n      let keyResNum =await this.handelDeviceOprate(row,'securityCapabilities')\r\n      if(keyResNum.success&&keyResNum.data.operate){\r\n        keyIterateNum = keyResNum.data.result.keyIterateNum\r\n      }\r\n      const encry_iv = md5(new Date().getTime().toString());\r\n      const secretKey = getSecretKey(\r\n            device_username,\r\n            device_password,\r\n            encry_iv,\r\n            keyIterateNum,\r\n            ''\r\n      );\r\n      let params = {security: 1, iv: encry_iv, secretkey: secretKey}\r\n      return params\r\n\r\n    },\r\n    \r\n    validateRow(row){\r\n      let value = JSON.parse(row.value);\r\n      let ip = ''\r\n      let device_username = ''\r\n      let device_password = ''\r\n      value.map(item=>{\r\n        if(item.key=='ip'){\r\n          ip = item.value\r\n        }\r\n        if(item.key=='device_username'){\r\n          device_username = item.value\r\n        }\r\n        if(item.key=='device_password'){\r\n          device_password = item.value\r\n        }\r\n      })\r\n      let errss = []\r\n      if(ip===''){\r\n        errss.push('IP')\r\n      }\r\n      if(device_username===''){\r\n        errss.push('设备用户名')\r\n      }\r\n      if(device_password===''){\r\n        errss.push('设备密码')\r\n      }\r\n      if(ip==''||device_username==''||device_password==''){\r\n        let errstr = String(errss)\r\n\r\n        return [false,errstr]\r\n      }else{\r\n        let res = {\r\n          ip,\r\n          device_username,\r\n          device_password,\r\n        }\r\n        return [true,res]\r\n      }\r\n    },\r\n\r\n    async handelDeviceEncryOprate(row,method){\r\n      let validas = this.validateRow(row)\r\n      let params = {}\r\n      if(validas[0]){\r\n        params =await this.getParamsKey(row,validas[1]['device_username'],validas[1]['device_password'])\r\n      }else{\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n       \r\n      let data = {\r\n        method: method,\r\n        params:params\r\n      }\r\n      let device = row.tlabTestObjectId.split('-')\r\n      return api.labApi.deviceOprate(validas[1]['ip'],device[0],device[2],data).then(res=>{\r\n        return Promise.resolve(res)\r\n      }).catch((err)=>{\r\n        this.$message.error('无法请求')\r\n        return Promise.reject(err)\r\n      })\r\n\r\n    },\r\n\r\n    async deviceExportConfig(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      try {\r\n        let res =await this.handelDeviceEncryOprate(row,'exportConfig')\r\n        if(res.success&&res.data.operate){\r\n          this.$message.info(`导出配置成功,将自动下载,请耐心等待。`);\r\n          let file_name = res.data.file_name\r\n          let download_url = res.data.result.download_url\r\n           let iframe = document.createElement(\"iframe\")\r\n            iframe.style.display = \"none\";\r\n            iframe.src = download_url;\r\n            document.body.appendChild(iframe);\r\n        }else{\r\n          this.$message.error(`${res.msg}`)\r\n        }\r\n      } catch (error) {\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceStatus(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      let res =await this.handelDeviceOprate(row,'boardStatus')\r\n      if(res.success&&res.data.operate){\r\n        this.deviceStatusData =res.data.result\r\n        this.statusDialogVisible = true\r\n      }else{\r\n        this.$message.error(`${res.msg}`)\r\n      }\r\n      \r\n      \r\n    },\r\n\r\n    // todo: 单独提出一个方法\r\n    // getTaskId(disIds){\r\n    //   let data = {\r\n    //     \"cycleId\": parseInt(this.$route.params.id),\r\n    //     \"operationIdObject\": {\r\n    //       \"testObjectIdList\": disIds\r\n    //     }\r\n    //   }\r\n\r\n    //   api.disApi.insertTask(data).then(res=>{\r\n    //     console.log(res)\r\n    //     console.log(\"res.success return: \" + res.success)\r\n    //     console.log(\"res.data.id return: \" + res.data.id)\r\n    //     if (res.success){\r\n    //       console.log(\"任务id: \" + res.data.id)\r\n    //       return res.data.id\r\n    //     }else{\r\n    //       this.$message.error('创建任务失败: ' + res.msg)\r\n    //     }\r\n    //   })\r\n    // },\r\n\r\n    uploadSuccess(response, file, fileList){\r\n      // this.$message.success('文件上传成功')\r\n      this.$refs.upload.clearFiles()\r\n\r\n      let upData = []\r\n      let disIds = []\r\n      \r\n      for (let i in this.testObjSelDataList){\r\n        upData.push({\r\n          \"ip\": this.testObjSelDataList[i].ip,\r\n          \"asset_id\": this.testObjSelDataList[i].tlabTestObjectId\r\n        })\r\n        disIds.push(this.testObjSelDataList[i].tlabTestObjectId)\r\n      };\r\n\r\n      let data = {\r\n        \"cycleId\": parseInt(this.$route.params.id),\r\n        \"taskType\": \"设备升级\",\r\n        // \"creatorName\": this.userInfo.loginName,\r\n        \"result\": \"进行中\",\r\n        \"operationIdObject\": {\r\n          \"testObjectIdList\": disIds\r\n        }\r\n      }\r\n\r\n      api.disApi.insertTask(data).then(res=>{\r\n        if (res.success){\r\n          console.log(\"任务id: \" + res.data.id)\r\n          let taskId = res.data.id\r\n\r\n          let upgradeData = {\r\n            \"job_id\": taskId,\r\n            \"kwargs\": {\r\n              // \"url\": \"http://10.65.144.140:5000/dis/v1/devices/operate\", \r\n              \"url\": this.DEVICE_URL + \"/dis/v1/devices/operate\",\r\n              \"method\": \"post\",\r\n              \"args\": {\r\n                \"method\": \"updateFirmware\",\r\n                \"task_id\": taskId, \r\n                \"operation_num\": this.updateDict.operation_num,\r\n                \"interval\": this.updateDict.interval,\r\n                \"file_url\": response.data.url,\r\n                \"data\": upData\r\n              }\r\n            },\r\n            \"trigger\": \"interval\", \r\n            \"trigger_args\": {\r\n              \"minutes\": this.updateDict.interval\r\n            },\r\n            \"execute_count\": this.updateDict.operation_num\r\n          };\r\n          api.disApi.setTimer(upgradeData).then(res=>{\r\n            this.deviceRestartVisible = false\r\n            if (res.success){\r\n              this.$message.info('配置下发成功,请稍后在任务管理中心查看结果')\r\n            }else{\r\n              this.$message.error('配置下发失败: ' + res.msg)\r\n              \r\n              let taskUpData = {\r\n                \"task_id\": taskId, \r\n                \"result\": \"失败\",\r\n                \"message\": '配置下发失败: ' + res.msg\r\n              }\r\n              api.disApi.insertTask(taskUpData)\r\n            }\r\n          })\r\n        }else{\r\n          this.$message.error('创建任务失败: ' + res.msg)\r\n        }\r\n      })\r\n    },\r\n\r\n    handlePreview(file) {\r\n      this.$refs.upload.data = this.currentUpload['data']\r\n      this.upgradeFile = file\r\n      console.log(\"file is: \" + this.upgradeFile)\r\n    },\r\n\r\n    onChange(file, fileList){\r\n      if(this.currentDevice['method']=='uploading'){\r\n        let type = file.name.split(\".\");\r\n        type = type[type.length - 1];\r\n        \r\n        if (!type.match(/(dav)$/i)) {\r\n          this.$message.error(\"请上传dav格式的升级文件\");\r\n          this.$refs.upload.clearFiles()\r\n          return false;\r\n        }\r\n        this.fileList = [...fileList]\r\n      }\r\n    },\r\n\r\n    submitUpload() {\r\n      if(this.fileList.length>0){\r\n        this.$confirm('是否继续?', '提示', {\r\n                  confirmButtonText: '确定',\r\n                  cancelButtonText: '取消',\r\n                  confirmButtonClass: 'btn-red',\r\n                  type: 'warning'\r\n        }).then(async() => {\r\n          this.$refs.upload.submit();\r\n          this.uploadDialogVisible = false\r\n        })\r\n      }else{\r\n        this.$message.error('请选择文件')\r\n      }\r\n      \r\n    },\r\n\r\n    async deviceUpgrade(row){\r\n        this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name,method:\"uploading\"}\r\n        Object.assign(this.currentUpload,{\r\n          row:row,\r\n          id:row.id,\r\n          ip:\"validas[1]['ip']\",\r\n          name:row.name,\r\n          res:\"device[0]\",\r\n          resId:\"device[2]\",\r\n          data:{}\r\n        })\r\n        console.log(this.currentUpload)\r\n        console.log(this.upgradeData)\r\n        this.uploadDialogVisible = true\r\n    },\r\n\r\n    async handelReboot(row){\r\n      let item = {\r\n        name:row.name,\r\n        dialogMsg: '设备重启中...',\r\n        rebooting:true,\r\n      }\r\n      this.deviceOprates[row.id] = item\r\n      if(this.currentDevice['name']==row.name){\r\n        this.currentDevice = this.deviceOprates[row.id]\r\n      }\r\n      let rebootRes =await this.handelDeviceOprate(row,'reboot')\r\n      if(rebootRes.success&&rebootRes.data.operate){\r\n        this.rebootDialogVisible=true\r\n        setTimeout(()=>{\r\n            let interval = setInterval(async()=>{\r\n            let res =await this.handelDeviceOprate(row,'deviceInfo')\r\n            if(res.success){\r\n              this.deviceOprates[row.id]['rebooting']=false\r\n              this.deviceOprates[row.id]['dialogMsg']='设备重启完成'\r\n              if(this.currentDevice['name']==row.name){\r\n                this.currentDevice = this.deviceOprates[row.id]\r\n              }\r\n              clearInterval(interval)\r\n            }\r\n          },3000)\r\n        },88000)\r\n      }else{\r\n        this.deviceOprates[row.id]['rebooting']=false\r\n        this.deviceOprates[row.id]['dialogMsg']='设备重启失败'\r\n        if(this.currentDevice['name']==row.name){\r\n          this.currentDevice = this.deviceOprates[row.id]\r\n        }\r\n        this.$message.error(`${rebootRes.msg}`)\r\n      }\r\n    },\r\n\r\n    deviceRboot(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name}\r\n      if(!this.currentDevice['rebooting']){\r\n        this.$confirm('是否重启设备?', '提示', {\r\n                confirmButtonText: '确定',\r\n                cancelButtonText: '取消',\r\n                confirmButtonClass: 'btn-red',\r\n                type: 'warning'\r\n        }).then(async() => {\r\n            this.handelReboot(row)\r\n        })\r\n      }else{\r\n        this.rebootDialogVisible=true\r\n      }\r\n    },\r\n\r\n    deviceReset(row){\r\n      let validas = this.validateRow(row)\r\n      if(!validas[0]){\r\n        this.$message.error(`缺少属性[${validas[1]}]配置信息,无法操作设备`);\r\n        return\r\n      }\r\n      this.currentDevice = this.deviceOprates[row.id]?this.deviceOprates[row.id]:{name:row.name}\r\n      if(!this.currentDevice['reseting']){\r\n        this.$confirm('是否恢复设备?', '提示', {\r\n                confirmButtonText: '确定',\r\n                cancelButtonText: '取消',\r\n                confirmButtonClass: 'btn-red',\r\n                type: 'warning'\r\n        }).then(async() => {\r\n          let item = {\r\n            name:row.name,\r\n            dialogMsg: '设备恢复中...',\r\n            reseting:true,\r\n          }\r\n          this.deviceOprates[row.id] = item\r\n          if(this.currentDevice['name']==row.name){\r\n            this.currentDevice = this.deviceOprates[row.id]\r\n          }\r\n          this.rebootDialogVisible=true\r\n          let resetRes =await this.handelDeviceOprate(row,'factoryReset')\r\n          if(resetRes.success&&resetRes.data.result.statusCode=='7'){\r\n            this.deviceOprates[row.id]['reseting'] = false\r\n            this.handelDeviceOprate(row,'reboot')\r\n            let item = {\r\n              name:row.name,\r\n              dialogMsg: '设备恢复成功',\r\n              reseting:false,\r\n            }\r\n            this.deviceOprates[row.id] = item\r\n            if(this.currentDevice['name']==row.name){\r\n              this.currentDevice = this.deviceOprates[row.id]\r\n            }\r\n          }else{\r\n            let item = {\r\n              name:row.name,\r\n              dialogMsg: '设备恢复失败',\r\n              reseting:false,\r\n            }\r\n            this.deviceOprates[row.id] = item\r\n            if(this.currentDevice['name']==row.name){\r\n              this.currentDevice = this.deviceOprates[row.id]\r\n            }\r\n          }\r\n           \r\n        })\r\n      }else{\r\n        this.rebootDialogVisible=true\r\n      }\r\n\r\n    },\r\n\r\n    handelDeviceOprate(row,method,params={}){\r\n      let validas = this.validateRow(row)\r\n      let device = row.tlabTestObjectId.split('-')\r\n      let data = {\r\n        \"method\": method,\r\n        \"params\": params,\r\n      }\r\n      if(params['user_id']){\r\n        Object.assign(data,{ID:params['user_id']})\r\n      }\r\n      return api.labApi.deviceOprate(validas[1]['ip'],device[0],device[2],data).then(res=>{\r\n        return Promise.resolve(res)\r\n      }).catch((err)=>{\r\n        this.$message.error('无法请求')\r\n        return Promise.reject(err)\r\n\r\n      })\r\n\r\n    },\r\n}\r\n};\r\n</script>\r\n\r\n<style scoped>\r\n.serverStatus{\r\n  display: inline-block;\r\n  border-radius: 5px;\r\n  width: 8px;\r\n  height: 8px;\r\n  margin-right: 4px;\r\n}\r\n.normal{\r\n  background: #3bcd8d;\r\n}\r\n.abnormal_network{\r\n  background: #fe5332;\r\n}\r\n.deviceOperation .el-button{\r\n  float: none;\r\n}\r\n.deviceOperation .el-button + .el-button{\r\n  border-left: 1px solid #dddddd;\r\n}\r\n</style>\r\n"}]
<<<OUTPUT ENDS>>>
w0rp commented 5 years ago

I don't think there's an issue with ALE here. I think you need to install a Vue parser for ESLint.