pf 2 лет назад
Родитель
Сommit
f30f10003d
100 измененных файлов с 3309 добавлено и 0 удалено
  1. 6 0
      .eslintignore
  2. 198 0
      .eslintrc.js
  3. 24 0
      .gitignore
  4. 21 0
      LICENSE
  5. 36 0
      README.en.md
  6. 4 0
      README.es.md
  7. 4 0
      README.ja.md
  8. 4 0
      README.zh-CN.md
  9. 5 0
      babel.config.js
  10. 35 0
      build/index.js
  11. 19 0
      build/utils.js
  12. 104 0
      das
  13. 24 0
      jest.config.js
  14. 9 0
      jsconfig.json
  15. 116 0
      mock/article.js
  16. 57 0
      mock/index.js
  17. 84 0
      mock/mock-server.js
  18. 51 0
      mock/remote-search.js
  19. 98 0
      mock/role/index.js
  20. 525 0
      mock/role/routes.js
  21. 84 0
      mock/user.js
  22. 131 0
      package.json
  23. 4 0
      plop-templates/README.md
  24. 26 0
      plop-templates/component/index.hbs
  25. 55 0
      plop-templates/component/prompt.js
  26. 16 0
      plop-templates/store/index.hbs
  27. 62 0
      plop-templates/store/prompt.js
  28. 9 0
      plop-templates/utils.js
  29. 26 0
      plop-templates/view/index.hbs
  30. 55 0
      plop-templates/view/prompt.js
  31. 9 0
      plopfile.js
  32. 5 0
      postcss.config.js
  33. BIN
      public/favicon.ico
  34. 19 0
      public/index.html
  35. 12 0
      public/rem.js
  36. 1 0
      readme.txt
  37. 18 0
      src/App.vue
  38. 41 0
      src/api/article.js
  39. 62 0
      src/api/box-debug-mqtt.js
  40. 20 0
      src/api/box-debug.js
  41. 242 0
      src/api/box.js
  42. 152 0
      src/api/casbin.js
  43. 78 0
      src/api/consumble.js
  44. 183 0
      src/api/content.js
  45. 24 0
      src/api/mock-user.js
  46. 26 0
      src/api/order.js
  47. 21 0
      src/api/plugin.js
  48. 317 0
      src/api/project.js
  49. 8 0
      src/api/qiniu.js
  50. 17 0
      src/api/remote-search.js
  51. 38 0
      src/api/role.js
  52. 35 0
      src/api/user.js
  53. 88 0
      src/api/work-order.js
  54. BIN
      src/assets/401_images/401.gif
  55. BIN
      src/assets/404_images/404.png
  56. BIN
      src/assets/404_images/404_cloud.png
  57. BIN
      src/assets/consumable/Delete.png
  58. BIN
      src/assets/consumable/edit-button.png
  59. BIN
      src/assets/consumable/refresh.png
  60. BIN
      src/assets/custom-theme/fonts/element-icons.ttf
  61. BIN
      src/assets/custom-theme/fonts/element-icons.woff
  62. 1 0
      src/assets/custom-theme/index.css
  63. BIN
      src/assets/debug/add.png
  64. BIN
      src/assets/debug/common_plugin.png
  65. BIN
      src/assets/debug/edit.png
  66. BIN
      src/assets/debug/error-triangle.png
  67. BIN
      src/assets/debug/success.png
  68. BIN
      src/assets/debug/warning.png
  69. BIN
      src/assets/gateway_plugin_new/icon_lock_selected.png
  70. BIN
      src/assets/gateway_plugin_new/icon_unlock_selected.png
  71. BIN
      src/assets/gateway_plugin_new/icon_write_selected.png
  72. BIN
      src/assets/gateway_plugin_new/list_btn_delete.png
  73. BIN
      src/assets/gateway_plugin_new/list_btn_new.png
  74. BIN
      src/assets/gateway_plugin_new/list_disabled.png
  75. BIN
      src/assets/gateway_plugin_new/list_dropdownbox_normal.png
  76. BIN
      src/assets/gateway_plugin_new/list_dropdownbox_selected.png
  77. BIN
      src/assets/gateway_plugin_new/list_icon_dropdown.png
  78. BIN
      src/assets/gateway_plugin_new/list_input_normal.png
  79. BIN
      src/assets/gateway_plugin_new/list_input_selected.png
  80. BIN
      src/assets/gateway_plugin_new/list_menu_checkbox_normal.png
  81. BIN
      src/assets/gateway_plugin_new/list_menu_checkbox_selected.png
  82. BIN
      src/assets/gateway_plugin_new/list_menu_dropdown.png
  83. BIN
      src/assets/gateway_plugin_new/list_menu_packup.png
  84. BIN
      src/assets/gateway_plugin_new/list_radio_normal.png
  85. BIN
      src/assets/gateway_plugin_new/list_radio_selected.png
  86. BIN
      src/assets/gateway_plugin_new/more.png
  87. BIN
      src/assets/gateway_plugin_new/more2.png
  88. BIN
      src/assets/gateway_plugin_new/more3.png
  89. BIN
      src/assets/gateway_plugin_new/navibar_btn_return.png
  90. BIN
      src/assets/gateway_plugin_new/tab_btn_normal.png
  91. BIN
      src/assets/gateway_plugin_new/tab_btn_save_bg.png
  92. BIN
      src/assets/gateway_plugin_new/tab_btn_selected.png
  93. BIN
      src/assets/gateway_plugin_new/tab_input_remark.png
  94. BIN
      src/assets/login/SourceHanSansCN-Light.otf
  95. BIN
      src/assets/login/login_Shadow.png
  96. BIN
      src/assets/login/login_bg.png
  97. BIN
      src/assets/login/login_bg1.png
  98. BIN
      src/assets/login/login_btn.png
  99. BIN
      src/assets/login/login_btn_normal.png
  100. 0 0
      src/assets/login/login_btn_pressed.png

+ 6 - 0
.eslintignore

@@ -0,0 +1,6 @@
+build/*.js
+src/assets
+public
+dist
+
+*

+ 198 - 0
.eslintrc.js

@@ -0,0 +1,198 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline":"off",
+    "vue/name-property-casing": ["error", "PascalCase"],
+    "vue/no-v-html": "off",
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}

+ 24 - 0
.gitignore

@@ -0,0 +1,24 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
+l.rar

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017-present PanJiaChen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 36 - 0
README.en.md

@@ -0,0 +1,36 @@
+# 铂睿思-后台web
+
+#### Description
+{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
+
+#### Software Architecture
+Software architecture description
+
+#### Installation
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Instructions
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### Contribution
+
+1.  Fork the repository
+2.  Create Feat_xxx branch
+3.  Commit your code
+4.  Create Pull Request
+
+
+#### Gitee Feature
+
+1.  You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
+2.  Gitee blog [blog.gitee.com](https://blog.gitee.com)
+3.  Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
+4.  The most valuable open source project [GVP](https://gitee.com/gvp)
+5.  The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
+6.  The most popular members  [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 4 - 0
README.es.md

@@ -0,0 +1,4 @@
+# LeenkSee-Admin
+机电管理系统
+基于vue-elemenet-admin + Casbin鉴权 + JWT鉴权的后台管理系统
+<p>by 西歪歪 2020/04/06</p>

+ 4 - 0
README.ja.md

@@ -0,0 +1,4 @@
+# LeenkSee-Admin
+机电管理系统
+基于vue-elemenet-admin + Casbin鉴权 + JWT鉴权的后台管理系统
+<p>by 西歪歪 2020/04/06</p>

+ 4 - 0
README.zh-CN.md

@@ -0,0 +1,4 @@
+# LeenkSee-Admin
+机电管理系统
+基于vue-elemenet-admin + Casbin鉴权 + JWT鉴权的后台管理系统
+<p>by 西歪歪 2020/04/06</p>

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}

+ 19 - 0
build/utils.js

@@ -0,0 +1,19 @@
+var px2remLoader = {
+  loader: 'px2rem-loader',
+  options: {
+    remUnit: 136.6 //设计稿宽度/10
+  }
+};
+
+// generate loader string to be used with extract text plugin
+function generateLoaders(loader, loaderOptions) {
+  var loaders = [cssLoader, px2remLoader]; //添加px2rem 插件
+  if (loader) {
+    loaders.push({
+      loader: loader + '-loader',
+      options: Object.assign({}, loaderOptions, {
+        sourceMap: options.sourceMap
+      })
+    })
+  }
+}

+ 104 - 0
das

@@ -0,0 +1,104 @@
+67b575b (HEAD -> master, linkseestore/master, linkseestore/dev, linkseestore/67b575b) HEAD@{0}: reset: moving to 67b575bdc9ed166d46f3b1a4221e91105bdc75e5
+67b575b (HEAD -> master, linkseestore/master, linkseestore/dev, linkseestore/67b575b) HEAD@{1}: reset: moving to 67b575bdc9ed166d46f3b1a4221e91105bdc75e5
+86a3c1d HEAD@{2}: reset: moving to HEAD
+86a3c1d HEAD@{3}: commit: 备份一下
+67b575b (HEAD -> master, linkseestore/master, linkseestore/dev, linkseestore/67b575b) HEAD@{4}: commit: 备份
+5b5ca53 HEAD@{5}: commit: +耗材使用率
+88778bb (origin/dev) HEAD@{6}: commit: 工单及相关 功能、样式调整
+ab147c0 HEAD@{7}: commit: 耗材+工单
+f5643a9 HEAD@{8}: commit: 空品bug fix
+5209a52 HEAD@{9}: commit: 插件盒子修改fix 存储
+05905c9 HEAD@{10}: commit: 兼容旧插件备份
+9901e66 HEAD@{11}: pull --tags linkseestore dev: Fast-forward
+6aa78fa HEAD@{12}: commit: merge
+359b925 HEAD@{13}: commit: 空品 电表功能回归
+736c92a HEAD@{14}: commit: 2020/06/04 0:29 merge
+08cf5de HEAD@{15}: rebase finished: returning to refs/heads/master
+08cf5de HEAD@{16}: pull --rebase linkseestore dev: checkout 08cf5de49108c84109cbbca5fbd15609586f14ba
+ae0bb41 HEAD@{17}: commit: 空品 + 电表
+6ead005 HEAD@{18}: commit (merge): Merge branch 'dev' of http://47.111.224.110:3000/pf/linksee-backend-web
+0c4e3e2 HEAD@{19}: commit: before merge
+81dec35 HEAD@{20}: commit: 新风机order fix
+f751ea7 HEAD@{21}: commit: merge
+20211bb HEAD@{22}: pull --tags linkseestore dev: Fast-forward
+fa7c8ae HEAD@{23}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+49d4406 HEAD@{24}: commit: before merge
+9a72ea1 HEAD@{25}: commit: before merge
+f470a62 HEAD@{26}: pull --tags linkseestore dev: Fast-forward
+1932be9 HEAD@{27}: pull --tags linkseestore dev: Fast-forward
+d9670a3 HEAD@{28}: commit (merge): cy合并 可能有问题
+8b30ad5 HEAD@{29}: commit: cy 2020/05/18 0:34 before merge
+d425653 HEAD@{30}: commit: cy 2020/5/17 19:29 before merge
+b8937b7 HEAD@{31}: pull --tags linkseestore dev: Fast-forward
+ac26e9f HEAD@{32}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+ea8d296 HEAD@{33}: commit: cy 2020/05/17 before commit
+eafa3be HEAD@{34}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+6ad4864 HEAD@{35}: commit: merge
+38b1a2e HEAD@{36}: pull --tags linkseestore dev: Fast-forward
+0616a44 HEAD@{37}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+81eae32 HEAD@{38}: commit: cy 2020/05/17 before merge
+8254e3e (origin/master, origin/HEAD) HEAD@{39}: commit: 除可见不可见问题外的修改
+064e449 HEAD@{40}: pull --tags linkseestore dev: Fast-forward
+dc570d7 HEAD@{41}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+ff382ef HEAD@{42}: commit: type bug fix
+c8b5cd1 HEAD@{43}: commit: 部分问题修改 +
+7c9615c HEAD@{44}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+12bc79e HEAD@{45}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+0820390 HEAD@{46}: commit: merge
+a4e90cf HEAD@{47}: pull --tags linkseestore dev: Fast-forward
+94b0494 HEAD@{48}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+8338f3a HEAD@{49}: commit: 装置和standalone带上id
+81f8677 HEAD@{50}: commit (merge): Merge branch 'dev' of http://47.111.224.110:3000/pf/linksee-backend-web
+307c9b5 HEAD@{51}: commit: 同步按钮+装置type
+0059f9a HEAD@{52}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+069406d HEAD@{53}: commit: 2020-05-12
+c61652e HEAD@{54}: commit: 末端完成
+92acf03 HEAD@{55}: commit: cy备份
+8355d1e HEAD@{56}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+d2e49ac HEAD@{57}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+56ab563 HEAD@{58}: pull --tags linkseestore dev: Merge made by the 'recursive' strategy.
+63f15e7 HEAD@{59}: commit: edit完成合并
+af3ab32 HEAD@{60}: pull --tags linkseestore dev: Fast-forward
+b518f84 HEAD@{61}: pull --tags linkseestore dev: Fast-forward
+548ef1a HEAD@{62}: commit: 末端
+3dae613 HEAD@{63}: commit: createbox 98%
+0fb28b6 HEAD@{64}: commit: create-box 95%
+f23d1c4 HEAD@{65}: commit: 整合
+43dd8a2 HEAD@{66}: commit: 主机
+8a91399 HEAD@{67}: commit: create完毕
+3365f5d HEAD@{68}: commit: edit 备份
+de35959 HEAD@{69}: commit: edit 部分备份
+a021367 HEAD@{70}: commit: JSON校对 备份
+52c2e94 HEAD@{71}: commit: 末端
+07baac0 HEAD@{72}: commit:  + 部分参数未确定 保存
+8813ab8 HEAD@{73}: commit: 新风机插件高级设置完成 保存
+29dcb36 HEAD@{74}: commit: 换热站基础设置完成
+589f82c HEAD@{75}: commit: 新风机基本完成
+41ed3d7 HEAD@{76}: commit: 新风机部分存档
+9dcf2dd HEAD@{77}: commit: 修改命令出现双向绑定的问题
+739c959 HEAD@{78}: commit: 插件option显示+筛选
+d83cd5a HEAD@{79}: commit: 指征供水温度自定义装置完成 保存
+76ddd01 HEAD@{80}: commit: 12
+b440217 HEAD@{81}: commit: 盒子列表筛选+高级设置+项目未选择时隐藏+系统可用模式
+69c6b70 HEAD@{82}: commit: 流程修改
+311be45 HEAD@{83}: commit: 盒子管理:新增主机
+67bf90d HEAD@{84}: commit: mege
+bd1915c HEAD@{85}: commit: merge
+2a4ef0d HEAD@{86}: pull --tags LeenkSee dev: Fast-forward
+8e0ba22 HEAD@{87}: commit: 盒子管理
+2c7c734 HEAD@{88}: commit: 修改冗余代码+edit 赋值 对应问题修改
+30aca9e HEAD@{89}: pull LeenkSee dev: Merge made by the 'recursive' strategy.
+190828b HEAD@{90}: commit: mqtt联调
+f5be1ef HEAD@{91}: commit: 各种bug fixed
+d07a0b8 HEAD@{92}: commit (merge): merge
+9a01d7f HEAD@{93}: commit (merge): 1
+02764f7 HEAD@{94}: commit: q
+0d2505c HEAD@{95}: commit: merge
+5eb36ab HEAD@{96}: commit (merge): Merge branch 'master' of https://github.com/q849830742/LeenkSee-Admin
+8705ee2 HEAD@{97}: commit: 未同步上传
+d36fd0c HEAD@{98}: pull --tags origin master: Fast-forward
+7f3bc2a HEAD@{99}: pull --tags origin master: Fast-forward
+3080c39 HEAD@{100}: commit: merge
+4011c90 HEAD@{101}: pull --tags origin master: Fast-forward
+1324538 HEAD@{102}: commit: merge
+978639b HEAD@{103}: clone: from https://github.com/q849830742/LeenkSee-Admin.git

+ 24 - 0
jest.config.js

@@ -0,0 +1,24 @@
+module.exports = {
+  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
+      'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest'
+  },
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/src/$1'
+  },
+  snapshotSerializers: ['jest-serializer-vue'],
+  testMatch: [
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+  ],
+  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
+  coverageDirectory: '<rootDir>/tests/unit/coverage',
+  // 'collectCoverage': true,
+  'coverageReporters': [
+    'lcov',
+    'text-summary'
+  ],
+  testURL: 'http://localhost/'
+}

+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
+{ 
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+        "@/*": ["src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}

+ 116 - 0
mock/article.js

@@ -0,0 +1,116 @@
+import Mock from 'mockjs'
+
+const List = []
+const count = 100
+
+const baseContent = '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
+const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3'
+
+for (let i = 0; i < count; i++) {
+  List.push(Mock.mock({
+    id: '@increment',
+    timestamp: +Mock.Random.date('T'),
+    author: '@first',
+    reviewer: '@first',
+    title: '@title(5, 10)',
+    content_short: 'mock data',
+    content: baseContent,
+    forecast: '@float(0, 100, 2, 2)',
+    importance: '@integer(1, 3)',
+    'type|1': ['CN', 'US', 'JP', 'EU'],
+    'status|1': ['published', 'draft'],
+    display_time: '@datetime',
+    comment_disabled: true,
+    pageviews: '@integer(300, 5000)',
+    image_uri,
+    platforms: ['a-platform']
+  }))
+}
+
+export default [
+  {
+    url: '/vue-element-admin/article/list',
+    type: 'get',
+    response: config => {
+      const { importance, type, title, page = 1, limit = 20, sort } = config.query
+
+      let mockList = List.filter(item => {
+        if (importance && item.importance !== +importance) return false
+        if (type && item.type !== type) return false
+        if (title && item.title.indexOf(title) < 0) return false
+        return true
+      })
+
+      if (sort === '-id') {
+        mockList = mockList.reverse()
+      }
+
+      const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
+
+      return {
+        code: 20000,
+        data: {
+          total: mockList.length,
+          items: pageList
+        }
+      }
+    }
+  },
+
+  {
+    url: '/vue-element-admin/article/detail',
+    type: 'get',
+    response: config => {
+      const { id } = config.query
+      for (const article of List) {
+        if (article.id === +id) {
+          return {
+            code: 20000,
+            data: article
+          }
+        }
+      }
+    }
+  },
+
+  {
+    url: '/vue-element-admin/article/pv',
+    type: 'get',
+    response: _ => {
+      return {
+        code: 20000,
+        data: {
+          pvData: [
+            { key: 'PC', pv: 1024 },
+            { key: 'mobile', pv: 1024 },
+            { key: 'ios', pv: 1024 },
+            { key: 'android', pv: 1024 }
+          ]
+        }
+      }
+    }
+  },
+
+  {
+    url: '/vue-element-admin/article/create',
+    type: 'post',
+    response: _ => {
+      return {
+        code: 20000,
+        data: 'success'
+      }
+    }
+  },
+
+  {
+    url: '/vue-element-admin/article/update',
+    type: 'post',
+    response: _ => {
+      return {
+        code: 20000,
+        data: 'success'
+      }
+    }
+  }
+]
+

+ 57 - 0
mock/index.js

@@ -0,0 +1,57 @@
+import Mock from 'mockjs'
+import { param2Obj } from '../src/utils'
+
+import user from './user'
+import role from './role'
+import article from './article'
+import search from './remote-search'
+
+const mocks = [
+  ...user,
+  ...role,
+  ...article,
+  ...search
+]
+
+// for front mock
+// please use it cautiously, it will redefine XMLHttpRequest,
+// which will cause many of your third-party libraries to be invalidated(like progress event).
+export function mockXHR() {
+  // mock patch
+  // https://github.com/nuysoft/Mock/issues/300
+  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
+  Mock.XHR.prototype.send = function() {
+    if (this.custom.xhr) {
+      this.custom.xhr.withCredentials = this.withCredentials || false
+
+      if (this.responseType) {
+        this.custom.xhr.responseType = this.responseType
+      }
+    }
+    this.proxy_send(...arguments)
+  }
+
+  function XHR2ExpressReqWrap(respond) {
+    return function(options) {
+      let result = null
+      if (respond instanceof Function) {
+        const { body, type, url } = options
+        // https://expressjs.com/en/4x/api.html#req
+        result = respond({
+          method: type,
+          body: JSON.parse(body),
+          query: param2Obj(url)
+        })
+      } else {
+        result = respond
+      }
+      return Mock.mock(result)
+    }
+  }
+
+  for (const i of mocks) {
+    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
+  }
+}
+
+export default mocks

+ 84 - 0
mock/mock-server.js

@@ -0,0 +1,84 @@
+const chokidar = require('chokidar')
+const bodyParser = require('body-parser')
+const chalk = require('chalk')
+const path = require('path')
+const Mock = require('mockjs')
+
+const mockDir = path.join(process.cwd(), 'mock')
+
+function registerRoutes(app) {
+  let mockLastIndex
+  const { default: mocks } = require('./index.js')
+  const mocksForServer = mocks.map(route => {
+    return responseFake(route.url, route.type, route.response)
+  })
+  for (const mock of mocksForServer) {
+    app[mock.type](mock.url, mock.response)
+    mockLastIndex = app._router.stack.length
+  }
+  const mockRoutesLength = Object.keys(mocksForServer).length
+  return {
+    mockRoutesLength: mockRoutesLength,
+    mockStartIndex: mockLastIndex - mockRoutesLength
+  }
+}
+
+function unregisterRoutes() {
+  Object.keys(require.cache).forEach(i => {
+    if (i.includes(mockDir)) {
+      delete require.cache[require.resolve(i)]
+    }
+  })
+}
+
+// for mock server
+const responseFake = (url, type, respond) => {
+  return {
+    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
+    type: type || 'get',
+    response(req, res) {
+      console.log('request invoke:' + req.path)
+      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
+    }
+  }
+}
+
+module.exports = app => {
+  // es6 polyfill
+  require('@babel/register')
+
+  // parse app.body
+  // https://expressjs.com/en/4x/api.html#req.body
+  app.use(bodyParser.json())
+  app.use(bodyParser.urlencoded({
+    extended: true
+  }))
+
+  const mockRoutes = registerRoutes(app)
+  var mockRoutesLength = mockRoutes.mockRoutesLength
+  var mockStartIndex = mockRoutes.mockStartIndex
+
+  // watch files, hot reload mock server
+  chokidar.watch(mockDir, {
+    ignored: /mock-server/,
+    ignoreInitial: true
+  }).on('all', (event, path) => {
+    if (event === 'change' || event === 'add') {
+      try {
+        // remove mock routes stack
+        app._router.stack.splice(mockStartIndex, mockRoutesLength)
+
+        // clear routes cache
+        unregisterRoutes()
+
+        const mockRoutes = registerRoutes(app)
+        mockRoutesLength = mockRoutes.mockRoutesLength
+        mockStartIndex = mockRoutes.mockStartIndex
+
+        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
+      } catch (error) {
+        console.log(chalk.redBright(error))
+      }
+    }
+  })
+}

+ 51 - 0
mock/remote-search.js

@@ -0,0 +1,51 @@
+import Mock from 'mockjs'
+
+const NameList = []
+const count = 100
+
+for (let i = 0; i < count; i++) {
+  NameList.push(Mock.mock({
+    name: '@first'
+  }))
+}
+NameList.push({ name: 'mock-Pan' })
+
+export default [
+  // username search
+  {
+    url: '/vue-element-admin/search/user',
+    type: 'get',
+    response: config => {
+      const { name } = config.query
+      const mockNameList = NameList.filter(item => {
+        const lowerCaseName = item.name.toLowerCase()
+        return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0)
+      })
+      return {
+        code: 20000,
+        data: { items: mockNameList }
+      }
+    }
+  },
+
+  // transaction list
+  {
+    url: '/vue-element-admin/transaction/list',
+    type: 'get',
+    response: _ => {
+      return {
+        code: 20000,
+        data: {
+          total: 20,
+          'items|20': [{
+            order_no: '@guid()',
+            timestamp: +Mock.Random.date('T'),
+            username: '@name()',
+            price: '@float(1000, 15000, 0, 2)',
+            'status|1': ['success', 'pending']
+          }]
+        }
+      }
+    }
+  }
+]

+ 98 - 0
mock/role/index.js

@@ -0,0 +1,98 @@
+import Mock from 'mockjs'
+import { deepClone } from '../../src/utils/index.js'
+import { asyncRoutes, constantRoutes } from './routes.js'
+
+const routes = deepClone([...constantRoutes, ...asyncRoutes])
+
+const roles = [
+  {
+    key: 'admin',
+    name: 'admin',
+    description: 'Super Administrator. Have access to view all pages.',
+    routes: routes
+  },
+  {
+    key: 'editor',
+    name: 'editor',
+    description: 'Normal Editor. Can see all pages except permission page',
+    routes: routes.filter(i => i.path !== '/permission')// just a mock
+  },
+  {
+    key: 'visitor',
+    name: 'visitor',
+    description: 'Just a visitor. Can only see the home page and the document page',
+    routes: [{
+      path: '',
+      redirect: 'dashboard',
+      children: [
+        {
+          path: 'dashboard',
+          name: 'Dashboard',
+          meta: { title: 'dashboard', icon: 'dashboard' }
+        }
+      ]
+    }]
+  }
+]
+
+export default [
+  // mock get all routes form server
+  {
+    url: '/vue-element-admin/routes',
+    type: 'get',
+    response: _ => {
+      return {
+        code: 20000,
+        data: routes
+      }
+    }
+  },
+
+  // mock get all roles form server
+  {
+    url: '/vue-element-admin/roles',
+    type: 'get',
+    response: _ => {
+      return {
+        code: 20000,
+        data: roles
+      }
+    }
+  },
+
+  // add role
+  {
+    url: '/vue-element-admin/role',
+    type: 'post',
+    response: {
+      code: 20000,
+      data: {
+        key: Mock.mock('@integer(300, 5000)')
+      }
+    }
+  },
+
+  // update role
+  {
+    url: '/vue-element-admin/role/[A-Za-z0-9]',
+    type: 'put',
+    response: {
+      code: 20000,
+      data: {
+        status: 'success'
+      }
+    }
+  },
+
+  // delete role
+  {
+    url: '/vue-element-admin/role/[A-Za-z0-9]',
+    type: 'delete',
+    response: {
+      code: 20000,
+      data: {
+        status: 'success'
+      }
+    }
+  }
+]

+ 525 - 0
mock/role/routes.js

@@ -0,0 +1,525 @@
+// Just a mock data
+
+export const constantRoutes = [
+  {
+    path: '/redirect',
+    component: 'layout/Layout',
+    hidden: true,
+    children: [
+      {
+        path: '/redirect/:path*',
+        component: 'views/redirect/index'
+      }
+    ]
+  },
+  {
+    path: '/login',
+    component: 'views/login/index',
+    hidden: true
+  },
+  {
+    path: '/auth-redirect',
+    component: 'views/login/auth-redirect',
+    hidden: true
+  },
+  {
+    path: '/404',
+    component: 'views/error-page/404',
+    hidden: true
+  },
+  {
+    path: '/401',
+    component: 'views/error-page/401',
+    hidden: true
+  },
+  {
+    path: '',
+    component: 'layout/Layout',
+    redirect: 'dashboard',
+    children: [
+      {
+        path: 'dashboard',
+        component: 'views/dashboard/index',
+        name: 'Dashboard',
+        meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
+      }
+    ]
+  },
+  {
+    path: '/documentation',
+    component: 'layout/Layout',
+    children: [
+      {
+        path: 'index',
+        component: 'views/documentation/index',
+        name: 'Documentation',
+        meta: { title: 'Documentation', icon: 'documentation', affix: true }
+      }
+    ]
+  },
+  {
+    path: '/guide',
+    component: 'layout/Layout',
+    redirect: '/guide/index',
+    children: [
+      {
+        path: 'index',
+        component: 'views/guide/index',
+        name: 'Guide',
+        meta: { title: 'Guide', icon: 'guide', noCache: true }
+      }
+    ]
+  }
+]
+
+export const asyncRoutes = [
+  {
+    path: '/permission',
+    component: 'layout/Layout',
+    redirect: '/permission/index',
+    alwaysShow: true,
+    meta: {
+      title: 'Permission',
+      icon: 'lock',
+      roles: ['admin', 'editor']
+    },
+    children: [
+      {
+        path: 'page',
+        component: 'views/permission/page',
+        name: 'PagePermission',
+        meta: {
+          title: 'Page Permission',
+          roles: ['admin']
+        }
+      },
+      {
+        path: 'directive',
+        component: 'views/permission/directive',
+        name: 'DirectivePermission',
+        meta: {
+          title: 'Directive Permission'
+        }
+      },
+      {
+        path: 'role',
+        component: 'views/permission/role',
+        name: 'RolePermission',
+        meta: {
+          title: 'Role Permission',
+          roles: ['admin']
+        }
+      }
+    ]
+  },
+
+  {
+    path: '/icon',
+    component: 'layout/Layout',
+    children: [
+      {
+        path: 'index',
+        component: 'views/icons/index',
+        name: 'Icons',
+        meta: { title: 'Icons', icon: 'icon', noCache: true }
+      }
+    ]
+  },
+
+  {
+    path: '/components',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    name: 'ComponentDemo',
+    meta: {
+      title: 'Components',
+      icon: 'component'
+    },
+    children: [
+      {
+        path: 'tinymce',
+        component: 'views/components-demo/tinymce',
+        name: 'TinymceDemo',
+        meta: { title: 'Tinymce' }
+      },
+      {
+        path: 'markdown',
+        component: 'views/components-demo/markdown',
+        name: 'MarkdownDemo',
+        meta: { title: 'Markdown' }
+      },
+      {
+        path: 'json-editor',
+        component: 'views/components-demo/json-editor',
+        name: 'JsonEditorDemo',
+        meta: { title: 'Json Editor' }
+      },
+      {
+        path: 'split-pane',
+        component: 'views/components-demo/split-pane',
+        name: 'SplitpaneDemo',
+        meta: { title: 'SplitPane' }
+      },
+      {
+        path: 'avatar-upload',
+        component: 'views/components-demo/avatar-upload',
+        name: 'AvatarUploadDemo',
+        meta: { title: 'Avatar Upload' }
+      },
+      {
+        path: 'dropzone',
+        component: 'views/components-demo/dropzone',
+        name: 'DropzoneDemo',
+        meta: { title: 'Dropzone' }
+      },
+      {
+        path: 'sticky',
+        component: 'views/components-demo/sticky',
+        name: 'StickyDemo',
+        meta: { title: 'Sticky' }
+      },
+      {
+        path: 'count-to',
+        component: 'views/components-demo/count-to',
+        name: 'CountToDemo',
+        meta: { title: 'Count To' }
+      },
+      {
+        path: 'mixin',
+        component: 'views/components-demo/mixin',
+        name: 'ComponentMixinDemo',
+        meta: { title: 'componentMixin' }
+      },
+      {
+        path: 'back-to-top',
+        component: 'views/components-demo/back-to-top',
+        name: 'BackToTopDemo',
+        meta: { title: 'Back To Top' }
+      },
+      {
+        path: 'drag-dialog',
+        component: 'views/components-demo/drag-dialog',
+        name: 'DragDialogDemo',
+        meta: { title: 'Drag Dialog' }
+      },
+      {
+        path: 'drag-select',
+        component: 'views/components-demo/drag-select',
+        name: 'DragSelectDemo',
+        meta: { title: 'Drag Select' }
+      },
+      {
+        path: 'dnd-list',
+        component: 'views/components-demo/dnd-list',
+        name: 'DndListDemo',
+        meta: { title: 'Dnd List' }
+      },
+      {
+        path: 'drag-kanban',
+        component: 'views/components-demo/drag-kanban',
+        name: 'DragKanbanDemo',
+        meta: { title: 'Drag Kanban' }
+      }
+    ]
+  },
+  {
+    path: '/charts',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    name: 'Charts',
+    meta: {
+      title: 'Charts',
+      icon: 'chart'
+    },
+    children: [
+      {
+        path: 'keyboard',
+        component: 'views/charts/keyboard',
+        name: 'KeyboardChart',
+        meta: { title: 'Keyboard Chart', noCache: true }
+      },
+      {
+        path: 'line',
+        component: 'views/charts/line',
+        name: 'LineChart',
+        meta: { title: 'Line Chart', noCache: true }
+      },
+      {
+        path: 'mixchart',
+        component: 'views/charts/mixChart',
+        name: 'MixChart',
+        meta: { title: 'Mix Chart', noCache: true }
+      }
+    ]
+  },
+  {
+    path: '/nested',
+    component: 'layout/Layout',
+    redirect: '/nested/menu1/menu1-1',
+    name: 'Nested',
+    meta: {
+      title: 'Nested',
+      icon: 'nested'
+    },
+    children: [
+      {
+        path: 'menu1',
+        component: 'views/nested/menu1/index',
+        name: 'Menu1',
+        meta: { title: 'Menu1' },
+        redirect: '/nested/menu1/menu1-1',
+        children: [
+          {
+            path: 'menu1-1',
+            component: 'views/nested/menu1/menu1-1',
+            name: 'Menu1-1',
+            meta: { title: 'Menu1-1' }
+          },
+          {
+            path: 'menu1-2',
+            component: 'views/nested/menu1/menu1-2',
+            name: 'Menu1-2',
+            redirect: '/nested/menu1/menu1-2/menu1-2-1',
+            meta: { title: 'Menu1-2' },
+            children: [
+              {
+                path: 'menu1-2-1',
+                component: 'views/nested/menu1/menu1-2/menu1-2-1',
+                name: 'Menu1-2-1',
+                meta: { title: 'Menu1-2-1' }
+              },
+              {
+                path: 'menu1-2-2',
+                component: 'views/nested/menu1/menu1-2/menu1-2-2',
+                name: 'Menu1-2-2',
+                meta: { title: 'Menu1-2-2' }
+              }
+            ]
+          },
+          {
+            path: 'menu1-3',
+            component: 'views/nested/menu1/menu1-3',
+            name: 'Menu1-3',
+            meta: { title: 'Menu1-3' }
+          }
+        ]
+      },
+      {
+        path: 'menu2',
+        name: 'Menu2',
+        component: 'views/nested/menu2/index',
+        meta: { title: 'Menu2' }
+      }
+    ]
+  },
+
+  {
+    path: '/example',
+    component: 'layout/Layout',
+    redirect: '/example/list',
+    name: 'Example',
+    meta: {
+      title: 'Example',
+      icon: 'example'
+    },
+    children: [
+      {
+        path: 'create',
+        component: 'views/example/create',
+        name: 'CreateArticle',
+        meta: { title: 'Create Article', icon: 'edit' }
+      },
+      {
+        path: 'edit/:id(\\d+)',
+        component: 'views/example/edit',
+        name: 'EditArticle',
+        meta: { title: 'Edit Article', noCache: true },
+        hidden: true
+      },
+      {
+        path: 'list',
+        component: 'views/example/list',
+        name: 'ArticleList',
+        meta: { title: 'Article List', icon: 'list' }
+      }
+    ]
+  },
+
+  {
+    path: '/tab',
+    component: 'layout/Layout',
+    children: [
+      {
+        path: 'index',
+        component: 'views/tab/index',
+        name: 'Tab',
+        meta: { title: 'Tab', icon: 'tab' }
+      }
+    ]
+  },
+
+  {
+    path: '/error',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    name: 'ErrorPages',
+    meta: {
+      title: 'Error Pages',
+      icon: '404'
+    },
+    children: [
+      {
+        path: '401',
+        component: 'views/error-page/401',
+        name: 'Page401',
+        meta: { title: 'Page 401', noCache: true }
+      },
+      {
+        path: '404',
+        component: 'views/error-page/404',
+        name: 'Page404',
+        meta: { title: 'Page 404', noCache: true }
+      }
+    ]
+  },
+
+  {
+    path: '/error-log',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    children: [
+      {
+        path: 'log',
+        component: 'views/error-log/index',
+        name: 'ErrorLog',
+        meta: { title: 'Error Log', icon: 'bug' }
+      }
+    ]
+  },
+
+  {
+    path: '/excel',
+    component: 'layout/Layout',
+    redirect: '/excel/export-excel',
+    name: 'Excel',
+    meta: {
+      title: 'Excel',
+      icon: 'excel'
+    },
+    children: [
+      {
+        path: 'export-excel',
+        component: 'views/excel/export-excel',
+        name: 'ExportExcel',
+        meta: { title: 'Export Excel' }
+      },
+      {
+        path: 'export-selected-excel',
+        component: 'views/excel/select-excel',
+        name: 'SelectExcel',
+        meta: { title: 'Select Excel' }
+      },
+      {
+        path: 'export-merge-header',
+        component: 'views/excel/merge-header',
+        name: 'MergeHeader',
+        meta: { title: 'Merge Header' }
+      },
+      {
+        path: 'upload-excel',
+        component: 'views/excel/upload-excel',
+        name: 'UploadExcel',
+        meta: { title: 'Upload Excel' }
+      }
+    ]
+  },
+
+  {
+    path: '/zip',
+    component: 'layout/Layout',
+    redirect: '/zip/download',
+    alwaysShow: true,
+    meta: { title: 'Zip', icon: 'zip' },
+    children: [
+      {
+        path: 'download',
+        component: 'views/zip/index',
+        name: 'ExportZip',
+        meta: { title: 'Export Zip' }
+      }
+    ]
+  },
+
+  {
+    path: '/pdf',
+    component: 'layout/Layout',
+    redirect: '/pdf/index',
+    children: [
+      {
+        path: 'index',
+        component: 'views/pdf/index',
+        name: 'PDF',
+        meta: { title: 'PDF', icon: 'pdf' }
+      }
+    ]
+  },
+  {
+    path: '/pdf/download',
+    component: 'views/pdf/download',
+    hidden: true
+  },
+
+  {
+    path: '/theme',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    children: [
+      {
+        path: 'index',
+        component: 'views/theme/index',
+        name: 'Theme',
+        meta: { title: 'Theme', icon: 'theme' }
+      }
+    ]
+  },
+
+  {
+    path: '/clipboard',
+    component: 'layout/Layout',
+    redirect: 'noRedirect',
+    children: [
+      {
+        path: 'index',
+        component: 'views/clipboard/index',
+        name: 'ClipboardDemo',
+        meta: { title: 'Clipboard Demo', icon: 'clipboard' }
+      }
+    ]
+  },
+
+  {
+    path: '/i18n',
+    component: 'layout/Layout',
+    children: [
+      {
+        path: 'index',
+        component: 'views/i18n-demo/index',
+        name: 'I18n',
+        meta: { title: 'I18n', icon: 'international' }
+      }
+    ]
+  },
+
+  {
+    path: 'external-link',
+    component: 'layout/Layout',
+    children: [
+      {
+        path: 'https://github.com/PanJiaChen/vue-element-admin',
+        meta: { title: 'External Link', icon: 'link' }
+      }
+    ]
+  },
+
+  { path: '*', redirect: '/404', hidden: true }
+]

+ 84 - 0
mock/user.js

@@ -0,0 +1,84 @@
+
+const tokens = {
+  admin: {
+    token: 'admin-token'
+  },
+  editor: {
+    token: 'editor-token'
+  }
+}
+
+const users = {
+  'admin-token': {
+    roles: ['admin'],
+    introduction: 'I am a super administrator',
+    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+    name: 'Super Admin'
+  },
+  'editor-token': {
+    roles: ['editor'],
+    introduction: 'I am an editor',
+    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+    name: 'Normal Editor'
+  }
+}
+
+export default [
+  // user login
+  {
+    url: '/vue-element-admin/user/login',
+    type: 'post',
+    response: config => {
+      const { username } = config.body
+      const token = tokens[username]
+
+      // mock error
+      if (!token) {
+        return {
+          code: 60204,
+          message: 'Account and password are incorrect.'
+        }
+      }
+
+      return {
+        code: 20000,
+        data: token
+      }
+    }
+  },
+
+  // get user info
+  {
+    url: '/vue-element-admin/user/info\.*',
+    type: 'get',
+    response: config => {
+      const { token } = config.query
+      const info = users[token]
+
+      // mock error
+      if (!info) {
+        return {
+          code: 50008,
+          message: 'Login failed, unable to get user details.'
+        }
+      }
+
+      return {
+        code: 20000,
+        data: info
+      }
+    }
+  },
+
+  // user logout
+  {
+    url: '/vue-admin-template/user/logout',
+    type: 'post',
+    response: _ => {
+      return {
+        code: 20000,
+        data: 'success'
+      }
+    }
+  }
+]

+ 131 - 0
package.json

@@ -0,0 +1,131 @@
+{
+  "name": "vue-element-admin",
+  "version": "4.2.1",
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
+  "author": "Pan <panfree23@gmail.com>",
+  "license": "MIT",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "new": "plop"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
+  },
+  "bugs": {
+    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
+  },
+  "dependencies": {
+    "@json-editor/json-editor": "^2.1.0",
+    "a-vue-steps": "^1.0.0",
+    "axios": "0.18.1",
+    "clipboard": "2.0.4",
+    "cnpm": "^6.1.1",
+    "codemirror": "5.45.0",
+    "core-js": "^2.6.12",
+    "driver.js": "0.9.5",
+    "dropzone": "5.5.1",
+    "echarts": "4.2.1",
+    "element-ui": "2.13.0",
+    "file-saver": "2.0.1",
+    "fuse.js": "3.4.4",
+    "iview": "^1.0.1",
+    "js-cookie": "2.2.0",
+    "jsencrypt": "^3.0.0-rc.1",
+    "json-editor": "^0.7.28",
+    "jsonlint": "1.6.3",
+    "jszip": "3.2.1",
+    "lib-flexible": "^0.3.2",
+    "lodash": "^4.17.20",
+    "mqtt": "^3.0.0",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "paho-mqtt": "^1.1.0",
+    "path-to-regexp": "2.4.0",
+    "postcss-px2rem": "^0.3.0",
+    "prettier": "^1.12.1",
+    "qrcodejs2": "0.0.2",
+    "screenfull": "4.2.0",
+    "script-loader": "0.7.2",
+    "showdown": "1.9.0",
+    "sortablejs": "1.8.4",
+    "tui-editor": "1.3.3",
+    "vue": "2.6.10",
+    "vue-count-to": "1.0.13",
+    "vue-router": "3.0.2",
+    "vue-splitpane": "1.0.4",
+    "vuedraggable": "2.20.0",
+    "vuex": "3.1.0",
+    "xlsx": "0.14.1"
+  },
+  "devDependencies": {
+    "@babel/core": "7.0.0",
+    "@babel/register": "7.0.0",
+    "@vue/cli-plugin-babel": "3.5.3",
+    "@vue/cli-plugin-eslint": "^3.9.1",
+    "@vue/cli-plugin-unit-jest": "3.5.3",
+    "@vue/cli-service": "3.5.3",
+    "@vue/test-utils": "1.0.0-beta.29",
+    "autoprefixer": "^9.5.1",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "10.0.1",
+    "babel-jest": "23.6.0",
+    "chalk": "2.4.2",
+    "chokidar": "2.1.5",
+    "connect": "3.6.6",
+    "eslint": "5.15.3",
+    "eslint-plugin-vue": "5.2.2",
+    "html-webpack-plugin": "3.2.0",
+    "husky": "1.3.1",
+    "lint-staged": "8.1.5",
+    "mockjs": "1.0.1-beta3",
+    "node-sass": "^4.14.0",
+    "plop": "2.3.0",
+    "pre-commit": "^1.2.2",
+    "px2rem-loader": "^0.1.9",
+    "runjs": "^4.3.2",
+    "sass-loader": "^7.1.0",
+    "script-ext-html-webpack-plugin": "2.1.3",
+    "serve-static": "^1.13.2",
+    "svg-sprite-loader": "4.1.3",
+    "svgo": "1.2.0",
+    "terser-webpack-plugin": "^4.2.0",
+    "vue-template-compiler": "2.6.10",
+    "vue2-ace-editor": "0.0.15"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

+ 4 - 0
plop-templates/README.md

@@ -0,0 +1,4 @@
+# LeenkSee-Admin
+机电管理系统
+基于vue-elemenet-admin + Casbin鉴权 + JWT鉴权的后台管理系统
+<p>by 西歪歪 2020/04/06</p>

+ 26 - 0
plop-templates/component/index.hbs

@@ -0,0 +1,26 @@
+{{#if template}}
+<template>
+  <div />
+</template>
+{{/if}}
+
+{{#if script}}
+<script>
+export default {
+  name: '{{ properCase name }}',
+  props: {},
+  data() {
+    return {}
+  },
+  created() {},
+  mounted() {},
+  methods: {}
+}
+</script>
+{{/if}}
+
+{{#if style}}
+<style lang="scss" scoped>
+
+</style>
+{{/if}}

+ 55 - 0
plop-templates/component/prompt.js

@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate vue component',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'component name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '<template>',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '<script>',
+      value: 'script',
+      checked: true
+    },
+    {
+      name: 'style',
+      value: 'style',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
+        return 'Components require at least a <script> or <template> tag.'
+      }
+      return true
+    }
+  }
+  ],
+  actions: data => {
+    const name = '{{properCase name}}'
+    const actions = [{
+      type: 'add',
+      path: `src/components/${name}/index.vue`,
+      templateFile: 'plop-templates/component/index.hbs',
+      data: {
+        name: name,
+        template: data.blocks.includes('template'),
+        script: data.blocks.includes('script'),
+        style: data.blocks.includes('style')
+      }
+    }]
+
+    return actions
+  }
+}

+ 16 - 0
plop-templates/store/index.hbs

@@ -0,0 +1,16 @@
+{{#if state}}
+const state = {}
+{{/if}}
+
+{{#if mutations}}
+const mutations = {}
+{{/if}}
+
+{{#if actions}}
+const actions = {}
+{{/if}}
+
+export default {
+  namespaced: true,
+  {{options}}
+}

+ 62 - 0
plop-templates/store/prompt.js

@@ -0,0 +1,62 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate store',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'store name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: 'state',
+      value: 'state',
+      checked: true
+    },
+    {
+      name: 'mutations',
+      value: 'mutations',
+      checked: true
+    },
+    {
+      name: 'actions',
+      value: 'actions',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (!value.includes('state') || !value.includes('mutations')) {
+        return 'store require at least state and mutations'
+      }
+      return true
+    }
+  }
+  ],
+  actions(data) {
+    const name = '{{name}}'
+    const { blocks } = data
+    const options = ['state', 'mutations']
+    const joinFlag = `,
+  `
+    if (blocks.length === 3) {
+      options.push('actions')
+    }
+
+    const actions = [{
+      type: 'add',
+      path: `src/store/modules/${name}.js`,
+      templateFile: 'plop-templates/store/index.hbs',
+      data: {
+        options: options.join(joinFlag),
+        state: blocks.includes('state'),
+        mutations: blocks.includes('mutations'),
+        actions: blocks.includes('actions')
+      }
+    }]
+    return actions
+  }
+}

+ 9 - 0
plop-templates/utils.js

@@ -0,0 +1,9 @@
+exports.notEmpty = name => {
+  return v => {
+    if (!v || v.trim === '') {
+      return `${name} is required`
+    } else {
+      return true
+    }
+  }
+}

+ 26 - 0
plop-templates/view/index.hbs

@@ -0,0 +1,26 @@
+{{#if template}}
+<template>
+  <div />
+</template>
+{{/if}}
+
+{{#if script}}
+<script>
+export default {
+  name: '{{ properCase name }}',
+  props: {},
+  data() {
+    return {}
+  },
+  created() {},
+  mounted() {},
+  methods: {}
+}
+</script>
+{{/if}}
+
+{{#if style}}
+<style lang="scss" scoped>
+
+</style>
+{{/if}}

+ 55 - 0
plop-templates/view/prompt.js

@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate a view',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'view name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '<template>',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '<script>',
+      value: 'script',
+      checked: true
+    },
+    {
+      name: 'style',
+      value: 'style',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
+        return 'View require at least a <script> or <template> tag.'
+      }
+      return true
+    }
+  }
+  ],
+  actions: data => {
+    const name = '{{name}}'
+    const actions = [{
+      type: 'add',
+      path: `src/views/${name}/index.vue`,
+      templateFile: 'plop-templates/view/index.hbs',
+      data: {
+        name: name,
+        template: data.blocks.includes('template'),
+        script: data.blocks.includes('script'),
+        style: data.blocks.includes('style')
+      }
+    }]
+
+    return actions
+  }
+}

+ 9 - 0
plopfile.js

@@ -0,0 +1,9 @@
+const viewGenerator = require('./plop-templates/view/prompt')
+const componentGenerator = require('./plop-templates/component/prompt')
+const storeGenerator = require('./plop-templates/store/prompt.js')
+
+module.exports = function(plop) {
+  plop.setGenerator('view', viewGenerator)
+  plop.setGenerator('component', componentGenerator)
+  plop.setGenerator('store', storeGenerator)
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {}
+  }
+}

BIN
public/favicon.ico


+ 19 - 0
public/index.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="renderer" content="webkit">
+  <meta name="viewport"
+    content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title><%= webpackConfig.name %></title>
+</head>
+
+<body>
+  <div id="app"></div>
+  <!-- built files will be auto injected -->
+</body>
+
+</html>

+ 12 - 0
public/rem.js

@@ -0,0 +1,12 @@
+window.onload = function () {
+  getRem(1920, 32)
+};
+window.onresize = function () {
+  getRem(1920, 32)
+};
+
+function getRem(pwidth, prem) {
+  var html = document.getElementsByTagName("html")[0];
+  var oWidth = document.body.clientWidth || document.documentElement.clientWidth;
+  html.style.fontSize = oWidth / pwidth * prem + "px";
+}

+ 1 - 0
readme.txt

@@ -0,0 +1 @@
+后台前端

+ 18 - 0
src/App.vue

@@ -0,0 +1,18 @@
+<template>
+  <div id="app">
+    <!--  -->
+    <router-view />
+  </div>
+</template>
+
+<script>
+</script>
+<style lang="scss">
+  body .el-table th.gutter {
+    display: table-cell !important;
+  }
+
+  body .el-table colgroup.gutter {
+    display: table-cell !important;
+  }
+</style>

+ 41 - 0
src/api/article.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function fetchList(query) {
+  return request({
+    url: '/vue-element-admin/article/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function fetchArticle(id) {
+  return request({
+    url: '/vue-element-admin/article/detail',
+    method: 'get',
+    params: { id }
+  })
+}
+
+export function fetchPv(pv) {
+  return request({
+    url: '/vue-element-admin/article/pv',
+    method: 'get',
+    params: { pv }
+  })
+}
+
+export function createArticle(data) {
+  return request({
+    url: '/vue-element-admin/article/create',
+    method: 'post',
+    data
+  })
+}
+
+export function updateArticle(data) {
+  return request({
+    url: '/vue-element-admin/article/update',
+    method: 'post',
+    data
+  })
+}

+ 62 - 0
src/api/box-debug-mqtt.js

@@ -0,0 +1,62 @@
+import {
+  get,
+  post
+} from '@/utils/axios-middleware'
+const base = 'http://linksee-mqtt-transport.linkseeiot.com/'
+
+// 修改盒子的高级配置
+export function publishAdvanceConf (data) {
+  return post(base + 'api/publish/advanceConf', data)
+}
+
+// 发送控制命令
+export function publishControl (data) {
+  return post(base + 'api/publish/control', data)
+}
+
+// 发送命令,增加盒子自定义装置
+export function pulishIoUnit (data) {
+  return post(base + 'api/publish/ioUnit', data)
+}
+
+// 发送命令,修改盒子的运行状态
+export function pulishRunStat (data) {
+  return post(base + 'api/publish/runStatus', data)
+}
+
+// 发送命令,切换指定控制器的上下机状态
+export function publishStandaloneList (data) {
+  return post(base + 'api/publish/standaloneStat', data)
+}
+
+// 发送命令,通知盒子取最新的盒子配置
+export function publishSynConf (data) {
+  return post(base + 'api/publish/publishSynConf', data)
+}
+
+//通知盒子更新网关版本
+export function updateGateWayVersion (data) {
+  return post(base + 'api/publish/updateVersion', data)
+}
+
+//通知盒子更新固件版本
+export function updateFirmwareVer (data) {
+  return post(base + 'api/publish/updateFirmwareVer', data)
+}
+
+//通知盒子开启debug模式
+export function debugMode (data) {
+  return post(base + 'api/publish/debugMode', data)
+}
+
+
+//同步日志
+export function uploadLog (data) {
+  return post(base + 'api/publish/uploadLog', data)
+}
+
+
+//同步上传历史记录
+export function uploadHistory (data) {
+  return post(base + 'api/publish/uploadHistory', data)
+}

+ 20 - 0
src/api/box-debug.js

@@ -0,0 +1,20 @@
+import {
+  get,
+  post
+} from '@/utils/axios-middleware'
+const base = 'http://linksee-box-api.linkseeiot.com/'
+
+// 获取插件信息
+export function getRunState(params) {
+  return get(base + 'api/transport/getRunState', params)
+}
+
+// 获取主机高级参数
+export function getAdvanceConf(params) {
+  return get(base + 'api/transport/getAdvanceConf', params)
+}
+
+// 获取盒子信息
+export function getBoxInfo(params) {
+  return get(base + 'api/transport/getBoxInfo', params)
+}

+ 242 - 0
src/api/box.js

@@ -0,0 +1,242 @@
+import {
+  post,
+  get
+} from '@/utils/axios-middleware'
+const base = 'http://backend-admin-api.linkseeiot.com/'
+//角色判断
+export function whoImi(data) {
+  return get(base + 'whoImi', data)
+}
+
+//获取插件信息
+export function getBoxPluginList(data) {
+  return post(base + 'box/plugin/list', data)
+}
+
+//删除盒子插件
+export function delBoxPlugin(data) {
+  return post(base + 'box/plugin/delete', data)
+}
+
+//新建盒子插件
+export function createBoxPlugin(data) {
+  return post(base + 'box/plugin/create', data)
+}
+
+//获取盒子插件基本配置
+export function boxPluginBase(data) {
+  return post(base + 'box/plugin/base', data)
+}
+
+//获取盒子详情
+export function boxPluginDetail(data) {
+  return post(base + 'box/plugin/detail', data)
+}
+
+//修改盒子插件
+export function boxPluginUpdate(data) {
+  return post(base + 'box/plugin/update', data)
+}
+
+//显示级联关系
+export function apparatusTypeList(data) {
+  return post(base + 'apparatus/type/list', data)
+}
+
+//修改插件状态
+export function editPublishStatus(data) {
+  return post(base + 'box/plugin/editPublishStatus', data)
+}
+
+//获取工程列表
+export function getProjectList(data) {
+  return post(base + 'project/list', data)
+}
+
+//获取盒子列表
+export function getBoxList(data) {
+  return post(base + 'box/list', data)
+}
+
+//删除盒子
+export function delBox(data) {
+  return post(base + 'box/delete', data)
+}
+
+//新建盒子
+export function createBox(data) {
+  return post(base + 'box/create', data)
+}
+
+//获取盒子详情
+export function getBoxDetail(data) {
+  return post(base + 'box/detail', data)
+}
+
+//更新盒子信息
+export function updateBox(data) {
+  return post(base + 'box/update', data)
+}
+
+//获取盒子高级配置
+// export function getAdvanceConf(data){
+//   return get('http://linksee-box-api.linkseeiot.com/api/transport/getAdvanceConf',data)
+// }
+
+//同步盒子配置
+export function syncConf(data) {
+  return post('http://linksee-mqtt-transport.linkseeiot.com/api/publish/synConf', data)
+}
+
+//获取历史记录图标
+export function getHistory(data) {
+  return get(base + 'history/get', data)
+}
+
+//盒子模板
+export function createBoxTemplate(data) {
+  return post(base + 'boxTemplate/create', data)
+}
+
+export function deleteBoxTemplate(data) {
+  return post(base + 'boxTemplate/delete', data)
+}
+
+export function boxTemplateDetail(data) {
+  return post(base + 'boxTemplate/detail', data)
+}
+
+export function boxTemplateList(data) {
+  return post(base + 'boxTemplate/list', data)
+}
+
+export function updateBoxTemplate(data) {
+  return post(base + 'boxTemplate/update', data)
+}
+
+//设备类型
+//create
+export function createApparatusType(data) {
+  return post(base + 'apparatus/type/create', data)
+}
+
+//list
+export function ApparatusTypeList(data) {
+  return get(base + 'apparatus/type/list', data)
+}
+
+//delete
+export function deleteApparatusType(data) {
+  return post(base + 'apparatus/type/delete', data)
+}
+
+//detail
+export function detailAppratusType(data) {
+  return get(base + 'apparatus/type/detail', data)
+}
+
+
+//update
+export function updateAppratusType(data) {
+  return post(base + 'apparatus/type/update', data)
+}
+
+
+//设备品牌
+//create
+export function createApparatusBrand(data) {
+  return post(base + 'apparatus/brand/create', data)
+}
+
+export function editApparatusBrand(data) {
+  return post(base + 'apparatus/brand/update', data)
+}
+
+export function deleteApparatusBrand(data) {
+  return post(base + 'apparatus/brand/delete', data)
+}
+
+export function apparatusDeviceSeries(data) {
+  return get(base + 'apparatus/device/series', data)
+}
+
+//设备分类
+//create
+export function createApparatusClassic(data) {
+  return post(base + 'apparatus/classic/create', data)
+}
+
+//edit
+export function editApparatusClassic(data) {
+  return post(base + 'apparatus/classic/update', data)
+}
+
+export function deleteApparatusClassic(data) {
+  return post(base + 'apparatus/classic/delete', data)
+}
+
+
+
+//设备管理
+//设备筛选
+export function ApparatusDeviceFilter(data) {
+  return get(base + 'apparatus/device/filter', data)
+}
+
+//列表
+export function ApparatusDeviceList(data) {
+  return get(base + 'apparatus/device/list', data)
+}
+
+//新增
+export function createApparatusDevice(data) {
+  return post(base + 'apparatus/device/create', data)
+}
+
+//删除
+export function deleteApparatusDevice(data) {
+  return post(base + 'apparatus/device/delete', data)
+}
+
+//详情
+export function detailAppratusDevice(data) {
+  return get(base + 'apparatus/device/detail', data)
+}
+
+//更新
+export function editApparatusDevice(data) {
+  return post(base + 'apparatus/device/update', data)
+}
+
+//设备型号
+//新建
+export function createApparatusModel(data) {
+  return post(base + 'apparatus/model/create', data)
+}
+
+//删除
+export function deleteApparatusModel(data) {
+  return post(base + 'apparatus/model/delete', data)
+}
+
+//修改
+export function editApparatusModel(data) {
+  return post(base + 'apparatus/model/update', data)
+}
+
+export function logRequestList(data) {
+  return post(base + 'log/request/list', data)
+}
+
+export function logRequestDetail(data) {
+  return post(base + 'log/request/detail', data)
+}
+
+export function boxPluginExport(data) {
+  return post(base + 'box/plugin/export', data)
+}
+
+// 获取自定义装置的最大ID
+export function getCustomMaxId(data) {
+  return get(base + 'box/getCustomMaxId', data)
+}

+ 152 - 0
src/api/casbin.js

@@ -0,0 +1,152 @@
+import { get, post } from '@/utils/axios-middleware'
+// const base = "http://sport-backend-casbin-api.linkseeiot.com/";
+const base = 'http://backend-casbin-api.linkseeiot.com/'
+/* ============================================= */
+/*                                               */
+/*                菜单管理部分路由                */
+/*                                               */
+/* ============================================= */
+// 新建菜单
+export function menuAdd(data) {
+  return post(base + 'casbin/menu/add', data)
+}
+
+// 编辑菜单
+export function menuEdit(data) {
+  return post(base + 'casbin/menu/edit', data)
+}
+
+// 后台菜单列表
+export function menuList(data) {
+  return post(base + 'casbin/menu/list', data)
+}
+
+// 删除菜单
+export function menuDelete(data) {
+  return post(base + 'casbin/menu/delete', data)
+}
+
+// 菜单详情
+export function menuDetail(data) {
+  return post(base + 'casbin/menu/detail', data)
+}
+
+// 获取某token对应菜单树
+export function token2Menu(data) {
+  return post(base + 'casbin/token/menu', data)
+}
+
+/* ============================================= */
+/*                                               */
+/*                角色管理部分路由                */
+/*                                               */
+/* ============================================= */
+// 新建角色
+export function addRole(data) {
+  return post(base + 'casbin/role/add', data)
+}
+
+// 删除角色
+export function deleteRole(data) {
+  return post(base + 'casbin/role/delete', data)
+}
+
+// 某角色对应菜单列表
+export function role2MenuTree(data) {
+  return post(base + 'casbin/role/menu', data)
+}
+
+// 编辑角色菜单关联关系
+export function editRole2Menu(data) {
+  return post(base + 'casbin/role/menu/tree/edit', data)
+}
+
+// 后台用户角色列表
+export function roleList(data) {
+  return post(base + 'casbin/role/list', data)
+}
+
+/* ============================================= */
+/*                                               */
+/*                树  管理部分路由                */
+/*                                               */
+/* ============================================= */
+// 树 列表
+export function treeList(data) {
+  return post(base + 'casbin/menu/tree/list', data)
+}
+
+// 编辑虚拟目录树 和 树对应关系
+export function editTree(data) {
+  return post(base + 'casbin/menu/tree/edit', data)
+}
+
+// 获取 树 对应虚拟目录树详情
+export function tree2MenuTree(data) {
+  return post(base + 'casbin/menu/tree/detail', data)
+}
+
+// 新增目录树
+export function addTree(data) {
+  return post(base + 'casbin/menu/tree/add', data)
+}
+
+// 删除目录树
+export function deleteTree(data) {
+  return post(base + 'casbin/menu/tree/delete', data)
+}
+
+/* ============================================= */
+/*                                               */
+/*                用户管理部分路由                */
+/*                                               */
+/* ============================================= */
+// 新建用户
+export function addUser(data) {
+  return post(base + 'casbin/user/add', data)
+}
+
+// 用户列表
+export function userList(data) {
+  return post(base + 'casbin/user/list', data)
+}
+
+// 获取某用户当前菜单
+export function user2MenuTree(data) {
+  return post(base + 'casbin/user/menu', data)
+}
+
+// 修改用户角色关联
+export function editUser2Role(data) {
+  return post(base + 'casbin/user-role-relation/edit', data)
+}
+
+// 删除用户
+export function deleteUser(data) {
+  return post(base + 'casbin/user/delete', data)
+}
+
+/* ============================================= */
+/*                                               */
+/*                路由管理部分路由                */
+/*                                               */
+/* ============================================= */
+// 添加路由
+export function addRouter(data) {
+  return post(base + 'router/add', data)
+}
+
+// 删除路由
+export function delRouter(params) {
+  return get(base + 'router/del', params)
+}
+
+// 修改路由描述
+export function editRouter(data) {
+  return post(base + 'router/edit', data)
+}
+
+// 获取路由列表
+export function routerList(params) {
+  return get(base + 'router/list', params)
+}

+ 78 - 0
src/api/consumble.js

@@ -0,0 +1,78 @@
+import { post } from "@/utils/axios-middleware";
+
+const base = "http://backend-admin-api.linkseeiot.com/";
+
+//耗材列表
+export async function consumablesList(data) {
+  return post(base + "consumables_management/list", data);
+}
+
+//新增耗材
+export async function createConsumable(data) {
+  return post(base + "consumables_management/create", data);
+}
+
+//删除耗材
+export async function deleteConsumable(data) {
+  return post(base + "consumables_management/delete", data);
+}
+
+//编辑耗材
+export async function updateConsumable(data) {
+  return post(base + "consumables_management/update", data);
+}
+
+//刷新耗材使用率
+export async function resetConsumable(data) {
+  return post(base + "consumables_management/reset", data);
+}
+
+//耗材详情
+export async function consumableDetail(data) {
+  return post(base + "consumables_management/detail", data);
+}
+
+//耗材转工单
+export async function toWorkOrder(data) {
+  return post(base + "consumables_management/toWorkOrder", data);
+}
+
+//耗材算法列表
+export async function consumptionAlgorithmList(data) {
+  return post(base + "consumption_algorithm/list", data);
+}
+
+//新建耗材算法
+export async function createConsumptionAlgorithm(data) {
+  return post(base + "consumption_algorithm/create", data);
+}
+
+//更新耗材算法
+export async function updateConsumptionAlgorithm(data) {
+  return post(base + "consumption_algorithm/update", data);
+}
+
+//删除耗材算法
+export async function deleteConsumptionAlgorithm(data) {
+  return post(base + "consumption_algorithm/delete", data);
+}
+
+//耗材品类列表
+export async function consumptionAlgorithmTypeList(data) {
+  return post(base + "consumables_management/tree", data);
+}
+
+//新建耗材品类管理
+export async function createConsumptionAlgorithmType(data) {
+  return post(base + "consumables_management/type/create", data);
+}
+
+//编辑耗材品类管理
+export async function updateConsumptionAlgorithmType(data) {
+  return post(base + "consumables_management/type/update", data);
+}
+
+//删除耗材品类
+export async function deleteConsumptionAlgorithmType(data) {
+  return post(base + "consumables_management/type/delete", data);
+}

+ 183 - 0
src/api/content.js

@@ -0,0 +1,183 @@
+import {
+  get,
+  post
+} from "@/utils/axios-middleware";
+const base = "http://backend-admin-api.linkseeiot.com/";
+
+//获取QA列表
+export function getQAList(data) {
+  return post(base + "qa/list", data);
+}
+
+//新建QA列表
+export function createQA(data) {
+  return post(base + "qa/create", data);
+}
+
+//删除QA列表
+export function deleteQA(data) {
+  return post(base + "qa/delete", data);
+}
+
+//修改QA列表
+export function updateQA(data) {
+  return post(base + "qa/update", data);
+}
+
+//QA详情
+export function detailQA(data) {
+  return post(base + "qa/detail", data);
+}
+
+//反馈列表
+export function feedBackList(data) {
+  return post(base + "feedback/list", data);
+}
+
+//删除反馈
+export function deleteFeedBack(data) {
+  return post(base + 'feedback/delete', data)
+}
+
+//版本列表
+export function versionList(params) {
+  return get(base + 'getAppVersion', params)
+}
+
+//编辑版本
+export function editAppVersion(data) {
+  return post(base + 'editAppVersion', data)
+}
+
+//新增版本
+export function addAppVersion(data) {
+  return post(base + 'createAppVersion', data)
+}
+
+//删除版本
+export function deleteVersion(data) {
+  return post(base + 'delAppVersion', data)
+}
+
+//消息列表
+export function messageList(data) {
+  return post(base + 'message/list', data)
+}
+
+//新建消息
+export function createMessage(data) {
+  return post(base + 'message/create', data)
+}
+
+//消息详情
+export function detailMessage(data) {
+  return post(base + 'message/detail', data)
+}
+
+//删除消息
+export function deleteMessage(data) {
+  return post(base + 'message/delete', data)
+}
+
+//更新消息
+export function updateMessage(data) {
+  return post(base + 'message/update', data)
+}
+
+/**
+ * 换肤
+ */
+export function createTheme(data) {
+  return post(base + 'theme/create', data)
+}
+
+//删除
+export function deleteTheme(data) {
+  return post(base + 'theme/delete', data)
+}
+
+//详情
+export function detailTheme(data) {
+  return post(base + 'theme/detail', data)
+}
+
+//列表
+export function themeList(data) {
+  return post(base + 'theme/list', data)
+}
+
+//修改
+export function updateTheme(data) {
+  return post(base + 'theme/update', data)
+}
+
+/*联锁库相关 */
+// list
+export function logicList(data) {
+  return get(base + 'logic/list', data)
+}
+
+// group
+export function logicGroup(data) {
+  return get(base + 'logic/group', data)
+}
+
+// detail
+export function logicDetail(data) {
+  return get(base + 'logic/get', data)
+}
+
+// create logic
+export function createLogic(data) {
+  return post(base + 'logic/create', data)
+}
+
+// delete logic
+export function deleteLogic(data) {
+  return post(base + 'logic/delete', data)
+}
+
+// edit logic
+export function editLogic(data) {
+  return post(base + 'logic/edit', data)
+}
+
+// create logic params
+export function createLogicParam(data) {
+  return post(base + 'logic/param/create', data)
+}
+
+//delete logic params
+export function deleteLogicParam(data) {
+  return post(base + 'logic/param/delete', data)
+}
+
+//edit logic params
+export function editLogicParam(data) {
+  return post(base + 'logic/param/edit', data)
+}
+
+//获取自动匹配模式列表
+export function getAutoMatchModeList(data) {
+  return post(base + "auto_match_mode/list", data);
+}
+
+//新建自动匹配模式列表
+export function createAutoMatchMode(data) {
+  return post(base + "auto_match_mode/create", data);
+}
+
+//删除自动匹配模式列表
+export function deleteAutoMatchMode(data) {
+  return post(base + "auto_match_mode/delete", data);
+}
+
+//修改自动匹配模式列表
+export function updateAutoMatchMode(data) {
+  return post(base + "auto_match_mode/update", data);
+}
+
+//省列表
+export function getAutoMatchModeProvList(data) {
+  return post(base + 'auto_match_mode/province/list', data)
+}

+ 24 - 0
src/api/mock-user.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+
+export function login(data) {
+  return request({
+    url: '/vue-admin-template/user/login',
+    method: 'post',
+    data
+  })
+}
+
+export function getInfo(token) {
+  return request({
+    url: '/vue-admin-template/user/info',
+    method: 'get',
+    params: { token }
+  })
+}
+
+export function logout() {
+  return request({
+    url: '/vue-admin-template/user/logout',
+    method: 'post'
+  })
+}

+ 26 - 0
src/api/order.js

@@ -0,0 +1,26 @@
+import {
+  post,
+  get
+} from "@/utils/axios-middleware";
+
+const base = "http://backend-admin-api.linkseeiot.com/";
+
+//获取订单列表
+export function getOrderList(data) {
+  return post(base + "order/list", data);
+}
+
+//创建订单
+export function createOrder(data) {
+  return post(base + "order/create", data);
+}
+
+//订单详情
+export function getOrderInfo(data) {
+  return post(base + "order/detail", data);
+}
+
+//获取支付宝QrCode
+export function getQr(data) {
+  return post(base + "order/getQr", data)
+}

+ 21 - 0
src/api/plugin.js

@@ -0,0 +1,21 @@
+import {
+  get,
+  post
+} from '@/utils/axios-middleware'
+const base = 'http://linksee-box-api.linkseeiot.com/'
+
+//获取插件信息
+export function getRunState(params) {
+  return get(base + 'api/transport/getRunState', params)
+}
+
+//获取主机高级参数
+export function getHostAdvArg(params) {
+  return get(base + 'api/transport/getAdvanceConf', params)
+}
+
+//获取控制器是否可见
+export function getCtrlEnabled(params) {
+  return get(base + 'api/transport/getCtrlEnabled', params)
+}
+

+ 317 - 0
src/api/project.js

@@ -0,0 +1,317 @@
+import {
+  post,
+  get
+} from "@/utils/axios-middleware";
+
+const base = "http://backend-admin-api.linkseeiot.com/";
+
+//获取省级级联
+export function getProvinceList(data) {
+  return post(base + "province/list", data);
+}
+
+//获取市级级联
+export function getCityList(data) {
+  return post(base + "city/list", data);
+}
+
+//获取区级级联
+export function getAreaList(data) {
+  return post(base + "area/list", data);
+}
+
+//获取项目列表
+export function getProjectList(data) {
+  return post(base + "project/list", data);
+}
+
+//添加项目列表
+export function addProject(data) {
+  return post(base + "project/add", data);
+}
+
+//删除项目列表
+export function delProject(data) {
+  return post(base + "project/delete", data);
+}
+
+//调试工程师列表
+export function debugEngineerList(data) {
+  return post(base + "projectDebugEngineer/list", data);
+}
+
+//修改调试工程师
+export function updateDebugEngineer(data) {
+  return post(base + "projectDebugEngineer/update", data);
+}
+
+//删除调试工程师
+export function deleteDebugEngineer(data) {
+  return post(base + "projectDebugEngineer/delete", data);
+}
+
+//添加调试工程师
+export function createDebugEngineer(data) {
+  return post(base + "projectDebugEngineer/create", data);
+}
+
+//维修工程师列表
+export function maintenanceEngineerList(data) {
+  return post(base + "projectMaintenanceEngineer/list", data);
+}
+
+//修改维修工程师
+export function updateMaintenanceEngineer(data) {
+  return post(base + "projectMaintenanceEngineer/update", data);
+}
+
+//删除维修工程师
+export function deleteMaintenanceEngineer(data) {
+  return post(base + "projectMaintenanceEngineer/delete", data);
+}
+
+//添加维修工程师
+export function createMaintenanceEngineer(data) {
+  return post(base + "projectMaintenanceEngineer/create", data);
+}
+
+//项目经理列表
+export function projectManagerList(data) {
+  return post(base + "projectManager/list", data);
+}
+
+//修改项目经理
+export function updateProjectManager(data) {
+  return post(base + "projectManager/update", data);
+}
+
+//删除项目经理
+export function deleteProjectManager(data) {
+  return post(base + "projectManager/delete", data);
+}
+
+//添加项目经理
+export function createProjectManager(data) {
+  return post(base + "projectManager/create", data);
+}
+
+//新建工程
+export function createProject(data) {
+  return post(base + "project/create", data);
+}
+
+//运营商列表
+export function operatorList(data) {
+  return post(base + "operator/list", data);
+}
+
+//修改运营者列表
+export function updateOperator(data) {
+  return post(base + "operator/update", data);
+}
+
+//新建运营者
+export function createOperator(data) {
+  return post(base + "operator/create", data);
+}
+
+//删除运营者
+export function deleteOperator(data) {
+  return post(base + "operator/delete", data);
+}
+
+//运营者详情
+export function detailOperator(data) {
+  return post(base + "operator/detail", data)
+}
+
+
+//获取运营商下面经销商
+export function getDistributorFromOperator(data) {
+  return post(base + "operator/distributor/list", data);
+}
+
+//添加或删除运营商下面的经销商
+export function editOperatorDistributorRelation(data) {
+  return post(base + "operator/distributor/edit", data);
+}
+
+//经销商列表
+export function distributorList(data) {
+  return post(base + "distributor/list", data);
+}
+
+//编辑经销商
+export function updateDistributor(data) {
+  return post(base + "distributor/update", data)
+}
+
+//新建经销商
+export function createDistributor(data) {
+  return post(base + 'distributor/create', data)
+}
+
+//删除经销商
+export function deleteDistributor(data) {
+  return post(base + 'distributor/delete', data)
+}
+
+//经销商详情
+export function detailDistributor(data) {
+  return post(base + 'distributor/detail', data)
+}
+
+//工程详情
+export function projectDetail(data) {
+  return post(base + "project/detail", data);
+}
+
+//
+export function getDistrictList(data) {
+  return post(base + "district/list", data);
+}
+
+//编辑工程
+export function updateProject(data) {
+  return post(base + "project/update", data);
+}
+
+//删除工程
+export function deleteProject(data) {
+  return post(base + "project/delete", data);
+}
+
+//报修列表
+export function repairMasterList(data) {
+  return post(base + "repair/master/list", data);
+}
+
+//维修转工单
+export function createWorkOrder(data) {
+  return post(base + 'repair/toWorkOrder', data)
+}
+
+//故障报警列表
+export function faultAlertList(data) {
+  return post(base + 'faultAlert/list', data)
+}
+
+//删除故障报警
+export function deleteFaultAlert(data) {
+  return post(base + 'faultAlert/delete', data)
+}
+
+//转工单
+export function faultToWorkOrder(data) {
+  return post(base + 'faultAlert/toWorkOrder', data)
+}
+
+//获取系统结构
+export function systemHistoryTree(data) {
+  return get(base + 'history/tree/system', data)
+}
+
+//获取分室结构
+export function endHistoryTree(data) {
+  return get(base + 'history/tree/end', data)
+}
+
+//获取电表结构
+export function ammeterHistoryTree(data) {
+  return get(base + 'history/tree/ammeter', data)
+}
+
+//获取echarts图表数据
+export function getHistories(data) {
+  return post(base + 'history/get', data)
+}
+
+//获取电表数据
+export function getElec(data) {
+  return post(base + 'history/getElec', data)
+}
+
+
+//经销商下面的项目列表
+export function distributorProjects(data) {
+  return post(base + 'distributor/project/list', data)
+}
+
+/**
+ * 网关版本管理
+ */
+export function getGateWayList(data) {
+  return post(base + 'gateway/version/list', data)
+}
+
+export function updateGateWay(data) {
+  return post(base + 'gateway/version/update', data)
+}
+
+export function deleteGateWay(data) {
+  return post(base + 'gateway/version/delete', data)
+}
+
+export function createGateWay(data) {
+  return post(base + 'gateway/version/create', data)
+}
+
+/**
+ * 策略库
+ */
+export function policyBaseCtrlList(data) {
+  return post(base + 'policyBase/controller/list', data)
+}
+
+
+export function ctrlTargetList(data) {
+  return post(base + 'policyBase/controller/target/list', data)
+}
+
+
+export function policyBaseList(data) {
+  return post(base + 'policyBase/list', data)
+}
+
+export function deletePolicyBase(data) {
+  return post(base + 'policyBase/delete', data)
+}
+
+export function updatePolicyBase(data) {
+  return post(base + 'policyBase/update', data)
+}
+
+export function policyBaseDetail(data) {
+  return post(base + 'policyBase/detail', data)
+}
+
+export function createPolicyBase(data) {
+  return post(base + 'policyBase/create', data)
+}
+
+export function policyDetailList(data) {
+  return post(base + 'policyBase/details', data)
+}
+
+
+//售后
+export function createCustomerService(data) {
+  return post(base + 'customer_service/create', data)
+}
+
+export function deleteCustomerService(data) {
+  return post(base + 'customer_service/delete', data)
+}
+
+export function updateCustomerService(data) {
+  return post(base + 'customer_service/update', data)
+}
+
+export function customerServiceList(data) {
+  return post(base + 'customer_service/list', data)
+}
+
+//天气
+export function getWeather(data) {
+  return get(base + 'getWeather', data)
+}

+ 8 - 0
src/api/qiniu.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request'
+
+export function getToken() {
+  return request({
+    url: '/qiniu/upload/token', // 假地址 自行替换
+    method: 'get'
+  })
+}

+ 17 - 0
src/api/remote-search.js

@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function searchUser(name) {
+  return request({
+    url: '/vue-element-admin/search/user',
+    method: 'get',
+    params: { name }
+  })
+}
+
+export function transactionList(query) {
+  return request({
+    url: '/vue-element-admin/transaction/list',
+    method: 'get',
+    params: query
+  })
+}

+ 38 - 0
src/api/role.js

@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+export function getRoutes() {
+  return request({
+    url: '/vue-element-admin/routes',
+    method: 'get'
+  })
+}
+
+export function getRoles() {
+  return request({
+    url: '/vue-element-admin/roles',
+    method: 'get'
+  })
+}
+
+export function addRole(data) {
+  return request({
+    url: '/vue-element-admin/role',
+    method: 'post',
+    data
+  })
+}
+
+export function updateRole(id, data) {
+  return request({
+    url: `/vue-element-admin/role/${id}`,
+    method: 'put',
+    data
+  })
+}
+
+export function deleteRole(id) {
+  return request({
+    url: `/vue-element-admin/role/${id}`,
+    method: 'delete'
+  })
+}

+ 35 - 0
src/api/user.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+import { get } from '@/utils/axios-middleware'
+const base = 'http://backend-casbin-api.linkseeiot.com/'
+
+export function logout() {
+  return request({
+    url: '/vue-admin-template/user/logout',
+    method: 'post'
+  })
+}
+/* ============================================= */
+/*                                               */
+/*                   用户相关                    */
+/*                                               */
+/* ============================================= */
+// 用户登录
+export function login(params) {
+  return get(base + 'login', params)
+}
+
+// 获取用户信息
+export function getInfo() {
+  return new Promise((reject, resolve) => {
+    reject({
+      data: {
+        roles: ['admin'],
+        introduction: 'I am a super administrator',
+        avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+        name: 'Super Admin'
+      }
+    }).catch(error => {
+      resolve(error)
+    })
+  })
+}

+ 88 - 0
src/api/work-order.js

@@ -0,0 +1,88 @@
+import {
+  post,
+  get
+} from "@/utils/axios-middleware";
+
+const base = "http://backend-admin-api.linkseeiot.com/";
+
+export function workOrderGetList(data) {
+  return get(base + 'workOrder/getList', data)
+}
+
+export function workOrderCreate(data) {
+  return post(base + 'workOrder/create', data)
+}
+
+export function workOrderRemove(gdNo) {
+  return post(base + `workOrder/remove?gdNo=${gdNo}`)
+}
+
+export function workOrderGetStage(data) {
+  return get(base + 'workOrder/getStage', data)
+}
+
+export function workOrderGetInfo(data) {
+  return get(base + 'workOrder/getInfo', data)
+}
+
+export function workOrderUpdate(gdNo, data) {
+  return post(base + `workOrder/update?gdNo=${gdNo}`, data)
+}
+
+export function workOrderProcess(gdNo) {
+  return post(base + `workOrder/process?gdNo=${gdNo}`)
+}
+
+export function workOrderClose(gdNo) {
+  return post(base + `workOrder/close?gdNo=${gdNo}`)
+}
+
+export function workOrderFinish(gdNo) {
+  return post(base + `workOrder/finish?gdNo=${gdNo}`)
+}
+
+export function workOrderToAudit(gdNo, assign_uid) {
+  return post(base + `workOrder/toAudit?gdNo=${gdNo}&assign_uid=${assign_uid}`)
+}
+
+export function workOrderAuditSucc(gdNo) {
+  return post(base + `workOrder/auditSuc?gdNo=${gdNo}`)
+}
+
+export function workOrderAuditFail(gdNo) {
+  return post(base + `workOrder/auditFail?gdNo=${gdNo}`)
+}
+
+export function workOrderAssign(gdNo, user) {
+  console.log("user = " + JSON.stringify(user));
+  return post(base + `workOrder/assign?gdNo=${gdNo}&assign_uid=${user.id}&assign_role=${user.role_name}`)
+}
+
+export function workOrderToModify(gdNo, assign_uid) {
+  return post(base + `workOrder/toModify?gdNo=${gdNo}&assign_uid=${assign_uid}`)
+}
+
+//获取责任人列表
+export function workOrderGetMembers(gdNo) {
+  return get(base + `workOrder/getMembers?gdNo=${gdNo}`)
+}
+
+// 获取按钮权限
+export function workOrderGetEvents(gdNo) {
+  return get(base + `workOrder/getEvents?gdNo=${gdNo}`)
+}
+
+// 预约客户
+export function workOrderAppoint(gdNo) {
+  return post(base + `workOrder/appoint?gdNo=${gdNo}`)
+}
+
+// 现场处理
+export function workOrderOnSite(gdNo) {
+  return post(base + `workOrder/onSite?gdNo=${gdNo}`)
+}
+
+// 远程处理
+export function workOrderRemote(gdNo) {
+  return post(base + `workOrder/remote?gdNo=${gdNo}`)
+}

BIN
src/assets/401_images/401.gif


BIN
src/assets/404_images/404.png


BIN
src/assets/404_images/404_cloud.png


BIN
src/assets/consumable/Delete.png


BIN
src/assets/consumable/edit-button.png


BIN
src/assets/consumable/refresh.png


BIN
src/assets/custom-theme/fonts/element-icons.ttf


BIN
src/assets/custom-theme/fonts/element-icons.woff


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
src/assets/custom-theme/index.css


BIN
src/assets/debug/add.png


BIN
src/assets/debug/common_plugin.png


BIN
src/assets/debug/edit.png


BIN
src/assets/debug/error-triangle.png


BIN
src/assets/debug/success.png


BIN
src/assets/debug/warning.png


BIN
src/assets/gateway_plugin_new/icon_lock_selected.png


BIN
src/assets/gateway_plugin_new/icon_unlock_selected.png


BIN
src/assets/gateway_plugin_new/icon_write_selected.png


BIN
src/assets/gateway_plugin_new/list_btn_delete.png


BIN
src/assets/gateway_plugin_new/list_btn_new.png


BIN
src/assets/gateway_plugin_new/list_disabled.png


BIN
src/assets/gateway_plugin_new/list_dropdownbox_normal.png


BIN
src/assets/gateway_plugin_new/list_dropdownbox_selected.png


BIN
src/assets/gateway_plugin_new/list_icon_dropdown.png


BIN
src/assets/gateway_plugin_new/list_input_normal.png


BIN
src/assets/gateway_plugin_new/list_input_selected.png


BIN
src/assets/gateway_plugin_new/list_menu_checkbox_normal.png


BIN
src/assets/gateway_plugin_new/list_menu_checkbox_selected.png


BIN
src/assets/gateway_plugin_new/list_menu_dropdown.png


BIN
src/assets/gateway_plugin_new/list_menu_packup.png


BIN
src/assets/gateway_plugin_new/list_radio_normal.png


BIN
src/assets/gateway_plugin_new/list_radio_selected.png


BIN
src/assets/gateway_plugin_new/more.png


BIN
src/assets/gateway_plugin_new/more2.png


BIN
src/assets/gateway_plugin_new/more3.png


BIN
src/assets/gateway_plugin_new/navibar_btn_return.png


BIN
src/assets/gateway_plugin_new/tab_btn_normal.png


BIN
src/assets/gateway_plugin_new/tab_btn_save_bg.png


BIN
src/assets/gateway_plugin_new/tab_btn_selected.png


BIN
src/assets/gateway_plugin_new/tab_input_remark.png


BIN
src/assets/login/SourceHanSansCN-Light.otf


BIN
src/assets/login/login_Shadow.png


BIN
src/assets/login/login_bg.png


BIN
src/assets/login/login_bg1.png


BIN
src/assets/login/login_btn.png


BIN
src/assets/login/login_btn_normal.png


+ 0 - 0
src/assets/login/login_btn_pressed.png


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