├── .babelrc ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── dist ├── favicon.ico ├── index.html └── static │ ├── css │ ├── app.1d365fa20d80077303afd74b3d5ba528.css │ ├── app.1d365fa20d80077303afd74b3d5ba528.css.map │ └── reset.css │ ├── fonts │ ├── element-icons.535877f.woff │ ├── element-icons.732389d.ttf │ ├── fontawesome-webfont.674f50d.eot │ ├── fontawesome-webfont.af7ae50.woff2 │ ├── fontawesome-webfont.b06871f.ttf │ └── fontawesome-webfont.fee66e7.woff │ ├── img │ ├── fontawesome-webfont.912ec66.svg │ └── icons.2704f3c.png │ └── js │ ├── app.d963b6f8b5c668253b76.js │ ├── app.d963b6f8b5c668253b76.js.map │ ├── manifest.c33f93f8098cff3fbb0d.js │ ├── manifest.c33f93f8098cff3fbb0d.js.map │ ├── vendor.4b8eb37f85a468e06321.js │ └── vendor.4b8eb37f85a468e06321.js.map ├── favicon.ico ├── index.html ├── package.json ├── src ├── App.vue ├── assets │ ├── logo.png │ └── topo │ │ ├── application.png │ │ ├── canvas_bg.jpg │ │ ├── cloud.png │ │ ├── compute.png │ │ ├── container.png │ │ ├── database.png │ │ ├── dbms.png │ │ ├── filesystem.png │ │ ├── icons.png │ │ ├── message.png │ │ ├── network.png │ │ ├── port.png │ │ ├── pull.svg │ │ ├── push.svg │ │ ├── root.png │ │ ├── router.png │ │ ├── sercurity.png │ │ ├── storage.png │ │ ├── subnet.png │ │ ├── virtualip.png │ │ ├── volume.png │ │ └── webserver.png ├── components │ ├── vFooter.vue │ ├── vHeader.vue │ └── vTopo │ │ ├── components │ │ ├── vShapebar.vue │ │ └── vTopoAttrPanel.vue │ │ └── vTopo.vue ├── config │ └── connectorRules.js ├── data │ ├── toolbarNodeData.js │ ├── topoData1.js │ ├── topoData2.js │ └── topoJson.js ├── less │ ├── index.css │ └── index.less ├── main.js ├── nlComponentLib │ ├── components │ │ ├── nlButton.vue │ │ └── nlPageTitle.vue │ └── index.js └── router │ └── index.js ├── static ├── .gitkeep └── css │ └── reset.css └── topoJson.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false 5 | }], 6 | "stage-2" 7 | ], 8 | "plugins": ["transform-runtime"] 9 | } 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Editor directories and files 8 | .idea 9 | .vscode 10 | *.suo 11 | *.ntvs* 12 | *.njsproj 13 | *.sln 14 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | // to edit target browsers: use "browserslist" field in package.json 6 | "postcss-import": {}, 7 | "autoprefixer": {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 996.icu 2 | # vue2.0拓扑组件 3 | ## demo演示地址 4 | https://mirror198829.github.io/vue-topo/dist/index.html 5 | ## 序 6 | 2016年9月接到html5替换flash的拓扑图任务,历时3月整,使用jquery+SVG技术完成第一款拓扑图组件,涵盖拖拽、缩放、删除、选中区域、连线、导入、保存图片、多种布局显示等功能,但当node数高达百位时,因dom的操作,出现了非常可怕的性能问题。
7 | 2017年10月20日,因新公司项目需要,果断决定结合当下流行的VUE2.0框架 + SVG技术 重写拓扑组件,并将此开源,希望大家多提意见 8 | ## 技术选型 9 | * VUE2.0 10 | * SVG 11 | * Element-UI 12 | ## 功能分析及技术点 13 | | 功能 | 技术点 | 14 | |-------------|-----| 15 | |toolbar拖拽|记录鼠标位置;
拖拽物体的显示隐藏;| 16 | |连接关系:创建连线|绘制时:使用svg的 ``,需正确获取起始和终止点;
结束绘制:使用``路径绘制连线形态,根据两者节点位置不同,共计4种连线形态展示;| 17 | |包含关系:单层嵌套|依据最终的位置判断是否为包含关系(这里的算法有待优化);
重新计算父节点宽高: 父结点宽高为子节点宽高+边距
重新计算子节点的位置信息:父节点位置信息 - 边距| 18 | |包含关系:多层嵌套|通过递归的方式完成嵌套布局| 19 | |包含关系:并列嵌套|父节点宽高:内部子节点宽度之和 + 边距,父节点高度:最高子节点高度 + 边距;
每个子节点位置:当前节点位置 = 前一个节点位置 + 前一个节点宽度 + 间隔边距| 20 | |删除:单结点|删除节点同时删除关联连线(source&target| 21 | |删除:包含关系|删除包含关系同时恢复父节点的宽高同时刷新并列节点位置| 22 | |删除:连线|刷新原本有连线的连接点样式| 23 | |删除:多节点|使用for循环,注意i--| 24 | |框选|使用``,根据鼠标移动位移的正负数,选择不同的x和y值| 25 | |svg的viewbox的移动功能 |记录鼠标移动的位移,修改viewbox的视图位置| 26 | 27 | ## Usage 28 | #### NPM 29 | ``` 30 | npm i vue-topo -save 31 | ``` 32 | ``` 33 | import vTopo from 'vue-topo' 34 | import 'vue-topo/dist/vue-topo.min.css' 35 | Vue.use(vTopo) 36 | ``` 37 | #### github源码使用 38 | ``` 39 | npm install 40 | ``` 41 | ``` 42 | npm run dev //启动服务 43 | ``` 44 | #### 引入组件 45 | ``` 46 | // xxx.vue 47 | 50 | 51 | ``` 52 | #### Attributes 53 | | 参数 | 说明 | 类型 | 可选值 | 默认值 | 必填 | 54 | | --- | --- | --- | --- | --- | --- | 55 | | editable | 是否可编辑 | boolean | true/false | true | — | 56 | | topo-data | topo初始值 | object | — | {nodes:[],connectors:[]} | 是 | 57 | ## 说明 58 | 代码开源,欢迎码农们提出宝贵意见,bug请提issues,本人将及时修改。最后著作权归一步工程师,请大家注明代码来源:https://github.com/Mirror198829/vue-topo 59 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, function (err, stats) { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | function exec (cmd) { 7 | return require('child_process').execSync(cmd).toString().trim() 8 | } 9 | 10 | const versionRequirements = [ 11 | { 12 | name: 'node', 13 | currentVersion: semver.clean(process.version), 14 | versionRequirement: packageConfig.engines.node 15 | } 16 | ] 17 | 18 | if (shell.which('npm')) { 19 | versionRequirements.push({ 20 | name: 'npm', 21 | currentVersion: exec('npm --version'), 22 | versionRequirement: packageConfig.engines.npm 23 | }) 24 | } 25 | 26 | module.exports = function () { 27 | const warnings = [] 28 | for (let i = 0; i < versionRequirements.length; i++) { 29 | const mod = versionRequirements[i] 30 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 31 | warnings.push(mod.name + ': ' + 32 | chalk.red(mod.currentVersion) + ' should be ' + 33 | chalk.green(mod.versionRequirement) 34 | ) 35 | } 36 | } 37 | 38 | if (warnings.length) { 39 | console.log('') 40 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 41 | console.log() 42 | for (let i = 0; i < warnings.length; i++) { 43 | const warning = warnings[i] 44 | console.log(' ' + warning) 45 | } 46 | console.log() 47 | process.exit(1) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const pkg = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | return path.posix.join(assetsSubDirectory, _path) 12 | } 13 | 14 | exports.cssLoaders = function (options) { 15 | options = options || {} 16 | 17 | const cssLoader = { 18 | loader: 'css-loader', 19 | options: { 20 | sourceMap: options.sourceMap 21 | } 22 | } 23 | 24 | var postcssLoader = { 25 | loader: 'postcss-loader', 26 | options: { 27 | sourceMap: options.sourceMap 28 | } 29 | } 30 | 31 | // generate loader string to be used with extract text plugin 32 | function generateLoaders (loader, loaderOptions) { 33 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 34 | if (loader) { 35 | loaders.push({ 36 | loader: loader + '-loader', 37 | options: Object.assign({}, loaderOptions, { 38 | sourceMap: options.sourceMap 39 | }) 40 | }) 41 | } 42 | 43 | // Extract CSS when that option is specified 44 | // (which is the case during production build) 45 | if (options.extract) { 46 | return ExtractTextPlugin.extract({ 47 | use: loaders, 48 | fallback: 'vue-style-loader' 49 | }) 50 | } else { 51 | return ['vue-style-loader'].concat(loaders) 52 | } 53 | } 54 | 55 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 56 | return { 57 | css: generateLoaders(), 58 | postcss: generateLoaders(), 59 | less: generateLoaders('less').concat({ 60 | loader: 'sass-resources-loader', 61 | options: { 62 | resources: path.resolve(__dirname, '../src/less/index.less') 63 | } 64 | }), 65 | sass: generateLoaders('sass', { indentedSyntax: true }), 66 | scss: generateLoaders('sass'), 67 | stylus: generateLoaders('stylus'), 68 | styl: generateLoaders('stylus') 69 | } 70 | } 71 | 72 | // Generate loaders for standalone style files (outside of .vue) 73 | exports.styleLoaders = function (options) { 74 | const output = [] 75 | const loaders = exports.cssLoaders(options) 76 | for (const extension in loaders) { 77 | const loader = loaders[extension] 78 | output.push({ 79 | test: new RegExp('\\.' + extension + '$'), 80 | use: loader 81 | }) 82 | } 83 | return output 84 | } 85 | 86 | exports.createNotifierCallback = function () { 87 | const notifier = require('node-notifier') 88 | 89 | return (severity, errors) => { 90 | if (severity !== 'error') { 91 | return 92 | } 93 | const error = errors[0] 94 | 95 | const filename = error.file && error.file.split('!').pop() 96 | notifier.notify({ 97 | title: pkg.name, 98 | message: severity + ': ' + error.name, 99 | subtitle: filename || '', 100 | icon: path.join(__dirname, 'logo.png') 101 | }) 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | 10 | module.exports = { 11 | loaders: utils.cssLoaders({ 12 | sourceMap: sourceMapEnabled, 13 | extract: isProduction 14 | }), 15 | cssSourceMap: sourceMapEnabled, 16 | cacheBusting: config.dev.cacheBusting, 17 | transformToRequire: { 18 | video: 'src', 19 | source: 'src', 20 | img: 'src', 21 | image: 'xlink:href' 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | const webpack = require("webpack") 7 | 8 | function resolve (dir) { 9 | return path.join(__dirname, '..', dir) 10 | } 11 | 12 | module.exports = { 13 | context: path.resolve(__dirname, '../'), 14 | entry: { 15 | app: './src/main.js' 16 | }, 17 | output: { 18 | path: config.build.assetsRoot, 19 | filename: '[name].js', 20 | publicPath: process.env.NODE_ENV === 'production' 21 | ? config.build.assetsPublicPath 22 | : config.dev.assetsPublicPath 23 | }, 24 | resolve: { 25 | extensions: ['.js', '.vue', '.json'], 26 | alias: { 27 | 'vue$': 'vue/dist/vue.esm.js', 28 | '@': resolve('src'), 29 | } 30 | }, 31 | plugins: [ 32 | new webpack.ProvidePlugin({ 33 | jQuery: "jquery", 34 | $: "jquery" 35 | }) 36 | ], 37 | module: { 38 | rules: [ 39 | { 40 | test: /\.vue$/, 41 | loader: 'vue-loader', 42 | options: vueLoaderConfig 43 | }, 44 | { 45 | test: /\.js$/, 46 | loader: 'babel-loader', 47 | include: [resolve('src'), resolve('test')] 48 | }, 49 | { 50 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 51 | loader: 'url-loader', 52 | options: { 53 | limit: 10000, 54 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 55 | } 56 | }, 57 | { 58 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 59 | loader: 'url-loader', 60 | options: { 61 | limit: 10000, 62 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 63 | } 64 | }, 65 | { 66 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 67 | loader: 'url-loader', 68 | options: { 69 | limit: 10000, 70 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 71 | } 72 | } 73 | ] 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const baseWebpackConfig = require('./webpack.base.conf') 7 | const HtmlWebpackPlugin = require('html-webpack-plugin') 8 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 9 | const portfinder = require('portfinder') 10 | 11 | const devWebpackConfig = merge(baseWebpackConfig, { 12 | module: { 13 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 14 | }, 15 | // cheap-module-eval-source-map is faster for development 16 | devtool: config.dev.devtool, 17 | 18 | // these devServer options should be customized in /config/index.js 19 | devServer: { 20 | clientLogLevel: 'warning', 21 | historyApiFallback: true, 22 | hot: true, 23 | compress: true, 24 | host: process.env.HOST || config.dev.host, 25 | port: process.env.PORT || config.dev.port, 26 | open: config.dev.autoOpenBrowser, 27 | overlay: config.dev.errorOverlay ? { 28 | warnings: false, 29 | errors: true, 30 | } : false, 31 | publicPath: config.dev.assetsPublicPath, 32 | proxy: config.dev.proxyTable, 33 | quiet: true, // necessary for FriendlyErrorsPlugin 34 | watchOptions: { 35 | poll: config.dev.poll, 36 | } 37 | }, 38 | plugins: [ 39 | new webpack.DefinePlugin({ 40 | 'process.env': require('../config/dev.env') 41 | }), 42 | new webpack.HotModuleReplacementPlugin(), 43 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 44 | new webpack.NoEmitOnErrorsPlugin(), 45 | // https://github.com/ampedandwired/html-webpack-plugin 46 | new HtmlWebpackPlugin({ 47 | filename: 'index.html', 48 | template: 'index.html', 49 | inject: true 50 | }), 51 | ] 52 | }) 53 | 54 | module.exports = new Promise((resolve, reject) => { 55 | portfinder.basePort = process.env.PORT || config.dev.port 56 | portfinder.getPort((err, port) => { 57 | if (err) { 58 | reject(err) 59 | } else { 60 | // publish the new Port, necessary for e2e tests 61 | process.env.PORT = port 62 | // add port to devServer config 63 | devWebpackConfig.devServer.port = port 64 | 65 | // Add FriendlyErrorsPlugin 66 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 67 | compilationSuccessInfo: { 68 | messages: [`Your application is running here: http://${config.dev.host}:${port}`], 69 | }, 70 | onErrors: config.dev.notifyOnErrors 71 | ? utils.createNotifierCallback() 72 | : undefined 73 | })) 74 | 75 | resolve(devWebpackConfig) 76 | } 77 | }) 78 | }) 79 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | 13 | const env = require('../config/prod.env') 14 | 15 | const webpackConfig = merge(baseWebpackConfig, { 16 | module: { 17 | rules: utils.styleLoaders({ 18 | sourceMap: config.build.productionSourceMap, 19 | extract: true, 20 | usePostCSS: true 21 | }) 22 | }, 23 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 24 | output: { 25 | path: config.build.assetsRoot, 26 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 27 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 28 | }, 29 | plugins: [ 30 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 31 | new webpack.DefinePlugin({ 32 | 'process.env': env 33 | }), 34 | // UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify 35 | new webpack.optimize.UglifyJsPlugin({ 36 | compress: { 37 | warnings: false 38 | }, 39 | sourceMap: config.build.productionSourceMap, 40 | parallel: true 41 | }), 42 | // extract css into its own file 43 | new ExtractTextPlugin({ 44 | filename: utils.assetsPath('css/[name].[contenthash].css'), 45 | // set the following option to `true` if you want to extract CSS from 46 | // codesplit chunks into this main css file as well. 47 | // This will result in *all* of your app's CSS being loaded upfront. 48 | allChunks: false, 49 | }), 50 | // Compress extracted CSS. We are using this plugin so that possible 51 | // duplicated CSS from different components can be deduped. 52 | new OptimizeCSSPlugin({ 53 | cssProcessorOptions: config.build.productionSourceMap 54 | ? { safe: true, map: { inline: false } } 55 | : { safe: true } 56 | }), 57 | // generate dist index.html with correct asset hash for caching. 58 | // you can customize output by editing /index.html 59 | // see https://github.com/ampedandwired/html-webpack-plugin 60 | new HtmlWebpackPlugin({ 61 | filename: config.build.index, 62 | template: 'index.html', 63 | favicon: 'favicon.ico', 64 | inject: true, 65 | minify: { 66 | removeComments: true, 67 | collapseWhitespace: true, 68 | removeAttributeQuotes: true 69 | // more options: 70 | // https://github.com/kangax/html-minifier#options-quick-reference 71 | }, 72 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 73 | chunksSortMode: 'dependency' 74 | }), 75 | // keep module.id stable when vender modules does not change 76 | new webpack.HashedModuleIdsPlugin(), 77 | // enable scope hoisting 78 | new webpack.optimize.ModuleConcatenationPlugin(), 79 | // split vendor js into its own file 80 | new webpack.optimize.CommonsChunkPlugin({ 81 | name: 'vendor', 82 | minChunks: function (module) { 83 | // any required modules inside node_modules are extracted to vendor 84 | return ( 85 | module.resource && 86 | /\.js$/.test(module.resource) && 87 | module.resource.indexOf( 88 | path.join(__dirname, '../node_modules') 89 | ) === 0 90 | ) 91 | } 92 | }), 93 | // extract webpack runtime and module manifest to its own file in order to 94 | // prevent vendor hash from being updated whenever app bundle is updated 95 | new webpack.optimize.CommonsChunkPlugin({ 96 | name: 'manifest', 97 | minChunks: Infinity 98 | }), 99 | // This instance extracts shared chunks from code splitted chunks and bundles them 100 | // in a separate chunk, similar to the vendor chunk 101 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 102 | new webpack.optimize.CommonsChunkPlugin({ 103 | name: 'app', 104 | async: 'vendor-async', 105 | children: true, 106 | minChunks: 3 107 | }), 108 | 109 | // copy custom static assets 110 | new CopyWebpackPlugin([ 111 | { 112 | from: path.resolve(__dirname, '../static'), 113 | to: config.build.assetsSubDirectory, 114 | ignore: ['.*'] 115 | } 116 | ]) 117 | ] 118 | }) 119 | 120 | if (config.build.productionGzip) { 121 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 122 | 123 | webpackConfig.plugins.push( 124 | new CompressionWebpackPlugin({ 125 | asset: '[path].gz[query]', 126 | algorithm: 'gzip', 127 | test: new RegExp( 128 | '\\.(' + 129 | config.build.productionGzipExtensions.join('|') + 130 | ')$' 131 | ), 132 | threshold: 10240, 133 | minRatio: 0.8 134 | }) 135 | ) 136 | } 137 | 138 | if (config.build.bundleAnalyzerReport) { 139 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 140 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 141 | } 142 | 143 | module.exports = webpackConfig 144 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.2.4 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8086, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: true, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | // Use Eslint Loader? 24 | // If true, your code will be linted during bundling and 25 | // linting errors and warnings will be shown in the console. 26 | useEslint: true, 27 | // If true, eslint errors and warnings will also be shown in the error overlay 28 | // in the browser. 29 | showEslintErrorsInOverlay: false, 30 | 31 | /** 32 | * Source Maps 33 | */ 34 | 35 | // https://webpack.js.org/configuration/devtool/#development 36 | devtool: 'eval-source-map', 37 | 38 | // If you have problems debugging vue-files in devtools, 39 | // set this to false - it *may* help 40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 41 | cacheBusting: true, 42 | 43 | // CSS Sourcemaps off by default because relative paths are "buggy" 44 | // with this option, according to the CSS-Loader README 45 | // (https://github.com/webpack/css-loader#sourcemaps) 46 | // In our experience, they generally work as expected, 47 | // just be aware of this issue when enabling this option. 48 | cssSourceMap: false, 49 | }, 50 | 51 | build: { 52 | // Template for index.html 53 | index: path.resolve(__dirname, '../dist/index.html'), 54 | 55 | // Paths 56 | assetsRoot: path.resolve(__dirname, '../dist'), 57 | assetsSubDirectory: 'static', 58 | assetsPublicPath: '/vue-topo/dist/', 59 | //assetsPublicPath: '/', 60 | 61 | /** 62 | * Source Maps 63 | */ 64 | 65 | productionSourceMap: true, 66 | // https://webpack.js.org/configuration/devtool/#production 67 | devtool: '#source-map', 68 | 69 | // Gzip off by default as many popular static hosts such as 70 | // Surge or Netlify already gzip all static assets for you. 71 | // Before setting to `true`, make sure to: 72 | // npm install --save-dev compression-webpack-plugin 73 | productionGzip: false, 74 | productionGzipExtensions: ['js', 'css'], 75 | 76 | // Run the build command with an extra argument to 77 | // View the bundle analyzer report after build finishes: 78 | // `npm run build --report` 79 | // Set to `true` or `false` to always turn it on or off 80 | bundleAnalyzerReport: process.env.npm_config_report 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/favicon.ico -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | vueTopo
-------------------------------------------------------------------------------- /dist/static/css/reset.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | width: 100%; 5 | } 6 | 7 | body { 8 | font-family: arial, helvetica, sans-serif; 9 | font-size: 13px; 10 | font-size-adjust: none; 11 | font-stretch: normal; 12 | font-style: normal; 13 | font-variant: normal; 14 | font-weight: normal; 15 | line-height: 1.4; 16 | text-align: center; 17 | } 18 | 19 | body, 20 | ul, 21 | ol, 22 | dl, 23 | dd, 24 | h1, 25 | h2, 26 | h3, 27 | h4, 28 | h5, 29 | h6, 30 | p, 31 | form, 32 | fieldset, 33 | legend, 34 | input, 35 | textarea, 36 | select, 37 | button, 38 | th, 39 | td { 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | h1, 45 | h2, 46 | h3, 47 | h4, 48 | h5, 49 | h6 { 50 | font-size: 100%; 51 | font-weight: normal; 52 | } 53 | 54 | table { 55 | font-size: inherit; 56 | } 57 | 58 | input, 59 | select { 60 | font-family: arial, helvetica, clean, sans-serif; 61 | font-size: 100%; 62 | font-size-adjust: none; 63 | font-stretch: normal; 64 | font-style: normal; 65 | font-variant: normal; 66 | font-weight: normal; 67 | line-height: normal; 68 | } 69 | 70 | button { 71 | overflow: visible; 72 | } 73 | 74 | th, 75 | em, 76 | strong, 77 | b, 78 | address, 79 | cite { 80 | font-style: normal; 81 | font-weight: normal; 82 | } 83 | 84 | li { 85 | list-style-image: none; 86 | list-style-position: outside; 87 | list-style-type: none; 88 | } 89 | 90 | img, 91 | fieldset { 92 | border: 0 none; 93 | } 94 | 95 | ins { 96 | text-decoration: none; 97 | } 98 | 99 | .clearfix { 100 | zoom: 1; 101 | } 102 | 103 | .clearfix:after { 104 | content: ''; 105 | display: block; 106 | clear: both; 107 | } 108 | -------------------------------------------------------------------------------- /dist/static/fonts/element-icons.535877f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/element-icons.535877f.woff -------------------------------------------------------------------------------- /dist/static/fonts/element-icons.732389d.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/element-icons.732389d.ttf -------------------------------------------------------------------------------- /dist/static/fonts/fontawesome-webfont.674f50d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/fontawesome-webfont.674f50d.eot -------------------------------------------------------------------------------- /dist/static/fonts/fontawesome-webfont.af7ae50.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/fontawesome-webfont.af7ae50.woff2 -------------------------------------------------------------------------------- /dist/static/fonts/fontawesome-webfont.b06871f.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/fontawesome-webfont.b06871f.ttf -------------------------------------------------------------------------------- /dist/static/fonts/fontawesome-webfont.fee66e7.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/fonts/fontawesome-webfont.fee66e7.woff -------------------------------------------------------------------------------- /dist/static/img/icons.2704f3c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/dist/static/img/icons.2704f3c.png -------------------------------------------------------------------------------- /dist/static/js/manifest.c33f93f8098cff3fbb0d.js: -------------------------------------------------------------------------------- 1 | !function(r){function n(o){if(t[o])return t[o].exports;var e=t[o]={i:o,l:!1,exports:{}};return r[o].call(e.exports,e,e.exports,n),e.l=!0,e.exports}var o=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var f,i,p,a=0,l=[];a 2 | 3 | 4 | 5 | vueTopo 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-topo", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "'Mirror198829' <'412366756@qq.com'>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js" 11 | }, 12 | "dependencies": { 13 | "vue": "^2.5.2", 14 | "vue-router": "^3.0.1" 15 | }, 16 | "devDependencies": { 17 | "autoprefixer": "^7.1.2", 18 | "babel-core": "^6.22.1", 19 | "babel-loader": "^7.1.1", 20 | "babel-plugin-transform-runtime": "^6.22.0", 21 | "babel-preset-env": "^1.3.2", 22 | "babel-preset-stage-2": "^6.22.0", 23 | "babel-register": "^6.22.0", 24 | "chalk": "^2.0.1", 25 | "copy-webpack-plugin": "^4.0.1", 26 | "css-loader": "^0.28.0", 27 | "element-ui": "^2.0.5", 28 | "eventsource-polyfill": "^0.9.6", 29 | "extract-text-webpack-plugin": "^3.0.0", 30 | "file-loader": "^1.1.4", 31 | "font-awesome": "^4.7.0", 32 | "friendly-errors-webpack-plugin": "^1.6.1", 33 | "html-webpack-plugin": "^2.30.1", 34 | "jquery": "^3.2.1", 35 | "less": "^2.7.3", 36 | "less-loader": "^4.0.5", 37 | "node-notifier": "^5.1.2", 38 | "optimize-css-assets-webpack-plugin": "^3.2.0", 39 | "ora": "^1.2.0", 40 | "portfinder": "^1.0.13", 41 | "postcss-import": "^11.0.0", 42 | "postcss-loader": "^2.0.8", 43 | "rimraf": "^2.6.0", 44 | "sass-resources-loader": "^2.0.0", 45 | "save-svg-as-png": "^1.2.0", 46 | "semver": "^5.3.0", 47 | "shelljs": "^0.7.6", 48 | "url-loader": "^0.5.8", 49 | "vue-loader": "^13.3.0", 50 | "vue-style-loader": "^3.0.1", 51 | "vue-template-compiler": "^2.5.2", 52 | "webpack": "^3.6.0", 53 | "webpack-bundle-analyzer": "^3.9.0", 54 | "webpack-dev-server": "^2.9.1", 55 | "webpack-merge": "^4.1.0" 56 | }, 57 | "engines": { 58 | "node": ">= 4.0.0", 59 | "npm": ">= 3.0.0" 60 | }, 61 | "browserslist": [ 62 | "> 1%", 63 | "last 2 versions", 64 | "not ie <= 8" 65 | ] 66 | } 67 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 25 | 26 | 76 | 77 | 82 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/topo/application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/application.png -------------------------------------------------------------------------------- /src/assets/topo/canvas_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/canvas_bg.jpg -------------------------------------------------------------------------------- /src/assets/topo/cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/cloud.png -------------------------------------------------------------------------------- /src/assets/topo/compute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/compute.png -------------------------------------------------------------------------------- /src/assets/topo/container.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/container.png -------------------------------------------------------------------------------- /src/assets/topo/database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/database.png -------------------------------------------------------------------------------- /src/assets/topo/dbms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/dbms.png -------------------------------------------------------------------------------- /src/assets/topo/filesystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/filesystem.png -------------------------------------------------------------------------------- /src/assets/topo/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/icons.png -------------------------------------------------------------------------------- /src/assets/topo/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/message.png -------------------------------------------------------------------------------- /src/assets/topo/network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/network.png -------------------------------------------------------------------------------- /src/assets/topo/port.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/port.png -------------------------------------------------------------------------------- /src/assets/topo/pull.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 9 Copy 2 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/assets/topo/push.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Group 9 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/assets/topo/root.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/root.png -------------------------------------------------------------------------------- /src/assets/topo/router.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/router.png -------------------------------------------------------------------------------- /src/assets/topo/sercurity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/sercurity.png -------------------------------------------------------------------------------- /src/assets/topo/storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/storage.png -------------------------------------------------------------------------------- /src/assets/topo/subnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/subnet.png -------------------------------------------------------------------------------- /src/assets/topo/virtualip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/virtualip.png -------------------------------------------------------------------------------- /src/assets/topo/volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/volume.png -------------------------------------------------------------------------------- /src/assets/topo/webserver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/assets/topo/webserver.png -------------------------------------------------------------------------------- /src/components/vFooter.vue: -------------------------------------------------------------------------------- 1 | 7 | 21 | 22 | 32 | -------------------------------------------------------------------------------- /src/components/vHeader.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /src/components/vTopo/components/vShapebar.vue: -------------------------------------------------------------------------------- 1 | 7 | 24 | 25 | 57 | -------------------------------------------------------------------------------- /src/components/vTopo/components/vTopoAttrPanel.vue: -------------------------------------------------------------------------------- 1 | 7 | 46 | 47 | 80 | 81 | 84 | -------------------------------------------------------------------------------- /src/components/vTopo/vTopo.vue: -------------------------------------------------------------------------------- 1 | 7 | 227 | 1221 | 1292 | 1295 | -------------------------------------------------------------------------------- /src/config/connectorRules.js: -------------------------------------------------------------------------------- 1 | let connectorRules = [ 2 | { 3 | type:'Service', 4 | canBeContainedType:['Service'], 5 | canLinkToType:['Service'] 6 | }, 7 | { 8 | type:'Root', 9 | canBeContainedType:['Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 10 | canLinkToType:['Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'] 11 | }, 12 | { 13 | type:'Compute', 14 | canBeContainedType:[], 15 | canLinkToType:['Compute','Root','Container','Volume','FileSystem','ObjectStorage','Network','VirtualIP','SercurityGroup','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','ApplicationModule','CloudifyManager'] 16 | }, 17 | { 18 | type:'Container', 19 | canBeContainedType:['Container','Compute'], 20 | canLinkToType:['Container','Root','Volume','FileSystem','ObjectStorage','Network','VirtualIP','SercurityGroup','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','ApplicationModule','CloudifyManager'] 21 | }, 22 | { 23 | type:'Volume', 24 | canBeContainedType:['Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 25 | canLinkToType:['Volume','Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'] 26 | }, 27 | { 28 | type:'FileSystem', 29 | canBeContainedType:['FileSystem','Root','Compute','Container','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 30 | canLinkToType:['FileSystem','Root','Compute','Container','Volume','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','ApplicationModule','CloudifyManager'] 31 | }, 32 | { 33 | type:'ObjectStorage', 34 | canBeContainedType:['ObjectStorage','Root','Compute','Container','FileSystem','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 35 | canLinkToType:['ObjectStorage','Root','Compute','Container','Volume','FileSystem','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','ApplicationModule','CloudifyManager'] 36 | }, 37 | { 38 | type:'Network', 39 | canBeContainedType:[], 40 | canLinkToType:[] 41 | }, 42 | { 43 | type:'Router', 44 | canBeContainedType:[], 45 | canLinkToType:[] 46 | }, 47 | { 48 | type:'LoadBalancer', 49 | canBeContainedType:[], 50 | canLinkToType:[] 51 | }, 52 | { 53 | type:'VirtualIP', 54 | canBeContainedType:[], 55 | canLinkToType:[] 56 | }, 57 | { 58 | type:'SercurityGroup', 59 | canBeContainedType:[], 60 | canLinkToType:[] 61 | }, 62 | { 63 | type:'DBMS', 64 | canBeContainedType:['DBMS','Root','Compute','Container','FileSystem','ObjectStorage','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 65 | canLinkToType:['DBMS','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DataBase','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'] 66 | }, 67 | { 68 | type:'DataBase', 69 | canBeContainedType:['DataBase','Root','Compute','Container','FileSystem','ObjectStorage','DBMS','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'], 70 | canLinkToType:['DataBase','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','WebServer','ApplicationServer','MessageBusServer','CloudifyManager'] 71 | }, 72 | { 73 | type:'WebServer', 74 | canBeContainedType:['WebServer','Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','ApplicationServer','CloudifyManager'], 75 | canLinkToType:['WebServer','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','ApplicationServer','CloudifyManager'] 76 | }, 77 | { 78 | type:'ApplicationServer', 79 | canBeContainedType:['ApplicationServer','Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'], 80 | canLinkToType:['ApplicationServer','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'] 81 | }, 82 | { 83 | type:'MessageBusServer', 84 | canBeContainedType:['ApplicationServer','Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'], 85 | canLinkToType:['ApplicationServer','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'] 86 | }, 87 | { 88 | type:'ApplicationModule', 89 | canBeContainedType:['Root','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'], 90 | canLinkToType:['ApplicationModule','Root','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','CloudifyManager'] 91 | }, 92 | { 93 | type:'CloudifyManager', 94 | canBeContainedType:['CloudifyManager','Compute','Container','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer'], 95 | canLinkToType:['CloudifyManager','Compute','Container','Volume','FileSystem','ObjectStorage','DBMS','DataBase','WebServer','ApplicationServer','MessageBusServer','ApplicationModule'] 96 | } 97 | ] 98 | export default connectorRules -------------------------------------------------------------------------------- /src/data/toolbarNodeData.js: -------------------------------------------------------------------------------- 1 | const toolbarNodeData = [ 2 | {type:'Service',icon:require('../assets/topo/root.png'),width:140,height:80,num:1,classType:'T1'}, 3 | {type:'Router',icon:require('../assets/topo/router.png'),width:50,height:50,num:1,classType:'T2'}, 4 | {type:'Container',icon:require('../assets/topo/container.png'),width:140,height:80,num:1,classType:'T1'}, 5 | {type:'Pod',icon:require('../assets/topo/container.png'),width:140,height:80,num:1,classType:'T1'}, 6 | {type:'LoadBalancer',icon:require('../assets/topo/router.png'),width:115,height:60,num:1,classType:'T1'}, 7 | {type:'Compute',icon:require('../assets/topo/compute.png'),width:150,height:100,num:1,classType:'T1'}, 8 | {type:'Volume',icon:require('../assets/topo/volume.png'),width:50,height:50,num:1,classType:'T2'}, 9 | {type:'FileSystem',icon:require('../assets/topo/filesystem.png'),width:150,height:100,num:1,classType:'T1'}, 10 | {type:'ObjectStorage',icon:require('../assets/topo/storage.png'),width:150,height:100,num:1,classType:'T1'}, 11 | {type:'Network',icon:require('../assets/topo/network.png'),width:130,height:80,num:1,classType:'T1'}, 12 | {type:'Subnet',icon:require('../assets/topo/subnet.png'),width:150,height:100,num:1,classType:'T1'}, 13 | {type:'Port',icon:require('../assets/topo/port.png'),width:150,height:100,num:1,classType:'T1'}, 14 | {type:'LoadBalancer',icon:require('../assets/topo/router.png'),width:150,height:100,num:1,classType:'T1'}, 15 | {type:'VirtualIP',icon:require('../assets/topo/virtualip.png'),width:50,height:50,num:1,classType:'T2'}, 16 | {type:'SercurityGroup',icon:require('../assets/topo/sercurity.png'),width:50,height:50,num:1,classType:'T2'}, 17 | {type:'DBMS',icon:require('../assets/topo/dbms.png'),width:150,height:100,num:1,classType:'T1'}, 18 | {type:'DataBase',icon:require('../assets/topo/database.png'),width:150,height:100,num:1,classType:'T1'}, 19 | {type:'WebServer',icon:require('../assets/topo/webserver.png'),width:150,height:100,num:1,classType:'T1'}, 20 | {type:'ApplicationServer',icon:require('../assets/topo/application.png'),width:150,height:100,num:1,classType:'T1'}, 21 | {type:'MessageBusServer',icon:require('../assets/topo/message.png'),width:150,height:100,num:1,classType:'T1'}, 22 | {type:'ApplicationModule',icon:require('../assets/topo/application.png'),width:50,height:50,num:1,classType:'T2'}, 23 | {type:'CloudifyManager',icon:require('../assets/topo/cloud.png'),width:150,height:100,num:1,classType:'T1'} 24 | ] 25 | export default toolbarNodeData -------------------------------------------------------------------------------- /src/data/topoData1.js: -------------------------------------------------------------------------------- 1 | let topoJson = { 2 | "nodes": [{ 3 | "name": "ApplicationModule_1", 4 | "type": "ApplicationModule", 5 | "id": "qehkqs6mazk", 6 | "x": 460, 7 | "y": 340, 8 | "icon": "data:image/png;base64,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", 9 | "width": 50, 10 | "height": 50, 11 | "initW": 50, 12 | "initH": 50, 13 | "classType": "T2", 14 | "isLeftConnectShow": true, 15 | "isRightConnectShow": false, 16 | "containNodes": [], 17 | "attrs": [], 18 | "isSelect": false 19 | }, { 20 | "name": "Container_1", 21 | "type": "Container", 22 | "id": "4trq8hpmv7g0", 23 | "x": 100, 24 | "y": 160, 25 | "icon": "data:image/png;base64,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", 26 | "width": 140, 27 | "height": 80, 28 | "initW": 140, 29 | "initH": 80, 30 | "classType": "T1", 31 | "isLeftConnectShow": false, 32 | "isRightConnectShow": true, 33 | "containNodes": [], 34 | "attrs": [], 35 | "isSelect": false 36 | }, { 37 | "name": "ObjectStorage_1", 38 | "type": "ObjectStorage", 39 | "id": "168oyhimq4m8", 40 | "x": 500, 41 | "y": 80, 42 | "icon": "data:image/png;base64,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", 43 | "width": 150, 44 | "height": 100, 45 | "initW": 150, 46 | "initH": 100, 47 | "classType": "T1", 48 | "isLeftConnectShow": true, 49 | "isRightConnectShow": false, 50 | "containNodes": [], 51 | "attrs": [], 52 | "isSelect": false 53 | }, { 54 | "name": "Container_2", 55 | "type": "Container", 56 | "id": "49dz3mbgaas0", 57 | "x": 80, 58 | "y": 360, 59 | "icon": "data:image/png;base64,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", 60 | "width": 140, 61 | "height": 80, 62 | "initW": 140, 63 | "initH": 80, 64 | "classType": "T1", 65 | "isLeftConnectShow": true, 66 | "isRightConnectShow": true, 67 | "containNodes": [], 68 | "attrs": [], 69 | "isSelect": false 70 | }, { 71 | "name": "Container_3", 72 | "type": "Container", 73 | "id": "6gle6rqk2m00", 74 | "x": 100, 75 | "y": 520, 76 | "icon": "data:image/png;base64,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", 77 | "width": 346, 78 | "height": 120, 79 | "initW": 140, 80 | "initH": 80, 81 | "classType": "T1", 82 | "isLeftConnectShow": false, 83 | "isRightConnectShow": false, 84 | "containNodes": ["5jkxlx7tpy00", "4aoxxa2ejva0"], 85 | "attrs": [], 86 | "isSelect": false 87 | }, { 88 | "name": "Pod_1", 89 | "type": "Pod", 90 | "id": "5jkxlx7tpy00", 91 | "x": 122, 92 | "y": 550, 93 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffCggXHg/9L6OvAAAD4UlEQVRYw+3XzW+UVRTH8Y+VvheML4kvRJcmhqU7IbRWqJ2WviIlsjJxhTFR4tadJq5cGhPRRBBpQ2unb9QWSoQFiRE1xr9AF4pvgLRDO1Ta62JuH1o6nc60XXJnMYvn3PO953fOvfdcih+1uk25qMf2EmYVOao0GjQjCDJGNaneOucVUoZMC4KZ+J8xpl3l5p1Xa9HvpiC45qRG9T7zV4SltavdjPP9zpgVBDf0abANlNntC9cEwZy01EYgOc0zguC6fg3KV3zf5gW9bgiCWWOl5aRCs3TUOgi+tHMNuz0+j/IVnZNqqUTz/ywIgtsuO+rxvPblGp2Icq2bk5zmt6K233jNm741LwgWfef1NSDb7NXnepw3KKVmtVGlfYZjnWdN6bYDPOqIyxGy4EdHPbZGJLudirLeMi6larnzAwajLHNGdXloxeRHHDbutiC444q3PJkXUqnBiZj4GSM6c5ADemO1LLqgc41qqNNjLEYYXHHUU3ntHtRgxJ1YXQO6uZpUy6ILmvLpl+So2UiMdNHP3siTk1rNLsTiyMntumDapRhFxoSuAjVdrd7JCLnjJ+94IvlWpdNELJJZl/wrCFwT/O55zUkF3TLqYAFIhXqf+ieu8XvH7FSl3VDiPK3NLr/cBVz1HCq1S8fVzRrWESsp3yizxyd+j5AfjEUFZozqVo2n/bo8gmeTMJsS46xJbeoKQHY5Hs+qXOQTWpPIn8kPgBovG4gTZ513aI3dWW6vfnNxMcNaV9gVAOQgBwzEjTNn3OF79ka1Fr1x92YM61wV6TqAXDJbk90975yDEVInlUSYcXZpQ5UOyK10X1IdWZcc1uVcUi3jmtfcN0UCcnKlnEkSPxedDxYsgJIA5M6rdHIfjxbcjBsC5HLygSD4OK/mawDKijBdGvP+AH/LFj+pFMCSdUlzSgNsYNwH3AdsFSBY2HLPC0IO8ADq1G/xq6VWfe7CLZPFDh8Z1r2ZXn/ZqNEm7biHkSXlVLxUZk16teARfEwQvF/Q+SvOJt1Jnw4o16I/tnxZ48nNVSpguw4j8b64Ka1teTtf4UVfxfP+tqk8d2xhQK1WX8smfen+fG+FSo1OR7nmTOlZlZP8gGpdJhNZ+gu/dqo06Y1N35xJR1bItRqw3SFj0fm0AS3FPKXK7TcQO7x555flZCVgh46krZ8xpEXF+s7vylWvP8nJRT3q8LYgeA81Ok3FhGYM2VfUNbpKrkankyfVlC7vCoIPtS/rovsLtvxFQJr1xZxk/CYI/oyFMG1A62ac381JU/LEWvrNGNFaiual5GRG2ksb0Xy9UaPDhCkHCx4n94z/AYpVGROJOCKXAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTExLTEyVDExOjEzOjI5KzA4OjAw1QoCwAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQyMzozMDoxNSswODowMMi5fQ4AAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANDQ1bVxYUAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA0NDX+rQgNAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0NDQzMTgyMTVISR9dAAAAEnRFWHRUaHVtYjo6U2l6ZQA3LjIyS0Kg7KQfAAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTk0NC8xMTk0NDQ5LnBuZy+ofRYAAAAASUVORK5CYII=", 94 | "width": 140, 95 | "height": 80, 96 | "initW": 140, 97 | "initH": 80, 98 | "classType": "T1", 99 | "isLeftConnectShow": false, 100 | "isRightConnectShow": false, 101 | "containNodes": [], 102 | "attrs": [], 103 | "isSelect": false 104 | }, { 105 | "name": "Pod_2", 106 | "type": "Pod", 107 | "id": "4aoxxa2ejva0", 108 | "x": 284, 109 | "y": 550, 110 | "icon": "data:image/png;base64,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", 111 | "width": 140, 112 | "height": 80, 113 | "initW": 140, 114 | "initH": 80, 115 | "classType": "T1", 116 | "isLeftConnectShow": false, 117 | "isRightConnectShow": false, 118 | "containNodes": [], 119 | "attrs": [], 120 | "isSelect": false 121 | }], 122 | "connectors": [{ 123 | "id": "2owjakk3cj0", 124 | "type": "Line", 125 | "strokeW": 10, 126 | "color": "#9AC0EE", 127 | "targetNode": { 128 | "x": 460, 129 | "y": 340, 130 | "id": "qehkqs6mazk", 131 | "width": 50, 132 | "height": 50 133 | }, 134 | "sourceNode": { 135 | "x": 100, 136 | "y": 160, 137 | "id": "4trq8hpmv7g0", 138 | "width": 140, 139 | "height": 80 140 | }, 141 | "isSelect": false 142 | }, { 143 | "id": "ucbdfy4baf", 144 | "type": "Line", 145 | "strokeW": 6, 146 | "color": "#ED565B", 147 | "targetNode": { 148 | "x": 500, 149 | "y": 80, 150 | "id": "168oyhimq4m8", 151 | "width": 150, 152 | "height": 100 153 | }, 154 | "sourceNode": { 155 | "x": 100, 156 | "y": 160, 157 | "id": "4trq8hpmv7g0", 158 | "width": 140, 159 | "height": 80 160 | }, 161 | "isSelect": false 162 | }, { 163 | "id": "w0kqd4vs0l", 164 | "type": "Line", 165 | "strokeW": 12, 166 | "color": "#3CD37B", 167 | "targetNode": { 168 | "x": 80, 169 | "y": 360, 170 | "id": "49dz3mbgaas0", 171 | "width": 140, 172 | "height": 80 173 | }, 174 | "sourceNode": { 175 | "x": 80, 176 | "y": 360, 177 | "id": "49dz3mbgaas0", 178 | "width": 140, 179 | "height": 80 180 | }, 181 | "isSelect": false 182 | }, { 183 | "id": "1tvycjqq70u", 184 | "type": "Contain", 185 | "sourceNode": { 186 | "id": "5jkxlx7tpy00", 187 | "width": 140, 188 | "height": 80, 189 | "x": 122, 190 | "y": 550 191 | }, 192 | "targetNode": { 193 | "id": "6gle6rqk2m00", 194 | "width": 346, 195 | "height": 120, 196 | "x": 100, 197 | "y": 520 198 | }, 199 | "isSelect": false 200 | }, { 201 | "id": "1ltadqyi6pj", 202 | "type": "Contain", 203 | "sourceNode": { 204 | "id": "4aoxxa2ejva0", 205 | "width": 140, 206 | "height": 80, 207 | "x": 284, 208 | "y": 550 209 | }, 210 | "targetNode": { 211 | "id": "6gle6rqk2m00", 212 | "width": 346, 213 | "height": 120, 214 | "x": 100, 215 | "y": 520 216 | }, 217 | "isSelect": false 218 | }] 219 | } 220 | export default topoJson 221 | -------------------------------------------------------------------------------- /src/data/topoData2.js: -------------------------------------------------------------------------------- 1 | let topoJson = { 2 | "nodes": [{ 3 | "name": "LoadBalancer_1", 4 | "type": "LoadBalancer", 5 | "id": "1hokg0mgnmww", 6 | "x": 840, 7 | "y": 180, 8 | "icon": "data:image/png;base64,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dGU6bW9kaWZ5ADIwMTEtMDktMTlUMTg6NTE6NTUrMDg6MDAeZye4AAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1MACg4SwAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjUyfV/QXQAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzE2NDI5NTE1FAFWUQAAABJ0RVh0VGh1bWI6OlNpemUANy4yMktCoOykHwAAAF10RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvNTU5NS81NTk1OTUucG5n/eaoFgAAAABJRU5ErkJggg==", 9 | "width": 115, 10 | "height": 60, 11 | "initW": 115, 12 | "initH": 60, 13 | "classType": "T1", 14 | "isLeftConnectShow": true, 15 | "isRightConnectShow": false, 16 | "containNodes": [], 17 | "attrs": [], 18 | "isSelect": false 19 | }, { 20 | "name": "Router_1", 21 | "type": "Router", 22 | "id": "dbfp8krc8ow", 23 | "x": 680, 24 | "y": 220, 25 | "icon": "data:image/png;base64,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dGU6bW9kaWZ5ADIwMTEtMDktMTlUMTg6NTE6NTUrMDg6MDAeZye4AAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1MACg4SwAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjUyfV/QXQAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzE2NDI5NTE1FAFWUQAAABJ0RVh0VGh1bWI6OlNpemUANy4yMktCoOykHwAAAF10RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvNTU5NS81NTk1OTUucG5n/eaoFgAAAABJRU5ErkJggg==", 26 | "width": 50, 27 | "height": 50, 28 | "initW": 50, 29 | "initH": 50, 30 | "classType": "T2", 31 | "isLeftConnectShow": true, 32 | "isRightConnectShow": true, 33 | "containNodes": [], 34 | "attrs": [], 35 | "isSelect": false 36 | }, { 37 | "name": "Service_1", 38 | "type": "Service", 39 | "id": "1orsbg8m30zk", 40 | "x": 60, 41 | "y": 40, 42 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffCggXHgqNRVcgAAADLUlEQVRYw9XYT2xUVRTH8c+8GRFambZQQYpaBLS0aoHEWpsSEo2JoIlLjXGjG3e6Efcm6EY3akyMCxN3Ro1RoiaKBInxD6JtDUFraBMJldJWrWjB2j/T52I6mZnO9E078zb+7mJe7nnvfN857/45dyhUyiGjMlW2aUfdJlKPmBLW1D7UVOwyUXCd9rF9mDduvsiyEjVoQMaj3i5OSl43aceMw94yv0r3oe1eskfS/mJAoR42LzSsZZXOc3pWKHRKY2FnUHDdI4khf1QJ+No02nSWBzToAX1mqgScdg5p95YHbNWKf52s0j3jTixmYl05QJuNGNFfNSD0iVncqrUcYK8UBv1WNYABI9jsjlJAnTtBv7kaAKO+R+CA5FLA9ToxW0OCIOO4EN35oZ4D3GwjJgzWBOCY87jB7UsBe61Bn5EaASP6cLXeYkDSbvBt1XMgpzlfgHtyi14WsEEbZvxQo3v4xiV0aC8E7NKKMT/HAPhJP9K6CwF3SWPIWAyAyz4F+7IrdYDAHvCd6RgAfGUKu23NARq1Y9rxWNwzaAjb7M8Bblz8AmdjAkz6Esk8YJdGDBqPCcARV9ClOQvoEWCg5jmQ12nD2K6NQJNute0DpfrdSazXS2CbVowYiBHA5+ZwwPpApw34MZY5kNcJQ+hwS0qXNThvS1EBkFXCtIlIRwmbrBWW9AeGdWjWm3BKFyZNlSm1EiY8EblH3O1ljWUAoSZpfMSVCsXgc5ERvFLh6QspdZh3oUwt16wB9ZGAbGX4p8kSyxotktZlbxj3kF+XpCj0vMcoE36p3vTiki+4YKd3bRZmARkXjZY8dnkFrrP628WSvnoL5LfMcrX0SurrcNk7g6KfCLW4alnb2sqFcirCNgse8Lpflolmp/sgqtiPAgzISLrG4xVectaZ5Y1RKfrAGys4iMx6bXGTXHUEUw45akfkS2Scdcw/1QGY8l7FCCqo8ij6fwBWshzUBKiTjt1zozokAhlc6/7YAQezB/OUc3bgaUmf+Ssm500OehKMJbzgmcXuS1HjeVWq1wBCh2lxpMY/QJZrC96xKYEtnvKg6/IHtxiUMep9r5r4DyOQQYon6gF4AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTExLTEyVDExOjEzOjI5KzA4OjAw1QoCwAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQyMzozMDoxMCswODowMJqBUqkAAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANDQ1bVxYUAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA0NDX+rQgNAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0NDQzMTgyMTA4I+vSAAAAEnRFWHRUaHVtYjo6U2l6ZQA4LjIzS0JQeHz9AAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTk0NC8xMTk0NDQyLnBuZ1h4TAcAAAAASUVORK5CYII=", 43 | "width": 552, 44 | "height": 160, 45 | "initW": 140, 46 | "initH": 80, 47 | "classType": "T1", 48 | "isLeftConnectShow": false, 49 | "isRightConnectShow": true, 50 | "containNodes": ["jdturwsp9xc", "6isr7j0hiec0"], 51 | "attrs": [], 52 | "isSelect": false 53 | }, { 54 | "name": "Pod_1", 55 | "type": "Pod", 56 | "id": "jdturwsp9xc", 57 | "x": 82, 58 | "y": 70, 59 | "icon": "data:image/png;base64,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", 60 | "width": 346, 61 | "height": 120, 62 | "initW": 140, 63 | "initH": 80, 64 | "classType": "T1", 65 | "isLeftConnectShow": false, 66 | "isRightConnectShow": false, 67 | "containNodes": [66, 88], 68 | "attrs": [], 69 | "isSelect": false 70 | }, { 71 | "x": 266, 72 | "y": 100, 73 | "width": 140, 74 | "height": 80, 75 | "id": 88, 76 | "isLeftConnectShow": false, 77 | "isRightConnectShow": false, 78 | "name": "Container_c", 79 | "isSelect": false, 80 | "initW": 140, 81 | "initH": 80, 82 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffCggXHg/9L6OvAAAD4UlEQVRYw+3XzW+UVRTH8Y+VvheML4kvRJcmhqU7IbRWqJ2WviIlsjJxhTFR4tadJq5cGhPRRBBpQ2unb9QWSoQFiRE1xr9AF4pvgLRDO1Ta62JuH1o6nc60XXJnMYvn3PO953fOvfdcih+1uk25qMf2EmYVOao0GjQjCDJGNaneOucVUoZMC4KZ+J8xpl3l5p1Xa9HvpiC45qRG9T7zV4SltavdjPP9zpgVBDf0abANlNntC9cEwZy01EYgOc0zguC6fg3KV3zf5gW9bgiCWWOl5aRCs3TUOgi+tHMNuz0+j/IVnZNqqUTz/ywIgtsuO+rxvPblGp2Icq2bk5zmt6K233jNm741LwgWfef1NSDb7NXnepw3KKVmtVGlfYZjnWdN6bYDPOqIyxGy4EdHPbZGJLudirLeMi6larnzAwajLHNGdXloxeRHHDbutiC444q3PJkXUqnBiZj4GSM6c5ADemO1LLqgc41qqNNjLEYYXHHUU3ntHtRgxJ1YXQO6uZpUy6ILmvLpl+So2UiMdNHP3siTk1rNLsTiyMntumDapRhFxoSuAjVdrd7JCLnjJ+94IvlWpdNELJJZl/wrCFwT/O55zUkF3TLqYAFIhXqf+ieu8XvH7FSl3VDiPK3NLr/cBVz1HCq1S8fVzRrWESsp3yizxyd+j5AfjEUFZozqVo2n/bo8gmeTMJsS46xJbeoKQHY5Hs+qXOQTWpPIn8kPgBovG4gTZ513aI3dWW6vfnNxMcNaV9gVAOQgBwzEjTNn3OF79ka1Fr1x92YM61wV6TqAXDJbk90975yDEVInlUSYcXZpQ5UOyK10X1IdWZcc1uVcUi3jmtfcN0UCcnKlnEkSPxedDxYsgJIA5M6rdHIfjxbcjBsC5HLygSD4OK/mawDKijBdGvP+AH/LFj+pFMCSdUlzSgNsYNwH3AdsFSBY2HLPC0IO8ADq1G/xq6VWfe7CLZPFDh8Z1r2ZXn/ZqNEm7biHkSXlVLxUZk16teARfEwQvF/Q+SvOJt1Jnw4o16I/tnxZ48nNVSpguw4j8b64Ka1teTtf4UVfxfP+tqk8d2xhQK1WX8smfen+fG+FSo1OR7nmTOlZlZP8gGpdJhNZ+gu/dqo06Y1N35xJR1bItRqw3SFj0fm0AS3FPKXK7TcQO7x555flZCVgh46krZ8xpEXF+s7vylWvP8nJRT3q8LYgeA81Ok3FhGYM2VfUNbpKrkankyfVlC7vCoIPtS/rovsLtvxFQJr1xZxk/CYI/oyFMG1A62ac381JU/LEWvrNGNFaiual5GRG2ksb0Xy9UaPDhCkHCx4n94z/AYpVGROJOCKXAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTExLTEyVDExOjEzOjI5KzA4OjAw1QoCwAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQyMzozMDoxNSswODowMMi5fQ4AAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANDQ1bVxYUAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA0NDX+rQgNAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0NDQzMTgyMTVISR9dAAAAEnRFWHRUaHVtYjo6U2l6ZQA3LjIyS0Kg7KQfAAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTk0NC8xMTk0NDQ5LnBuZy+ofRYAAAAASUVORK5CYII=", 83 | "classType": "T1", 84 | "containNodes": [], 85 | "attrs": [], 86 | "type": "Container" 87 | }, { 88 | "name": "Pod_2", 89 | "type": "Pod", 90 | "id": "6isr7j0hiec0", 91 | "x": 450, 92 | "y": 70, 93 | "icon": "data:image/png;base64,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", 94 | "width": 140, 95 | "height": 80, 96 | "initW": 140, 97 | "initH": 80, 98 | "classType": "T1", 99 | "isLeftConnectShow": false, 100 | "isRightConnectShow": false, 101 | "containNodes": [], 102 | "attrs": [], 103 | "isSelect": false 104 | }, { 105 | "x": 104, 106 | "y": 100, 107 | "width": 140, 108 | "height": 80, 109 | "id": 66, 110 | "isLeftConnectShow": false, 111 | "isRightConnectShow": false, 112 | "name": "Container_a", 113 | "isSelect": false, 114 | "initW": 140, 115 | "initH": 80, 116 | "icon": "data:image/png;base64,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", 117 | "classType": "T1", 118 | "containNodes": [], 119 | "type": "Container", 120 | "attrs": [{ 121 | "type": "input", 122 | "name": "portId", 123 | "value": "2222141", 124 | "placeholder": "请输入portId", 125 | "rules": [{ 126 | "required": true, 127 | "message": "请输入活动名称", 128 | "trigger": "blur" 129 | }], 130 | "disabled": true 131 | }, { 132 | "type": "select", 133 | "name": "server", 134 | "value": "", 135 | "placeholder": "请选择服务器", 136 | "options": [{ 137 | "label": "上海服务器", 138 | "value": "shagnhai" 139 | }, { 140 | "label": "北京服务器", 141 | "value": "beijing" 142 | }], 143 | "disabled": false 144 | }, { 145 | "type": "checkbox", 146 | "name": "数据库类型", 147 | "value": [], 148 | "options": [{ 149 | "label": "SQL server" 150 | }, { 151 | "label": "Access" 152 | }, { 153 | "label": "mySQL" 154 | }, { 155 | "label": "Oracle" 156 | }], 157 | "disabled": false 158 | }, { 159 | "type": "textarea", 160 | "name": "数据库", 161 | "value": "", 162 | "rules": [], 163 | "disabled": false 164 | }, { 165 | "type": "radio", 166 | "name": "数据类型", 167 | "value": "", 168 | "options": [{ 169 | "label": "sql" 170 | }, { 171 | "label": "oracle" 172 | }], 173 | "disabled": true 174 | }, { 175 | "type": "keyVal", 176 | "name": "service", 177 | "value": "dbms" 178 | }, { 179 | "type": "keyVal", 180 | "name": "sql", 181 | "value": "sq" 182 | }] 183 | }], 184 | "connectors": [{ 185 | "type": "Contain", 186 | "sourceNode": { 187 | "id": 66, 188 | "width": 140, 189 | "height": 80, 190 | "x": 104, 191 | "y": 100 192 | }, 193 | "targetNode": { 194 | "id": "jdturwsp9xc", 195 | "width": 346, 196 | "height": 120, 197 | "x": 82, 198 | "y": 70 199 | }, 200 | "isSelect": false 201 | }, { 202 | "type": "Contain", 203 | "sourceNode": { 204 | "id": "jdturwsp9xc", 205 | "width": 346, 206 | "height": 120, 207 | "x": 82, 208 | "y": 70 209 | }, 210 | "targetNode": { 211 | "id": "1orsbg8m30zk", 212 | "width": 552, 213 | "height": 160, 214 | "x": 60, 215 | "y": 40 216 | }, 217 | "isSelect": false 218 | }, { 219 | "type": "Line", 220 | "targetNode": { 221 | "x": 840, 222 | "y": 180, 223 | "id": "1hokg0mgnmww", 224 | "width": 115, 225 | "height": 60 226 | }, 227 | "sourceNode": { 228 | "x": 680, 229 | "y": 220, 230 | "id": "dbfp8krc8ow", 231 | "width": 50, 232 | "height": 50 233 | }, 234 | "isSelect": false 235 | }, { 236 | "type": "Line", 237 | "targetNode": { 238 | "x": 680, 239 | "y": 220, 240 | "id": "dbfp8krc8ow", 241 | "width": 50, 242 | "height": 50 243 | }, 244 | "sourceNode": { 245 | "x": 60, 246 | "y": 40, 247 | "id": "1orsbg8m30zk", 248 | "width": 552, 249 | "height": 160 250 | }, 251 | "isSelect": false 252 | }, { 253 | "type": "Contain", 254 | "sourceNode": { 255 | "id": "6isr7j0hiec0", 256 | "width": 140, 257 | "height": 80, 258 | "x": 450, 259 | "y": 70 260 | }, 261 | "targetNode": { 262 | "id": "1orsbg8m30zk", 263 | "width": 552, 264 | "height": 160, 265 | "x": 60, 266 | "y": 40 267 | }, 268 | "isSelect": false 269 | }, { 270 | "type": "Contain", 271 | "sourceNode": { 272 | "id": 88, 273 | "width": 140, 274 | "height": 80, 275 | "x": 266, 276 | "y": 100 277 | }, 278 | "targetNode": { 279 | "id": "jdturwsp9xc", 280 | "width": 346, 281 | "height": 120, 282 | "x": 82, 283 | "y": 70 284 | }, 285 | "isSelect": false 286 | }] 287 | } 288 | 289 | export default topoJson 290 | -------------------------------------------------------------------------------- /src/data/topoJson.js: -------------------------------------------------------------------------------- 1 | // let topoJson = { 2 | // "nodes": [{ 3 | // "name": "LoadBalancer_1", 4 | // "type": "LoadBalancer", 5 | // "id": "1hokg0mgnmww", 6 | // "x": 840, 7 | // "y": 180, 8 | // "icon": "data:image/png;base64,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dGU6bW9kaWZ5ADIwMTEtMDktMTlUMTg6NTE6NTUrMDg6MDAeZye4AAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1MACg4SwAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjUyfV/QXQAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzE2NDI5NTE1FAFWUQAAABJ0RVh0VGh1bWI6OlNpemUANy4yMktCoOykHwAAAF10RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvNTU5NS81NTk1OTUucG5n/eaoFgAAAABJRU5ErkJggg==", 9 | // "width": 115, 10 | // "height": 60, 11 | // "initW": 115, 12 | // "initH": 60, 13 | // "classType": "T1", 14 | // "isLeftConnectShow": true, 15 | // "isRightConnectShow": false, 16 | // "containNodes": [], 17 | // "attrs": [], 18 | // "isSelect": false 19 | // }, { 20 | // "name": "Router_1", 21 | // "type": "Router", 22 | // "id": "dbfp8krc8ow", 23 | // "x": 680, 24 | // "y": 220, 25 | // "icon": "data:image/png;base64,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dGU6bW9kaWZ5ADIwMTEtMDktMTlUMTg6NTE6NTUrMDg6MDAeZye4AAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1MACg4SwAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjUyfV/QXQAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzE2NDI5NTE1FAFWUQAAABJ0RVh0VGh1bWI6OlNpemUANy4yMktCoOykHwAAAF10RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvNTU5NS81NTk1OTUucG5n/eaoFgAAAABJRU5ErkJggg==", 26 | // "width": 50, 27 | // "height": 50, 28 | // "initW": 50, 29 | // "initH": 50, 30 | // "classType": "T2", 31 | // "isLeftConnectShow": true, 32 | // "isRightConnectShow": true, 33 | // "containNodes": [], 34 | // "attrs": [], 35 | // "isSelect": false 36 | // }, { 37 | // "name": "Service_1", 38 | // "type": "Service", 39 | // "id": "1orsbg8m30zk", 40 | // "x": 60, 41 | // "y": 40, 42 | // "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffCggXHgqNRVcgAAADLUlEQVRYw9XYT2xUVRTH8c+8GRFambZQQYpaBLS0aoHEWpsSEo2JoIlLjXGjG3e6Efcm6EY3akyMCxN3Ro1RoiaKBInxD6JtDUFraBMJldJWrWjB2j/T52I6mZnO9E078zb+7mJe7nnvfN857/45dyhUyiGjMlW2aUfdJlKPmBLW1D7UVOwyUXCd9rF9mDduvsiyEjVoQMaj3i5OSl43aceMw94yv0r3oe1eskfS/mJAoR42LzSsZZXOc3pWKHRKY2FnUHDdI4khf1QJ+No02nSWBzToAX1mqgScdg5p95YHbNWKf52s0j3jTixmYl05QJuNGNFfNSD0iVncqrUcYK8UBv1WNYABI9jsjlJAnTtBv7kaAKO+R+CA5FLA9ToxW0OCIOO4EN35oZ4D3GwjJgzWBOCY87jB7UsBe61Bn5EaASP6cLXeYkDSbvBt1XMgpzlfgHtyi14WsEEbZvxQo3v4xiV0aC8E7NKKMT/HAPhJP9K6CwF3SWPIWAyAyz4F+7IrdYDAHvCd6RgAfGUKu23NARq1Y9rxWNwzaAjb7M8Bblz8AmdjAkz6Esk8YJdGDBqPCcARV9ClOQvoEWCg5jmQ12nD2K6NQJNute0DpfrdSazXS2CbVowYiBHA5+ZwwPpApw34MZY5kNcJQ+hwS0qXNThvS1EBkFXCtIlIRwmbrBWW9AeGdWjWm3BKFyZNlSm1EiY8EblH3O1ljWUAoSZpfMSVCsXgc5ERvFLh6QspdZh3oUwt16wB9ZGAbGX4p8kSyxotktZlbxj3kF+XpCj0vMcoE36p3vTiki+4YKd3bRZmARkXjZY8dnkFrrP628WSvnoL5LfMcrX0SurrcNk7g6KfCLW4alnb2sqFcirCNgse8Lpflolmp/sgqtiPAgzISLrG4xVectaZ5Y1RKfrAGys4iMx6bXGTXHUEUw45akfkS2Scdcw/1QGY8l7FCCqo8ij6fwBWshzUBKiTjt1zozokAhlc6/7YAQezB/OUc3bgaUmf+Ssm500OehKMJbzgmcXuS1HjeVWq1wBCh2lxpMY/QJZrC96xKYEtnvKg6/IHtxiUMep9r5r4DyOQQYon6gF4AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTExLTEyVDExOjEzOjI5KzA4OjAw1QoCwAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMC0wOFQyMzozMDoxMCswODowMJqBUqkAAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANDQ1bVxYUAAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAA0NDX+rQgNAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0NDQzMTgyMTA4I+vSAAAAEnRFWHRUaHVtYjo6U2l6ZQA4LjIzS0JQeHz9AAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTk0NC8xMTk0NDQyLnBuZ1h4TAcAAAAASUVORK5CYII=", 43 | // "width": 552, 44 | // "height": 160, 45 | // "initW": 140, 46 | // "initH": 80, 47 | // "classType": "T1", 48 | // "isLeftConnectShow": false, 49 | // "isRightConnectShow": true, 50 | // "containNodes": ["jdturwsp9xc", "6isr7j0hiec0"], 51 | // "attrs": [], 52 | // "isSelect": false 53 | // }, { 54 | // "name": "Pod_1", 55 | // "type": "Pod", 56 | // "id": "jdturwsp9xc", 57 | // "x": 82, 58 | // "y": 70, 59 | // "icon": "data:image/png;base64,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", 60 | // "width": 346, 61 | // "height": 120, 62 | // "initW": 140, 63 | // "initH": 80, 64 | // "classType": "T1", 65 | // "isLeftConnectShow": false, 66 | // "isRightConnectShow": false, 67 | // "containNodes": [66, 88], 68 | // "attrs": [], 69 | // "isSelect": false 70 | // }, { 71 | // "x": 266, 72 | // "y": 100, 73 | // "width": 140, 74 | // "height": 80, 75 | // "id": 88, 76 | // "isLeftConnectShow": false, 77 | // "isRightConnectShow": false, 78 | // "name": "Container_c", 79 | // "isSelect": false, 80 | // "initW": 140, 81 | // "initH": 80, 82 | // "icon": "data:image/png;base64,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", 83 | // "classType": "T1", 84 | // "containNodes": [], 85 | // "attrs": [], 86 | // "type": "Container" 87 | // }, { 88 | // "name": "Pod_2", 89 | // "type": "Pod", 90 | // "id": "6isr7j0hiec0", 91 | // "x": 450, 92 | // "y": 70, 93 | // "icon": "data:image/png;base64,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", 94 | // "width": 140, 95 | // "height": 80, 96 | // "initW": 140, 97 | // "initH": 80, 98 | // "classType": "T1", 99 | // "isLeftConnectShow": false, 100 | // "isRightConnectShow": false, 101 | // "containNodes": [], 102 | // "attrs": [], 103 | // "isSelect": false 104 | // }, { 105 | // "x": 104, 106 | // "y": 100, 107 | // "width": 140, 108 | // "height": 80, 109 | // "id": 66, 110 | // "isLeftConnectShow": false, 111 | // "isRightConnectShow": false, 112 | // "name": "Container_a", 113 | // "isSelect": false, 114 | // "initW": 140, 115 | // "initH": 80, 116 | // "icon": "data:image/png;base64,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", 117 | // "classType": "T1", 118 | // "containNodes": [], 119 | // "type": "Container", 120 | // "attrs": [{ 121 | // "type": "input", 122 | // "name": "portId", 123 | // "value": "2222141", 124 | // "placeholder": "请输入portId", 125 | // "rules": [{ 126 | // "required": true, 127 | // "message": "请输入活动名称", 128 | // "trigger": "blur" 129 | // }], 130 | // "disabled": true 131 | // }, { 132 | // "type": "select", 133 | // "name": "server", 134 | // "value": "", 135 | // "placeholder": "请选择服务器", 136 | // "options": [{ 137 | // "label": "上海服务器", 138 | // "value": "shagnhai" 139 | // }, { 140 | // "label": "北京服务器", 141 | // "value": "beijing" 142 | // }], 143 | // "disabled": false 144 | // }, { 145 | // "type": "checkbox", 146 | // "name": "数据库类型", 147 | // "value": [], 148 | // "options": [{ 149 | // "label": "SQL server" 150 | // }, { 151 | // "label": "Access" 152 | // }, { 153 | // "label": "mySQL" 154 | // }, { 155 | // "label": "Oracle" 156 | // }], 157 | // "disabled": false 158 | // }, { 159 | // "type": "textarea", 160 | // "name": "数据库", 161 | // "value": "", 162 | // "rules": [], 163 | // "disabled": false 164 | // }, { 165 | // "type": "radio", 166 | // "name": "数据类型", 167 | // "value": "", 168 | // "options": [{ 169 | // "label": "sql" 170 | // }, { 171 | // "label": "oracle" 172 | // }], 173 | // "disabled": true 174 | // }, { 175 | // "type": "keyVal", 176 | // "name": "service", 177 | // "value": "dbms" 178 | // }, { 179 | // "type": "keyVal", 180 | // "name": "sql", 181 | // "value": "sq" 182 | // }] 183 | // }], 184 | // "connectors": [{ 185 | // "type": "Contain", 186 | // "sourceNode": { 187 | // "id": 66, 188 | // "width": 140, 189 | // "height": 80, 190 | // "x": 104, 191 | // "y": 100 192 | // }, 193 | // "targetNode": { 194 | // "id": "jdturwsp9xc", 195 | // "width": 346, 196 | // "height": 120, 197 | // "x": 82, 198 | // "y": 70 199 | // }, 200 | // "isSelect": false 201 | // }, { 202 | // "type": "Contain", 203 | // "sourceNode": { 204 | // "id": "jdturwsp9xc", 205 | // "width": 346, 206 | // "height": 120, 207 | // "x": 82, 208 | // "y": 70 209 | // }, 210 | // "targetNode": { 211 | // "id": "1orsbg8m30zk", 212 | // "width": 552, 213 | // "height": 160, 214 | // "x": 60, 215 | // "y": 40 216 | // }, 217 | // "isSelect": false 218 | // }, { 219 | // "type": "Line", 220 | // "targetNode": { 221 | // "x": 840, 222 | // "y": 180, 223 | // "id": "1hokg0mgnmww", 224 | // "width": 115, 225 | // "height": 60 226 | // }, 227 | // "sourceNode": { 228 | // "x": 680, 229 | // "y": 220, 230 | // "id": "dbfp8krc8ow", 231 | // "width": 50, 232 | // "height": 50 233 | // }, 234 | // "isSelect": false 235 | // }, { 236 | // "type": "Line", 237 | // "targetNode": { 238 | // "x": 680, 239 | // "y": 220, 240 | // "id": "dbfp8krc8ow", 241 | // "width": 50, 242 | // "height": 50 243 | // }, 244 | // "sourceNode": { 245 | // "x": 60, 246 | // "y": 40, 247 | // "id": "1orsbg8m30zk", 248 | // "width": 552, 249 | // "height": 160 250 | // }, 251 | // "isSelect": false 252 | // }, { 253 | // "type": "Contain", 254 | // "sourceNode": { 255 | // "id": "6isr7j0hiec0", 256 | // "width": 140, 257 | // "height": 80, 258 | // "x": 450, 259 | // "y": 70 260 | // }, 261 | // "targetNode": { 262 | // "id": "1orsbg8m30zk", 263 | // "width": 552, 264 | // "height": 160, 265 | // "x": 60, 266 | // "y": 40 267 | // }, 268 | // "isSelect": false 269 | // }, { 270 | // "type": "Contain", 271 | // "sourceNode": { 272 | // "id": 88, 273 | // "width": 140, 274 | // "height": 80, 275 | // "x": 266, 276 | // "y": 100 277 | // }, 278 | // "targetNode": { 279 | // "id": "jdturwsp9xc", 280 | // "width": 346, 281 | // "height": 120, 282 | // "x": 82, 283 | // "y": 70 284 | // }, 285 | // "isSelect": false 286 | // }] 287 | // } 288 | 289 | let topoJson = { 290 | "nodes": [{ 291 | "name": "Router_1", 292 | "type": "Router", 293 | "id": "3e9gd7rqais0", 294 | "x": 460, 295 | "y": 180, 296 | "icon": "data:image/png;base64,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dGU6bW9kaWZ5ADIwMTEtMDktMTlUMTg6NTE6NTUrMDg6MDAeZye4AAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1MACg4SwAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjUyfV/QXQAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzE2NDI5NTE1FAFWUQAAABJ0RVh0VGh1bWI6OlNpemUANy4yMktCoOykHwAAAF10RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvNTU5NS81NTk1OTUucG5n/eaoFgAAAABJRU5ErkJggg==", 297 | "width": 50, 298 | "height": 50, 299 | "initW": 50, 300 | "initH": 50, 301 | "classType": "T2", 302 | "isLeftConnectShow": true, 303 | "isRightConnectShow": false, 304 | "containNodes": [], 305 | "attrs": [], 306 | "isSelect": false 307 | }, { 308 | "name": "Compute_2", 309 | "type": "Compute", 310 | "id": "5xcsqlke4ck0", 311 | "x": 140, 312 | "y": 260, 313 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAvCAQAAADznqqIAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAAAlgAAAJYAJvGvrMAAAAHdElNRQfeBB0OBxd1H8B3AAADO0lEQVRYw+XYS2hcVRzH8c+dyVOSmoY8SmhCTUgltUQa0Vox1RA3tRUpWB8LX0hxJ0gWLl2ILroRH1gQEQpaQTALC+JCLBZTpUmLNlUiptU0rRpijTW16SSZXDfDdCbMZCYkM0F6zubO+Z9zv+d37u+e+Z8b+MomC4pVArESG7UUDQizEWFRgYSRIgOxBsiSlOt5E+YFBRHWqDQTcsI+FwqADNX5yK2ZVV4wXgCNzJi7/iMVGeRUWOJhpfrNLhMZpN9kOaXd20r96PRKJC/PsT02WGfTSoDLQ0bcjVLbi4es0wXal/k4VoDcrBl0qku2RQuL3Gadn/yh0cZES5v37CocMmoH+v2gRmei7TnPeElVoZB1Os352kncBpo9gk4dq40sS7zIm7X6zXcGhO5Vg/u1Yr37Vhe5Xb9HwQ6VBk0YM6VFvai9os6iV+XqISOet1ufOqV6cEzcr85q0KHdPaa85ZIurSjXrWnlyDa96LJHkw7ThnDFzyK22KfRCYed0WA3HveZN/LRuzRyrxazovbr0WTcOcQNYY/HcMSkz7FTmxdV6bU1H52jwkQdW5R41TgudMCwOaNChxJG2mVGXGhEM+7wl9+9b14o9HJGRr3hJOXaUirvss2Ygw4r0YYTidRsxKQIvjCOEcM2eFLcNxY86OZcGjPtlrW2iAo9rcJRv/jEfreYdioRn3ROs6s+Bf86aqcS3+rzods9ayhtGwxcdDnXwr5iVkxMKOYh8KrQKbXJMe8IHU/q6XbFnCfwplBcLK3OGbTV6esLm0nlsO9VCAUGHAMHlTtpKtnjY83eTc59yAFljuCQTnWLMuPAoGvpDaPaEtfndTufME4pQv9kTTnKskSqVSxqCV1W48ukl2OZ//n+zmWBrFOZNp1r6Bpn66H5AlHmU59v6sJWe8qfBcnWq1Pcnmaf4pTYjXHyWhNksaHRwAupbspaFjyge4n4uA/E8nJ7PP/ZvZbcmDPVATfle6P8lzXIEc07b79RHPs/Rub9ySr7SbEyLRYXuprV4FExVVItFprJ1jubD8u97s6UQaF6tVmVBGZcTPv4OKvP4PJUBtZrSJvngktLrFaQcsyFmLJsXf8DzYj4yH++yAwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDktMTdUMTU6MjA6MjcrMDg6MDA27lEcAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTA0LTI5VDE0OjA3OjIzKzA4OjAwvrlCHgAAAE10RVh0c29mdHdhcmUASW1hZ2VNYWdpY2sgNy4wLjEtNiBRMTYgeDg2XzY0IDIwMTYtMDktMTcgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfd2aVOAAAAY3RFWHRzdmc6Y29tbWVudAAgR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICByC3WWAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAAzNDL2d9t2AAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADQxM2q5WX0AAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM5ODc1MTY0M/CJX8EAAAASdEVYdFRodW1iOjpTaXplADUuNTdLQnY4/0YAAABfdEVYdFRodW1iOjpVUkkAZmlsZTovLy9ob21lL3d3d3Jvb3Qvc2l0ZS93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExNTY2LzExNTY2OTIucG5nE69imwAAAABJRU5ErkJggg==", 314 | "width": 150, 315 | "height": 100, 316 | "initW": 150, 317 | "initH": 100, 318 | "classType": "T1", 319 | "isLeftConnectShow": true, 320 | "isRightConnectShow": true, 321 | "containNodes": [], 322 | "attrs": [], 323 | "isSelect": false 324 | }, { 325 | "name": "Compute_1", 326 | "type": "Compute", 327 | "id": "4he2wkhejti0", 328 | "x": 100, 329 | "y": 60, 330 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAvCAQAAADznqqIAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAAAlgAAAJYAJvGvrMAAAAHdElNRQfeBB0OBxd1H8B3AAADO0lEQVRYw+XYS2hcVRzH8c+dyVOSmoY8SmhCTUgltUQa0Vox1RA3tRUpWB8LX0hxJ0gWLl2ILroRH1gQEQpaQTALC+JCLBZTpUmLNlUiptU0rRpijTW16SSZXDfDdCbMZCYkM0F6zubO+Z9zv+d37u+e+Z8b+MomC4pVArESG7UUDQizEWFRgYSRIgOxBsiSlOt5E+YFBRHWqDQTcsI+FwqADNX5yK2ZVV4wXgCNzJi7/iMVGeRUWOJhpfrNLhMZpN9kOaXd20r96PRKJC/PsT02WGfTSoDLQ0bcjVLbi4es0wXal/k4VoDcrBl0qku2RQuL3Gadn/yh0cZES5v37CocMmoH+v2gRmei7TnPeElVoZB1Os352kncBpo9gk4dq40sS7zIm7X6zXcGhO5Vg/u1Yr37Vhe5Xb9HwQ6VBk0YM6VFvai9os6iV+XqISOet1ufOqV6cEzcr85q0KHdPaa85ZIurSjXrWnlyDa96LJHkw7ThnDFzyK22KfRCYed0WA3HveZN/LRuzRyrxazovbr0WTcOcQNYY/HcMSkz7FTmxdV6bU1H52jwkQdW5R41TgudMCwOaNChxJG2mVGXGhEM+7wl9+9b14o9HJGRr3hJOXaUirvss2Ygw4r0YYTidRsxKQIvjCOEcM2eFLcNxY86OZcGjPtlrW2iAo9rcJRv/jEfreYdioRn3ROs6s+Bf86aqcS3+rzods9ayhtGwxcdDnXwr5iVkxMKOYh8KrQKbXJMe8IHU/q6XbFnCfwplBcLK3OGbTV6esLm0nlsO9VCAUGHAMHlTtpKtnjY83eTc59yAFljuCQTnWLMuPAoGvpDaPaEtfndTufME4pQv9kTTnKskSqVSxqCV1W48ukl2OZ//n+zmWBrFOZNp1r6Bpn66H5AlHmU59v6sJWe8qfBcnWq1Pcnmaf4pTYjXHyWhNksaHRwAupbspaFjyge4n4uA/E8nJ7PP/ZvZbcmDPVATfle6P8lzXIEc07b79RHPs/Rub9ySr7SbEyLRYXuprV4FExVVItFprJ1jubD8u97s6UQaF6tVmVBGZcTPv4OKvP4PJUBtZrSJvngktLrFaQcsyFmLJsXf8DzYj4yH++yAwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDktMTdUMTU6MjA6MjcrMDg6MDA27lEcAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTA0LTI5VDE0OjA3OjIzKzA4OjAwvrlCHgAAAE10RVh0c29mdHdhcmUASW1hZ2VNYWdpY2sgNy4wLjEtNiBRMTYgeDg2XzY0IDIwMTYtMDktMTcgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfd2aVOAAAAY3RFWHRzdmc6Y29tbWVudAAgR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICByC3WWAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAAzNDL2d9t2AAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADQxM2q5WX0AAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM5ODc1MTY0M/CJX8EAAAASdEVYdFRodW1iOjpTaXplADUuNTdLQnY4/0YAAABfdEVYdFRodW1iOjpVUkkAZmlsZTovLy9ob21lL3d3d3Jvb3Qvc2l0ZS93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExNTY2LzExNTY2OTIucG5nE69imwAAAABJRU5ErkJggg==", 331 | "width": 150, 332 | "height": 100, 333 | "initW": 150, 334 | "initH": 100, 335 | "classType": "T1", 336 | "isLeftConnectShow": false, 337 | "isRightConnectShow": true, 338 | "containNodes": [], 339 | "attrs": [], 340 | "isSelect": false 341 | }], 342 | "connectors": [{ 343 | "type": "Line", 344 | "strokeW":10, 345 | "color":"#DE4516", 346 | "targetNode": { 347 | "x": 460, 348 | "y": 180, 349 | "id": "3e9gd7rqais0", 350 | "width": 50, 351 | "height": 50 352 | }, 353 | "sourceNode": { 354 | "x": 100, 355 | "y": 60, 356 | "id": "4he2wkhejti0", 357 | "width": 150, 358 | "height": 100 359 | }, 360 | "isSelect": false 361 | }, { 362 | "type": "Line", 363 | "strokeW":5, 364 | "color":"#3399ff", 365 | "targetNode": { 366 | "x": 140, 367 | "y": 260, 368 | "id": "5xcsqlke4ck0", 369 | "width": 150, 370 | "height": 100 371 | }, 372 | "sourceNode": { 373 | "x": 140, 374 | "y": 260, 375 | "id": "5xcsqlke4ck0", 376 | "width": 150, 377 | "height": 100 378 | }, 379 | "isSelect": false 380 | }] 381 | } 382 | export default topoJson 383 | -------------------------------------------------------------------------------- /src/less/index.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/src/less/index.css -------------------------------------------------------------------------------- /src/less/index.less: -------------------------------------------------------------------------------- 1 | @theme-color:#f3f3f3; 2 | @theme-font-color:#525252; -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import ElementUI from 'element-ui' 7 | import $ from 'jquery' 8 | import nlComponentLib from './nlComponentLib' 9 | 10 | import 'element-ui/lib/theme-chalk/index.css' 11 | import 'element-ui/lib/theme-chalk/display.css' 12 | import 'font-awesome/css/font-awesome.css' 13 | import '../static/css/reset.css' //rest样式引入 14 | 15 | 16 | Vue.config.productionTip = false 17 | 18 | Vue.use(ElementUI) 19 | Vue.use(nlComponentLib) 20 | 21 | /* eslint-disable no-new */ 22 | new Vue({ 23 | el: '#app', 24 | router, 25 | template: '', 26 | components: { App } 27 | }) 28 | -------------------------------------------------------------------------------- /src/nlComponentLib/components/nlButton.vue: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: caojing 3 | * @Date: 2018-10-23 11:36:54 4 | * @LastEditors: caojing 5 | * @LastEditTime: 2018-11-13 16:18:52 6 | */ 7 | 12 | 13 | 45 | 46 | 65 | -------------------------------------------------------------------------------- /src/nlComponentLib/components/nlPageTitle.vue: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: caojing 3 | * @Date: 2018-10-23 11:26:05 4 | * @LastEditors: caojing 5 | * @LastEditTime: 2018-11-13 16:19:15 6 | */ 7 | 15 | 16 | 33 | 38 | -------------------------------------------------------------------------------- /src/nlComponentLib/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: caojing 3 | * @Date: 2018-10-23 11:25:17 4 | * @Last Modified by: caojing 5 | * @Last Modified time: 2018-10-23 11:38:20 6 | */ 7 | import Vue from 'vue' 8 | import nlPageTitle from './components/nlPageTitle'; 9 | import nlButton from './components/nlButton'; 10 | export default (Vue)=>{ 11 | Vue.component("nlPageTitle",nlPageTitle); 12 | Vue.component("nlButton",nlButton) 13 | } -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | // import HelloWorld from '@/components/HelloWorld' 4 | 5 | Vue.use(Router) 6 | 7 | export default new Router({ 8 | routes: [ 9 | { 10 | path: '/', 11 | // name: 'Hello', 12 | // component: HelloWorld 13 | } 14 | ] 15 | }) 16 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1StepEngineer/vue-topo/08a7e478717e15e4e5236f1ec4bbfbafaaba56a9/static/.gitkeep -------------------------------------------------------------------------------- /static/css/reset.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | width: 100%; 5 | } 6 | 7 | body { 8 | font-family: arial, helvetica, sans-serif; 9 | font-size: 13px; 10 | font-size-adjust: none; 11 | font-stretch: normal; 12 | font-style: normal; 13 | font-variant: normal; 14 | font-weight: normal; 15 | line-height: 1.4; 16 | text-align: center; 17 | } 18 | 19 | body, 20 | ul, 21 | ol, 22 | dl, 23 | dd, 24 | h1, 25 | h2, 26 | h3, 27 | h4, 28 | h5, 29 | h6, 30 | p, 31 | form, 32 | fieldset, 33 | legend, 34 | input, 35 | textarea, 36 | select, 37 | button, 38 | th, 39 | td { 40 | margin: 0; 41 | padding: 0; 42 | } 43 | 44 | h1, 45 | h2, 46 | h3, 47 | h4, 48 | h5, 49 | h6 { 50 | font-size: 100%; 51 | font-weight: normal; 52 | } 53 | 54 | table { 55 | font-size: inherit; 56 | } 57 | 58 | input, 59 | select { 60 | font-family: arial, helvetica, clean, sans-serif; 61 | font-size: 100%; 62 | font-size-adjust: none; 63 | font-stretch: normal; 64 | font-style: normal; 65 | font-variant: normal; 66 | font-weight: normal; 67 | line-height: normal; 68 | } 69 | 70 | button { 71 | overflow: visible; 72 | } 73 | 74 | th, 75 | em, 76 | strong, 77 | b, 78 | address, 79 | cite { 80 | font-style: normal; 81 | font-weight: normal; 82 | } 83 | 84 | li { 85 | list-style-image: none; 86 | list-style-position: outside; 87 | list-style-type: none; 88 | } 89 | 90 | img, 91 | fieldset { 92 | border: 0 none; 93 | } 94 | 95 | ins { 96 | text-decoration: none; 97 | } 98 | 99 | .clearfix { 100 | zoom: 1; 101 | } 102 | 103 | .clearfix:after { 104 | content: ''; 105 | display: block; 106 | clear: both; 107 | } 108 | -------------------------------------------------------------------------------- /topoJson.json: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": [{ 3 | "name": "New_Cloud_2", 4 | "type": "T1", 5 | "id": "34ls07hv9zw0", 6 | "x": 620, 7 | "y": 40, 8 | "icon": "data:image/png;base64,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", 9 | "width": 150, 10 | "height": 100, 11 | "initW": 150, 12 | "initH": 100, 13 | "isLeftConnectShow": true, 14 | "isRightConnectShow": false, 15 | "containNodes": [], 16 | "attrs": [], 17 | "isSelect": false 18 | }, { 19 | "name": "New_Sercurity_4", 20 | "type": "T2", 21 | "id": "6mcyevkii4g0", 22 | "x": 720, 23 | "y": 220, 24 | "icon": "data:image/png;base64,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", 25 | "width": 50, 26 | "height": 50, 27 | "initW": 50, 28 | "initH": 50, 29 | "isLeftConnectShow": true, 30 | "isRightConnectShow": false, 31 | "containNodes": [], 32 | "attrs": [], 33 | "isSelect": false 34 | }, { 35 | "name": "New_message_2", 36 | "type": "T1", 37 | "id": "6we4dyy14ng0", 38 | "x": 60, 39 | "y": 60, 40 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAYFBMVEUAAAAFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwgFBwj///8kFXhAAAAAHnRSTlMAAAAAAAAABBsfHgDG4uEAH///AAAAAAAAAAAAAABDf+8HAAAAAWJLR0QfBQ0QvQAAAAd0SU1FB9wGGRIfIZXo8p8AAAC/SURBVEjH7ZTLDoQgDEV9oYiCiuJb//8zp4FVzWTSzuxG746Uo7ftDVH06L6KkzQTIkuTmAjkhSyVKmWRE4FK1toYXcuKCDSt7qztdNsQAaGMPU9rlLgRwJ4Sew+8TUOQRD+4cXRDLyhxCp8PIv0kNBD0vo3JhzkIIj37EQXBoGZcnQBYsIfVLyEIVrHi6gLAhj3sGNhxdQPg4sFhwF0cAnDgG+PH4/ENwLbEbpo9Vvbi2NH4NXwx9kB9LR/9nV5F3ifPVzHocAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0wOS0xN1QxNToxODowMSswODowMJ0uRa4AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTItMDYtMjVUMTg6MzE6MzMrMDg6MDDdMmKEAAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADI1NunDRBkAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMjU2ejIURAAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxMzQwNjIwMjkzKwS6NgAAABB0RVh0VGh1bWI6OlNpemUANTc3QtRUFGYAAABfdEVYdFRodW1iOjpVUkkAZmlsZTovLy9ob21lL3d3d3Jvb3Qvc2l0ZS93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzEwNzQ5LzEwNzQ5OTUucG5nFCa7PwAAAABJRU5ErkJggg==", 41 | "width": 425, 42 | "height": 180, 43 | "initW": 150, 44 | "initH": 100, 45 | "isLeftConnectShow": true, 46 | "isRightConnectShow": true, 47 | "containNodes": ["2b6spnktzphc", "4up0c1sqs040"], 48 | "attrs": [], 49 | "isSelect": false 50 | }, { 51 | "name": "New_Compute_2", 52 | "type": "T1", 53 | "id": "2b6spnktzphc", 54 | "x": 85, 55 | "y": 90, 56 | "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAAvCAQAAADznqqIAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAAAlgAAAJYAJvGvrMAAAAHdElNRQfeBB0OBxd1H8B3AAADO0lEQVRYw+XYS2hcVRzH8c+dyVOSmoY8SmhCTUgltUQa0Vox1RA3tRUpWB8LX0hxJ0gWLl2ILroRH1gQEQpaQTALC+JCLBZTpUmLNlUiptU0rRpijTW16SSZXDfDdCbMZCYkM0F6zubO+Z9zv+d37u+e+Z8b+MomC4pVArESG7UUDQizEWFRgYSRIgOxBsiSlOt5E+YFBRHWqDQTcsI+FwqADNX5yK2ZVV4wXgCNzJi7/iMVGeRUWOJhpfrNLhMZpN9kOaXd20r96PRKJC/PsT02WGfTSoDLQ0bcjVLbi4es0wXal/k4VoDcrBl0qku2RQuL3Gadn/yh0cZES5v37CocMmoH+v2gRmei7TnPeElVoZB1Os352kncBpo9gk4dq40sS7zIm7X6zXcGhO5Vg/u1Yr37Vhe5Xb9HwQ6VBk0YM6VFvai9os6iV+XqISOet1ufOqV6cEzcr85q0KHdPaa85ZIurSjXrWnlyDa96LJHkw7ThnDFzyK22KfRCYed0WA3HveZN/LRuzRyrxazovbr0WTcOcQNYY/HcMSkz7FTmxdV6bU1H52jwkQdW5R41TgudMCwOaNChxJG2mVGXGhEM+7wl9+9b14o9HJGRr3hJOXaUirvss2Ygw4r0YYTidRsxKQIvjCOEcM2eFLcNxY86OZcGjPtlrW2iAo9rcJRv/jEfreYdioRn3ROs6s+Bf86aqcS3+rzods9ayhtGwxcdDnXwr5iVkxMKOYh8KrQKbXJMe8IHU/q6XbFnCfwplBcLK3OGbTV6esLm0nlsO9VCAUGHAMHlTtpKtnjY83eTc59yAFljuCQTnWLMuPAoGvpDaPaEtfndTufME4pQv9kTTnKskSqVSxqCV1W48ukl2OZ//n+zmWBrFOZNp1r6Bpn66H5AlHmU59v6sJWe8qfBcnWq1Pcnmaf4pTYjXHyWhNksaHRwAupbspaFjyge4n4uA/E8nJ7PP/ZvZbcmDPVATfle6P8lzXIEc07b79RHPs/Rub9ySr7SbEyLRYXuprV4FExVVItFprJ1jubD8u97s6UQaF6tVmVBGZcTPv4OKvP4PJUBtZrSJvngktLrFaQcsyFmLJsXf8DzYj4yH++yAwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDktMTdUMTU6MjA6MjcrMDg6MDA27lEcAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTA0LTI5VDE0OjA3OjIzKzA4OjAwvrlCHgAAAE10RVh0c29mdHdhcmUASW1hZ2VNYWdpY2sgNy4wLjEtNiBRMTYgeDg2XzY0IDIwMTYtMDktMTcgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfd2aVOAAAAY3RFWHRzdmc6Y29tbWVudAAgR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICByC3WWAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAAzNDL2d9t2AAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADQxM2q5WX0AAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTM5ODc1MTY0M/CJX8EAAAASdEVYdFRodW1iOjpTaXplADUuNTdLQnY4/0YAAABfdEVYdFRodW1iOjpVUkkAZmlsZTovLy9ob21lL3d3d3Jvb3Qvc2l0ZS93d3cuZWFzeWljb24ubmV0L2Nkbi1pbWcuZWFzeWljb24uY24vc3JjLzExNTY2LzExNTY2OTIucG5nE69imwAAAABJRU5ErkJggg==", 57 | "width": 200, 58 | "height": 140, 59 | "initW": 150, 60 | "initH": 100, 61 | "isLeftConnectShow": false, 62 | "isRightConnectShow": false, 63 | "containNodes": ["6zj25w7bblc0"], 64 | "attrs": [], 65 | "isSelect": false 66 | }, { 67 | "name": "New_Database_2", 68 | "type": "T1", 69 | "id": "6zj25w7bblc0", 70 | "x": 110, 71 | "y": 120, 72 | "icon": "data:image/png;base64,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", 73 | "width": 150, 74 | "height": 100, 75 | "initW": 150, 76 | "initH": 100, 77 | "isLeftConnectShow": false, 78 | "isRightConnectShow": false, 79 | "containNodes": [], 80 | "attrs": [], 81 | "isSelect": false 82 | }, { 83 | "name": "New_Network_3", 84 | "type": "T1", 85 | "id": "4up0c1sqs040", 86 | "x": 310, 87 | "y": 90, 88 | "icon": "data:image/png;base64,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", 89 | "width": 150, 90 | "height": 100, 91 | "initW": 150, 92 | "initH": 100, 93 | "isLeftConnectShow": false, 94 | "isRightConnectShow": false, 95 | "containNodes": [], 96 | "attrs": [], 97 | "isSelect": false 98 | }], 99 | "connectors": [{ 100 | "type": "Line", 101 | "targetNode": { 102 | "x": 620, 103 | "y": 40, 104 | "id": "34ls07hv9zw0", 105 | "width": 150, 106 | "height": 100 107 | }, 108 | "sourceNode": { 109 | "x": 60, 110 | "y": 60, 111 | "id": "6we4dyy14ng0", 112 | "width": 425, 113 | "height": 180 114 | }, 115 | "isSelect": false 116 | }, { 117 | "type": "Contain", 118 | "sourceNode": { 119 | "id": "2b6spnktzphc", 120 | "width": 200, 121 | "height": 140, 122 | "x": 85, 123 | "y": 90 124 | }, 125 | "targetNode": { 126 | "id": "6we4dyy14ng0", 127 | "width": 425, 128 | "height": 180, 129 | "x": 60, 130 | "y": 60 131 | }, 132 | "isSelect": false 133 | }, { 134 | "type": "Line", 135 | "targetNode": { 136 | "x": 60, 137 | "y": 60, 138 | "id": "6we4dyy14ng0", 139 | "width": 425, 140 | "height": 180 141 | }, 142 | "sourceNode": { 143 | "x": 60, 144 | "y": 60, 145 | "id": "6we4dyy14ng0", 146 | "width": 425, 147 | "height": 180 148 | }, 149 | "isSelect": false 150 | }, { 151 | "type": "Contain", 152 | "sourceNode": { 153 | "id": "4up0c1sqs040", 154 | "width": 150, 155 | "height": 100, 156 | "x": 310, 157 | "y": 90 158 | }, 159 | "targetNode": { 160 | "id": "6we4dyy14ng0", 161 | "width": 425, 162 | "height": 180, 163 | "x": 60, 164 | "y": 60 165 | }, 166 | "isSelect": false 167 | }, { 168 | "type": "Contain", 169 | "sourceNode": { 170 | "id": "6zj25w7bblc0", 171 | "width": 150, 172 | "height": 100, 173 | "x": 110, 174 | "y": 120 175 | }, 176 | "targetNode": { 177 | "id": "2b6spnktzphc", 178 | "width": 200, 179 | "height": 140, 180 | "x": 85, 181 | "y": 90 182 | }, 183 | "isSelect": false 184 | }, { 185 | "type": "Line", 186 | "targetNode": { 187 | "x": 720, 188 | "y": 220, 189 | "id": "6mcyevkii4g0", 190 | "width": 50, 191 | "height": 50 192 | }, 193 | "sourceNode": { 194 | "x": 60, 195 | "y": 60, 196 | "id": "6we4dyy14ng0", 197 | "width": 425, 198 | "height": 180 199 | }, 200 | "isSelect": false 201 | }] 202 | } --------------------------------------------------------------------------------