diff --git a/.eslintrc.js b/.eslintrc.js index c977505478..bd03f8edfc 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -69,6 +69,7 @@ module.exports = { 'newIsCap': true, 'capIsNew': false }], + 'vue/no-unused-components': 'off', 'new-parens': 2, 'no-array-constructor': 2, 'no-caller': 2, diff --git a/package.json b/package.json index 02f68e2376..aaa3fd6695 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "file-saver": "2.0.1", "fuse.js": "3.4.4", "js-cookie": "2.2.0", + "js-yaml": "^4.1.0", "jsonlint": "1.6.3", "jszip": "3.2.1", "normalize.css": "7.0.0", @@ -35,13 +36,16 @@ "script-loader": "0.7.2", "sortablejs": "1.8.4", "tui-editor": "1.3.3", + "vis-network": "^9.1.9", "vue": "2.6.10", "vue-count-to": "1.0.13", "vue-router": "3.0.2", "vue-splitpane": "1.0.4", "vuedraggable": "2.20.0", "vuex": "3.1.0", - "xlsx": "0.14.1" + "xlsx": "0.14.1", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0" }, "devDependencies": { "@vue/cli-plugin-babel": "4.4.4", diff --git a/src/assets/custom-theme/topology.png b/src/assets/custom-theme/topology.png new file mode 100644 index 0000000000..8ccaf62888 Binary files /dev/null and b/src/assets/custom-theme/topology.png differ diff --git a/src/config/APIconfig.js b/src/config/APIconfig.js new file mode 100644 index 0000000000..561c297687 --- /dev/null +++ b/src/config/APIconfig.js @@ -0,0 +1,2 @@ +// src/config/apiConfig.js +export const API_URL = 'http://localhost:3000' diff --git a/src/router/index.js b/src/router/index.js index 2be959d295..a657eec16f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -7,10 +7,10 @@ Vue.use(Router) import Layout from '@/layout' /* Router Modules */ -import componentsRouter from './modules/components' +// import componentsRouter from './modules/components' import chartsRouter from './modules/charts' import tableRouter from './modules/table' -import nestedRouter from './modules/nested' +// import nestedRouter from './modules/nested' /** * Note: sub-menu only appear when route children.length >= 1 @@ -79,46 +79,32 @@ export const constantRoutes = [ path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', - meta: { title: 'Dashboard', icon: 'dashboard', affix: true } + meta: { title: '首页', icon: 'dashboard', affix: true } } ] }, { - path: '/documentation', + path: '/grafana', component: Layout, children: [ { path: 'index', - component: () => import('@/views/documentation/index'), - name: 'Documentation', - meta: { title: 'Documentation', icon: 'documentation', affix: true } + component: () => import('@/views/grafana/index'), + name: 'Grafana', + meta: { title: '算力可视化', icon: 'chart', affix: true } } ] }, { - path: '/guide', + path: '/schedule', component: Layout, - redirect: '/guide/index', + redirect: '/schedule/index', children: [ { path: 'index', - component: () => import('@/views/guide/index'), - name: 'Guide', - meta: { title: 'Guide', icon: 'guide', noCache: true } - } - ] - }, - { - path: '/profile', - component: Layout, - redirect: '/profile/index', - hidden: true, - children: [ - { - path: 'index', - component: () => import('@/views/profile/index'), - name: 'Profile', - meta: { title: 'Profile', icon: 'user', noCache: true } + component: () => import('@/views/schedule/index'), + name: 'Schedule', + meta: { title: '调度决策', icon: 'guide', noCache: true } } ] } @@ -129,256 +115,18 @@ export const constantRoutes = [ * the routes that need to be dynamically loaded based on user roles */ export const asyncRoutes = [ - { - path: '/permission', - component: Layout, - redirect: '/permission/page', - alwaysShow: true, // will always show the root menu - name: 'Permission', - meta: { - title: 'Permission', - icon: 'lock', - roles: ['admin', 'editor'] // you can set roles in root nav - }, - children: [ - { - path: 'page', - component: () => import('@/views/permission/page'), - name: 'PagePermission', - meta: { - title: 'Page Permission', - roles: ['admin'] // or you can only set roles in sub nav - } - }, - { - path: 'directive', - component: () => import('@/views/permission/directive'), - name: 'DirectivePermission', - meta: { - title: 'Directive Permission' - // if do not set roles, means: this page does not require permission - } - }, - { - path: 'role', - component: () => import('@/views/permission/role'), - name: 'RolePermission', - meta: { - title: 'Role Permission', - roles: ['admin'] - } - } - ] - }, - - { - path: '/icon', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/icons/index'), - name: 'Icons', - meta: { title: 'Icons', icon: 'icon', noCache: true } - } - ] - }, - /** when your routing map is too long, you can split it into small modules **/ - componentsRouter, chartsRouter, - nestedRouter, tableRouter, - - { - path: '/example', - component: Layout, - redirect: '/example/list', - name: 'Example', - meta: { - title: 'Example', - icon: 'el-icon-s-help' - }, - children: [ - { - path: 'create', - component: () => import('@/views/example/create'), - name: 'CreateArticle', - meta: { title: 'Create Article', icon: 'edit' } - }, - { - path: 'edit/:id(\\d+)', - component: () => import('@/views/example/edit'), - name: 'EditArticle', - meta: { title: 'Edit Article', noCache: true, activeMenu: '/example/list' }, - hidden: true - }, - { - path: 'list', - component: () => import('@/views/example/list'), - name: 'ArticleList', - meta: { title: 'Article List', icon: 'list' } - } - ] - }, - - { - path: '/tab', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/tab/index'), - name: 'Tab', - meta: { title: 'Tab', icon: 'tab' } - } - ] - }, - - { - path: '/error', - component: Layout, - redirect: 'noRedirect', - name: 'ErrorPages', - meta: { - title: 'Error Pages', - icon: '404' - }, - children: [ - { - path: '401', - component: () => import('@/views/error-page/401'), - name: 'Page401', - meta: { title: '401', noCache: true } - }, - { - path: '404', - component: () => import('@/views/error-page/404'), - name: 'Page404', - meta: { title: '404', noCache: true } - } - ] - }, - { - path: '/error-log', - component: Layout, - children: [ - { - path: 'log', - component: () => import('@/views/error-log/index'), - name: 'ErrorLog', - meta: { title: 'Error Log', icon: 'bug' } - } - ] - }, - - { - path: '/excel', - component: Layout, - redirect: '/excel/export-excel', - name: 'Excel', - meta: { - title: 'Excel', - icon: 'excel' - }, - children: [ - { - path: 'export-excel', - component: () => import('@/views/excel/export-excel'), - name: 'ExportExcel', - meta: { title: 'Export Excel' } - }, - { - path: 'export-selected-excel', - component: () => import('@/views/excel/select-excel'), - name: 'SelectExcel', - meta: { title: 'Export Selected' } - }, - { - path: 'export-merge-header', - component: () => import('@/views/excel/merge-header'), - name: 'MergeHeader', - meta: { title: 'Merge Header' } - }, - { - path: 'upload-excel', - component: () => import('@/views/excel/upload-excel'), - name: 'UploadExcel', - meta: { title: 'Upload Excel' } - } - ] - }, - - { - path: '/zip', - component: Layout, - redirect: '/zip/download', - alwaysShow: true, - name: 'Zip', - meta: { title: 'Zip', icon: 'zip' }, - children: [ - { - path: 'download', - component: () => import('@/views/zip/index'), - name: 'ExportZip', - meta: { title: 'Export Zip' } - } - ] - }, - - { - path: '/pdf', - component: Layout, - redirect: '/pdf/index', - children: [ - { - path: 'index', - component: () => import('@/views/pdf/index'), - name: 'PDF', - meta: { title: 'PDF', icon: 'pdf' } - } - ] - }, - { - path: '/pdf/download', - component: () => import('@/views/pdf/download'), - hidden: true - }, - - { - path: '/theme', - component: Layout, - children: [ - { - path: 'index', - component: () => import('@/views/theme/index'), - name: 'Theme', - meta: { title: 'Theme', icon: 'theme' } - } - ] - }, - - { - path: '/clipboard', + path: '/icon', component: Layout, children: [ { path: 'index', - component: () => import('@/views/clipboard/index'), - name: 'ClipboardDemo', - meta: { title: 'Clipboard', icon: 'clipboard' } - } - ] - }, - - { - path: 'external-link', - component: Layout, - children: [ - { - path: 'https://github.com/PanJiaChen/vue-element-admin', - meta: { title: 'External Link', icon: 'link' } + component: () => import('@/views/icons/index'), + name: 'Icons', + meta: { title: '服务访问', icon: 'link', noCache: true } } ] }, diff --git a/src/router/modules/charts.js b/src/router/modules/charts.js index 29684dec0e..7c823a0f0a 100644 --- a/src/router/modules/charts.js +++ b/src/router/modules/charts.js @@ -3,32 +3,38 @@ import Layout from '@/layout' const chartsRouter = { - path: '/charts', + path: '/route', component: Layout, redirect: 'noRedirect', - name: 'Charts', + name: 'Route', meta: { - title: 'Charts', - icon: 'chart' + title: '路由控制', + icon: 'tree' }, children: [ { - path: 'keyboard', - component: () => import('@/views/charts/keyboard'), - name: 'KeyboardChart', - meta: { title: 'Keyboard Chart', noCache: true } + path: 'show_paths', + component: () => import('@/views/route/show_paths'), + name: 'ShowPaths', + meta: { title: '查看最短路径', noCache: true } }, { - path: 'line', - component: () => import('@/views/charts/line'), - name: 'LineChart', - meta: { title: 'Line Chart', noCache: true } + path: 'show_sid', + component: () => import('@/views/route/show_sid'), + name: 'ShowSID', + meta: { title: '查看SID', noCache: true } }, { - path: 'mix-chart', - component: () => import('@/views/charts/mix-chart'), - name: 'MixChart', - meta: { title: 'Mix Chart', noCache: true } + path: 'show_policy', + component: () => import('@/views/route/show_policy.vue'), + name: 'ShowPolicy', + meta: { title: '路由策略管理', noCache: true } + }, + { + path: 'show_steer', + component: () => import('@/views/route/show_steer'), + name: 'ShowSteer', + meta: { title: '引导策略管理', noCache: true } } ] } diff --git a/src/router/modules/table.js b/src/router/modules/table.js index ec28c527c8..f87def564d 100644 --- a/src/router/modules/table.js +++ b/src/router/modules/table.js @@ -3,38 +3,26 @@ import Layout from '@/layout' const tableRouter = { - path: '/table', + path: '/deploy', component: Layout, - redirect: '/table/complex-table', - name: 'Table', + redirect: '/deploy/app', + name: 'Deploy', meta: { - title: 'Table', - icon: 'table' + title: '算力请求', + icon: 'edit' }, children: [ { - path: 'dynamic-table', - component: () => import('@/views/table/dynamic-table/index'), - name: 'DynamicTable', - meta: { title: 'Dynamic Table' } + path: 'app', + component: () => import('@/views/deploy/app.vue'), + name: 'DeployApp', + meta: { title: '应用部署' } }, { - path: 'drag-table', - component: () => import('@/views/table/drag-table'), - name: 'DragTable', - meta: { title: 'Drag Table' } - }, - { - path: 'inline-edit-table', - component: () => import('@/views/table/inline-edit-table'), - name: 'InlineEditTable', - meta: { title: 'Inline Edit' } - }, - { - path: 'complex-table', - component: () => import('@/views/table/complex-table'), - name: 'ComplexTable', - meta: { title: 'Complex Table' } + path: 'service', + component: () => import('@/views/deploy/service.vue'), + name: 'DeployService', + meta: { title: '服务部署' } } ] } diff --git a/src/views/dashboard/admin/index.vue b/src/views/dashboard/admin/index.vue index 8cb557be1f..db5f2c35e9 100644 --- a/src/views/dashboard/admin/index.vue +++ b/src/views/dashboard/admin/index.vue @@ -1,97 +1,73 @@ diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue index 1720ea8fae..b8a132801c 100644 --- a/src/views/dashboard/index.vue +++ b/src/views/dashboard/index.vue @@ -1,6 +1,7 @@ diff --git a/src/views/deploy/app.vue b/src/views/deploy/app.vue new file mode 100644 index 0000000000..de38571589 --- /dev/null +++ b/src/views/deploy/app.vue @@ -0,0 +1,196 @@ +