niuheng преди 3 години
ревизия
13171f4c44
променени са 100 файла, в които са добавени 12782 реда и са изтрити 0 реда
  1. 12 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 15 0
      .gitignore
  4. 1 0
      .npmrc
  5. 10 0
      .postcssrc.js
  6. 1 0
      .yarnrc
  7. 155 0
      README.md
  8. 45 0
      build/build.js
  9. 56 0
      build/check-versions.js
  10. BIN
      build/logo.png
  11. 101 0
      build/utils.js
  12. 20 0
      build/vue-loader.conf.js
  13. 99 0
      build/webpack.base.conf.js
  14. 93 0
      build/webpack.dev.conf.js
  15. 140 0
      build/webpack.prod.conf.js
  16. 289 0
      config/conf.js
  17. 17 0
      config/dev.env.js
  18. 69 0
      config/index.js
  19. 11 0
      config/prod.env.js
  20. 19 0
      index.html
  21. 97 0
      package.json
  22. 40 0
      publish.js
  23. 17 0
      src/App.vue
  24. 205 0
      src/api/alarm/alarm.js
  25. 140 0
      src/api/data_admin/buildTaskApi.js
  26. 10 0
      src/api/database/hbase.js
  27. 12 0
      src/api/database/redis.js
  28. 66 0
      src/api/dict/index.js
  29. 72 0
      src/api/fm/rules.js
  30. 83 0
      src/api/fm/sop.js
  31. 125 0
      src/api/framework.js
  32. 171 0
      src/api/httputils.js
  33. 270 0
      src/api/model/file.js
  34. 44 0
      src/api/model/report.js
  35. 56 0
      src/api/msgsever.js
  36. 9 0
      src/api/object/build.js
  37. 26 0
      src/api/object/equip.js
  38. 20 0
      src/api/object/floor.js
  39. 188 0
      src/api/relation/api.js
  40. 48 0
      src/api/scan/config.js
  41. 47 0
      src/api/scan/fetch.js
  42. 203 0
      src/api/scan/httpUtil.js
  43. 1671 0
      src/api/scan/request.js
  44. 50 0
      src/api/synclog/index.js
  45. 34 0
      src/api/system/index.js
  46. 137 0
      src/api/system/persagy-sso-server.js
  47. 21 0
      src/api/system/role.js
  48. 15 0
      src/api/system/user.js
  49. 30 0
      src/api/uploader/index.js
  50. BIN
      src/assets/css/chosen-sprite.png
  51. BIN
      src/assets/css/chosen-sprite@2x.png
  52. 492 0
      src/assets/css/chosen.css
  53. 477 0
      src/assets/css/jsmind.css
  54. BIN
      src/assets/image/floorBG.png
  55. BIN
      src/assets/image/login_bg.png
  56. BIN
      src/assets/image/model/arrowBlue.png
  57. BIN
      src/assets/image/model/arrowGray.png
  58. BIN
      src/assets/image/model/arrowGreen.png
  59. BIN
      src/assets/image/model/columnBlue.png
  60. BIN
      src/assets/image/model/columnGray.png
  61. BIN
      src/assets/image/model/columnGreen.png
  62. BIN
      src/assets/image/model/delModelBlue.png
  63. BIN
      src/assets/image/model/delModelGray.png
  64. BIN
      src/assets/image/model/downJsonBlue.png
  65. BIN
      src/assets/image/model/downJsonGray.png
  66. BIN
      src/assets/image/model/downJsonGreen.png
  67. BIN
      src/assets/image/model/downModelBlue.png
  68. BIN
      src/assets/image/model/downModelGray.png
  69. BIN
      src/assets/image/model/downModelGreen.png
  70. BIN
      src/assets/image/model/rightDownBlue.png
  71. BIN
      src/assets/image/model/rightDownGray.png
  72. BIN
      src/assets/image/model/rightDownGreen.png
  73. BIN
      src/assets/image/model/upJsonBlue.png
  74. BIN
      src/assets/image/model/upJsonGray.png
  75. BIN
      src/assets/image/model/upJsonGreen.png
  76. BIN
      src/assets/image/model/upModelBlue.png
  77. BIN
      src/assets/image/model/upModelGray.png
  78. BIN
      src/assets/image/model/upModelGreen.png
  79. BIN
      src/assets/image/model/waitingAnlBlue.png
  80. BIN
      src/assets/image/model/waitingAnlGray.png
  81. BIN
      src/assets/image/model/waitingAnlGreen.png
  82. BIN
      src/assets/image/model/waitingManageBlue.png
  83. BIN
      src/assets/image/model/waitingManageGray.png
  84. BIN
      src/assets/image/model/waitingManageGreen.png
  85. BIN
      src/assets/image/no-data.png
  86. 2 0
      src/assets/image/uncultivated.svg
  87. 1378 0
      src/assets/js/chosen.jquery.min.js
  88. 327 0
      src/assets/js/handsontable-chosen-editor.js
  89. 2933 0
      src/assets/js/jsmind.js
  90. BIN
      src/assets/logo.png
  91. 37 0
      src/assets/pako/pako.js
  92. 120 0
      src/assets/scss/point/point_config/common.scss
  93. 485 0
      src/assets/scss/point/point_config/reset.scss
  94. 96 0
      src/assets/scss/reset.scss
  95. 503 0
      src/assets/style/iconfont/iconfont.css
  96. 863 0
      src/assets/style/iconfont/iconfont.json
  97. BIN
      src/assets/style/iconfont/iconfont.ttf
  98. BIN
      src/assets/style/iconfont/iconfont.woff
  99. BIN
      src/assets/style/iconfont/iconfont.woff2
  100. 0 0
      src/assets/style/style.scss

+ 12 - 0
.babelrc

@@ -0,0 +1,12 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"]
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 15 - 0
.gitignore

@@ -0,0 +1,15 @@
+.DS_Store
+node_modules/
+adm/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 1 - 0
.npmrc

@@ -0,0 +1 @@
+@saga-web:registry=http://dev.dp.sagacloud.cn:8082/repository/npm-saga

+ 10 - 0
.postcssrc.js

@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 1 - 0
.yarnrc

@@ -0,0 +1 @@
+"@saga-web:registry" "http://dev.dp.sagacloud.cn:8082/repository/npm-saga"

+ 155 - 0
README.md

@@ -0,0 +1,155 @@
+# sagacloud-admin
+
+> A Vue.js project
+
+## Build Setup
+
+```bash
+npm install
+npm install vuex axios element-ui echarts font-awesome
+npm install less less-loader node-sass sass-loader --save-dev
+
+# serve with hot reload at localhost:8080
+npm run dev
+# build for production with minification
+npm run build
+# build for production and view the bundle analyzer report
+npm run build --report
+```
+
+## 项目结构说明
+
+#### 目录结构
+
+```
+│  .editorconfig                        # 格式化配置,修改缩进为2
+│  index.html                           # 修改页面title
+│  package.json                         # 包
+│  README.md                            # 说明文档
+│
+├─build                                 # 不变
+│
+├─config
+│      dev.env.js                       # 开发环境变量
+│      index.js                         # 设置代理
+│      prod.env.js                      # 生产环境变量
+│
+├─src
+│  ├─api                                # 业务逻辑api, http的请求都放在这里
+│  │  |─framework.js                    # 框架预留接口,实现登录,权限校验等功能
+│  │  └─httputils.js                    # http 工具类
+│  ├─assets                             # 静态资源, 替换logo图片
+│  ├─components                         # 业务相关组件
+│  ├─data                               # 业务相关静态数据
+│  │      menus.js                      # 菜单数据
+│  ├─demo                               # Demo主目录
+│  │  │  demo-menus.js                  # Demo按钮
+│  │  │  demo-routes.js                 # Demo路由
+│  │  └─views                           # Demo页面
+│  ├─framework                          # 框架主目录
+│  │  ├─components                      # 业务无关组件
+│  │  │
+│  │  ├─demo                            # Demo主目录
+│  │  │  │  demo-menus.js               # Demo按钮
+│  │  │  │  demo-routes.js              # Demo路由
+│  │  │  └─views                        # Demo页面
+│  │  │
+│  │  ├─layout                          # 框架主目录
+│  │  │      layout-store.js            # 框架状态定义
+│  │  │      Login.vue                  # 登录页
+│  │  │      Main.vue                   # 框架主页
+│  │  │      PageHeader.vue             # 顶部栏
+│  │  │      PageSidebar.vue            # 左侧菜单栏
+│  │  │
+│  │  ├─plugins                         # 插件,业务无关
+│  │  │      components.js
+│  │  ├─style                           # 样式
+│  │  │
+│  │  ├─template                        # 页面模板
+│  │  │      TablePageTemplate.vue
+│  │  │
+│  │  └─utils                           # 工具类,业务无关
+│  │
+│  ├─router                             # 主路由
+│  │      index.js
+│  │      system.js
+│  │
+│  ├─store                              # vuex
+│  │      index.js
+│  │
+│  └─views                              # 业务页面主路径
+|
+└─static
+        .gitkeep
+```
+
+#### /api/framework.js
+
+必须实现以下方法
+
+```
+export default {
+
+    // 路由拦截
+    routerBeforeEach: async function(to, from, next){},
+
+    // 获取左侧菜单数据
+    getMenus: function(permissions){},
+
+    // 跳转到登录页面
+    toLoginPage: function(){},
+
+    // 登录接口
+    login: function(username, password){}
+
+    // 加载当前登录用户信息
+    loadUserInfo: function(){},
+
+    // 退出登录
+    toLogout: function(){}
+}
+
+```
+
+#### 工具类说明
+
+/src/utils/basicutils.js
+
+```
+    formatDateByPattern(date, pattern) // 日期格式化
+    indexInArray(arr, key, val)        // 找出数组arr中第一个属性key的值等于val的元素的下标
+    itemInArray(arr, key, val)         // 找出数组arr中第一个属性key的值等于val的元素
+    deleteInArray(arr, key, val)       // 从数组中将属性key的值等于val的所有元素删除
+```
+
+/src/api/httputils.js // 一般在服务端接口 API 中使用,不建议在别的地方使用,有授权标记
+
+```
+    getCookie(name)                    // 获取cookie值
+    getJson(url, params)               // 发送GET请求
+    postJson(url, data)                // 发送POST请求
+```
+
+/src/utils/storage.js
+
+```
+    set(key, value, fn)                // 在浏览器缓存中设置数据, 如果value是对象会转化成json
+    get(key, fn)                       // 在浏览器缓存中取出数据, 取出数据后会尝试js对象返回
+    remove(key)                        // 在浏览器缓存中删除数据
+```
+
+#### 设置面包屑方法
+
+```
+在路由router中配置meta.breadcrumbs,在进入路由页面时会自动解析为面包屑
+this.$store.dispatch('setBreadcrumb', [{ label: 'Demo' }, { label: 'Form'  ])
+this.$store.dispatch('setBreadcrumb', [{ label: 'Demo', path: '' }, { label: 'Form' , path: ''}])
+```
+#### 上传管理器调用方法(上传较大文件时使用)
+
+```
+在组件中引入Bus中央时间总线
+    Bus.$emit('openUploader', query, file)    //添加文件到上传管理器中, query为参数, file为H5原生的文件对象
+    Bus.$on('fileAdded', () => {})            //文件选择后的回调
+    Bus.$on('fileSuccess', () => {})          //文件上传成功后的回调
+```

+ 45 - 0
build/build.js

@@ -0,0 +1,45 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+    if (err) throw err
+    webpack(webpackConfig, (err, stats) => {
+        spinner.stop()
+        if (err) throw err
+        process.stdout.write(
+            stats.toString({
+                colors: true,
+                modules: false,
+                children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+                chunks: false,
+                chunkModules: false
+            }) + '\n\n'
+        )
+
+        if (stats.hasErrors()) {
+            console.log(chalk.red('  Build failed with errors.\n'))
+            process.exit(1)
+        }
+
+        console.log(chalk.cyan('  Build complete.\n'))
+        console.log(
+            chalk.yellow(
+                '  Tip: built files are meant to be served over an HTTP server.\n' +
+                    "  Opening index.html over file:// won't work.\n"
+            )
+        )
+    })
+})

+ 56 - 0
build/check-versions.js

@@ -0,0 +1,56 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec(cmd) {
+    return require('child_process')
+        .execSync(cmd)
+        .toString()
+        .trim()
+}
+
+const versionRequirements = [
+    {
+        name: 'node',
+        currentVersion: semver.clean(process.version),
+        versionRequirement: packageConfig.engines.node
+    }
+]
+
+if (shell.which('npm')) {
+    versionRequirements.push({
+        name: 'npm',
+        currentVersion: exec('npm --version'),
+        versionRequirement: packageConfig.engines.npm
+    })
+}
+
+module.exports = function() {
+    const warnings = []
+
+    for (let i = 0; i < versionRequirements.length; i++) {
+        const mod = versionRequirements[i]
+
+        if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+            warnings.push(
+                mod.name + ': ' + chalk.red(mod.currentVersion) + ' should be ' + chalk.green(mod.versionRequirement)
+            )
+        }
+    }
+
+    if (warnings.length) {
+        console.log('')
+        console.log(chalk.yellow('To use this template, you must update following to modules:'))
+        console.log()
+
+        for (let i = 0; i < warnings.length; i++) {
+            const warning = warnings[i]
+            console.log('  ' + warning)
+        }
+
+        console.log()
+        process.exit(1)
+    }
+}

BIN
build/logo.png


+ 101 - 0
build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory =
+    process.env.NODE_ENV === 'production' ? config.build.assetsSubDirectory : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders(loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader',
+        publicPath: '../../'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 20 - 0
build/vue-loader.conf.js

@@ -0,0 +1,20 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction ? config.build.productionSourceMap : config.dev.cssSourceMap
+
+module.exports = {
+    loaders: utils.cssLoaders({
+        sourceMap: sourceMapEnabled,
+        extract: isProduction
+    }),
+    cssSourceMap: sourceMapEnabled,
+    cacheBusting: config.dev.cacheBusting,
+    transformToRequire: {
+        video: ['src', 'poster'],
+        source: 'src',
+        img: 'src',
+        image: 'xlink:href'
+    }
+}

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

@@ -0,0 +1,99 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+const webpack = require('webpack')
+
+function resolve(dir) {
+    return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+    context: path.resolve(__dirname, '../'),
+    entry: {
+        app: './src/main.js'
+    },
+    output: {
+        path: config.build.assetsRoot,
+        filename: '[name].js',
+        publicPath: process.env.NODE_ENV === 'production'
+            ? config.build.assetsPublicPath
+            : config.dev.assetsPublicPath
+    },
+    resolve: {
+        extensions: ['.ts', '.js', '.vue', '.json'],
+        alias: {
+            'vue$': 'vue/dist/vue.esm.js',
+            '@': resolve('src'),
+            'jquery': 'jquery',
+        }
+    },
+    // 增加一个plugins
+    plugins: [
+        new webpack.ProvidePlugin({
+            $: "jquery",
+            jQuery: "jquery"
+        })
+    ],
+    module: {
+        rules: [
+            {
+                test: /\.vue$/,
+                loader: 'vue-loader',
+                options: vueLoaderConfig
+            },
+            {
+                test: /\.tsx?$/,
+                loader: 'ts-loader',
+                exclude: /node_modules/,
+                options: {
+                  appendTsSuffixTo: [/\.vue$/],
+                }
+            },
+            {
+                test: /\.js$/,
+                loader: 'babel-loader',
+                include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+            },
+            {
+                test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('img/[name].[hash:7].[ext]')
+                }
+            },
+            {
+                test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('media/[name].[hash:7].[ext]')
+                }
+            },
+            {
+                test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+                loader: 'url-loader',
+                options: {
+                    limit: 10000,
+                    name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+                }
+            }
+        ]
+    },
+    node: {
+        // prevent webpack from injecting useless setImmediate polyfill because Vue
+        // source contains it (although only uses it if it's native).
+        setImmediate: false,
+        // prevent webpack from injecting mocks to Node native modules
+        // that does not make sense for the client
+        dgram: 'empty',
+        fs: 'empty',
+        net: 'empty',
+        tls: 'empty',
+        child_process: 'empty'
+    }
+}

+ 93 - 0
build/webpack.dev.conf.js

@@ -0,0 +1,93 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+    module: {
+        rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+    },
+    // cheap-module-eval-source-map is faster for development
+    devtool: config.dev.devtool,
+
+    // these devServer options should be customized in /config/index.js
+    devServer: {
+        clientLogLevel: 'warning',
+        historyApiFallback: {
+            rewrites: [{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }]
+        },
+        hot: true,
+        contentBase: false, // since we use CopyWebpackPlugin.
+        compress: true,
+        host: HOST || config.dev.host,
+        port: PORT || config.dev.port,
+        open: config.dev.autoOpenBrowser,
+        overlay: config.dev.errorOverlay ? { warnings: false, errors: true } : false,
+        publicPath: config.dev.assetsPublicPath,
+        proxy: config.dev.proxyTable,
+        quiet: true, // necessary for FriendlyErrorsPlugin
+        watchOptions: {
+            poll: config.dev.poll
+        }
+    },
+    plugins: [
+        new webpack.DefinePlugin({
+            'process.env': require('../config/dev.env')
+        }),
+        new webpack.HotModuleReplacementPlugin(),
+        new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+        new webpack.NoEmitOnErrorsPlugin(),
+        // https://github.com/ampedandwired/html-webpack-plugin
+        new HtmlWebpackPlugin({
+            filename: 'index.html',
+            template: 'index.html',
+            inject: true,
+            favicon: path.resolve(__dirname, '../static/favicon.ico')
+        }),
+        // copy custom static assets
+        new CopyWebpackPlugin([
+            {
+                from: path.resolve(__dirname, '../static'),
+                to: config.dev.assetsSubDirectory,
+                ignore: ['.*']
+            }
+        ])
+    ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+    portfinder.basePort = process.env.PORT || config.dev.port
+    portfinder.getPort((err, port) => {
+        if (err) {
+            reject(err)
+        } else {
+            // publish the new Port, necessary for e2e tests
+            process.env.PORT = port
+            // add port to devServer config
+            devWebpackConfig.devServer.port = port
+
+            // Add FriendlyErrorsPlugin
+            devWebpackConfig.plugins.push(
+                new FriendlyErrorsPlugin({
+                    compilationSuccessInfo: {
+                        messages: [
+                            `Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`
+                        ]
+                    },
+                    onErrors: config.dev.notifyOnErrors ? utils.createNotifierCallback() : undefined
+                })
+            )
+            resolve(devWebpackConfig)
+        }
+    })
+})

+ 140 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,140 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+    module: {
+        rules: utils.styleLoaders({
+            sourceMap: config.build.productionSourceMap,
+            extract: true,
+            usePostCSS: true
+        })
+    },
+    devtool: config.build.productionSourceMap ? config.build.devtool : false,
+    output: {
+        path: config.build.assetsRoot,
+        filename: utils.assetsPath('js/[name].[chunkhash].js'),
+        chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+    },
+    plugins: [
+        // http://vuejs.github.io/vue-loader/en/workflow/production.html
+        new webpack.DefinePlugin({
+            'process.env': env
+        }),
+        new UglifyJsPlugin({
+            uglifyOptions: {
+                compress: {
+                    warnings: false
+                }
+            },
+            sourceMap: config.build.productionSourceMap,
+            parallel: true
+        }),
+        // extract css into its own file
+        new ExtractTextPlugin({
+            filename: utils.assetsPath('css/[name].[contenthash].css'),
+            // Setting the following option to `false` will not extract CSS from codesplit chunks.
+            // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+            // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
+            // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+            allChunks: true
+        }),
+        // Compress extracted CSS. We are using this plugin so that possible
+        // duplicated CSS from different components can be deduped.
+        new OptimizeCSSPlugin({
+            cssProcessorOptions: config.build.productionSourceMap
+                ? { safe: true, map: { inline: false } }
+                : { safe: true }
+        }),
+        // generate dist index.html with correct asset hash for caching.
+        // you can customize output by editing /index.html
+        // see https://github.com/ampedandwired/html-webpack-plugin
+        new HtmlWebpackPlugin({
+            filename: config.build.index,
+            template: 'index.html',
+            inject: true,
+            minify: {
+                removeComments: true,
+                collapseWhitespace: true,
+                removeAttributeQuotes: true
+                // more options:
+                // https://github.com/kangax/html-minifier#options-quick-reference
+            },
+            // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+            chunksSortMode: 'dependency',
+            favicon: path.resolve(__dirname, '../static/favicon.ico')
+        }),
+        // keep module.id stable when vendor modules does not change
+        new webpack.HashedModuleIdsPlugin(),
+        // enable scope hoisting
+        new webpack.optimize.ModuleConcatenationPlugin(),
+        // split vendor js into its own file
+        new webpack.optimize.CommonsChunkPlugin({
+            name: 'vendor',
+            minChunks(module) {
+                // any required modules inside node_modules are extracted to vendor
+                return (
+                    module.resource &&
+                    /\.js$/.test(module.resource) &&
+                    module.resource.indexOf(path.join(__dirname, '../node_modules')) === 0
+                )
+            }
+        }),
+        // extract webpack runtime and module manifest to its own file in order to
+        // prevent vendor hash from being updated whenever app bundle is updated
+        new webpack.optimize.CommonsChunkPlugin({
+            name: 'manifest',
+            minChunks: Infinity
+        }),
+        // This instance extracts shared chunks from code splitted chunks and bundles them
+        // in a separate chunk, similar to the vendor chunk
+        // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+        new webpack.optimize.CommonsChunkPlugin({
+            name: 'app',
+            async: 'vendor-async',
+            children: true,
+            minChunks: 3
+        }),
+
+        // copy custom static assets
+        new CopyWebpackPlugin([
+            {
+                from: path.resolve(__dirname, '../static'),
+                to: config.build.assetsSubDirectory,
+                ignore: ['.*']
+            }
+        ])
+    ]
+})
+
+if (config.build.productionGzip) {
+    const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+    webpackConfig.plugins.push(
+        new CompressionWebpackPlugin({
+            asset: '[path].gz[query]',
+            algorithm: 'gzip',
+            test: new RegExp('\\.(' + config.build.productionGzipExtensions.join('|') + ')$'),
+            threshold: 10240,
+            minRatio: 0.8
+        })
+    )
+}
+
+if (config.build.bundleAnalyzerReport) {
+    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+    webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 289 - 0
config/conf.js

@@ -0,0 +1,289 @@
+/**
+ * Info: 14(测试)、18(研发测试)、39(项目组)
+ */
+module.exports = {
+  "18": {
+    "/admin": {
+      target: "http://mbi.sagacloud.cn:8080/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/admin": "/"
+      }
+    },
+    "/persagy-sso-server": {
+        target: "http://192.168.64.17:28888/",
+        changeOrigin: true,
+        pathRewrite: {
+          "^/persagy-sso-server": "/persagy-sso-server/"
+        }
+    },
+    "/datacenter": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datacenter": "/datacenter/"
+      }
+    },
+    "/equip-component": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/equip-component": "/equip-component/"
+      }
+    },
+    "/message-center": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/message-center": "/message-center/"
+      }
+    },
+    "/datasyn": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datasyn": "/datasyn/"
+      }
+    },
+    "/revit-algorithm": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/revit-algorithm": "/revit-algorithm/"
+      }
+    },
+    "/scheduler": {
+      target: "http://192.168.64.17:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/scheduler": "/scheduler/"
+      }
+    },
+    "/scanbuilding": {
+      // 目标 API 地址
+      target: "http://192.168.64.17:28888",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/rwd": {
+      // 目标 API 地址
+      target: "http://39.102.40.239:9970/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/pointconfig": {
+      // 目标 API 地址
+      target: "http://mbi.sagacloud.cn:8080/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/image-service": {
+      // 目标 API 地址
+      target: "http://39.97.179.199:8891",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false,
+      pathRewrite: {
+        "^/image-service": "/image-service/"
+      }
+    }
+  },
+  "14": {
+    "/admin": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/admin": "/"
+      }
+    },
+    "/datacenter": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datacenter": "/datacenter/"
+      }
+    },
+    "/equip-component": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/equip-component": "/equip-component/"
+      }
+    },
+    "/message-center": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/message-center": "/message-center/"
+      }
+    },
+    "/datasyn": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datasyn": "/datasyn/"
+      }
+    },
+    "/revit-algorithm": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/revit-algorithm": "/revit-algorithm/"
+      }
+    },
+    "/scheduler": {
+      target: "http://adm/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/scheduler": "/scheduler/"
+      }
+    },
+    "/scanbuilding": {
+      // 目标 API 地址
+      target: "http://adm/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/rwd": {
+      // 目标 API 地址
+      target: "http://adm/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/pointconfig": {
+      // 目标 API 地址
+      target: "http://mbi.sagacloud.cn:8080/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/image-service": {
+      // 目标 API 地址
+      target: "http://adm/",
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false,
+      pathRewrite: {
+        "^/image-service": "/image-service/"
+      }
+    }
+  },
+  "39": {
+    "/admin": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/admin": "/"
+      }
+    },
+    "/persagy-sso-server": {
+        target: "http://39.102.40.239:28888/",
+        changeOrigin: true,
+        pathRewrite: {
+          "^/persagy-sso-server": "/persagy-sso-server/"
+        }
+    },
+    "/datacenter": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datacenter": "/datacenter/"
+      }
+    },
+    "/equip-component": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/equip-component": "/equip-component/"
+      }
+    },
+    "/message-center": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/message-center": "/message-center/"
+      }
+    },
+    "/datasyn": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/datasyn": "/datasyn/"
+      }
+    },
+    "/revit-algorithm": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/revit-algorithm": "/revit-algorithm/"
+      }
+    },
+    "/scheduler": {
+      target: "http://39.102.40.239:28888/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/scheduler": "/scheduler/"
+      }
+    },
+    "/scanbuilding": {
+      // 目标 API 地址
+      target: "http://39.102.40.239:28888",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/rwd": {
+      // 目标 API 地址
+      target: "http://39.102.40.239:9970/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/pointconfig": {
+      // 目标 API 地址
+      target: "http://39.102.40.239:28888/",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false
+    },
+    "/image-service": {
+      // 目标 API 地址
+      target: "http://39.97.179.199:8891",
+      // 如果要代理 websockets
+      ws: true,
+      // 将主机标头的原点更改为目标URL
+      changeOrigin: false,
+      pathRewrite: {
+        "^/image-service": "/image-service/"
+      }
+    },
+    "/login-service": {
+      target: "http://develop.persagy.com/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/login-service": "/EMS_SaaS_Web/Spring/MVC/entrance/unifier/loginUserService"
+      }
+    },
+    "/getUserById": {
+      target: "http://develop.persagy.com/",
+      changeOrigin: true,
+      pathRewrite: {
+        "^/getUserById": "/EMS_SaaS_Web/Spring/MVC/entrance/unifier/getPersonByUserIdService"
+      }
+    },
+  },
+};

+ 17 - 0
config/dev.env.js

@@ -0,0 +1,17 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"',
+  // MQTT_SERVICE: '"ws://172.16.42.210:61614/stomp/"' //MQ测试环境地址
+  // BASE_URL: '"http://mbi.sagacloud.cn"', //线上iframe地址
+  //   SSO_SERVER: '"http://sso.sagacloud.cn"',  //正式环境
+  //   SSO_SERVER: '"http://192.168.64.18:9988/persagysso/"', //单点登录开发测试环境地址(自研)
+  //   BASE_URL: '"http://192.168.64.18"', //iframe开发测试环境地址
+  //   MQTT_SERVICE: '"ws://192.168.64.18:61614/stomp/"', //MQ开发测试环境地址
+  SSO_SERVER: '"http://39.102.40.239/persagysso/"', //单点登录生产环境地址(自研)
+  BASE_URL: '"http://39.102.40.239"', //iframe生产地址
+  MQTT_SERVICE: '"ws://39.102.40.239/stomp/"', //MQ生产环境地址
+  NO_LOGIN: '"false"' //是否免登陆(true/false)
+})

+ 69 - 0
config/index.js

@@ -0,0 +1,69 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+const proxyTable = require('./conf')
+
+module.exports = {
+  dev: {
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: proxyTable["39"],
+
+    // Various Dev Server settings
+    host: '0.0.0.0', // can be overwritten by process.env.HOST
+    port: 28080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    devtool: 'cheap-module-eval-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    cssSourceMap: true
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../adm/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../adm'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/adm/',
+
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: true,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: '#source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+}

+ 11 - 0
config/prod.env.js

@@ -0,0 +1,11 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"',
+//   SSO_SERVER: '"http://192.168.64.18:9988/persagysso/"', //单点登录开发测试环境地址(自研)
+//   BASE_URL: '"http://192.168.64.18"', //iframe开发测试环境地址
+//   MQTT_SERVICE: '"ws://192.168.64.18:61614/stomp/"', //MQ开发测试环境地址
+    SSO_SERVER: '"http://39.102.40.239/persagysso/"', //单点登录生产环境地址(自研)
+    BASE_URL: '"http://39.102.40.239"', //iframe生产地址
+    MQTT_SERVICE: '"ws://39.102.40.239/stomp/"', //MQ生产环境地址
+  NO_LOGIN: '"false"' //是否免登陆(true/false)
+}

+ 19 - 0
index.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8"/>
+  <meta name="viewport" content="width=device-width,initial-scale=1.0"/>
+  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
+  <meta http-equiv="Cache" content="no-cache">
+  <meta http-equiv="Pragma" content="no-cache"/>
+  <meta http-equiv="Expires" content="0"/>
+  <title>sagacloud-admin</title>
+  <script type="text/javascript" src="<%=htmlWebpackPlugin.files.publicPath %>static/systemConf.js"></script>
+</head>
+
+<body>
+    <div id="app"></div>
+</body>
+
+</html>

+ 97 - 0
package.json

@@ -0,0 +1,97 @@
+{
+  "name": "sagacloud-admin",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "zhangyu <zhangyu@sagacloud.cn>",
+  "private": true,
+  "remote": {
+    "host": "192.168.64.18",
+    "path": "/root/apps/web/adm",
+    "user": "root",
+    "password": "persagy@2020",
+    "local": "adm"
+  },
+  "scripts": {
+    "i": "npm install",
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev",
+    "build": "node build/build.js",
+    "publish": "node publish.js"
+  },
+  "dependencies": {
+    "@saga-web/base": "2.1.27",
+    "@saga-web/cad-engine": "2.0.595",
+    "@saga-web/draw": "2.1.113",
+    "@saga-web/graph": "2.1.138",
+    "axios": "^0.18.0",
+    "echarts": "^4.1.0",
+    "el-cascader-multi": "^1.1.8",
+    "element-ui": "^2.13.2",
+    "font-awesome": "^4.7.0",
+    "handsontable-pro": "^3.0.0",
+    "jquery": "^3.3.1",
+    "vue": "^2.5.2",
+    "vue-axios": "^2.1.4",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.1.0"
+  },
+  "devDependencies": {
+    "ajv": "^6.9.1",
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "chalk": "^2.0.1",
+    "copy-webpack-plugin": "^4.0.1",
+    "css-loader": "^0.28.0",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^1.1.4",
+    "file-saver": "^2.0.2",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "less": "^3.9.0",
+    "less-loader": "^4.1.0",
+    "moment": "^2.29.0",
+    "node-notifier": "^5.1.2",
+    "node-sass": "^4.14.1",
+    "node-ssh": "^6.0.0",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^7.1.0",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "spark-md5": "^3.0.0",
+    "stompjs": "^2.3.3",
+    "swiper": "^4.0.0",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^13.3.0",
+    "vue-simple-uploader": "^0.7.4",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0",
+    "xlsx": "^0.15.1"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 40 - 0
publish.js

@@ -0,0 +1,40 @@
+/*
+ * @Author: zhangyu
+ * @Date: 2019-12-18 16:18:30
+ * @Info: 自动化部署
+ * @LastEditTime : 2020-02-11 17:47:56
+ */
+
+const Client = require("node-ssh");
+const ssh = new Client(); 
+
+ssh.connect({
+  host: process.env.npm_package_remote_host,
+  port: "22",
+  // privateKey: `${process.env.HOME}\\.ssh\\id_rsa_2048`,
+  username: process.env.npm_package_remote_user,
+  password: process.env.npm_package_remote_password
+}).then(() => {
+  const failedList = [];
+  ssh.putDirectory(
+    process.env.npm_package_remote_local,
+    process.env.npm_package_remote_path,
+    {
+      recursive: true,
+      concurrency: 1,
+      tick: function(localPath, remotePath, error) {
+        if (error) {
+          failedList.push(localPath);
+        }
+      }
+    }
+  ).then(status => {
+    if (failedList.length > 0) {
+      console.log("发布失败");
+      console.log("failed transfers", failedList.join(", "));
+    } else {
+      console.log(status ? "发布成功" : "发布失败");
+    }
+    ssh.dispose();
+  });
+});

+ 17 - 0
src/App.vue

@@ -0,0 +1,17 @@
+<template>
+    <div id='app'>
+        <router-view/>
+        <global-uploader></global-uploader>
+    </div>
+</template>
+
+<script>
+import globalUploader from '@/components/globaluploader'
+
+export default {
+    name: 'App',
+    components: {
+        globalUploader
+    },
+}
+</script>

+ 205 - 0
src/api/alarm/alarm.js

@@ -0,0 +1,205 @@
+/**
+@author:fugy
+@date:2019.1.10
+@info:alarm-api
+ */
+import httputils from '@/api/httputils'
+
+const api = {
+    //获取对象类型
+    getObjectType() {
+        return new Promise((resolve, reject) => {
+            httputils.getJson(
+                '/server/dataplatform/dict/query/equipment_all',
+                null,
+                res => {
+                    if (res.result === 'success') {
+                        let dataArr = res.data
+                        objTypeArr = []
+                        let sysArr = []
+                        let devArr = []
+                        dataArr.forEach(item => {
+                            objTypeArr.push(item)
+                            let sysObj = {
+                                label: item.name,
+                                value: item.code,
+                                type: item.type
+                            }
+                            let devObj = {
+                                label: item.name,
+                                value: item.code,
+                                type: item.type
+                            }
+                            if (item.content) {
+                                sysObj.children = []
+                                devObj.children = []
+                                item.content.forEach(ele => {
+                                    objTypeArr.push(ele)
+                                    let sysObj1 = {
+                                        label: ele.name,
+                                        value: ele.code,
+                                        type: ele.type
+                                    }
+                                    let devObj1 = {
+                                        label: ele.name,
+                                        value: ele.code,
+                                        type: ele.type
+                                    }
+                                    if (ele.content) {
+                                        devObj1.children = []
+                                        ele.content.forEach(strip => {
+                                            objTypeArr.push(strip)
+                                            let devObj2 = {
+                                                label: strip.name,
+                                                value: strip.code,
+                                                type: strip.type
+                                            }
+                                            devObj1.children.push(devObj2)
+                                        })
+                                    } else {
+                                        devObj1 = {
+                                            label: ele.name,
+                                            value: ele.code,
+                                            type: ele.type,
+                                            disabled: true
+                                        }
+                                    }
+                                    sysObj.children.push(sysObj1)
+                                    devObj.children.push(devObj1)
+                                })
+                            }
+                            sysArr.push(sysObj)
+                            devArr.push(devObj)
+                        })
+                        let resObj = {
+                            sysArr,
+                            devArr
+                        }
+                        objTypeDevArr = devArr
+                        resolve(resObj)
+                    } else {
+                        reject('fail')
+                    }
+                },
+                fail => {
+                    reject(fail)
+                },
+                err => {
+                    reject(err)
+                }
+            )
+        })
+    },
+    // 获取对象类的改造成一个整的数组
+    getObjTypeNameFromCode(objType, category, spaceNameObj) {
+        if (objType == 'building') {
+            return { name: '建筑' }
+        } else if (objType == 'floor') {
+            return { name: '楼层' }
+        } else if (objType == 'space') {
+            let name
+            if (category) {
+                name = spaceNameObj[category]
+            } else {
+                name = '空间'
+            }
+
+            return { name: name }
+        } else {
+            let arr = objTypeArr.filter((ele, index) => {
+                return ele.code == category
+            })
+            if (arr.length) {
+                return arr[0]
+            } else {
+                return { name: '---' }
+            }
+        }
+    },
+    // 获取对象类中的空间级联
+    getObjTypeSpace() {
+        return new Promise((resolve, reject) => {
+            httputils.getJson('/server/dataplatform/dict/query/space', {}, res => {
+                if (res.result == "success") {
+                    resolve(res.data)
+                } else {
+                    resolve([])
+                }
+            })
+        })
+    },
+    // 获取固定和项目报警的list数据
+    getListData(params) {
+        return new Promise((resolve, reject) => {
+            httputils.postJson(
+                '/server/alarm/config/queryConfig',
+                params,
+                res => {
+                    resolve(res)
+                },
+                fail => {
+                    reject(fail)
+                },
+                err => {
+                    reject(err)
+                }
+            )
+        })
+    },
+    // 通过根据Id批量获取各物理实体
+    getApplyObjInfo(projectId, data) {
+        return new Promise((resolve, reject) => {
+            httputils.postJson('/server/dataplatform/object/batchquery?projectId=' + projectId, data, res => {
+                if (res.Result === "success") {
+                    resolve(res.Content || []);
+                }
+            }, fail => {
+                reject(fail);
+            }, err => {
+                reject(err);
+            })
+        })
+    },
+  //查询报警分类
+  alarmClassList(params) {
+    return new Promise(resolve => {
+      httputils.postJson('/server/alarm/config/category/query', params, resp => {
+        if (resp.result == 'success' && resp.count) {
+          resolve(resp.content)
+        } else {
+          resolve([])
+        }
+      })
+    })
+  },
+  //创建报警分类
+  createAlarmClass(params) {
+    return new Promise(resolve => {
+      httputils.postJson('/server/alarm/config/category/create', params, resp => {
+        resolve(resp)
+      })
+    })
+  },
+  /***************断数报警*************************************************** */
+  //获取断数报警通知人员
+  getNumUserNotice(params) {
+    return new Promise(resolve => {
+        httputils.postJson('/server/alarm/notifyuser/queryBrokenAlarmNotifyUser', params, resp => {
+            if(resp.result == 'success' && resp.count) {
+                resolve(resp.content)
+            } else {
+                resolve([])
+            }
+        })
+    })
+  },
+  //更新断数报警的通知方式
+  updateNumUserNotice(params) {
+    return new Promise(resolve => {
+        httputils.postJson('/server/alarm/brokenalarmnotifyuser/update', params, resp => {
+            resolve(resp)
+        })
+    })
+  }
+}
+export default api

+ 140 - 0
src/api/data_admin/buildTaskApi.js

@@ -0,0 +1,140 @@
+import http from '../scan/httpUtil';
+import { baseUrl, scan } from './../scan/config';
+
+/**
+ * info: 查询统计数量(查询总数量不传参数,查询已完成数量TaskState=0,查询未找到TaskState=-1,查询未验证TaskState=1)
+ * @param {Filters:string} param 查询参数
+ * @param {*} success  成功的回调函数
+ *
+ */
+export function queryTaskCount(param, success) {
+  // let url = `${baseUrl}${dataCenter}/scan-task-base/count`;
+  let url = `${baseUrl}${scan}/task/aggregate/count`;
+  http.postJson(url, param, success);
+}
+
+/*************************模型任务接口****************************/
+//创建模型任务
+export function createModelTask(param, success) {
+  // let url = `${baseUrl}${modelScanTask}/create`;
+  let url = `${baseUrl}${scan}/task/model/create`;
+  http.postJson(url, param, success);
+}
+
+//根据id删除模型任务
+export function deleteModelTask(param, success) {
+  // let url = `${baseUrl}${modelScanTask}/delete`;
+  let url = `${baseUrl}${scan}/task/model/delete`;
+  http.postJson(url, param, success);
+}
+
+//查询:根据模型空间ID查询设备信息
+export function queryModelDiglog(param, success) {
+  // let url = `${baseUrl}${modelScanTask}/equip-query`;
+  let url = `${baseUrl}${scan}/task/model/equip-query`;
+  http.postJson(url, param, success);
+}
+
+//查询模型任务
+export function queryModelTask(param, success) {
+  let url = `${baseUrl}${scan}/task/model/page-query`;
+  http.postJson(url, param, success);
+}
+
+//更新模型任务
+export function updateModelTask(param, success) {
+  let url = `${baseUrl}${scan}/task/model/update`;
+  http.postJson(url, param, success);
+}
+
+//查询设备分类
+export function queryModelCategory(param, success) {
+  let url = `${baseUrl}${scan}/task/model/model-category-query`;
+  http.postJson(url, param, success);
+}
+
+//查询模型文件夹和文件
+export function queryModelFile(param, success) {
+  let url = `${baseUrl}${scan}/task/model/model-file-query`;
+  http.postJson(url, param, success);
+}
+
+//查询模型任务下的部件类型及数量
+export function modelCategoryCount(param, success) {
+  let url = `${baseUrl}${scan}/task/model/category-count`;
+  http.postJson(url, param, success);
+}
+
+/*************************设备台账任务接口****************************/
+//创建设备台账任务
+export function createDeviceTask(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/create`;
+  http.postJson(url, param, success);
+}
+
+//根据id删除设备台账任务
+export function deleteDeviceTask(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/delete`;
+  http.postJson(url, param, success);
+}
+
+//查询设备台账任务
+export function queryDeviceTask(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/page-query`;
+  http.postJson(url, param, success)
+}
+
+//更新设备台账任务
+export function updateDeviceTask(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/update`;
+  http.postJson(url, param, success)
+}
+
+//设备台账任务接口 查询设备分类
+export function queryDeviceCategory(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/category/query`;
+  http.postJson(url, param, success)
+}
+
+//查询设备任务下的部件类型及数量
+export function categoryCount(param, success) {
+  let url = `${baseUrl}${scan}/task/equip/category-count`
+  http.postJson(url, param, success)
+}
+
+/*************************资产台账任务接口****************************/
+//统计数量
+export function countAssetsTask(param, success) {
+  let url = `${baseUrl}${scan}/task/property/count`;
+  http.postJson(url, param, success)
+}
+
+//创建设备台账任务
+export function createAssetsTask(param, success) {
+  let url = `${baseUrl}${scan}/task/property/create`;
+  http.postJson(url, param, success)
+}
+
+//根据id删除设备台账任务
+export function deleteAssetsTask(param, success) {
+  let url = `${baseUrl}${scan}/task/property/delete`;
+  http.postJson(url, param, success)
+}
+
+//查询资产台账任务 y
+export function queryAssetsTask(param, success) {
+  let url = `${baseUrl}${scan}/task/property/page-query`;
+  http.postJson(url, param, success)
+}
+
+//更新资产台账任务
+export function updateAssetsTask(param, success) {
+  let url = `${baseUrl}${scan}/task/property/update`;
+  http.postJson(url, param, success)
+}
+
+//查询设备族
+export function queryAssetsFamily(param, success) {
+  let url = `${baseUrl}${scan}/task/property/property-category-query`;
+  http.postJson(url, param, success)
+}

+ 10 - 0
src/api/database/hbase.js

@@ -0,0 +1,10 @@
+import httputils from '@/api/httputils'
+export default {
+    tables() {
+        return httputils.getJson('/admin/hbase/tables')
+    },
+
+    query(criteria) {
+        return httputils.postJson('/admin/hbase/query', criteria)
+    }
+}

+ 12 - 0
src/api/database/redis.js

@@ -0,0 +1,12 @@
+import httputils from '@/api/httputils'
+export default {
+    query(criteria) {
+        return httputils.postJson('/admin/redis/query', criteria)
+    },
+    save(redisData) {
+        return httputils.postJson('/admin/redis/save', redisData)
+    },
+    delete(redisData) {
+        return httputils.postJson('/admin/redis/delete', redisData)
+    }
+}

+ 66 - 0
src/api/dict/index.js

@@ -0,0 +1,66 @@
+import {baseUrl, dict, component_dict} from "@/api/scan/config";
+import http from "@/api/scan/httpUtil";
+
+//头部信息查询(查询所有设备类型-所有部件类型-所有系统类型-所有专业类型)
+export function queryPhysicsAllType(param, success) {
+  let url = `${baseUrl}${dict}/category`;
+  http.postJson(url, param, success);
+}
+
+//查询项目下类型的信息点
+export function getDataDictionary(param, success) {
+  let url = `${baseUrl}${dict}/query`;
+  http.postJson(url, param, success);
+}
+
+//批量处理字典信息操作
+export function setInfoPoint(param, success) {
+  let url = `${baseUrl}${dict}/dict-batch`;
+  http.postJson(url, param, success)
+}
+
+//设置-项目定制化字典
+export function setDataDictionary(param, success) {
+  let url = `${baseUrl}${dict}/setting-dic-project`;
+  http.postJson(url, param, success)
+}
+
+// 字典-项目下已有的设备类型带系统
+export function getEquipLkSys(param, success) {
+    let url = `${baseUrl}${dict}/system/equip/category`;
+    http.postJson(url, param, success)
+}
+
+/**
+ * 字典统一配置(切换到equip-component服务上)
+ */
+
+// 头部信息查询(查询所有设备类型-所有部件类型-所有系统类型-所有专业类型)
+export function dictCategory(param, success) {
+    let url = `${baseUrl}${component_dict}/category`;
+    http.postJson(url, param, success);
+}
+
+//查询项目下类型的信息点
+export function dictQuery(param, success) {
+    let url = `${baseUrl}${component_dict}/query`;
+    http.postJson(url, param, success);
+}
+
+//设置-项目定制化字典
+export function setDicProject(param, success) {
+    let url = `${baseUrl}${component_dict}/setting-dic-project`;
+    http.postJson(url, param, success)
+}
+
+//需采集信息同步到所有项目
+export function synDicProject(param, success) {
+    let url = `${baseUrl}${component_dict}/syn-dic-project`;
+    http.getJson(url, param, success)
+}
+
+// 统计-根据条件统计返回信息点
+export function deliveredInfos(param, success) {
+    let url = `${baseUrl}${component_dict}/delivered/infos`
+    http.postJson(url, param, success)
+}

+ 72 - 0
src/api/fm/rules.js

@@ -0,0 +1,72 @@
+/**
+@author:fugy
+@date:2019.1.16
+@info:项目抢单规则设定=project-rule-api
+ */
+const planHz = [
+    { id: 'd', name: '每日' },
+    { id: 'w', name: '每周' },
+    { id: 'm', name: '每月' },
+    { id: 'y', name: '每年' }
+]
+import httputils from '@/api/httputils'
+const api = {
+    getLevelDef() {
+        return { value: 'id', label: 'name', children: 'content' }
+    },
+    //获取级别列表
+    getLevelList() {
+        return new Promise((resolve, reject) => {
+            httputils.getJson('/server/workorder/engineer/level/def/list', null, resp => {
+                let result = []
+                resp.content.forEach(item => {
+                    let temp = { id: item.skillId, name: item.name, content: [] }
+                    if (item.content) {
+                        item.content.forEach(level => {
+                            temp.content.push({ id: level.levelId, name: level.name })
+                        })
+                    }
+                    result.push(temp)
+                })
+                resolve(result)
+            })
+        })
+    },
+    // 获取工单类型列表
+    getOrderType() {
+        return new Promise(resolve => {
+            httputils.getJson('/server/workorder/rule/queryWoTypeList', {}, resp => {
+                if (resp.result == 'success' && resp.count) {
+                    resolve(resp.content)
+                } else {
+                    resolve([])
+                }
+            })
+        })
+    },
+    //获取计划频率
+    getPlanHz() {
+        return planHz
+    },
+    //获取项目抢单规则的列表数据
+    getListData(params) {
+        return new Promise(resolve => {
+            httputils.postJson('/server/workorder/rule/query', params, resp => {
+                if (resp.result == 'success' && resp.content.length) {
+                    resolve(resp.content)
+                } else {
+                    resolve([])
+                }
+            })
+        })
+    },
+    //配置当前的工单的规则
+    updateWorkOrder(params) {
+        return new Promise(resolve => {
+            httputils.postJson('/server/workorder/rule/createOrUpdate', params, resp => {
+                resolve(resp)
+            })
+        })
+    }
+}
+export default api

+ 83 - 0
src/api/fm/sop.js

@@ -0,0 +1,83 @@
+/**
+@author:fugy
+@date:2018.10.22
+@info:通用问题对应集团的sop的api
+ */
+import httputils from '@/api/httputils'
+let priorityArr = [
+    //优先级数组
+    {
+        label: 'S',
+        value: 'S'
+    },
+    {
+        label: 'A',
+        value: 'A'
+    },
+    {
+        label: 'B',
+        value: 'B'
+    },
+    {
+        label: 'C',
+        value: 'C'
+    },
+    {
+        label: 'D',
+        value: 'D'
+    }
+];
+let problemArr = [
+    //问题级别数组
+    {
+        label: '电器',
+        value: '电器'
+    },
+    {
+        label: '建筑',
+        value: '建筑'
+    },
+    {
+        label: '家具',
+        value: '家具'
+    },
+    {
+        label: '其他',
+        value: '其他'
+    }
+]
+const api = {
+    // 获取sop的列表
+    getListData: function(params) {
+        return new Promise((resolve, reject) => {
+			httputils.postJson('/server/workorder/generalProblem/problem/query', params, res => {
+                resolve(res)
+			})
+		})
+    },
+    // 获取sop问题的列表数据
+    getSopList(params) {
+        return new Promise((resolve, reject) => {
+			httputils.postJson('/server/workorder/generalProblem/sop/list', params, res => {
+                resolve(res)
+			})
+		})
+    },
+    // 保存配置sop
+    setSop(params) {
+        return new Promise((resolve, reject) => {
+			httputils.postJson('/server/workorder/generalProblem/sop/set', params, res => {
+                resolve(res)
+			})
+		})
+    },
+    // 优先级数组
+    getPriorityArr: function () {
+        return priorityArr
+    },
+    // 获取问题类型
+    getProblemArr: function () {
+        return problemArr
+    },
+}
+export default api;

+ 125 - 0
src/api/framework.js

@@ -0,0 +1,125 @@
+import store from '@/store'
+import storage from "@/framework/utils/storage"
+import lStorage from '@/utils/localStorage'
+import menus from '@/data/menus'
+import router from '@/router'
+import httputils from '@/api/httputils'
+import { logout } from "@/api/system/persagy-sso-server";
+import { Message } from 'element-ui'
+// const userInfo = { username: 'admin', permissions: ['demo'] }
+
+const userInfo = null
+
+function toLogin() {
+  router.push('/login')
+}
+
+function checkMenu(menu, ps) {
+  let result = { ...menu }
+  if (menu.childrens) {
+    // 如果有下级菜单权限,则自动拥有上级菜单权限
+    result.childrens = []
+    menu.childrens.forEach(child => {
+      let submenu = checkMenu(child, ps)
+      if (submenu) {
+        result.childrens.push(submenu)
+      }
+    })
+    return result.childrens.length > 0 ? result : null
+  } else if (menu.opts) {
+    return menu.opts.some(opt => ps[opt.permission]) ? result : null
+  } else {
+    // 如果没有下级菜单且没有opts属性, 菜单可以直接访问,不需要权限
+    return result
+  }
+}
+
+export default {
+  /**
+   *  路由守卫, 每次路由跳转时验证登录
+   * @param {*} to
+   * @param {*} from
+   * @param {*} next
+   */
+  routerBeforeEach: async function (to, from, next) {
+    console.log('router before ', to)
+    if (to.path == '/auth' || to.path == '/login') {
+      next()
+    } else {
+      if (to.meta.breadcrumbs) {
+        store.dispatch('setBreadcrumb', to.meta.breadcrumbs)
+      } else {
+        store.dispatch('setBreadcrumb', [])
+      }
+      // next()
+      let userInfo = store.getters['layout/userInfo']
+      if (!userInfo) {
+        // 本地是未登录状态, 保存目标页面地址, 去登录
+        let lastRoute = { path: to.path, params: to.params, query: to.query }
+        store.commit('setLastRoute', lastRoute)
+        toLogin()
+      } else {
+        if (to.meta.breadcrumbs) {
+          store.dispatch('setBreadcrumb', to.meta.breadcrumbs)
+        }
+        next()
+      }
+      return true
+    }
+  },
+
+  getMenus(permissions) {
+    let result = []
+    let allMenus = []
+    // 开发环境下展示demo页面
+    // if (process.env.NODE_ENV === 'development') {
+    //     allMenus = demoMenus
+    // }
+    allMenus = allMenus.concat(menus)
+    let ps = !permissions ? {} : permissions
+    console.log(ps)
+    allMenus.forEach(item => {
+      let menu = checkMenu(item, ps)
+      if (menu) {
+        result.push(menu)
+      }
+    })
+    return result
+  },
+
+  login(username, password) {
+    return new Promise((resolve, reject) => {
+      if (username == 'admin') {
+        resolve({ result: 'success', ssoToken: 'admin-token' })
+      } else {
+        resolve({ result: 'fail', message: 'username or password error' })
+      }
+    })
+  },
+
+  loadUserInfo() {
+    return httputils.getJson(`/admin/ibms/user/userInfo`)
+  },
+
+  /**
+   * 退出账户登录
+   */
+  async toLogout() {
+    // TODO 调用登出接口(未添加)
+    let ssoServer = process.env.SSO_SERVER
+    let redirectUrl = window.location.protocol + '//' + window.location.host + '/adm/auth'
+    const res = await logout({});
+    if (res.code === 'Success') {
+        store.commit('setSsoToken', null)
+        lStorage.remove('');
+        lStorage.remove('ssoToken')
+        store.commit('layout/setUserInfo', null)
+        store.commit('layout/setUserId', "")
+        window.location.href = `${ssoServer}?redirectUrl=${redirectUrl}`
+    } else {
+        Message.error(`登出失败,失败原因:${res.message}`);
+    }
+  },
+
+  toLoginPage: toLogin
+}

+ 171 - 0
src/api/httputils.js

@@ -0,0 +1,171 @@
+import axios from 'axios'
+import store from '@/store'
+import storage from "@/framework/utils/storage";
+import lStorage from '@/utils/localStorage';
+import {
+  message
+} from '@/api/scan/config.js'
+
+var CancelToken = axios.CancelToken
+var cancel
+
+// 创建axios实例
+const axiosservice = axios.create({
+  timeout: 3000000, // 请求超时时间
+  retry: 4, //重新请求次数
+  retryDelay: 1000, //重新请求的间隔
+  credentials: true, // 接口每次请求会跨域携带cookie
+  cancelToken: new CancelToken(function executor(c) {
+    // executor 函数接收一个 cancel 函数作为参数
+    cancel = c
+  })
+})
+
+axiosservice.interceptors.request.use(
+  config => {
+    config.cancelToken = new axios.CancelToken(cancel => {
+      if (config.url !== `${message}/message/update-state` || config.url !== '/image-service/common/multipart_upload') {
+        store.commit('setAxiosArr', {
+          cancel
+        })
+      }
+    })
+    // config.withCredentials = true // 允许携带token ,这个是解决跨域产生的相关问题
+    // let token = store.getters['ssoToken']
+    // if (token) {
+    //     config.headers = {
+    //         'sso-token': token
+    //     }
+    // }
+    return config
+  },
+  error => {
+    return Promise.reject(error)
+  }
+)
+
+axiosservice.interceptors.response.use(
+  function (res) {
+    //在这里对返回的数据进行处理
+    let resp = res.data
+    // if (resp.result === 'unauthc') {
+    //     store.commit('logined', false)
+    //     MessageBox.confirm('未登录或登录信息已失效, 是否重新登录?', '提示', {
+    //         confirmButtonText: '确定',
+    //         cancelButtonText: '取消',
+    //         type: 'error'
+    //     })
+    //         .then(resp => {
+    //             const ssoServer = process.env.SSO_SERVER
+    //             const redirectUrl = window.location.protocol + '//' + window.location.host + '/adm/auth'
+    //             window.location.href = `${ssoServer}?redirectUrl=${redirectUrl}`
+    //         })
+    //         .catch(error => {
+    //             console.log('')
+    //         })
+    // }
+    return res
+  },
+  function (err) {
+    console.log('axios interceptors err = ', err)
+    return Promise.reject(err)
+  }
+)
+
+export default {
+  //获取cookie
+  getCookie(name) {
+    var arr,
+      reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
+    if ((arr = document.cookie.match(reg))) {
+      return unescape(arr[2])
+    } else {
+      /* 如果没有参数,那么就获取本域下的所有cookie */
+      return document.cookie
+    }
+  },
+
+  async getJson(url, params) {
+    let ssoToken = store.state.ssoToken ?
+      store.state.ssoToken :
+      lStorage.get("ssoToken");
+    let ProjectId = store.state.layout.projectId ?
+      store.state.layout.projectId :
+      lStorage.get("projectId");
+    let userName = store.state.layout.userInfo.userName ?
+      store.state.layout.userInfo.userName :
+      storage.get("user_name");
+    let group_code = store.state.layout.group_code ?
+      store.state.layout.group_code :
+      lStorage.get("group_code");
+    try {
+      let response = await axiosservice({
+        url,
+        headers: {
+          projectId: ProjectId,
+          token: ssoToken,
+          appId: "adm",
+          userId: userName,
+          groupCode: group_code
+        },
+        params,
+        method: 'get'
+      })
+      return response.data
+    } catch (err) {
+      throw err
+    }
+  },
+  async postJson(url, data) {
+    let ssoToken = store.state.ssoToken ?
+      store.state.ssoToken :
+      lStorage.get("ssoToken");
+    let ProjectId = store.state.layout.projectId ?
+      store.state.layout.projectId :
+      lStorage.get("projectId");
+    let userName = store.state.layout.userInfo.userName ?
+      store.state.layout.userInfo.userName :
+      storage.get("user_name");
+    let group_code = store.state.layout.group_code ?
+      store.state.layout.group_code :
+      lStorage.get("group_code");
+    try {
+      let response = await axiosservice({
+        url,
+        headers: {
+          projectId: ProjectId,
+          token: ssoToken,
+          appId: "adm",
+          userId: userName,
+          groupCode: group_code
+        },
+        data,
+        method: 'post'
+      })
+      return response.data
+    } catch (err) {
+      throw err
+    }
+  },
+  /**
+ * 根据用户ID获取用户信息:基本信息、菜单、项目
+ * nh 2021.10.25
+ */
+  getUserInfoByUserId(param) { 
+    return new Promise(function (resolve, reject) {
+      axios({
+        headers: {
+          "Content-Type": "application/x-www-form-urlencoded",
+        },
+        method: "post",
+        url: "/getUserById",
+        data: "jsonString=" + JSON.stringify(param),
+      }).then(res => { 
+        resolve(res.data);
+      }).catch(err => { 
+        reject(err);
+      });
+    });
+  },
+  axios: axiosservice
+}

+ 270 - 0
src/api/model/file.js

@@ -0,0 +1,270 @@
+import httputils from '@/api/scan/httpUtil'
+import { Message } from 'element-ui';
+
+const modelapi = '/revit-algorithm';
+const scheduler = '/scheduler';
+
+let api = {
+    // 新建模型文件夹
+    /**
+     *
+     * @param {Name:string,ProjectId:string} params
+     */
+    createModel(params, success) {
+        let Name = params.Name;
+        this.queryModel(Name, (res) => {
+            if (res.Total == 0) {
+                let data = {
+                    Content: [params]
+                };
+                // 查询是否有该模型文件夹
+                // 创建
+                httputils.postJson(`${modelapi}/model-folder/create`, data, success)
+            } else {
+                Message.error({ message: '该文件夹已经存在!' });
+            }
+        })
+    },
+    //删除模型文件夹
+    /**
+     *
+     * @param {Id:string} params
+     */
+    deleteModel(params, success) {
+        let Content = [params];
+        httputils.postJson(`${modelapi}/model-folder/delete`, Content, success)
+    },
+    //修改模型文件夹名称
+    /**
+    *
+    * @param {Name:string,ProjectId:string} params
+    */
+    updateModelName(params, success) {
+        let Name = params.Name;
+        this.queryModel(Name, (res) => {
+            if (res.Total == 0) {
+                let data = {
+                    Content: [params]
+                };
+                // 更改文件夹名称
+                httputils.postJson(`${modelapi}/model-folder/update`, data, success)
+            } else {
+                Message.error({ message: '该文件夹已经存在!' });
+            }
+        })
+    },
+    //查询模型文件夹
+    /**
+     * @param Name string  注:查询多个 Name = ''
+    */
+    queryModel(Name, success) {
+        let data = null;
+        if (Name) {
+            // 单个查询
+            data = {
+                Filters: `Name='${Name}'`,
+                Orders: "Name asc"
+            }
+        } else {
+            // 多个查询
+            data = {
+                Orders: "Name asc"
+            }
+        }
+        return httputils.postJson(`${modelapi}/model-folder/query`, data, success)
+    },
+
+
+
+    //以下是楼层文件接口
+
+    // 查询模型文件夹下的所有模型文件
+    queryFloorList(data, success) {
+        let Filters = `FolderId='${data.FolderId}'`;
+        if (data.FloorName) {
+            Filters = `FolderId='${data.FolderId}';FloorName='${data.FloorName}';ProjectId='${data.ProjectId}'`;
+        }
+        if (data.Status) {
+            Filters += `;Status in [${data.Status}]`
+        }
+        let params = {
+            Filters: Filters,
+            PageNumber: 1,
+            PageSize: 500
+        }
+        return httputils.postJson(`${modelapi}/model-floor/query-list`, params, success)
+    },
+    // 查询模型文件夹下的单个模型文件
+    queryFloorItem(data, success) {
+
+        let Filters = `FolderId='${data.FolderId}'`;
+        if (data.FloorName) {
+            Filters = `FolderId='${data.FolderId}';FloorName='${data.FloorName}';ProjectId='${data.ProjectId}'`;
+        }
+        let params = {
+            Filters: Filters
+        }
+        return httputils.postJson(`${modelapi}/model-floor/query`, params, success)
+    },
+    // 删除楼层文件
+    deleteFloor(data) {
+        return httputils.postJson(`${modelapi}/model-floor/delete`, data)
+    },
+    //编辑楼层文件的名字
+    updateFloorName(data, success) {
+        return httputils.postJson(`${modelapi}/model-floor/update`, data, success)
+    },
+
+
+    //以下是楼层文件接口
+
+    // 创建模型文件
+    createModelFile(data, success) {
+        return httputils.postJson(`${modelapi}/model-file/create`, data, success)
+    },
+    //删除模型文件(只有记录,文件不动)
+    deleteModelFile(data, success) {
+        return httputils.postJson(`${modelapi}/model-file/delete`, data, success)
+    },
+    /**
+     * info: 删除模型文件
+     * @param {*} params string 模型文件的id
+     * @param {*} success  成功的回调函数
+     */
+    deleteModelFileList(params, success) {
+        let data = {
+            Id:params.Id,
+            Force: params.Force?params.Force:false
+        }
+        return httputils.postJson(`${modelapi}/model-file/delete-file`, data, success)
+    },
+    //查询模型文件
+    queryModelFile(FloorModelId, success) {
+        let params = {
+          Distince: true,
+          Filters: `FloorModelId='${FloorModelId}';Removed=false`,
+          Orders: 'Version desc'
+        }
+        return httputils.postJson(`${modelapi}/model-file/query`, params, success)
+    },
+    // 上传模型文件
+    // uploadModelFile(payload, ProjectId,callback1, callback2) {
+    //     axios({
+    //         url: baseUrl + '/model-file/upload',
+    //         method: 'post',
+    //         headers: {
+    //             ProjectId: ProjectId
+    //         },
+    //         onUploadProgress: function (progressEvent) { //原生获取上传进度的事件
+    //             if (progressEvent.lengthComputable) {
+    //                 //属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量
+    //                 //如果lengthComputable为false,就获取不到progressEvent.total和progressEvent.loaded
+    //                 callback1(progressEvent);
+    //             }
+    //         },
+    //         data: payload
+    //     }).then(res => {
+    //         callback2(res);
+    //     }).catch(error => {
+    //         console.log('this is a catch')
+    //         console.log(error)
+    //     })
+    // },
+
+    //准备分片上传模型文件接口
+    modelFileUpload(data, success) {
+        return httputils.postJson(`${modelapi}/model-file/upload`, data, success)
+    },
+
+    mergeModelFile(data, success) {
+        return httputils.postJson(`${modelapi}/model-file/merge`, data, success)
+    }
+
+    // 更新模型文件
+    // upDateModelFile(data, ProjectId, UserName, UserId, callback1, callback2) {
+    //     let modelFile = {
+    //         Content: [{
+    //             FloorModelId:data.replaceModelItem.Id, //模型id
+    //             ModelName: data.Form.file.name,        //模型名字
+    //             UserName: UserName,
+    //             UserId: UserId,
+    //             Note: data.replaceModelItem.Note,
+    //             ReplaceReason: data.Form.ReplaceReason
+    //         }]
+    //     }
+    //     // //创建模型文件
+    //     this.createModelFile(modelFile, (createModelRes) => {
+    //         // 与此楼文件进行绑定
+    //         let upDateModelData = {
+    //             Content: [{
+    //                 Id:data.replaceModelItem.Id, //楼层
+    //                 CurrentModelId: createModelRes.EntityList[0].Id
+    //             }]
+    //         }
+    //         this.updateFloorName(upDateModelData, (upDateModelSucess) => {
+    //             if (upDateModelSucess.Result == "success") {
+    //                 // 处理数据
+    //                 let formData = new FormData();
+    //                 formData.append(
+    //                   "model",
+    //                   JSON.stringify({
+    //                     FloorModelId: data.replaceModelItem.Id,
+    //                     Id:createModelRes.EntityList[0].Id
+    //                   })
+    //                 );
+    //                 formData.append("file", data.Form.file.raw);
+    //                 this.uploadModelFile(formData,ProjectId,callback1,callback2)
+    //             }
+    //         })
+    //     })
+    // }
+
+}
+export default api
+
+//楼层与平面图绑定
+export function bindFloorModel(param, success) {
+    let url = `${modelapi}/model-floor/bind`;
+    httputils.postJson(url, param, success)
+}
+
+//根据模型id 获取模型文件夹及文件名
+export function getFileNameById(param, success) {
+    let url = `${modelapi}/model-folder/get-name`;
+    httputils.postJson(url, param, success)
+}
+
+// 根据条件查询统计数量
+export function countSyncLogCount(param, success) {
+    let url = `${modelapi}/sync-log/count`;
+    httputils.postJson(url, param, success)
+}
+
+// 查询同步日志
+export function querySyncLogCount(param, success) {
+    let url = `${modelapi}/sync-log/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 查询模型文件
+export function queryFileByModelId(param, success) {
+    let url = `${modelapi}/model-file/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 模型流程监控
+export function modelPathControl(param, success) {
+    let url = `${modelapi}/model-monitor/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 模型流程监控-获取待分配模型数量
+export function unassignQuery(param, success) {
+    let url = `${scheduler}/task/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 根据条件查询统计数量
+export function countModel(params, success) {
+    return httputils.postJson(`${modelapi}/model-file/count`, params, success)
+}

+ 44 - 0
src/api/model/report.js

@@ -0,0 +1,44 @@
+import httputils from '@/api/scan/httpUtil'
+import { Message } from 'element-ui';
+import axios from 'axios'
+const modelapi = '/revit-algorithm';
+
+// 导出模型问题报告
+// export function exportReport(params, success) {
+//     httputils.postJson(`${baseUrl}/report/non-blocking`, params, success)
+// }
+
+// 查询楼层列表
+export function queryFloorList(params, success) {
+    return httputils.postJson(`${modelapi}/model-floor/query-list`, params, success)
+}
+
+// 获取项目下所有模型文件夹
+export function queryModel(params, success) {
+    return httputils.postJson(`${modelapi}/model-folder/query`, params, success)
+}
+
+// 查询文件夹下的所有楼层
+export function queryReportList(params, success) {
+    return httputils.postJson(`${modelapi}/report/list/non-blocking`, params, success)
+}
+
+// 查询文件夹下的所有楼层(包含缺失楼层)
+export function queryLostReportList(params, success) {
+    return httputils.postJson(`${modelapi}/model-floor/query-list-missing`, params, success)
+}
+
+// 查询信息点映射
+export function queryInfoMap(params, success) {
+    return httputils.postJson(`${modelapi}/infoPointComp/query`, params, success)
+}
+
+// 查询管道映射
+export function queryPipeMap(params, success) {
+    return httputils.postJson(`${modelapi}/pdComp/query`, params, success)
+}
+
+// 查询项目识别规则配置
+export function queryProjectRule(params, success) {
+    return httputils.postJson(`${modelapi}/project/query`, params, success)
+}

+ 56 - 0
src/api/msgsever.js

@@ -0,0 +1,56 @@
+import http from './scan/httpUtil'
+import { message } from './scan/config'
+
+/*************************消息中心接口****************************/
+
+/**
+ * title: 统计数量
+ * info: 查询总数量不传参数,查询 已读Read = true,未读 Read = false
+ */
+export function messgeCount(param, success) {
+  let url = `${message}/message/count`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 创建消息
+ * info: 消息类型:提示(Info)、警告(Warning)、错误(Error)、成功(Success)
+ */
+export function messgeCreate(param, success) {
+  let url = `${message}/message/create`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 删除消息
+ */
+export function messgeDelete(param, success) {
+  let url = `${message}/message/delete`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 查询消息列表
+ */
+export function messgeQuery(param, success) {
+  let url = `${message}/message/page-query`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 更新消息状态
+ * info: 是否读过:未读(f)、已读(t)
+ */
+export function messgeUpdate(param, success) {
+  let url = `${message}/message/update`;
+  http.postJson(url, param, success)
+}
+
+/**
+ * title: 根据接收人将消息置为已读
+ * info: 已读Read = true,*UserId
+ */
+export function messgeUpdateState(param, success) {
+  let url = `${message}/message/update-state`;
+  http.postJson(url, param, success)
+}

+ 9 - 0
src/api/object/build.js

@@ -0,0 +1,9 @@
+import {baseUrl, object} from "@/api/scan/config";
+import http from "@/api/scan/httpUtil";
+
+//查询建筑信息
+export function buildingQuery(param, success) {
+  let url = `${baseUrl}${object}/building/query`;
+  http.postJson(url, param, success);
+}
+

+ 26 - 0
src/api/object/equip.js

@@ -0,0 +1,26 @@
+import { baseUrl, compEquipQuery, object } from "@/api/scan/config";
+import http from "@/api/scan/httpUtil";
+
+//设备清单 - 查询设备信息
+export function queryEquip(param, success) {
+  let url = `${baseUrl}${object}/equip/query`;
+  http.postJson(url, param, success);
+}
+
+//设备清单 - 统计项目下所有设备数量
+export function countEquip(param, success) {
+  let url = `${baseUrl}${object}/equip/count`;
+  http.postJson(url, param, success);
+}
+
+//查询设备关联资产部件数量
+export function getEquipTableCon(param, success) {
+  let url = `${baseUrl}${compEquipQuery}/equip-components`;
+  http.postJson(url, param, success);
+}
+
+//项目下所有的设备类型以及名称 - 系统设备树
+export function getEquipTypeTree(param, success) {
+    let url = `${baseUrl}${compEquipQuery}/type/tree`;
+    http.getJson(url, param, success);
+}

+ 20 - 0
src/api/object/floor.js

@@ -0,0 +1,20 @@
+import { baseUrl, dataCenter, object } from "@/api/scan/config";
+import http from "@/api/scan/httpUtil";
+
+//查询楼层信息
+export function floorQuery(param, success) {
+  let url = `${baseUrl}${object}/floor/query`;
+  http.postJson(url, param, success);
+}
+
+//建筑楼层管理-创建楼层
+export function manageCreateFloor(param, success) {
+  let url = `${baseUrl}${object}/floor/create`;
+  http.postJson(url, param, success)
+}
+
+//建筑楼层管理-修改楼层
+export function manageUpdateFloor(param, success) {
+  let url = `${baseUrl}${object}/floor/update`;
+  http.postJson(url, param, success)
+}

+ 188 - 0
src/api/relation/api.js

@@ -0,0 +1,188 @@
+import httpUtil from "../scan/httpUtil";
+import fetch from "../scan/fetch";
+import storage from '@/framework/utils/storage'
+import { baseUrl, graphicUrl, dataCenter, dictCustom } from "@/api/scan/config"
+
+
+//查询总览
+export function graphic(param, success) {
+  let url = `${baseUrl}${graphicUrl}/overview`
+  httpUtil.postJson(url, param, success)
+}
+
+// 查询总览数量
+export function graphicNumber(param, success) {
+  let url = `${baseUrl}${graphicUrl}/query-count`
+  httpUtil.postJson(url, param, success)
+
+}
+
+// 查询总览数量-根据类型查询关系数量
+export function graphicTypeNumber(param, success) {
+  let url = `${baseUrl}${graphicUrl}/type/query-count?type=${param.type}`
+  httpUtil.postJson(url, {}, success)
+
+}
+
+//导入excel
+export function graphicUpload(param, success) {
+  let url = `${baseUrl}${graphicUrl}/import`
+  httpUtil.postJson(url, param, success)
+}
+
+// 下载报告
+export function reportDownload(param, success) {
+  let url = `${baseUrl}${graphicUrl}/report-downloads`
+  httpUtil.getJson(url, param, success)
+}
+
+// 下载模板
+export function templateDownloads(param, success) {
+  let url = `${baseUrl}${graphicUrl}/template-downloads`
+  httpUtil.getJson(url, param, success)
+}
+
+
+//    建筑下的业务空间
+export function buildSpace(param, success) {
+  let url = `${baseUrl}${dataCenter}/calc_building/space`
+  httpUtil.postJson(url, param, success)
+}
+
+
+// 管网系统设备分块 1
+// export function calcSpecial(param, success) {
+//   let url = ` ${baseUrl}${dataCenter}/calc_special/sys-block?Domain=${param.Domain}&SystemName=${param.SystemName}`
+//   httpUtil.postJson(url, param, success)
+// }
+export function calcSpecial(param, success) {
+  let url = `${baseUrl}${dataCenter}/calc_special/sys-block?relationType=${param.relationType}`
+  httpUtil.postJson(url, param, success)
+}
+
+
+//    获取源末端 2
+export function blockQuery(param, success) {
+  let url = `${baseUrl}${graphicUrl}/connected-block-query`
+  httpUtil.postJson(url, param, success)
+}
+
+
+// 覆盖源末端 3
+export function blockSource(param, success) {
+  let url = `${baseUrl}${graphicUrl}/replace-connected-block-source`
+  httpUtil.postJson(url, param, success)
+}
+
+//    管网系统确定流向 4
+export function sysDirection(param, success) {
+  let buildId = param.BuildingId ? `BuildingId=${param.BuildingId}&` : ''
+  let url = `${baseUrl}${dataCenter}/calc_special/sys-direction?BlockId=${param.BlockId}&${buildId}Domain=${param.Domain}&SystemName=${param.SystemName}&isSource=${param.isSource}`
+  httpUtil.postJson(url, param, success)
+}
+
+//************************无需配置源末端关系计算15种********************************//
+// 建筑下的业务空间
+export function businessSpaceAll(param) {
+  let { relation_type, zone_type, proId } = param
+  let userName = storage.get("user_name")
+  let ProjectId = localStorage.getItem("projectId")
+  let objectTypes = zone_type ? "?objectTypes=" + zone_type : ''
+  return fetch({
+    method: 'POST',
+    url: `${baseUrl}${dataCenter}/relation-calc/` + relation_type + objectTypes,
+    data: proId,
+    headers: { 'ProjectId': ProjectId, 'Comming': 'adm', 'Account': userName }
+  })
+}
+
+//************************数据转换********************************//
+
+// 项目化字典-统计数量 修改过大小写
+export function dictCount(param, success) {
+  let url = `${baseUrl}${dictCustom}/project-dict-count`
+  httpUtil.postJson(url, param, success)
+}
+
+// 项目化字典-需补充转换规则数量 修改过大小写
+export function dictSwitchCount(param, success) {
+  let url = `${baseUrl}${dictCustom}/project-dict-switch-count`
+  httpUtil.postJson(url, param, success)
+}
+
+//项目化字典 - 内容
+export function dectInfo(param) {
+  let data = param
+  let userName = storage.get("user_name")
+  let ProjectId = localStorage.getItem("projectId")
+  return fetch({
+    method: 'POST',
+    url: `${baseUrl}${dictCustom}/project-dict-info`,
+    data,
+    headers: { 'ProjectId': ProjectId, 'Comming': 'adm', 'Account': userName }
+  })
+}
+
+//数据中心-物理世界数据转换
+export function dictDataCenter(param, success) {
+  let url = `${baseUrl}${dictCustom}/project-dict-datacenter`
+  httpUtil.postJson(url, param, success)
+}
+
+//物理世界-数据中心数据转换
+export function dictDataPlatFrom(param, success) {
+  let url = `${baseUrl}${dictCustom}/project-dict-dataplatfrom`
+  httpUtil.postJson(url, param, success)
+}
+
+// 同步设备
+export function createEquip(param, success) {
+  let url = `${baseUrl}/dataplatform-sync/project-sync/create-equip?projectId=${param.projectId}`
+  httpUtil.postJson(url, {}, success)
+}
+
+//更新自定义自定脚本
+export function dictUpdate(param, success) {
+  let url = `${baseUrl}${dictCustom}/update`
+  httpUtil.postJson(url, param, success)
+}
+
+// 查询关系数据
+export function relQuery(param, success) {
+  // let url = `${baseUrl}${dataCenter}/relation-manual-calc/rel-query`
+  let url = `${baseUrl}${dataCenter}/rel-manual-calc/query`
+  httpUtil.postJson(url, param, success)
+}
+
+//添加关系数据
+export function relAdd(data) {
+  let userName = storage.get("user_name")
+  let ProjectId = localStorage.getItem("projectId")
+  return fetch({
+    method: 'POST',
+    // url: `${baseUrl}${dataCenter}/relation-manual-calc/rel-add`,
+    url: `${baseUrl}${dataCenter}/rel-manual-calc/add`,
+    data,
+    headers: { 'ProjectId': ProjectId, 'Comming': 'adm', 'Account': userName }
+  })
+}
+
+//删除关系
+export function relDelete(param, success) {
+  // let url = `${baseUrl}${dataCenter}/relation-manual-calc/rel-del`
+  let url = `${baseUrl}${dataCenter}/rel-manual-calc/del`
+  httpUtil.postJson(url, param, success)
+}
+
+
+// 添加源设备
+export function addSource(param, success) {
+  let url = `${baseUrl}${dataCenter}/mep-system-calc/source/add`
+  httpUtil.postJson(url, param, success)
+}
+
+//查看源设备
+export function sourceQuery(param, success) {
+  let url = `${baseUrl}${dataCenter}/mep-system-calc/source/query?calcName=${param.calcName}`
+  httpUtil.getJson(url, {}, success)
+}

+ 48 - 0
src/api/scan/config.js

@@ -0,0 +1,48 @@
+/******************* 基础代理配置 *********************/
+export const baseUrl = '';
+export const sso = '/persagy-sso-server';
+export const scan = '/scanbuilding';
+export const sass = 'sass';
+export const dataCenter = '/datacenter'
+export const component = '/equip-component'
+export const modelapi = '/revit-algorithm'
+export const rwd = '/rwd'
+export const datasyn = '/datasyn'
+/******************* 适配新版数据字典接口 *********************/
+export const object = dataCenter + '/object'
+export const rel = dataCenter + '/rel'
+export const system = object + '/general-system'
+export const message = baseUrl + '/message-center'
+
+
+export const shaft = object + '/shaft'
+export const tenant = dataCenter + '/tenant'
+export const floor = object + '/floor'
+export const dict = dataCenter + '/dict'
+export const component_dict = component + '/dict'
+export const classDef = dataCenter + '/class-def'
+export const locationPoint = object + '/location-point'
+export const modelScanTask = dataCenter + '/model-scan-task'
+export const equipScanTask = dataCenter + '/equip-scan-task'
+export const shContainSp = rel + '/sh-contain-sp-base'
+export const statistics = dataCenter + '/statistics'
+export const stat = component + '/statistics'
+export const graphicUrl = dataCenter + '/graphic'
+export const compSpace = component + '/space'
+export const compEquipQuery = component + '/equip-query'
+export const dictCustom = component + '/dict-custom'
+export const zone = {
+  GeneralZone: 'zone-general', //默认分区
+  PowerSupplyZone: 'zone-power-supply', //供电分区
+  LightingZone: 'zone-lighting', //照明分区
+  AirConditioningZone: 'metaspace', //空调分区
+  TenantZone: 'zone-tenant', //租赁分区
+  HeatingZone: 'zone-heating', //采暖分区
+  CleanZone: 'zone-clean', //洁净分区
+  DomesticWaterSupplyZone: 'zone-domestic-water', //生活给水分区
+  NetworkZone: 'zone-network', //网络分区
+  FunctionZone: 'zone-function', //功能分区
+  FireZone: 'zone-fire', //防火分区
+  SecurityZone: 'zone-security', //安防分区
+  Ispace: 'ispace', //元空间
+}

+ 47 - 0
src/api/scan/fetch.js

@@ -0,0 +1,47 @@
+import Vue from 'vue'
+import axios from 'axios'
+import vueAxios from 'vue-axios'
+import store from '@/store'
+import { message } from '@/api/scan/config.js'
+
+Vue.use(vueAxios, axios)
+//创建实例
+
+const service = axios.create({
+  timeout: 3000000, //请求时间超出
+  withCredentials: true, //是否跨站点访问控制请求
+})
+
+//request拦截
+service.interceptors.request.use(config => {
+    config.cancelToken = new axios.CancelToken(cancel => {
+        if (config.url !== `${message}/message/update-state` || config.url !== '/image-service/common/multipart_upload') {
+            store.commit('setAxiosArr', {cancel})
+        }
+    })
+  return config
+}, error => {
+  console.log(error)
+  Promise.reject(error)
+})
+
+//response拦截器
+service.interceptors.response.use(
+  response => {
+    // let resp = response.data;
+    // let result = resp.result || resp.Result
+    return response
+    // if (result == 'success' || result == 'Success') {
+    //     return response
+    // } else {
+    //     let msg = resp.message ? resp.message : resp.ResultMsg? resp.ResultMsg: resp.Message;
+    //     Message.error({ message: msg });
+    // }
+  },
+  error => {
+    console.log('err' + error)
+    return Promise.reject(error)
+  }
+)
+
+export default service

+ 203 - 0
src/api/scan/httpUtil.js

@@ -0,0 +1,203 @@
+import {Message} from "element-ui";
+import fetch from "./fetch";
+import storage from "@/framework/utils/storage";
+import lStorage from '@/utils/localStorage';
+import store from "@/store/index";
+
+function successResponse(vm, response, success, failed) {
+  let resp = response.data;
+  let result = resp.result ? resp.result : resp.Result;
+  if (result === "success") {
+    if (success) {
+      success(resp);
+    }
+  } else {
+    let msg = resp.message
+      ? resp.message
+      : resp.ResultMsg || resp.resultMsg || resp.Message;
+    Message.error({ message: msg });
+    if (failed) {
+      failed(resp);
+    }
+  }
+}
+
+function errorResponse(vm, response, err) {
+  let json = JSON.parse(JSON.stringify(response));
+  if (json.message === "路由调整取消请求") return;
+  console.error(response);
+  if (json.response) {
+    Message.error({
+      message: `接口:${json.response.config.url}请求错误,错误状态为:${json.response.status}`
+    });
+  } else {
+    console.error(vm, response, err);
+    Message.error({ message: "请求错误" });
+  }
+}
+
+function downFile(blob, fileName) {
+  // 非IE下载
+  if ("download" in document.createElement("a")) {
+    let link = document.createElement("a");
+    link.href = window.URL.createObjectURL(blob); // 创建下载的链接
+    link.download = fileName; // 下载后文件名
+    link.style.display = "none";
+    document.body.appendChild(link);
+    link.click(); // 点击下载
+    window.URL.revokeObjectURL(link.href); // 释放掉blob对象
+    document.body.removeChild(link); // 下载完成移除元素
+  } else {
+    // IE10+下载
+    window.navigator.msSaveBlob(blob, fileName);
+  }
+}
+
+export default {
+  getJson: function(url, data, success, failed, err) {
+    let ssoToken = store.state.ssoToken
+      ? store.state.ssoToken
+      : lStorage.get("ssoToken");
+    let ProjectId = store.state.layout.projectId
+      ? store.state.layout.projectId
+      : lStorage.get("projectId");
+    let userName = store.state.layout.userInfo.userName
+      ? store.state.layout.userInfo.userName
+      : storage.get("user_name");
+    let group_code = store.state.layout.group_code
+      ? store.state.layout.group_code
+      : lStorage.get("group_code");
+    let vm = this;
+    fetch({
+      url: url,
+      method: "get",
+      params: data,
+      headers: {
+        projectId: ProjectId,
+        token: ssoToken,
+        appId: "adm",
+        userId: userName,
+        groupCode: group_code
+      }
+    })
+      .then(response => {
+        successResponse(vm, response, success, failed);
+      })
+      .catch(error => {
+        errorResponse(vm, error, err);
+      });
+  },
+  postJson: function (url, data, success, failed, err, isShowPid) {
+    let ssoToken = store.state.ssoToken
+      ? store.state.ssoToken
+      : lStorage.get("ssoToken");
+    let ProjectId = store.state.layout.projectId
+      ? store.state.layout.projectId
+      : lStorage.get("projectId");
+    let userName = store.state.layout.userInfo.userName
+      ? store.state.layout.userInfo.userName
+      : storage.get("user_name");
+    let group_code = store.state.layout.group_code
+      ? store.state.layout.group_code
+      : lStorage.get("group_code");
+
+    let vm = this;
+    let params = {
+      url: url,
+      method: "post",
+      data: data,
+      headers: {
+        // projectId: ProjectId,
+        token: ssoToken,
+        appId: "adm",
+        userId: userName,
+        groupCode: group_code
+      }
+    }
+    let params1 = {
+      url: url,
+      method: "post",
+      data: data,
+      headers: {
+        projectId: ProjectId,
+        token: ssoToken,
+        appId: "adm",
+        userId: userName,
+        groupCode: group_code
+      }
+    }
+    fetch(isShowPid ? {...params} : { ...params1})
+      .then(response => {
+        successResponse(vm, response, success, failed);
+      })
+      .catch(error => {
+        errorResponse(vm, error, err);
+      });
+  },
+  getDownload(url, requestData, success, name) {
+    // 响应类型:arraybuffer, blob
+    fetch
+      .get(url, { params: requestData, responseType: "blob" })
+      .then(resp => {
+        const headers = resp.headers;
+        const contentType = headers["content-type"];
+
+        console.log("响应头信息", headers);
+        if (!resp.data) {
+          console.error("响应异常:", resp);
+          return false;
+        } else {
+          console.log("下载文件:", resp);
+          const blob = new Blob([resp.data], { type: contentType });
+
+          const contentDisposition = resp.headers["content-disposition"];
+          let fileName = "unknown";
+
+          if (name) {
+            fileName = name
+          } else if (contentDisposition) {
+            fileName = window.decodeURI(
+              resp.headers["content-disposition"].split("=")[1]
+            );
+          }
+          console.log("文件名称:", fileName);
+          downFile(blob, fileName);
+          success();
+        }
+      })
+      .catch(function(error) {
+        console.log(error);
+      });
+  },
+  download(url, requestData) {
+    // 响应类型:arraybuffer, blob
+    fetch
+      .post(url, requestData, { responseType: "blob" })
+      .then(resp => {
+        let headers = resp.headers;
+        let contentType = headers["content-type"];
+
+        console.log("响应头信息", headers);
+        if (!resp.data) {
+          console.error("响应异常:", resp);
+          return false;
+        } else {
+          console.log("下载文件:", resp);
+          const blob = new Blob([resp.data], { type: contentType });
+
+          const contentDisposition = resp.headers["content-disposition"];
+          let fileName = "unknown";
+          if (contentDisposition) {
+            fileName = window.decodeURI(
+              resp.headers["content-disposition"].split("=")[1]
+            );
+          }
+          console.log("文件名称:", fileName);
+          downFile(blob, fileName);
+        }
+      })
+      .catch(function(error) {
+        console.log(error);
+      });
+  }
+};

Файловите разлики са ограничени, защото са твърде много
+ 1671 - 0
src/api/scan/request.js


+ 50 - 0
src/api/synclog/index.js

@@ -0,0 +1,50 @@
+import { baseUrl, datasyn } from "@/api/scan/config";
+import httputils from "@/api/scan/httpUtil";
+
+/**
+ * 查询项目id对应得集团id
+ * @param { 接口参数 } param
+ */
+ export function queryGroupCode(param, success, error) {
+	return httputils.getJson(`${baseUrl}${datasyn}/record/query/project`, param, success, error)
+}
+
+/**
+ * 查询项目下得日志
+ * @param { 接口参数 } param
+ */
+export function queryTableList(param, success, error) {
+    return httputils.postJson(`${baseUrl}${datasyn}/record/query`, param, success, error)
+}
+
+/**
+ * 查询对象类型
+ * @param { 接口参数 } param
+ */
+export function queryobjType(param, success, error) {
+    return httputils.getJson(`${baseUrl}${datasyn}/record/query/type`, param, success, error)
+}
+
+/**
+ * 查询中台是否在线
+ * @param { 接口参数 } param
+ */
+export function queryIsOnline(param, success, error) {
+    return httputils.getJson(`${baseUrl}${datasyn}/record/query/online`, param, success, error)
+}
+
+/**
+ * 重新同步消息
+ * @param { 接口参数 } param
+ */
+export function queryRecordSyn(param, success, error) {
+    return httputils.postJson(`${baseUrl}${datasyn}/record/syn/data`, param, success, error)
+}
+
+/**
+ * 更新日志信息
+ * @param { 接口参数 } param
+ */
+export function queryRecordUpdata(param, success, error) {
+    return httputils.postJson(`${baseUrl}${datasyn}/record/update`, param, success, error)
+}

+ 34 - 0
src/api/system/index.js

@@ -0,0 +1,34 @@
+import { baseUrl, component } from '@/api/scan/config'
+import http from '@/api/httputils'
+
+/**
+ * 获取用户信息和token值
+ */
+export async function getUserInfo(param) {
+    let url = `${baseUrl}${component}/user/infos`
+    return await http.postJson(url, param)
+}
+  
+/**
+ * 根据登录token获取项目信息
+ */
+export async function getProjectsByToken(param) {
+    let url = `${baseUrl}${component}/user/group/project`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 根据登录token,用户获取菜单树
+ */
+ export async function getMenuByToken(param) {
+    let url = `${baseUrl}${component}/user/menu/tree`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 退出登录
+ */
+export async function logout(param) {
+    let url = `${baseUrl}${component}/user/logout`
+    return await http.postJson(url, param)
+}

+ 137 - 0
src/api/system/persagy-sso-server.js

@@ -0,0 +1,137 @@
+// 单点登录(自研)
+import { baseUrl, sso } from '@/api/scan/config'
+import http from '@/api/httputils'
+
+/**
+ * 根据用户ID获取用户信息:基本信息、菜单、项目
+ * nh 2021.10.25
+ */
+export async function getUserInfoByUserId(param) {
+    try {
+        var _obj = await http.getUserInfoByUserId({
+            puser: {
+                userId: param.userId,
+                loginDevice: "PC",
+                pd: param.pd
+            }
+        });
+        return _obj;
+    } catch (error) {
+        console.error('getUserInfoByUserId异常:', error);
+        return {
+            result:'failure'
+        };
+    }
+}
+
+/**
+ * 根据token获取用户信息、菜单信息和项目信息
+ */
+export async function getUserInfo(param) {
+    let url = `${baseUrl}${sso}/users/info`
+    return await http.getJson(url, param)
+}
+
+/**
+ * 退出登录
+ */
+export async function logout(param) {
+    let url = `${baseUrl}${sso}/users/logout`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 用户创建
+ */
+export async function createUsers(param) {
+    let url = `${baseUrl}${sso}/users/create`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 用户删除
+ */
+export async function deleteUsers(param) {
+    let url = `${baseUrl}${sso}/users/delete`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 用户修改
+ */
+export async function updateUsers(param) {
+    let url = `${baseUrl}${sso}/users/update`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 用户密码修改
+ */
+export async function updateUsersPass(param) {
+    let url = `${baseUrl}${sso}/users/update/password`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 用户查询
+ */
+export async function queryUsers(param) {
+    let url = `${baseUrl}${sso}/users/query`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色创建
+ */
+export async function createRole(param) {
+    let url = `${baseUrl}${sso}/role/create`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色删除
+ */
+export async function deleteRole(param) {
+    let url = `${baseUrl}${sso}/role/delete`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色修改
+ */
+export async function updateRole(param) {
+    let url = `${baseUrl}${sso}/role/update`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色查询
+ */
+export async function queryRole(param) {
+    let url = `${baseUrl}${sso}/role/query`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色修改-带菜单配置
+ */
+export async function updateRoleMenu(param) {
+    let url = `${baseUrl}${sso}/role/update/menu`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 角色创建-带菜单配置
+ */
+export async function createRoleMenu(param) {
+    let url = `${baseUrl}${sso}/role/create/menu`
+    return await http.postJson(url, param)
+}
+
+/**
+ * 获取全部菜单
+ */
+export async function queryMenu(param) {
+    let url = `${baseUrl}${sso}/menu/query`
+    return await http.getJson(url, param)
+}

+ 21 - 0
src/api/system/role.js

@@ -0,0 +1,21 @@
+import httputils from '@/api/httputils'
+export default {
+    query(criteria) {
+        return httputils.postJson('/admin/role/query', criteria)
+    },
+    create(role) {
+        return httputils.postJson('/admin/role/create', role)
+    },
+    update(role) {
+        return httputils.postJson('/admin/role/update', role)
+    },
+    delete(role) {
+        return httputils.postJson('/admin/role/delete', role)
+    },
+    getOperations(id) {
+        return httputils.getJson('/admin/role/getOperations?id=' + id)
+    },
+    setOperations(data) {
+        return httputils.postJson('/admin/role/setOperations', data)
+    }
+}

+ 15 - 0
src/api/system/user.js

@@ -0,0 +1,15 @@
+import httputils from '@/api/httputils'
+export default {
+  query(criteria) {
+    return httputils.postJson('/admin/user/query', criteria)
+  },
+  create(user) {
+    return httputils.postJson('/admin/user/create', user)
+  },
+  update(user) {
+    return httputils.postJson('/admin/user/update', user)
+  },
+  delete(user) {
+    return httputils.postJson('/admin/user/delete', user)
+  }
+}

+ 30 - 0
src/api/uploader/index.js

@@ -0,0 +1,30 @@
+import http from '../scan/httpUtil'
+
+const baseUrl = '/image-service'
+
+//分片上传文件接口
+
+/**
+ * info: 申请分片上传接口(获取上传UploadId)
+ * @param {systemId:string} param 系统的名称
+ * @param {secret:string} param 系统的密码
+ * @param {key:string} param  成功的回上传的文件名(可以包含文件路径)
+ * @param {overwrite:boolean} param 表示是否覆盖已有的文件(如果存在) 注:overwrite有一定风险, 只在注册分片时校验, 合并时候如果key被占用, 会覆盖掉之前文件
+ * 
+ */
+export function getUploadId(param, success) {
+  let url = ` ${baseUrl}/common/register_multipart_upload?systemId=${param.systemId}&secret=${param.secret}&key=${param.key}&overwrite=${param.overwrite}`
+  http.postJson(url, {}, success)
+}
+
+/**
+ * info: 合并分片的接口
+ * @param {systemId:string} param 系统的名称
+ * @param {secret:string} param 系统的密码
+ * @param {uploadId:string} param  需要合并的上传文件的uploadId
+ * 
+ */
+export function mergeMultipart(param, success) {
+  let url = ` ${baseUrl}/common/merge_multipart?systemId=${param.systemId}&secret=${param.secret}&uploadId=${param.uploadId}`
+  http.postJson(url, {}, success)
+}

BIN
src/assets/css/chosen-sprite.png


BIN
src/assets/css/chosen-sprite@2x.png


+ 492 - 0
src/assets/css/chosen.css

@@ -0,0 +1,492 @@
+/*!
+Chosen, a Select Box Enhancer for jQuery and Prototype
+by Patrick Filler for Harvest, http://getharvest.com
+
+Version 1.8.5
+Full source at https://github.com/harvesthq/chosen
+Copyright (c) 2011-2018 Harvest http://getharvest.com
+
+MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+This file is generated by `grunt build`, do not edit it by hand.
+*/
+
+.chosen-container.chosen-with-drop-top .chosen-drop {
+    left: 0;
+    top: -220px;
+}
+
+.chosen-container {
+    position: relative;
+    display: inline-block;
+    vertical-align: middle;
+    font-size: 13px;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none
+}
+
+.chosen-container * {
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box
+}
+
+.chosen-container .chosen-drop {
+    position: absolute;
+    top: 100%;
+    z-index: 1010;
+    width: 100%;
+    border: 1px solid #aaa;
+    border-top: 0;
+    background: #fff;
+    -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+    box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
+    display: none;
+    box-sizing: border-box;
+}
+
+.chosen-container.chosen-with-drop .chosen-drop {
+    display: block
+}
+
+.chosen-container a {
+    cursor: pointer
+}
+
+.chosen-container .chosen-single .group-name,
+.chosen-container .search-choice .group-name {
+    margin-right: 4px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    font-weight: 400;
+    color: #999
+}
+
+.chosen-container .chosen-single .group-name:after,
+.chosen-container .search-choice .group-name:after {
+    content: ":";
+    padding-left: 2px;
+    vertical-align: top
+}
+
+.chosen-container-single .chosen-single {
+    position: relative;
+    display: block;
+    overflow: hidden;
+    padding: 0 0 0 8px;
+    height: 25px;
+    border: 1px solid #aaa;
+    border-radius: 5px;
+    background-color: #fff;
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #fff), color-stop(50%, #f6f6f6), color-stop(52%, #eee), to(#f4f4f4));
+    background: linear-gradient(#fff 20%, #f6f6f6 50%, #eee 52%, #f4f4f4 100%);
+    background-clip: padding-box;
+    -webkit-box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, .1);
+    box-shadow: 0 0 3px #fff inset, 0 1px 1px rgba(0, 0, 0, .1);
+    color: #444;
+    text-decoration: none;
+    white-space: nowrap;
+    line-height: 24px
+}
+
+.chosen-container-single .chosen-single input[type=text] {
+    cursor: pointer;
+    opacity: 0;
+    position: absolute;
+    width: 0
+}
+
+.chosen-container-single .chosen-default {
+    color: #999
+}
+
+.chosen-container-single .chosen-single span {
+    display: block;
+    overflow: hidden;
+    margin-right: 26px;
+    text-overflow: ellipsis;
+    white-space: nowrap
+}
+
+.chosen-container-single .chosen-single-with-deselect span {
+    margin-right: 38px
+}
+
+.chosen-container-single .chosen-single abbr {
+    position: absolute;
+    top: 6px;
+    right: 26px;
+    display: block;
+    width: 12px;
+    height: 12px;
+    background: url(chosen-sprite.png) -42px 1px no-repeat;
+    font-size: 1px
+}
+
+.chosen-container-single .chosen-single abbr:hover {
+    background-position: -42px -10px
+}
+
+.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
+    background-position: -42px -10px
+}
+
+.chosen-container-single .chosen-single div {
+    position: absolute;
+    top: 0;
+    right: 0;
+    display: block;
+    width: 18px;
+    height: 100%
+}
+
+.chosen-container-single .chosen-single div b {
+    display: block;
+    width: 100%;
+    height: 100%;
+    background: url(chosen-sprite.png) no-repeat 0 2px
+}
+
+.chosen-container-single .chosen-search {
+    position: relative;
+    z-index: 1010;
+    margin: 0;
+    padding: 3px 4px;
+    white-space: nowrap
+}
+
+.chosen-container-single .chosen-search input[type=text] {
+    margin: 1px 0;
+    padding: 4px 20px 4px 5px;
+    width: 100%;
+    height: auto;
+    outline: 0;
+    border: 1px solid #aaa;
+    background: url(chosen-sprite.png) no-repeat 100% -20px;
+    font-size: 1em;
+    font-family: sans-serif;
+    line-height: normal;
+    border-radius: 0;
+    box-sizing: border-box;
+}
+
+.chosen-container-single .chosen-drop {
+    margin-top: -1px;
+    border-radius: 0 0 4px 4px;
+    background-clip: padding-box
+}
+
+.chosen-container-single.chosen-container-single-nosearch .chosen-search {
+    position: absolute;
+    opacity: 0;
+    pointer-events: none
+}
+
+.chosen-container .chosen-results {
+    color: #444;
+    position: relative;
+    overflow-x: hidden;
+    overflow-y: auto;
+    margin: 0 4px 4px 0;
+    padding: 0 0 0 4px;
+    max-height: 100px;
+    -webkit-overflow-scrolling: touch
+}
+
+.chosen-container .chosen-results li {
+    display: none;
+    margin: 0;
+    padding: 5px 6px;
+    list-style: none;
+    line-height: 15px;
+    word-wrap: break-word;
+    -webkit-touch-callout: none
+}
+
+.chosen-container .chosen-results li.active-result {
+    display: list-item;
+    cursor: pointer
+}
+
+.chosen-container .chosen-results li.disabled-result {
+    display: list-item;
+    color: #ccc;
+    cursor: default
+}
+
+.chosen-container .chosen-results li.highlighted {
+    background-color: #3875d7;
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+    background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+    color: #fff
+}
+
+.chosen-container .chosen-results li.no-results {
+    color: #777;
+    display: list-item;
+    background: #f4f4f4
+}
+
+.chosen-container .chosen-results li.group-result {
+    display: list-item;
+    font-weight: 700;
+    cursor: default
+}
+
+.chosen-container .chosen-results li.group-option {
+    padding-left: 15px
+}
+
+.chosen-container .chosen-results li em {
+    font-style: normal;
+    text-decoration: underline
+}
+
+.chosen-container-multi .chosen-choices {
+    position: relative;
+    overflow: hidden;
+    margin: 0;
+    padding: 0 5px;
+    width: 100%;
+    height: auto;
+    border: 1px solid #aaa;
+    background-color: #fff;
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #eee), color-stop(15%, #fff));
+    background-image: linear-gradient(#eee 1%, #fff 15%);
+    cursor: text
+}
+
+.chosen-container-multi .chosen-choices li {
+    float: left;
+    list-style: none
+}
+
+.chosen-container-multi .chosen-choices li.search-field {
+    margin: 0;
+    padding: 0;
+    white-space: nowrap
+}
+
+.chosen-container-multi .chosen-choices li.search-field input[type=text] {
+    margin: 1px 0;
+    padding: 0;
+    height: 25px;
+    outline: 0;
+    border: 0!important;
+    background: 0 0!important;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+    color: #999;
+    font-size: 100%;
+    font-family: sans-serif;
+    line-height: normal;
+    border-radius: 0;
+    width: 25px
+}
+
+.chosen-container-multi .chosen-choices li.search-choice {
+    position: relative;
+    margin: 3px 5px 3px 0;
+    padding: 3px 20px 3px 5px;
+    border: 1px solid #aaa;
+    max-width: 100%;
+    border-radius: 3px;
+    background-color: #eee;
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
+    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+    background-size: 100% 19px;
+    background-repeat: repeat-x;
+    background-clip: padding-box;
+    -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05);
+    box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, .05);
+    color: #333;
+    line-height: 13px;
+    cursor: default
+}
+
+.chosen-container-multi .chosen-choices li.search-choice span {
+    word-wrap: break-word
+}
+
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
+    position: absolute;
+    top: 4px;
+    right: 3px;
+    display: block;
+    width: 12px;
+    height: 12px;
+    background: url(chosen-sprite.png) -42px 1px no-repeat;
+    font-size: 1px
+}
+
+.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
+    background-position: -42px -10px
+}
+
+.chosen-container-multi .chosen-choices li.search-choice-disabled {
+    padding-right: 5px;
+    border: 1px solid #ccc;
+    background-color: #e4e4e4;
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), to(#eee));
+    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
+    color: #666
+}
+
+.chosen-container-multi .chosen-choices li.search-choice-focus {
+    background: #d4d4d4
+}
+
+.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
+    background-position: -42px -10px
+}
+
+.chosen-container-multi .chosen-results {
+    margin: 0;
+    padding: 0
+}
+
+.chosen-container-multi .chosen-drop .result-selected {
+    display: list-item;
+    color: #ccc;
+    cursor: default
+}
+
+.chosen-container-active .chosen-single {
+    border: 1px solid #5897fb;
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+    box-shadow: 0 0 5px rgba(0, 0, 0, .3)
+}
+
+.chosen-container-active.chosen-with-drop .chosen-single {
+    border: 1px solid #aaa;
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0;
+    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(20%, #eee), color-stop(80%, #fff));
+    background-image: linear-gradient(#eee 20%, #fff 80%);
+    -webkit-box-shadow: 0 1px 0 #fff inset;
+    box-shadow: 0 1px 0 #fff inset
+}
+
+.chosen-container-active.chosen-with-drop .chosen-single div {
+    border-left: none;
+    background: 0 0
+}
+
+.chosen-container-active.chosen-with-drop .chosen-single div b {
+    background-position: -18px 2px
+}
+
+.chosen-container-active .chosen-choices {
+    border: 1px solid #5897fb;
+    -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
+    box-shadow: 0 0 5px rgba(0, 0, 0, .3)
+}
+
+.chosen-container-active .chosen-choices li.search-field input[type=text] {
+    color: #222!important
+}
+
+.chosen-disabled {
+    opacity: .5!important;
+    cursor: default
+}
+
+.chosen-disabled .chosen-single {
+    cursor: default
+}
+
+.chosen-disabled .chosen-choices .search-choice .search-choice-close {
+    cursor: default
+}
+
+.chosen-rtl {
+    text-align: right
+}
+
+.chosen-rtl .chosen-single {
+    overflow: visible;
+    padding: 0 8px 0 0
+}
+
+.chosen-rtl .chosen-single span {
+    margin-right: 0;
+    margin-left: 26px;
+    direction: rtl
+}
+
+.chosen-rtl .chosen-single-with-deselect span {
+    margin-left: 38px
+}
+
+.chosen-rtl .chosen-single div {
+    right: auto;
+    left: 3px
+}
+
+.chosen-rtl .chosen-single abbr {
+    right: auto;
+    left: 26px
+}
+
+.chosen-rtl .chosen-choices li {
+    float: right
+}
+
+.chosen-rtl .chosen-choices li.search-field input[type=text] {
+    direction: rtl
+}
+
+.chosen-rtl .chosen-choices li.search-choice {
+    margin: 3px 5px 3px 0;
+    padding: 3px 5px 3px 19px
+}
+
+.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
+    right: auto;
+    left: 4px
+}
+
+.chosen-rtl.chosen-container-single .chosen-results {
+    margin: 0 0 4px 4px;
+    padding: 0 4px 0 0
+}
+
+.chosen-rtl .chosen-results li.group-option {
+    padding-right: 15px;
+    padding-left: 0
+}
+
+.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
+    border-right: none
+}
+
+.chosen-rtl .chosen-search input[type=text] {
+    padding: 4px 5px 4px 20px;
+    background: url(chosen-sprite.png) no-repeat -30px -20px;
+    direction: rtl
+}
+
+.chosen-rtl.chosen-container-single .chosen-single div b {
+    background-position: 6px 2px
+}
+
+.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
+    background-position: -12px 2px
+}
+
+@media only screen and (-webkit-min-device-pixel-ratio:1.5),
+only screen and (min-resolution:144dpi),
+only screen and (min-resolution:1.5dppx) {
+    .chosen-container .chosen-results-scroll-down span,
+    .chosen-container .chosen-results-scroll-up span,
+    .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
+    .chosen-container-single .chosen-search input[type=text],
+    .chosen-container-single .chosen-single abbr,
+    .chosen-container-single .chosen-single div b,
+    .chosen-rtl .chosen-search input[type=text] {
+        background-image: url(chosen-sprite@2x.png)!important;
+        background-size: 52px 37px!important;
+        background-repeat: no-repeat!important
+    }
+}

+ 477 - 0
src/assets/css/jsmind.css

@@ -0,0 +1,477 @@
+/*
+ * Released under BSD License
+ * Copyright (c) 2014-2015 hizzgdev@163.com
+ * 
+ * Project Home:
+ *   https://github.com/hizzgdev/jsmind/
+ */
+
+
+/* important section */
+
+.jsmind-inner {
+    position: relative;
+    overflow: auto;
+    width: 100%;
+    height: 100%;
+}
+
+
+/*box-shadow:0 0 2px #000;*/
+
+.jsmind-inner {
+    moz-user-select: -moz-none;
+    -moz-user-select: none;
+    -o-user-select: none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+
+/* z-index:1 */
+
+canvas {
+    position: absolute;
+    z-index: 1;
+}
+
+
+/* z-index:2 */
+
+jmnodes {
+    position: absolute;
+    z-index: 2;
+    background-color: rgba(0, 0, 0, 0);
+}
+
+
+/*background color is necessary*/
+
+jmnode {
+    position: absolute;
+    cursor: default;
+    max-width: 400px;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+jmexpander {
+    position: absolute;
+    width: 11px;
+    height: 11px;
+    display: block;
+    overflow: hidden;
+    line-height: 12px;
+    font-size: 12px;
+    text-align: center;
+    border-radius: 6px;
+    border-width: 1px;
+    border-style: solid;
+    cursor: pointer;
+}
+
+
+/* default theme */
+
+jmnode {
+    padding: 10px;
+    background-color: #fff;
+    color: #333;
+    border-radius: 5px;
+    box-shadow: 1px 1px 1px #666;
+    font: 16px/1.125 Verdana, Arial, Helvetica, sans-serif;
+}
+
+jmnode:hover {
+    box-shadow: 2px 2px 8px #000;
+    background-color: #ebebeb;
+    color: #333;
+}
+
+jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+    box-shadow: 2px 2px 8px #000;
+}
+
+jmnode.root {
+    font-size: 24px;
+}
+
+jmexpander {
+    border-color: gray;
+}
+
+jmexpander:hover {
+    border-color: #000;
+}
+
+@media screen and (max-device-width: 1024px) {
+    jmnode {
+        padding: 5px;
+        border-radius: 3px;
+        font-size: 14px;
+    }
+    jmnode.root {
+        font-size: 21px;
+    }
+}
+
+
+/* primary theme */
+
+jmnodes.theme-primary jmnode {
+    background-color: #428bca;
+    color: #fff;
+    border-color: #357ebd;
+}
+
+jmnodes.theme-primary jmnode:hover {
+    background-color: #3276b1;
+    border-color: #285e8e;
+}
+
+jmnodes.theme-primary jmnode.selected {
+    background-color: #f1c40f;
+    color: #fff;
+}
+
+jmnodes.theme-primary jmnode.root {}
+
+jmnodes.theme-primary jmexpander {}
+
+jmnodes.theme-primary jmexpander:hover {}
+
+
+/* warning theme */
+
+jmnodes.theme-warning jmnode {
+    background-color: #f0ad4e;
+    border-color: #eea236;
+    color: #fff;
+}
+
+jmnodes.theme-warning jmnode:hover {
+    background-color: #ed9c28;
+    border-color: #d58512;
+}
+
+jmnodes.theme-warning jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-warning jmnode.root {}
+
+jmnodes.theme-warning jmexpander {}
+
+jmnodes.theme-warning jmexpander:hover {}
+
+
+/* danger theme */
+
+jmnodes.theme-danger jmnode {
+    background-color: #d9534f;
+    border-color: #d43f3a;
+    color: #fff;
+}
+
+jmnodes.theme-danger jmnode:hover {
+    background-color: #d2322d;
+    border-color: #ac2925;
+}
+
+jmnodes.theme-danger jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-danger jmnode.root {}
+
+jmnodes.theme-danger jmexpander {}
+
+jmnodes.theme-danger jmexpander:hover {}
+
+
+/* success theme */
+
+jmnodes.theme-success jmnode {
+    background-color: #5cb85c;
+    border-color: #4cae4c;
+    color: #fff;
+}
+
+jmnodes.theme-success jmnode:hover {
+    background-color: #47a447;
+    border-color: #398439;
+}
+
+jmnodes.theme-success jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-success jmnode.root {}
+
+jmnodes.theme-success jmexpander {}
+
+jmnodes.theme-success jmexpander:hover {}
+
+
+/* info theme */
+
+jmnodes.theme-info jmnode {
+    background-color: #5dc0de;
+    border-color: #46b8da;
+    ;
+    color: #fff;
+}
+
+jmnodes.theme-info jmnode:hover {
+    background-color: #39b3d7;
+    border-color: #269abc;
+}
+
+jmnodes.theme-info jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-info jmnode.root {}
+
+jmnodes.theme-info jmexpander {}
+
+jmnodes.theme-info jmexpander:hover {}
+
+
+/* greensea theme */
+
+jmnodes.theme-greensea jmnode {
+    background-color: #1abc9c;
+    color: #fff;
+}
+
+jmnodes.theme-greensea jmnode:hover {
+    background-color: #16a085;
+}
+
+jmnodes.theme-greensea jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-greensea jmnode.root {}
+
+jmnodes.theme-greensea jmexpander {}
+
+jmnodes.theme-greensea jmexpander:hover {}
+
+
+/* nephrite theme */
+
+jmnodes.theme-nephrite jmnode {
+    background-color: #2ecc71;
+    color: #fff;
+}
+
+jmnodes.theme-nephrite jmnode:hover {
+    background-color: #27ae60;
+}
+
+jmnodes.theme-nephrite jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-nephrite jmnode.root {}
+
+jmnodes.theme-nephrite jmexpander {}
+
+jmnodes.theme-nephrite jmexpander:hover {}
+
+
+/* belizehole theme */
+
+jmnodes.theme-belizehole jmnode {
+    background-color: #3498db;
+    color: #fff;
+}
+
+jmnodes.theme-belizehole jmnode:hover {
+    background-color: #2980b9;
+}
+
+jmnodes.theme-belizehole jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-belizehole jmnode.root {}
+
+jmnodes.theme-belizehole jmexpander {}
+
+jmnodes.theme-belizehole jmexpander:hover {}
+
+
+/* wisteria theme */
+
+jmnodes.theme-wisteria jmnode {
+    background-color: #9b59b6;
+    color: #fff;
+}
+
+jmnodes.theme-wisteria jmnode:hover {
+    background-color: #8e44ad;
+}
+
+jmnodes.theme-wisteria jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-wisteria jmnode.root {}
+
+jmnodes.theme-wisteria jmexpander {}
+
+jmnodes.theme-wisteria jmexpander:hover {}
+
+
+/* asphalt theme */
+
+jmnodes.theme-asphalt jmnode {
+    background-color: #34495e;
+    color: #fff;
+}
+
+jmnodes.theme-asphalt jmnode:hover {
+    background-color: #2c3e50;
+}
+
+jmnodes.theme-asphalt jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-asphalt jmnode.root {}
+
+jmnodes.theme-asphalt jmexpander {}
+
+jmnodes.theme-asphalt jmexpander:hover {}
+
+
+/* orange theme */
+
+jmnodes.theme-orange jmnode {
+    background-color: #f1c40f;
+    color: #fff;
+}
+
+jmnodes.theme-orange jmnode:hover {
+    background-color: #f39c12;
+}
+
+jmnodes.theme-orange jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-orange jmnode.root {}
+
+jmnodes.theme-orange jmexpander {}
+
+jmnodes.theme-orange jmexpander:hover {}
+
+
+/* pumpkin theme */
+
+jmnodes.theme-pumpkin jmnode {
+    background-color: #e67e22;
+    color: #fff;
+}
+
+jmnodes.theme-pumpkin jmnode:hover {
+    background-color: #d35400;
+}
+
+jmnodes.theme-pumpkin jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-pumpkin jmnode.root {}
+
+jmnodes.theme-pumpkin jmexpander {}
+
+jmnodes.theme-pumpkin jmexpander:hover {}
+
+
+/* pomegranate theme */
+
+jmnodes.theme-pomegranate jmnode {
+    background-color: #e74c3c;
+    color: #fff;
+}
+
+jmnodes.theme-pomegranate jmnode:hover {
+    background-color: #c0392b;
+}
+
+jmnodes.theme-pomegranate jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-pomegranate jmnode.root {}
+
+jmnodes.theme-pomegranate jmexpander {}
+
+jmnodes.theme-pomegranate jmexpander:hover {}
+
+
+/* clouds theme */
+
+jmnodes.theme-clouds jmnode {
+    background-color: #ecf0f1;
+    color: #333;
+}
+
+jmnodes.theme-clouds jmnode:hover {
+    background-color: #bdc3c7;
+}
+
+jmnodes.theme-clouds jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-clouds jmnode.root {}
+
+jmnodes.theme-clouds jmexpander {}
+
+jmnodes.theme-clouds jmexpander:hover {}
+
+
+/* asbestos theme */
+
+jmnodes.theme-asbestos jmnode {
+    background-color: #95a5a6;
+    color: #fff;
+}
+
+jmnodes.theme-asbestos jmnode:hover {
+    background-color: #7f8c8d;
+}
+
+jmnodes.theme-asbestos jmnode.selected {
+    background-color: #11f;
+    color: #fff;
+}
+
+jmnodes.theme-asbestos jmnode.root {}
+
+jmnodes.theme-asbestos jmexpander {}
+
+jmnodes.theme-asbestos jmexpander:hover {}

BIN
src/assets/image/floorBG.png


BIN
src/assets/image/login_bg.png


BIN
src/assets/image/model/arrowBlue.png


BIN
src/assets/image/model/arrowGray.png


BIN
src/assets/image/model/arrowGreen.png


BIN
src/assets/image/model/columnBlue.png


BIN
src/assets/image/model/columnGray.png


BIN
src/assets/image/model/columnGreen.png


BIN
src/assets/image/model/delModelBlue.png


BIN
src/assets/image/model/delModelGray.png


BIN
src/assets/image/model/downJsonBlue.png


BIN
src/assets/image/model/downJsonGray.png


BIN
src/assets/image/model/downJsonGreen.png


BIN
src/assets/image/model/downModelBlue.png


BIN
src/assets/image/model/downModelGray.png


BIN
src/assets/image/model/downModelGreen.png


BIN
src/assets/image/model/rightDownBlue.png


BIN
src/assets/image/model/rightDownGray.png


BIN
src/assets/image/model/rightDownGreen.png


BIN
src/assets/image/model/upJsonBlue.png


BIN
src/assets/image/model/upJsonGray.png


BIN
src/assets/image/model/upJsonGreen.png


BIN
src/assets/image/model/upModelBlue.png


BIN
src/assets/image/model/upModelGray.png


BIN
src/assets/image/model/upModelGreen.png


BIN
src/assets/image/model/waitingAnlBlue.png


BIN
src/assets/image/model/waitingAnlGray.png


BIN
src/assets/image/model/waitingAnlGreen.png


BIN
src/assets/image/model/waitingManageBlue.png


BIN
src/assets/image/model/waitingManageGray.png


BIN
src/assets/image/model/waitingManageGreen.png


BIN
src/assets/image/no-data.png


Файловите разлики са ограничени, защото са твърде много
+ 2 - 0
src/assets/image/uncultivated.svg


Файловите разлики са ограничени, защото са твърде много
+ 1378 - 0
src/assets/js/chosen.jquery.min.js


+ 327 - 0
src/assets/js/handsontable-chosen-editor.js

@@ -0,0 +1,327 @@
+/// chosen plugin
+import Handsontable from "handsontable-pro"
+import 'handsontable-pro/dist/handsontable.full.css'
+import zhCN from 'handsontable-pro/languages/zh-CN';
+(function(Handsontable) {
+    "use strict";
+
+    var ChosenEditor = Handsontable.editors.TextEditor.prototype.extend();
+
+    ChosenEditor.prototype.prepare = function(row, col, prop, td, originalValue, cellProperties) {
+
+        Handsontable.editors.TextEditor.prototype.prepare.apply(this, arguments);
+
+        this.options = {};
+
+        if (this.cellProperties.chosenOptions) {
+            this.options = $.extend(this.options, cellProperties.chosenOptions);
+        }
+
+        cellProperties.chosenOptions = $.extend({}, cellProperties.chosenOptions);
+    };
+
+    ChosenEditor.prototype.createElements = function() {
+        this.$body = $(document.body);
+
+        this.TEXTAREA = document.createElement('select');
+        //this.TEXTAREA.setAttribute('type', 'text');
+        this.$textarea = $(this.TEXTAREA);
+
+        Handsontable.dom.addClass(this.TEXTAREA, 'handsontableInput');
+
+        this.textareaStyle = this.TEXTAREA.style;
+        this.textareaStyle.width = 0;
+        this.textareaStyle.height = 0;
+
+        this.TEXTAREA_PARENT = document.createElement('DIV');
+        Handsontable.dom.addClass(this.TEXTAREA_PARENT, 'handsontableInputHolder');
+
+        this.textareaParentStyle = this.TEXTAREA_PARENT.style;
+        this.textareaParentStyle.top = 0;
+        this.textareaParentStyle.left = 0;
+        this.textareaParentStyle.display = 'none';
+        this.textareaParentStyle.width = "200px";
+
+        this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);
+
+        this.instance.rootElement.appendChild(this.TEXTAREA_PARENT);
+
+        var that = this;
+        this.instance._registerTimeout(setTimeout(function() {
+            that.refreshDimensions();
+        }, 0));
+    };
+
+    var onChosenChanged = function() {
+        var options = this.cellProperties.chosenOptions;
+
+        if (!options.multiple) {
+            this.close();
+            this.finishEditing();
+        }
+    };
+    var onChosenClosed = function() {
+        var options = this.cellProperties.chosenOptions;
+
+        if (!options.multiple) {
+            this.close();
+            this.finishEditing();
+        } else {}
+    };
+    var onBeforeKeyDown = function(event) {
+        var instance = this;
+        var that = instance.getActiveEditor();
+
+        var keyCodes = Handsontable.helper.KEY_CODES;
+        var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey; //catch CTRL but not right ALT (which in some systems triggers ALT+CTRL)
+
+        //Process only events that have been fired in the editor
+        if (event.target.tagName !== "INPUT") {
+            return;
+        }
+        if (event.keyCode === 17 || event.keyCode === 224 || event.keyCode === 91 || event.keyCode === 93) {
+            //when CTRL or its equivalent is pressed and cell is edited, don't prepare selectable text in textarea
+            event.stopImmediatePropagation();
+            return;
+        }
+
+        var target = event.target;
+
+        switch (event.keyCode) {
+            case keyCodes.ARROW_RIGHT:
+                if (Handsontable.dom.getCaretPosition(target) !== target.value.length) {
+                    event.stopImmediatePropagation();
+                } else {
+                    that.$textarea.trigger("chosen:close");
+                }
+                break;
+
+            case keyCodes.ARROW_LEFT:
+                if (Handsontable.dom.getCaretPosition(target) !== 0) {
+                    event.stopImmediatePropagation();
+                } else {
+                    that.$textarea.trigger("chosen:close");
+                }
+                break;
+
+            case keyCodes.ENTER:
+                if (that.cellProperties.chosenOptions.multiple) {
+                    event.stopImmediatePropagation();
+                    event.preventDefault();
+                    event.stopPropagation();
+                }
+
+                break;
+
+            case keyCodes.A:
+            case keyCodes.X:
+            case keyCodes.C:
+            case keyCodes.V:
+                if (ctrlDown) {
+                    event.stopImmediatePropagation(); //CTRL+A, CTRL+C, CTRL+V, CTRL+X should only work locally when cell is edited (not in table context)
+                }
+                break;
+
+            case keyCodes.BACKSPACE:
+                var txt = $(that.TEXTAREA_PARENT).find("input").val();
+                $(that.TEXTAREA_PARENT).find("input").val(txt.substr(0, txt.length - 1)).trigger("keyup.chosen");
+
+                event.stopImmediatePropagation();
+                break;
+            case keyCodes.DELETE:
+            case keyCodes.HOME:
+            case keyCodes.END:
+                event.stopImmediatePropagation(); //backspace, delete, home, end should only work locally when cell is edited (not in table context)
+                break;
+        }
+
+    };
+
+    ChosenEditor.prototype.open = function(keyboardEvent) {
+        this.refreshDimensions();
+        this.textareaParentStyle.display = 'block';
+        this.instance.addHook('beforeKeyDown', onBeforeKeyDown);
+
+        this.$textarea.css({
+            height: $(this.TD).height() + 4,
+            'min-width': $(this.TD).outerWidth() - 4
+        });
+
+        //display the list
+        this.$textarea.hide();
+
+        //make sure that list positions matches cell position
+        //this.$textarea.offset($(this.TD).offset());
+
+        var options = $.extend({}, this.options, {
+            width: "100%",
+            search_contains: true
+        });
+
+        if (options.multiple) {
+            this.$textarea.attr("multiple", true);
+        } else {
+            this.$textarea.attr("multiple", false);
+        }
+
+        this.$textarea.empty();
+        this.$textarea.append("<option value=''></option>");
+        var el = null;
+        var originalValue = (this.originalValue + "").split(",");
+        if (options.data && options.data.length) {
+            for (var i = 0; i < options.data.length; i++) {
+                // el = $("<option />");
+                // el.attr("value", options.data[i].Code);
+                // el.html(options.data[i].Name);
+
+                // if (originalValue.indexOf(options.data[i].Code + "") > -1) {
+                //     el.attr("selected", true);
+                // }
+
+                // this.$textarea.append(el);
+                if (options.data[i].content && options.data[i].content.length) {
+                    for (var k = 0; k < options.data[i].content.length; k++) {
+                        if (options.data[i].content[k] && options.data[i].content[k].length) {
+                            for (var j = 0; j < options.data[i].content[k].length; j++) {
+                                el = $("<option />");
+                                el.attr("value", options.data[i].content[k].content[j].Code);
+                                el.html(options.data[i].content[k].content[j].Name);
+
+                                if (originalValue.indexOf(options.data[i].content[k].content[j].Code + "") > -1) {
+                                    el.attr("selected", true);
+                                }
+                                this.$textarea.append(el);
+                            }
+                        } else {
+                            el = $("<option />");
+                            el.attr("value", options.data[i].content[k].Code);
+                            el.html(options.data[i].content[k].Name);
+
+                            if (originalValue.indexOf(options.data[i].content[k].Code + "") > -1) {
+                                el.attr("selected", true);
+                            }
+                            this.$textarea.append(el);
+                        }
+                    }
+                } else {
+                    el = $("<option />");
+                    el.attr("value", options.data[i].Code);
+                    el.html(options.data[i].Name);
+
+                    if (originalValue.indexOf(options.data[i].Code + "") > -1) {
+                        el.attr("selected", true);
+                    }
+                    this.$textarea.append(el);
+                }
+            }
+        }
+
+        if ($(this.TEXTAREA_PARENT).find(".chosen-container").length) {
+            this.$textarea.chosen("destroy");
+        }
+
+        this.$textarea.chosen(options);
+
+        var self = this;
+        setTimeout(function() {
+
+            self.$textarea.on('change', onChosenChanged.bind(self));
+            self.$textarea.on('chosen:hiding_dropdown', onChosenClosed.bind(self));
+
+            self.$textarea.trigger("chosen:open");
+
+            $(self.TEXTAREA_PARENT).find("input").on("keydown", function(e) {
+                if (e.keyCode === Handsontable.helper.KEY_CODES.ENTER /*|| e.keyCode === Handsontable.helper.KEY_CODES.BACKSPACE*/ ) {
+                    if ($(this).val()) {
+                        e.preventDefault();
+                        e.stopPropagation();
+                    } else {
+                        e.preventDefault();
+                        e.stopPropagation();
+
+                        self.close();
+                        self.finishEditing();
+                    }
+
+                }
+
+                if (e.keyCode === Handsontable.helper.KEY_CODES.BACKSPACE) {
+                    var txt = $(self.TEXTAREA_PARENT).find("input").val();
+
+                    $(self.TEXTAREA_PARENT).find("input").val(txt.substr(0, txt.length - 1)).trigger("keyup.chosen");
+
+                    e.preventDefault();
+                    e.stopPropagation();
+                }
+
+                if (e.keyCode === Handsontable.helper.KEY_CODES.ARROW_DOWN || e.keyCode === Handsontable.helper.KEY_CODES.ARROW_UP) {
+                    e.preventDefault();
+                    e.stopPropagation();
+                }
+
+            });
+
+            setTimeout(function() {
+                self.$textarea.trigger("chosen:activate").focus();
+
+                if (keyboardEvent && keyboardEvent.keyCode && keyboardEvent.keyCode != 113) {
+                    var key = keyboardEvent.keyCode;
+                    var keyText = (String.fromCharCode((96 <= key && key <= 105) ? key - 48 : key)).toLowerCase();
+
+                    $(self.TEXTAREA_PARENT).find("input").val(keyText).trigger("keyup.chosen");
+                    self.$textarea.trigger("chosen:activate");
+                }
+            }, 1);
+        }, 1);
+
+    };
+
+    ChosenEditor.prototype.init = function() {
+        Handsontable.editors.TextEditor.prototype.init.apply(this, arguments);
+    };
+
+    ChosenEditor.prototype.close = function() {
+        this.instance.listen();
+        this.instance.removeHook('beforeKeyDown', onBeforeKeyDown);
+        this.$textarea.off();
+        this.$textarea.hide();
+        Handsontable.editors.TextEditor.prototype.close.apply(this, arguments);
+    };
+
+    ChosenEditor.prototype.getValue = function() {
+        if (!this.$textarea.val()) {
+            return "";
+        }
+        if (typeof this.$textarea.val() === "object") {
+            return this.$textarea.val().join(",");
+        }
+        return this.$textarea.val();
+    };
+
+
+    ChosenEditor.prototype.focus = function() {
+        this.instance.listen();
+
+        // DO NOT CALL THE BASE TEXTEDITOR FOCUS METHOD HERE, IT CAN MAKE THIS EDITOR BEHAVE POORLY AND HAS NO PURPOSE WITHIN THE CONTEXT OF THIS EDITOR
+        //Handsontable.editors.TextEditor.prototype.focus.apply(this, arguments);
+    };
+
+    ChosenEditor.prototype.beginEditing = function(initialValue) {
+        var onBeginEditing = this.instance.getSettings().onBeginEditing;
+        if (onBeginEditing && onBeginEditing() === false) {
+            return;
+        }
+
+        Handsontable.editors.TextEditor.prototype.beginEditing.apply(this, arguments);
+
+    };
+
+    ChosenEditor.prototype.finishEditing = function(isCancelled, ctrlDown) {
+        this.instance.listen();
+        return Handsontable.editors.TextEditor.prototype.finishEditing.apply(this, arguments);
+    };
+
+    Handsontable.editors.ChosenEditor = ChosenEditor;
+    Handsontable.editors.registerEditor('chosen', ChosenEditor);
+
+})(Handsontable);

Файловите разлики са ограничени, защото са твърде много
+ 2933 - 0
src/assets/js/jsmind.js


BIN
src/assets/logo.png


+ 37 - 0
src/assets/pako/pako.js

@@ -0,0 +1,37 @@
+import pako from 'pako'
+
+let funcTo = atob
+console.log(funcTo)
+
+const pakoObj = {
+    unzip: function unzip(b64Data) {
+        // console.log(b64Data)
+        var strData = funcTo(b64Data);
+
+        // Convert binary string to character-number array
+        var charData = strData.split('').map(function(x) { return x.charCodeAt(0); });
+        // console.log("charData", charData)
+
+        // Turn number array into byte-array
+        var binData = new Uint8Array(charData);
+
+
+        // // unzip
+        var data = pako.inflate(binData, { to: 'string' });
+        // console.log(data)
+        // strData = new Uint16Array(data).reduce(function(data, byte) {
+        //     return data + String.fromCharCode(byte);
+        // })
+        // console.log(strData)
+        return eval("(" + data + ")");
+    },
+    // 压缩
+    zip: function(str) {
+        //escape(str)  --->压缩前编码,防止中午乱码
+        var binaryString = pako.gzip(escape(str), { to: 'string' });
+        console.log(binaryString)
+        return binaryString;
+    }
+}
+
+export default pakoObj

+ 120 - 0
src/assets/scss/point/point_config/common.scss

@@ -0,0 +1,120 @@
+$borderWidth: 1px;
+$borderColor: #ccc;
+$hoverColor: #409EFF;
+$w: 800px;
+$radiusWidth: 4px;
+$size3: 23px;
+.saga-size3 {
+    font-size: $size3;
+}
+
+.select-bg {
+    background-color: $hoverColor;
+}
+
+.saga-border {
+    border: $borderWidth solid $borderColor;
+    box-sizing: border-box;
+    border-radius: $radiusWidth;
+}
+
+.el-dialog__body {
+    padding: 0;
+}
+
+body .htFiltersConditionsMenu:not(.htGhostTable) {
+    z-index: 4070;
+}
+
+.border-hover {}
+
+.border-hover:hover {
+    border-color: $hoverColor;
+}
+
+.saga-dashed-border {
+    border: $borderWidth dashed $borderColor;
+    border-radius: $radiusWidth;
+}
+
+.flex {
+    display: flex;
+    justify-content: space-around;
+}
+
+.saga-fill {
+    width: 100%;
+    height: 100%;
+}
+
+.margin5 {
+    margin: 10px 18px 18px 10px;
+}
+
+.dcenter {
+    margin-left: auto;
+    margin-right: auto;
+}
+
+.h1 {
+    font-size: 24px;
+    color: #8E9CC1;
+}
+
+.h3 {
+    font-size: 14px;
+    color: #333;
+}
+
+.h5 {
+    font-size: 12px;
+    color: #999;
+}
+
+.center {
+    text-align: center;
+}
+
+.padding10 {
+    padding: 10px;
+}
+
+.bg-F5 {
+    background: #F5FCFF;
+}
+
+.block {
+    display: block;
+}
+
+.w {
+    width: $w;
+}
+
+.h100 {
+    height: 100%;
+}
+
+.p-over2 {
+    text-overflow: -o-ellipsis-lastline;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2; //这儿的数字代表的就是你所需要实现效果的第N行
+    -webkit-box-orient: vertical;
+    overflow-wrap: break-word;
+}
+
+.pointer {
+    cursor: pointer;
+}
+
+@media screen and (max-width: 1366px) {
+    .w {
+        width: 560px;
+    }
+    html {
+        overflow-x: auto;
+        overflow-y: auto;
+    }
+}

+ 485 - 0
src/assets/scss/point/point_config/reset.scss

@@ -0,0 +1,485 @@
+$WinWitdh:1366px;
+$BaseC:#555;
+$LinkC:#06f;
+$HoverC:#f60;
+$FontSize:13px;
+$fontFamily: "Spurce Han Sans,Wah Kang font,Microsoft YaHei";
+$allColor: #333; //正文#333
+$color1: #666; //辅助文字#666
+$color2: #999; //#999
+$color3: #ccc; //失效文字#ccc
+$color4: #00A0E8; //链接文字
+$color5: #8E9CC1; //表头文字加粗
+$colorList: ( 1:$color1, 2:$color2, 3:$color3, 4:$color4, 5:$color5);
+$theme1: #5BA7FF;
+$theme2: #FFF;
+$theme3: #8E9CC1;
+$themeList: (1:$theme1, 2:$theme2, 3:$theme3);
+$auxiliary1: #548FF0; //辅助色彩
+$auxiliary2: #FF4121;
+$auxiliary3: #7ED321;
+$auxiliary4: #F5A623;
+$auxiliaryList: ( 1:$auxiliary1, 2:$auxiliary2, 3:$auxiliary3, 4:$auxiliary4);
+$borderColor1: #C2CEDB; //线条色彩
+$borderColor2: #DDD;
+$borderColorList: (1:$borderColor1, 2:$borderColor2);
+$bg1: #FFF;
+$bg2: #F2FBFF;
+$bg3: #EEFAFF;
+$bg4: #FFF5E4;
+$bg5: #E5F6D3;
+$bgList: ( 1:$bg1, 2:$bg2, 3:$bg3, 4:$bg4, 5:$bg5);
+$allSize: 14px; //正常文字大小
+$size1: 12px; //辅助文字大小
+// mixins
+@mixin dz($time:0.25s) {
+    -webkit-transition: all $time ease-in-out;
+    -moz-transition: all $time ease-in-out;
+    -o-transition: all $time ease-in-out;
+    transition: all $time ease-in-out;
+}
+
+// .el-dialog__headerbtn {
+//     top: -24px;
+//     right: -24px;
+//     width: 24px;
+//     height: 24px;
+//     border-radius: 50%;
+//     color: #8E9CC1;
+//     background-color: #fff;
+// }
+.el-dialog__header {
+    border-bottom: 1px solid #C2CEDB;
+    box-sizing: border-box;
+    .el-dialog__title {
+        height: 20px;
+        line-height: 20px;
+        font-size: 14px;
+    }
+}
+
+// .el-button--mini,
+// .el-button--mini.is-round {
+//     padding: 5px 20px;
+// }
+// .el-button {
+//     box-sizing: border-box;
+//     border-color: $auxiliary1;
+// }
+// .el-button span {
+//     color: $color4;
+// }
+// .el-button:focus,
+// .el-button:hover {
+//     background-color: $bg1;
+//     border-color: $auxiliary1;
+// }
+// .el-button span {
+//     display: inline-block;
+//     line-height: 20px;
+//     height: 20px;
+// }
+// * {
+//     font-family: $fontFamily;
+//     font-size: $allSize;
+//     color: $allColor;
+// }
+// .color {
+//     color: $allColor;
+// }
+// .el-input__inner:hover{
+//     border-color: 
+// }
+//文字色
+@each $i,
+$color in $colorList {
+    .color#{$i} {
+        color: $color;
+    }
+}
+
+//主题色
+@each $i,
+$theme in $themeList {
+    .theme#{$i} {
+        background-color: $theme;
+    }
+}
+
+//辅助背景色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary#{$i} {
+        background-color: $auxiliary;
+    }
+}
+
+//辅助色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary-color#{$i} {
+        color: $auxiliary;
+    }
+}
+
+//线条色
+@each $i,
+$borderColor in $borderColorList {
+    .border-color#{$i} {
+        border-color: $borderColor;
+    }
+}
+
+//背景色
+@each $i,
+$bg in $bgList {
+    .bg#{$i} {
+        background-color: $bg;
+    }
+}
+
+@for $i from 1 to 51 {
+    .border-radius#{$i} {
+        border-radius: #{$i}px;
+    }
+}
+
+@for $i from 1 to 11 {
+    .border#{$i} {
+        border-width: #{$i}px;
+        border-style: solid;
+    }
+}
+
+// .color2 {
+//     color: $color2;
+// }
+// .color3 {
+//     color: $color3;
+// }
+// .color4 {
+//     color: $color4;
+// }
+// .color5 {
+//     color: $color5
+// }
+// @charset "UTF-8";
+body,
+ul,
+ol,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+pre,
+form,
+fieldset,
+legend,
+input,
+button,
+textarea,
+p,
+blockquote,
+table,
+th,
+td,
+menu {
+    margin: 0;
+    padding: 0
+}
+
+html,
+body,
+#app {
+    height: 100%;
+    width: 100%;
+}
+
+table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    table-layout: fixed
+}
+
+ul,
+ol,
+menu {
+    list-style: none
+}
+
+fieldset,
+img {
+    border: none
+}
+
+img,
+object,
+select,
+input,
+textarea,
+button {
+    vertical-align: middle
+}
+
+input,
+textarea,
+select,
+address,
+caption,
+cite,
+code,
+dfn,
+em,
+i,
+b,
+strong,
+small,
+th,
+var,
+abbr {
+    font-size: 100%;
+    font-style: normal
+}
+
+caption,
+th {
+    text-align: left;
+}
+
+article,
+aside,
+footer,
+header,
+hgroup,
+nav,
+section,
+figure,
+figcaption {
+    display: block;
+}
+
+code,
+kbd,
+pre,
+samp,
+tt {
+    font-family: Consolas, "Courier New", Courier, monospace;
+}
+
+address,
+cite,
+dfn,
+em,
+var,
+i {
+    font-style: normal;
+}
+
+blockquote,
+q {
+    quotes: none;
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+    content: "";
+    content: none;
+}
+
+a {
+    color: $LinkC;
+    text-decoration: none;
+    cursor: pointer;
+    &:link,
+    &:visited,
+    &:active {
+        color: $LinkC;
+    }
+    &:hover,
+    &:focus {
+        color: $HoverC;
+        text-decoration: underline;
+        outline: none;
+    }
+    &,
+    span,
+    i,
+    em,
+    u,
+    strong,
+    b,
+    p,
+    img,
+    ul,
+    li,
+    div,
+    dd,
+    dt,
+    dl,
+    ol,
+    table,
+    th,
+    td,
+    h1,
+    h2,
+    h3,
+    h4,
+    h5,
+    h6,
+    input,
+    textarea,
+    button,
+    small,
+    select {
+        cursor: pointer;
+        @include dz;
+    }
+}
+
+abbr[title],
+acronym[title] {
+    border-bottom: 1px dotted;
+    cursor: help;
+}
+
+// base by fungleo
+html {
+    min-width: $WinWitdh;
+    // overflow-y: scroll;
+}
+
+body {
+    font-size: $FontSize;
+    color: $BaseC;
+    line-height: 2;
+}
+
+body,
+button,
+input,
+select,
+textarea {
+    font-family: Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,SimSun,sans-serif, "\5FAE\8F6F\96C5\9ED1";
+    *font-family: "\5FAE\8F6F\96C5\9ED1";
+}
+
+h1 {
+    font-size: $FontSize+10;
+}
+
+h2 {
+    font-size: $FontSize+8;
+}
+
+h3 {
+    font-size: $FontSize+6;
+}
+
+h4 {
+    font-size: $FontSize+4;
+}
+
+h5 {
+    font-size: $FontSize+2;
+}
+
+h6 {
+    font-size: $FontSize;
+}
+
+hr {
+    border: none;
+    height: 1px;
+    background: lighten($BaseC, 50%);
+}
+
+.fl {
+    float: left;
+}
+
+.fr {
+    float: right;
+}
+
+.tl {
+    text-align: left;
+}
+
+.tr {
+    text-align: right;
+}
+
+.tc {
+    text-align: center;
+}
+
+.cf:before,
+.cf:after,
+.web:before,
+.web:after,
+.web_:before,
+.web_:after {
+    content: "";
+    display: table;
+}
+
+.cf:after,
+.web:after,
+.web_:after {
+    clear: both;
+}
+
+.cf {
+    zoom: 1;
+}
+
+.web {
+    width: $WinWitdh;
+    margin-left: auto;
+    margin-right: auto;
+    zoom: 1;
+}
+
+.web_ {
+    min-width: $WinWitdh;
+    width: 100%;
+    zoom: 1;
+}
+
+.block {
+    display: block;
+}
+
+.none {
+    display: none
+}
+
+.clear {
+    clear: both;
+}
+
+.fl {
+    float: left;
+}
+
+.disIne {
+    display: inline-block;
+}
+
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+    -webkit-appearance: none;
+}
+input[type="number"]{
+    -moz-appearance: textfield;
+}
+
+canvas:focus{
+    outline: none;
+}

+ 96 - 0
src/assets/scss/reset.scss

@@ -0,0 +1,96 @@
+$fontFamily: "Spurce Han Sans,Wah Kang font,Microsoft YaHei";
+$allColor: #303133; //主要文字
+$color1: #606266; //常规文字
+$color2: #909399; //次要文字
+$color3: #C0C4CC; //占位文字
+$colorList: ( 1:$color1, 2:$color2, 3:$color3);
+$theme1: #5BA7FF;
+$theme2: #FFF;
+$theme3: #8E9CC1;
+$themeList: (1:$theme1, 2:$theme2, 3:$theme3);
+$auxiliary1: #548FF0; //辅助色彩
+$auxiliary2: #FF4121;
+$auxiliary3: #7ED321;
+$auxiliary4: #F5A623;
+$auxiliaryList: ( 1:$auxiliary1, 2:$auxiliary2, 3:$auxiliary3, 4:$auxiliary4);
+$borderColor1: #C2CEDB; //线条色彩
+$borderColor2: #DDD;
+$borderColorList: (1:$borderColor1, 2:$borderColor2);
+$bg1: #FFF;
+$bg2: #F2FBFF;
+$bg3: #EEFAFF;
+$bg4: #FFF5E4;
+$bg5: #E5F6D3;
+$bgList: ( 1:$bg1, 2:$bg2, 3:$bg3, 4:$bg4, 5:$bg5);
+$allSize: 14px; //正常文字大小
+$size1: 12px; //辅助文字大小
+.el-dialog__header {
+    border-bottom: 1px solid #C2CEDB;
+    box-sizing: border-box;
+    .el-dialog__title {
+        height: 20px;
+        line-height: 20px;
+        font-size: 14px;
+    }
+}
+
+//文字色
+@each $i,
+$color in $colorList {
+    .color#{$i} {
+        color: $color;
+    }
+}
+
+//主题色
+@each $i,
+$theme in $themeList {
+    .theme#{$i} {
+        background-color: $theme;
+    }
+}
+
+//辅助背景色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary#{$i} {
+        background-color: $auxiliary;
+    }
+}
+
+//辅助色
+@each $i,
+$auxiliary in $auxiliaryList {
+    .auxiliary-color#{$i} {
+        color: $auxiliary;
+    }
+}
+
+//线条色
+@each $i,
+$borderColor in $borderColorList {
+    .border-color#{$i} {
+        border-color: $borderColor;
+    }
+}
+
+//背景色
+@each $i,
+$bg in $bgList {
+    .bg#{$i} {
+        background-color: $bg;
+    }
+}
+
+@for $i from 1 to 51 {
+    .border-radius#{$i} {
+        border-radius: #{$i}px;
+    }
+}
+
+@for $i from 1 to 11 {
+    .border#{$i} {
+        border-width: #{$i}px;
+        border-style: solid;
+    }
+}

+ 503 - 0
src/assets/style/iconfont/iconfont.css

@@ -0,0 +1,503 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 1318214 */
+  src: url('iconfont.woff2?t=1623402928952') format('woff2'),
+       url('iconfont.woff?t=1623402928952') format('woff'),
+       url('iconfont.ttf?t=1623402928952') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-dangqian:before {
+  content: "\e653";
+}
+
+.icon-topology:before {
+  content: "\e67c";
+}
+
+.icon-pingmiantu:before {
+  content: "\e652";
+}
+
+.icon-biaogewushuju:before {
+  content: "\e651";
+}
+
+.icon-juxing:before {
+  content: "\e650";
+}
+
+.icon-delate:before {
+  content: "\e64e";
+}
+
+.icon-conduct:before {
+  content: "\e64d";
+}
+
+.icon-Error:before {
+  content: "\e64c";
+}
+
+.icon-trouble:before {
+  content: "\e64b";
+}
+
+.icon-json:before {
+  content: "\e646";
+}
+
+.icon-revit:before {
+  content: "\e645";
+}
+
+.icon-icon-test:before {
+  content: "\e643";
+}
+
+.icon-OSSserver:before {
+  content: "\e644";
+}
+
+.icon-iconfontgengduo:before {
+  content: "\e641";
+}
+
+.icon-shipin-tianchong:before {
+  content: "\e647";
+}
+
+.icon-shipin:before {
+  content: "\e683";
+}
+
+.icon-Excel:before {
+  content: "\edde";
+}
+
+.icon-weixiubeijing:before {
+  content: "\e63a";
+}
+
+.icon-kongqizhiliang:before {
+  content: "\e63c";
+}
+
+.icon-fujian:before {
+  content: "\e6ea";
+}
+
+.icon-shezhi1:before {
+  content: "\e63d";
+}
+
+.icon-zuzhiguanxi:before {
+  content: "\e6c1";
+}
+
+.icon-view:before {
+  content: "\e639";
+}
+
+.icon-icon:before {
+  content: "\e65b";
+}
+
+.icon-jiankongguizeweihu:before {
+  content: "\e637";
+}
+
+.icon-yiliaohangyedeICON-:before {
+  content: "\e638";
+}
+
+.icon-guizeyingyong:before {
+  content: "\e64a";
+}
+
+.icon-chakan:before {
+  content: "\e63f";
+}
+
+.icon-jilu:before {
+  content: "\e635";
+}
+
+.icon-yun--tianchong:before {
+  content: "\e682";
+}
+
+.icon-yun--tianchong1:before {
+  content: "\e684";
+}
+
+.icon-yun--tianchong2:before {
+  content: "\e687";
+}
+
+.icon-yun--tianchong3:before {
+  content: "\e689";
+}
+
+.icon-shenhetongguo:before {
+  content: "\e636";
+}
+
+.icon-daochuexcel:before {
+  content: "\e714";
+}
+
+.icon-qingdanguanli:before {
+  content: "\e604";
+}
+
+.icon-shangchuan1:before {
+  content: "\e775";
+}
+
+.icon-kong:before {
+  content: "\e709";
+}
+
+.icon-shuxingxuanze:before {
+  content: "\e633";
+}
+
+.icon-shezhi:before {
+  content: "\e660";
+}
+
+.icon-shubiaozhizhen:before {
+  content: "\e781";
+}
+
+.icon-zidong:before {
+  content: "\e7ee";
+}
+
+.icon-jiazai:before {
+  content: "\e634";
+}
+
+.icon-shenglvehao:before {
+  content: "\e708";
+}
+
+.icon-warn:before {
+  content: "\e630";
+}
+
+.icon-shangchuan:before {
+  content: "\e664";
+}
+
+.icon-23:before {
+  content: "\e6ba";
+}
+
+.icon-new:before {
+  content: "\e63e";
+}
+
+.icon-iconset0450:before {
+  content: "\e749";
+}
+
+.icon-shipinbofangyingpian2:before {
+  content: "\e78e";
+}
+
+.icon-quanjing-m:before {
+  content: "\e631";
+}
+
+.icon-bianji:before {
+  content: "\e640";
+}
+
+.icon-shuoming:before {
+  content: "\e632";
+}
+
+.icon-you:before {
+  content: "\e63b";
+}
+
+.icon-doc-line:before {
+  content: "\e64f";
+}
+
+.icon-bofang:before {
+  content: "\e866";
+}
+
+.icon-changyongtubiao-xianxingdaochu-zhuanqu-:before {
+  content: "\e776";
+}
+
+.icon-changyongtubiao-mianxing-:before {
+  content: "\e79b";
+}
+
+.icon-Anti-cancel:before {
+  content: "\e62f";
+}
+
+.icon-download1:before {
+  content: "\e62e";
+}
+
+.icon-zoom:before {
+  content: "\e62d";
+}
+
+.icon-narrow:before {
+  content: "\e62c";
+}
+
+.icon-Cancel:before {
+  content: "\e62b";
+}
+
+.icon-Erase:before {
+  content: "\e62a";
+}
+
+.icon-edit1:before {
+  content: "\e627";
+}
+
+.icon-maximize:before {
+  content: "\e626";
+}
+
+.icon-move:before {
+  content: "\e625";
+}
+
+.icon-lijiqueren:before {
+  content: "\e762";
+}
+
+.icon-ico:before {
+  content: "\e624";
+}
+
+.icon-xiangqing-copy:before {
+  content: "\e763";
+}
+
+.icon-xiangqing:before {
+  content: "\e649";
+}
+
+.icon-jinggao:before {
+  content: "\e603";
+}
+
+.icon-dingwei:before {
+  content: "\e629";
+}
+
+.icon-yushu_yingwen:before {
+  content: "\e623";
+}
+
+.icon-shanglou:before {
+  content: "\e600";
+}
+
+.icon-htmal5icon30:before {
+  content: "\e642";
+}
+
+.icon-app4:before {
+  content: "\e6f4";
+}
+
+.icon-xitong:before {
+  content: "\e61f";
+}
+
+.icon-jiaoseguanli:before {
+  content: "\e621";
+}
+
+.icon-jiqixuexi-:before {
+  content: "\e754";
+}
+
+.icon-taizhangzhangbushezhi:before {
+  content: "\e654";
+}
+
+.icon-xinxi:before {
+  content: "\e648";
+}
+
+.icon-project-o:before {
+  content: "\e628";
+}
+
+.icon-jianzhu:before {
+  content: "\e601";
+}
+
+.icon-guanxi:before {
+  content: "\e6ad";
+}
+
+.icon-kechengshouquan:before {
+  content: "\e622";
+}
+
+.icon-renyuanguanli:before {
+  content: "\e663";
+}
+
+.icon-moxing___:before {
+  content: "\e602";
+}
+
+.icon-shitixingwei:before {
+  content: "\e620";
+}
+
+.icon-shujukushili:before {
+  content: "\e66c";
+}
+
+.icon-tongbushujukumoxing:before {
+  content: "\e673";
+}
+
+.icon-right:before {
+  content: "\e6f8";
+}
+
+.icon-left:before {
+  content: "\e720";
+}
+
+.icon-bottom:before {
+  content: "\e869";
+}
+
+.icon-top:before {
+  content: "\e867";
+}
+
+.icon-edit-2:before {
+  content: "\e61e";
+}
+
+.icon-nopicture:before {
+  content: "\e61d";
+}
+
+.icon-cross:before {
+  content: "\e61c";
+}
+
+.icon-hook:before {
+  content: "\e61b";
+}
+
+.icon-mark:before {
+  content: "\e619";
+}
+
+.icon-positioning:before {
+  content: "\e618";
+}
+
+.icon-association:before {
+  content: "\e617";
+}
+
+.icon-batchassociation:before {
+  content: "\e616";
+}
+
+.icon-search:before {
+  content: "\e615";
+}
+
+.icon-Update:before {
+  content: "\e614";
+}
+
+.icon-download:before {
+  content: "\e613";
+}
+
+.icon-Log:before {
+  content: "\e612";
+}
+
+.icon-replace:before {
+  content: "\e611";
+}
+
+.icon-termination:before {
+  content: "\e610";
+}
+
+.icon-folder:before {
+  content: "\e60f";
+}
+
+.icon-add-control:before {
+  content: "\e60e";
+}
+
+.icon-delete-control:before {
+  content: "\e60d";
+}
+
+.icon-windowclosed:before {
+  content: "\e60c";
+}
+
+.icon-return:before {
+  content: "\e60b";
+}
+
+.icon-open:before {
+  content: "\e60a";
+}
+
+.icon-less:before {
+  content: "\e609";
+}
+
+.icon-plus:before {
+  content: "\e608";
+}
+
+.icon-edit:before {
+  content: "\e607";
+}
+
+.icon-floorplan:before {
+  content: "\e606";
+}
+
+.icon-delete:before {
+  content: "\e605";
+}
+
+.icon-guanbi:before {
+  content: "\e66b";
+}
+
+.icon-wushuju:before {
+  content: "\e61a";
+}
+

+ 863 - 0
src/assets/style/iconfont/iconfont.json

@@ -0,0 +1,863 @@
+{
+  "id": "1318214",
+  "name": "慧云盈运维平台V3.0",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "运维平台3.0-图标",
+  "glyphs": [
+    {
+      "icon_id": "22214661",
+      "name": "当前",
+      "font_class": "dangqian",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "4922685",
+      "name": "拓扑",
+      "font_class": "topology",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "18683496",
+      "name": "平面图设计",
+      "font_class": "pingmiantu",
+      "unicode": "e652",
+      "unicode_decimal": 58962
+    },
+    {
+      "icon_id": "7349170",
+      "name": "表格无数据",
+      "font_class": "biaogewushuju",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "13956703",
+      "name": "矩形",
+      "font_class": "juxing",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "13759213",
+      "name": "delate",
+      "font_class": "delate",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "13710533",
+      "name": "conduct",
+      "font_class": "conduct",
+      "unicode": "e64d",
+      "unicode_decimal": 58957
+    },
+    {
+      "icon_id": "13710530",
+      "name": "Error",
+      "font_class": "Error",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "13710517",
+      "name": "trouble",
+      "font_class": "trouble",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "13710513",
+      "name": "json",
+      "font_class": "json",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "13710507",
+      "name": "revit",
+      "font_class": "revit",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "12508700",
+      "name": "111",
+      "font_class": "icon-test",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "13710494",
+      "name": "OSS server",
+      "font_class": "OSSserver",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "645195",
+      "name": "更多",
+      "font_class": "iconfontgengduo",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "2570109",
+      "name": "视频",
+      "font_class": "shipin-tianchong",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "5321972",
+      "name": "视频",
+      "font_class": "shipin",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "6808518",
+      "name": "Excel",
+      "font_class": "Excel",
+      "unicode": "edde",
+      "unicode_decimal": 60894
+    },
+    {
+      "icon_id": "7957905",
+      "name": "维修背景",
+      "font_class": "weixiubeijing",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "8628975",
+      "name": "空气质量",
+      "font_class": "kongqizhiliang",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "9881675",
+      "name": "KHCFDC_附件",
+      "font_class": "fujian",
+      "unicode": "e6ea",
+      "unicode_decimal": 59114
+    },
+    {
+      "icon_id": "10262050",
+      "name": "设 置",
+      "font_class": "shezhi1",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "8452524",
+      "name": "组织关系",
+      "font_class": "zuzhiguanxi",
+      "unicode": "e6c1",
+      "unicode_decimal": 59073
+    },
+    {
+      "icon_id": "10902058",
+      "name": "转换视图",
+      "font_class": "view",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "744577",
+      "name": "空间",
+      "font_class": "icon",
+      "unicode": "e65b",
+      "unicode_decimal": 58971
+    },
+    {
+      "icon_id": "3978010",
+      "name": "监控规则维护",
+      "font_class": "jiankongguizeweihu",
+      "unicode": "e637",
+      "unicode_decimal": 58935
+    },
+    {
+      "icon_id": "6756829",
+      "name": "定位",
+      "font_class": "yiliaohangyedeICON-",
+      "unicode": "e638",
+      "unicode_decimal": 58936
+    },
+    {
+      "icon_id": "9589340",
+      "name": "规则应用",
+      "font_class": "guizeyingyong",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "573859",
+      "name": "查看",
+      "font_class": "chakan",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "738194",
+      "name": "记录",
+      "font_class": "jilu",
+      "unicode": "e635",
+      "unicode_decimal": 58933
+    },
+    {
+      "icon_id": "2570201",
+      "name": "云-4",
+      "font_class": "yun--tianchong",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "2570203",
+      "name": "云-3",
+      "font_class": "yun--tianchong1",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "2570206",
+      "name": "云-2",
+      "font_class": "yun--tianchong2",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "2570208",
+      "name": "云-1",
+      "font_class": "yun--tianchong3",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "7171938",
+      "name": "审核通过",
+      "font_class": "shenhetongguo",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "7237252",
+      "name": "导出excel",
+      "font_class": "daochuexcel",
+      "unicode": "e714",
+      "unicode_decimal": 59156
+    },
+    {
+      "icon_id": "11408691",
+      "name": "清单管理",
+      "font_class": "qingdanguanli",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "5330293",
+      "name": "上传",
+      "font_class": "shangchuan1",
+      "unicode": "e775",
+      "unicode_decimal": 59253
+    },
+    {
+      "icon_id": "6529905",
+      "name": "空",
+      "font_class": "kong",
+      "unicode": "e709",
+      "unicode_decimal": 59145
+    },
+    {
+      "icon_id": "1166327",
+      "name": "批量框选",
+      "font_class": "shuxingxuanze",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "1212286",
+      "name": "设置",
+      "font_class": "shezhi",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "5330405",
+      "name": "鼠标指针",
+      "font_class": "shubiaozhizhen",
+      "unicode": "e781",
+      "unicode_decimal": 59265
+    },
+    {
+      "icon_id": "5729578",
+      "name": "自动",
+      "font_class": "zidong",
+      "unicode": "e7ee",
+      "unicode_decimal": 59374
+    },
+    {
+      "icon_id": "7127384",
+      "name": "加载",
+      "font_class": "jiazai",
+      "unicode": "e634",
+      "unicode_decimal": 58932
+    },
+    {
+      "icon_id": "9974429",
+      "name": "省略号",
+      "font_class": "shenglvehao",
+      "unicode": "e708",
+      "unicode_decimal": 59144
+    },
+    {
+      "icon_id": "113537",
+      "name": "叹号",
+      "font_class": "warn",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "167188",
+      "name": "上传",
+      "font_class": "shangchuan",
+      "unicode": "e664",
+      "unicode_decimal": 58980
+    },
+    {
+      "icon_id": "392180",
+      "name": "方向",
+      "font_class": "23",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "430025",
+      "name": "添加",
+      "font_class": "new",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "554484",
+      "name": "数据",
+      "font_class": "iconset0450",
+      "unicode": "e749",
+      "unicode_decimal": 59209
+    },
+    {
+      "icon_id": "688101",
+      "name": "视频 播放 影片 2",
+      "font_class": "shipinbofangyingpian2",
+      "unicode": "e78e",
+      "unicode_decimal": 59278
+    },
+    {
+      "icon_id": "949686",
+      "name": "全景-互动",
+      "font_class": "quanjing-m",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    },
+    {
+      "icon_id": "976543",
+      "name": "编辑",
+      "font_class": "bianji",
+      "unicode": "e640",
+      "unicode_decimal": 58944
+    },
+    {
+      "icon_id": "2674482",
+      "name": "说明",
+      "font_class": "shuoming",
+      "unicode": "e632",
+      "unicode_decimal": 58930
+    },
+    {
+      "icon_id": "5203315",
+      "name": "方向-右",
+      "font_class": "you",
+      "unicode": "e63b",
+      "unicode_decimal": 58939
+    },
+    {
+      "icon_id": "6265221",
+      "name": "文件",
+      "font_class": "doc-line",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
+    },
+    {
+      "icon_id": "9626836",
+      "name": "播放",
+      "font_class": "bofang",
+      "unicode": "e866",
+      "unicode_decimal": 59494
+    },
+    {
+      "icon_id": "10810190",
+      "name": "待办  等待 审核",
+      "font_class": "changyongtubiao-xianxingdaochu-zhuanqu-",
+      "unicode": "e776",
+      "unicode_decimal": 59254
+    },
+    {
+      "icon_id": "10866837",
+      "name": "计算机 算数",
+      "font_class": "changyongtubiao-mianxing-",
+      "unicode": "e79b",
+      "unicode_decimal": 59291
+    },
+    {
+      "icon_id": "10883859",
+      "name": "Anti-cancel",
+      "font_class": "Anti-cancel",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "10883806",
+      "name": "download",
+      "font_class": "download1",
+      "unicode": "e62e",
+      "unicode_decimal": 58926
+    },
+    {
+      "icon_id": "10883802",
+      "name": "zoom",
+      "font_class": "zoom",
+      "unicode": "e62d",
+      "unicode_decimal": 58925
+    },
+    {
+      "icon_id": "10883773",
+      "name": "narrow",
+      "font_class": "narrow",
+      "unicode": "e62c",
+      "unicode_decimal": 58924
+    },
+    {
+      "icon_id": "10883763",
+      "name": "Cancel",
+      "font_class": "Cancel",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "10883754",
+      "name": "Erase",
+      "font_class": "Erase",
+      "unicode": "e62a",
+      "unicode_decimal": 58922
+    },
+    {
+      "icon_id": "10883664",
+      "name": "edit",
+      "font_class": "edit1",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "10883653",
+      "name": "maximize",
+      "font_class": "maximize",
+      "unicode": "e626",
+      "unicode_decimal": 58918
+    },
+    {
+      "icon_id": "10883630",
+      "name": "move",
+      "font_class": "move",
+      "unicode": "e625",
+      "unicode_decimal": 58917
+    },
+    {
+      "icon_id": "8475421",
+      "name": "立即确认20x20",
+      "font_class": "lijiqueren",
+      "unicode": "e762",
+      "unicode_decimal": 59234
+    },
+    {
+      "icon_id": "10461393",
+      "name": "ico",
+      "font_class": "ico",
+      "unicode": "e624",
+      "unicode_decimal": 58916
+    },
+    {
+      "icon_id": "11007160",
+      "name": "详情-2",
+      "font_class": "xiangqing-copy",
+      "unicode": "e763",
+      "unicode_decimal": 59235
+    },
+    {
+      "icon_id": "8802632",
+      "name": "详情-2",
+      "font_class": "xiangqing",
+      "unicode": "e649",
+      "unicode_decimal": 58953
+    },
+    {
+      "icon_id": "1112",
+      "name": "警告",
+      "font_class": "jinggao",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "7291772",
+      "name": "定位",
+      "font_class": "dingwei",
+      "unicode": "e629",
+      "unicode_decimal": 58921
+    },
+    {
+      "icon_id": "10143964",
+      "name": "禹数_英文",
+      "font_class": "yushu_yingwen",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "36770",
+      "name": "楼梯(上)",
+      "font_class": "shanglou",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "400292",
+      "name": "筛选",
+      "font_class": "htmal5icon30",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "826065",
+      "name": "app4",
+      "font_class": "app4",
+      "unicode": "e6f4",
+      "unicode_decimal": 59124
+    },
+    {
+      "icon_id": "1119123",
+      "name": "系统",
+      "font_class": "xitong",
+      "unicode": "e61f",
+      "unicode_decimal": 58911
+    },
+    {
+      "icon_id": "2486592",
+      "name": "角色管理",
+      "font_class": "jiaoseguanli",
+      "unicode": "e621",
+      "unicode_decimal": 58913
+    },
+    {
+      "icon_id": "3336992",
+      "name": "关系",
+      "font_class": "jiqixuexi-",
+      "unicode": "e754",
+      "unicode_decimal": 59220
+    },
+    {
+      "icon_id": "4423857",
+      "name": "台账账簿设置",
+      "font_class": "taizhangzhangbushezhi",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "5064098",
+      "name": "信息",
+      "font_class": "xinxi",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "5092841",
+      "name": "项目",
+      "font_class": "project-o",
+      "unicode": "e628",
+      "unicode_decimal": 58920
+    },
+    {
+      "icon_id": "5093336",
+      "name": "建筑",
+      "font_class": "jianzhu",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "5325625",
+      "name": "关系",
+      "font_class": "guanxi",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "6729600",
+      "name": "课程授权",
+      "font_class": "kechengshouquan",
+      "unicode": "e622",
+      "unicode_decimal": 58914
+    },
+    {
+      "icon_id": "7450628",
+      "name": "人员管理",
+      "font_class": "renyuanguanli",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "10033410",
+      "name": "模型",
+      "font_class": "moxing___",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    },
+    {
+      "icon_id": "1010769",
+      "name": "实体行为",
+      "font_class": "shitixingwei",
+      "unicode": "e620",
+      "unicode_decimal": 58912
+    },
+    {
+      "icon_id": "1011014",
+      "name": "数据库实例",
+      "font_class": "shujukushili",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "1011261",
+      "name": "同步数据库模型",
+      "font_class": "tongbushujukumoxing",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "2045204",
+      "name": "enter",
+      "font_class": "right",
+      "unicode": "e6f8",
+      "unicode_decimal": 59128
+    },
+    {
+      "icon_id": "2045309",
+      "name": "return",
+      "font_class": "left",
+      "unicode": "e720",
+      "unicode_decimal": 59168
+    },
+    {
+      "icon_id": "12508757",
+      "name": "return",
+      "font_class": "bottom",
+      "unicode": "e869",
+      "unicode_decimal": 59497
+    },
+    {
+      "icon_id": "12508371",
+      "name": "return",
+      "font_class": "top",
+      "unicode": "e867",
+      "unicode_decimal": 59495
+    },
+    {
+      "icon_id": "10066078",
+      "name": "编辑2",
+      "font_class": "edit-2",
+      "unicode": "e61e",
+      "unicode_decimal": 58910
+    },
+    {
+      "icon_id": "10066001",
+      "name": "无图片",
+      "font_class": "nopicture",
+      "unicode": "e61d",
+      "unicode_decimal": 58909
+    },
+    {
+      "icon_id": "10065960",
+      "name": "叉",
+      "font_class": "cross",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    },
+    {
+      "icon_id": "10065949",
+      "name": "勾",
+      "font_class": "hook",
+      "unicode": "e61b",
+      "unicode_decimal": 58907
+    },
+    {
+      "icon_id": "10065823",
+      "name": "标记",
+      "font_class": "mark",
+      "unicode": "e619",
+      "unicode_decimal": 58905
+    },
+    {
+      "icon_id": "10065547",
+      "name": "定位",
+      "font_class": "positioning",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "10065507",
+      "name": "关联",
+      "font_class": "association",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "10064913",
+      "name": "批量关联",
+      "font_class": "batchassociation",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "10064625",
+      "name": "搜索",
+      "font_class": "search",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "10064600",
+      "name": "更新配置",
+      "font_class": "Update",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "10064555",
+      "name": "下载",
+      "font_class": "download",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "10064528",
+      "name": "日志",
+      "font_class": "Log",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "10064509",
+      "name": "替换模型",
+      "font_class": "replace",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "10064458",
+      "name": "终止任务",
+      "font_class": "termination",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "10064441",
+      "name": "文件夹",
+      "font_class": "folder",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "10064137",
+      "name": "添加-控件",
+      "font_class": "add-control",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "10064030",
+      "name": "删除-控件",
+      "font_class": "delete-control",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "10063984",
+      "name": "窗口关闭",
+      "font_class": "windowclosed",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "10063792",
+      "name": "返回",
+      "font_class": "return",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "10063358",
+      "name": "前往",
+      "font_class": "open",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "10063221",
+      "name": "减",
+      "font_class": "less",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "10063177",
+      "name": "加",
+      "font_class": "plus",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "10063141",
+      "name": "编辑",
+      "font_class": "edit",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "10063019",
+      "name": "图片",
+      "font_class": "floorplan",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "10062926",
+      "name": "删除",
+      "font_class": "delete",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "3978394",
+      "name": "关闭",
+      "font_class": "guanbi",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "8557519",
+      "name": "无数据",
+      "font_class": "wushuju",
+      "unicode": "e61a",
+      "unicode_decimal": 58906
+    }
+  ]
+}

BIN
src/assets/style/iconfont/iconfont.ttf


BIN
src/assets/style/iconfont/iconfont.woff


BIN
src/assets/style/iconfont/iconfont.woff2


+ 0 - 0
src/assets/style/style.scss


Някои файлове не бяха показани, защото твърде много файлове са промени