From 02e220485ed05218a417e5e973f3f4f17f2c2fd5 Mon Sep 17 00:00:00 2001 From: mabofu Date: Tue, 30 May 2023 16:09:41 +0800 Subject: [PATCH] Update project code --- .env | 4 +- .env.development | 3 +- .env.production | 3 +- .eslintignore | 2 +- .eslintrc.js | 11 + .gitignore | 14 +- Makefile | 38 + README.en.md | 2 + README.md | 2 + build/dsms-ui.conf | 23 + build/dsms-ui.spec | 33 + build/dsms.key | 32 + build/dsms.pem | 20 + index.html | 15 +- package.json | 100 ++- plugins.d.ts | 5 +- public/favicon.ico | Bin 4286 -> 23030 bytes settings.ts | 1 + src/App.vue | 68 +- src/api/about/index.ts | 13 + src/api/alarm/index.ts | 128 +++ src/api/block-storage/index.ts | 67 ++ src/api/cluster/index.ts | 33 + src/api/file-storage/index.ts | 57 ++ src/api/home/index.ts | 12 + src/api/login/index.ts | 2 +- src/api/monitor-center/index.ts | 71 ++ src/api/node/index.ts | 44 ++ src/api/storage/index.ts | 85 ++ src/api/task/index.ts | 14 + src/api/user/index.ts | 14 + src/assets/avatar.png | Bin 0 -> 4097 bytes src/assets/dsms_logo_.png | Bin 0 -> 5524 bytes src/assets/dsms_logo_mini.png | Bin 0 -> 9543 bytes src/components/auth/auth.vue | 30 + src/components/auth/authAll.vue | 31 + src/components/auth/auths.vue | 36 + src/components/description/index.vue | 60 ++ src/components/echarts/line.vue | 394 ++++++++++ src/components/echarts/pie.vue | 145 ++++ src/components/iconSelector/index.vue | 245 ++++++ src/components/svgIcon/index.vue | 72 ++ src/components/task/index.vue | 188 +++++ src/layout/component/columnsAside.vue | 287 +++++++ src/layout/component/main.vue | 76 +- src/layout/footer/index.vue | 2 +- src/layout/index.vue | 52 +- src/layout/logo/index.vue | 10 +- src/layout/main/classic.vue | 36 + src/layout/main/columns.vue | 42 + src/layout/main/defaults.vue | 48 ++ src/layout/main/transverse.vue | 18 + src/layout/navBars/breadcrumb/breadcrumb.vue | 170 +++- src/layout/navBars/breadcrumb/closeFull.vue | 60 ++ src/layout/navBars/breadcrumb/cluster.vue | 224 ++++++ src/layout/navBars/breadcrumb/index.vue | 118 ++- .../navBars/breadcrumb/interface/cluster.ts | 6 + src/layout/navBars/breadcrumb/setings.vue | 694 +++++++++++++++++ src/layout/navBars/breadcrumb/user.vue | 234 +++++- src/layout/navBars/breadcrumb/userNews.vue | 115 +++ src/layout/navBars/breadcrumb/version.vue | 104 +++ src/layout/navBars/index.vue | 31 +- src/layout/navBars/tagsView/tagsView.vue | 731 +++++++++++++++--- src/layout/navMenu/horizontal.vue | 151 ++++ src/layout/navMenu/subItem.vue | 43 +- src/layout/navMenu/vertical.vue | 164 ++-- src/layout/routerView/iframes.vue | 133 ++++ src/layout/routerView/parent.vue | 112 +++ src/main.ts | 11 +- src/router/frontEnd.ts | 95 +++ src/router/index.ts | 143 +++- src/router/route.ts | 366 +++++++++ src/router/routeEE.ts | 64 ++ src/router/routeTitle.ts | 20 + src/src/App.vue | 84 ++ src/src/api/about/index.ts | 13 + src/src/api/alarm/index.ts | 128 +++ src/src/api/block-storage/index.ts | 67 ++ src/src/api/cluster/index.ts | 33 + src/src/api/file-storage/index.ts | 57 ++ src/src/api/home/index.ts | 12 + src/src/api/login/index.ts | 22 + src/src/api/monitor-center/index.ts | 71 ++ src/src/api/node/index.ts | 44 ++ src/src/api/storage/index.ts | 85 ++ src/src/api/task/index.ts | 14 + src/src/api/user/index.ts | 14 + src/src/assets/401.png | Bin 0 -> 30224 bytes src/src/assets/404.png | Bin 0 -> 28523 bytes src/src/assets/avatar.png | Bin 0 -> 4097 bytes src/src/assets/dsms_logo_.png | Bin 0 -> 5524 bytes src/src/assets/dsms_logo_mini.png | Bin 0 -> 9543 bytes src/src/assets/login-bg.png | Bin 0 -> 1333247 bytes src/src/components/auth/auth.vue | 30 + src/src/components/auth/authAll.vue | 31 + src/src/components/auth/auths.vue | 36 + src/src/components/description/index.vue | 60 ++ src/src/components/echarts/line.vue | 394 ++++++++++ src/src/components/echarts/pie.vue | 145 ++++ src/src/components/iconSelector/index.vue | 245 ++++++ src/src/components/svgIcon/index.vue | 72 ++ src/src/components/task/index.vue | 188 +++++ src/src/layout/component/aside.vue | 165 ++++ src/src/layout/component/columnsAside.vue | 287 +++++++ src/src/layout/component/header.vue | 34 + src/src/layout/component/main.vue | 229 ++++++ src/src/layout/footer/index.vue | 46 ++ src/src/layout/index.vue | 51 ++ src/src/layout/logo/index.vue | 83 ++ src/src/layout/main/classic.vue | 36 + src/src/layout/main/columns.vue | 42 + src/src/layout/main/defaults.vue | 48 ++ src/src/layout/main/transverse.vue | 18 + .../layout/navBars/breadcrumb/breadcrumb.vue | 165 ++++ .../layout/navBars/breadcrumb/closeFull.vue | 60 ++ src/src/layout/navBars/breadcrumb/cluster.vue | 224 ++++++ src/src/layout/navBars/breadcrumb/index.vue | 121 +++ .../navBars/breadcrumb/interface/cluster.ts | 6 + src/src/layout/navBars/breadcrumb/setings.vue | 694 +++++++++++++++++ src/src/layout/navBars/breadcrumb/user.vue | 208 +++++ .../layout/navBars/breadcrumb/userNews.vue | 115 +++ src/src/layout/navBars/breadcrumb/version.vue | 104 +++ src/src/layout/navBars/index.vue | 39 + .../layout/navBars/tagsView/contextmenu.vue | 133 ++++ src/src/layout/navBars/tagsView/tagsView.vue | 687 ++++++++++++++++ src/src/layout/navMenu/horizontal.vue | 151 ++++ src/src/layout/navMenu/subItem.vue | 48 ++ src/src/layout/navMenu/vertical.vue | 93 +++ src/src/layout/routerView/iframes.vue | 133 ++++ src/src/layout/routerView/parent.vue | 112 +++ src/src/main.ts | 21 + src/src/router/frontEnd.ts | 95 +++ src/src/router/index.ts | 103 +++ src/src/router/route.ts | 366 +++++++++ src/src/router/routeEE.ts | 64 ++ src/src/router/routeTitle.ts | 20 + src/src/stores/charts.ts | 55 ++ src/src/stores/global.ts | 18 + src/src/stores/index.ts | 5 + src/src/stores/interface/index.ts | 77 ++ src/src/stores/keepAliveNames.ts | 30 + src/src/stores/routesList.ts | 22 + src/src/stores/tagsViewRoutes.ts | 20 + src/src/stores/themeConfig.ts | 117 +++ src/src/stores/userInfo.ts | 36 + src/src/theme/app.scss | 352 +++++++++ src/src/theme/common.scss | 8 + src/src/theme/common/transition.scss | 94 +++ src/src/theme/dark.scss | 235 ++++++ src/src/theme/element.scss | 290 +++++++ src/src/theme/iconSelector.scss | 70 ++ src/src/theme/iconfont/demo.css | 539 +++++++++++++ src/src/theme/iconfont/demo_index.html | 717 +++++++++++++++++ src/src/theme/iconfont/iconfont.css | 107 +++ src/src/theme/iconfont/iconfont.js | 1 + src/src/theme/iconfont/iconfont.json | 170 ++++ src/src/theme/iconfont/iconfont.ttf | Bin 0 -> 9144 bytes src/src/theme/iconfont/iconfont.woff | Bin 0 -> 5968 bytes src/src/theme/iconfont/iconfont.woff2 | Bin 0 -> 4980 bytes src/src/theme/index.scss | 11 + src/src/theme/loading.scss | 51 ++ src/src/theme/media/alarm.scss | 30 + src/src/theme/media/chart.scss | 94 +++ src/src/theme/media/cityLinkage.scss | 10 + src/src/theme/media/date.scss | 24 + src/src/theme/media/dialog.scss | 12 + src/src/theme/media/error.scss | 45 ++ src/src/theme/media/form.scss | 17 + src/src/theme/media/home.scss | 23 + src/src/theme/media/index.scss | 14 + src/src/theme/media/layout.scss | 50 ++ src/src/theme/media/login.scss | 63 ++ src/src/theme/media/media.scss | 14 + src/src/theme/media/pagination.scss | 16 + src/src/theme/media/personal.scss | 16 + src/src/theme/media/scrollbar.scss | 52 ++ src/src/theme/media/tagsView.scss | 11 + src/src/theme/mixins/index.scss | 50 ++ src/src/theme/other.scss | 36 + src/src/theme/reset.scss | 40 + src/src/theme/waves.scss | 94 +++ src/src/types/global.d.ts | 6 + src/src/types/index.ts | 42 + src/src/utils/arrayOperation.ts | 51 ++ src/src/utils/authDirective.ts | 35 + src/src/utils/authFunction.ts | 26 + src/src/utils/commonFunction.ts | 70 ++ src/src/utils/const.ts | 59 ++ src/src/utils/customDirective.ts | 164 ++++ src/src/utils/directive.ts | 11 + src/src/utils/formatTime.ts | 95 +++ src/src/utils/getStyleSheets.ts | 95 +++ src/src/utils/loading.ts | 38 + src/src/utils/message.ts | 21 + src/src/utils/other.ts | 252 ++++++ src/src/utils/request.ts | 75 ++ src/src/utils/setIconfont.ts | 43 ++ src/src/utils/storage.ts | 51 ++ src/src/utils/theme.ts | 39 + src/src/utils/toolsValidate.ts | 204 +++++ src/src/utils/wartermark.ts | 40 + src/src/utils/webSocket.ts | 88 +++ src/src/views/alarm/info/index.vue | 325 ++++++++ .../alarm/setting/components/alarmNotice.vue | 607 +++++++++++++++ .../setting/components/alarmStrategy.vue | 275 +++++++ src/src/views/alarm/setting/index.vue | 36 + .../views/alarm/setting/interface/index.ts | 48 ++ .../components/changeVolumeSize.vue | 90 +++ .../components/createVolume.vue | 241 ++++++ .../storage-volume/components/guideData.ts | 91 +++ .../storage-volume/components/volumeGuide.vue | 236 ++++++ .../block-storage/storage-volume/index.vue | 286 +++++++ .../cluster/node/components/diskManage.vue | 204 +++++ src/src/views/cluster/node/index.vue | 196 +++++ .../storage/components/createStoragePool.vue | 202 +++++ .../components/storagePoolDiskList.vue | 345 +++++++++ src/src/views/cluster/storage/index.vue | 226 ++++++ .../views/cluster/storage/interface/index.ts | 30 + src/src/views/error/401.vue | 106 +++ src/src/views/error/404.vue | 104 +++ .../directory/components/createDir.vue | 61 ++ .../directory/components/dirGuide.vue | 44 ++ .../views/file-storage/directory/index.vue | 215 ++++++ .../components/createFileSystem.vue | 146 ++++ .../views/file-storage/file-system/index.vue | 173 +++++ src/src/views/home/index.vue | 227 ++++++ src/src/views/login/component/account.vue | 128 +++ src/src/views/login/index.vue | 95 +++ .../components/cluster.vue | 134 ++++ .../cluster-performance/components/file.vue | 123 +++ .../cluster-performance/components/node.vue | 254 ++++++ .../cluster-performance/components/osd.vue | 262 +++++++ .../cluster-performance/components/pool.vue | 150 ++++ .../cluster-performance/components/volume.vue | 231 ++++++ .../cluster-performance/index.vue | 385 +++++++++ .../monitor-center/cluster-status/index.vue | 231 ++++++ src/src/views/no-cluster/index.vue | 28 + src/src/views/system-event/task/index.vue | 13 + src/stores/charts.ts | 55 ++ src/stores/global.ts | 18 + src/stores/interface/index.ts | 14 +- src/stores/routesList.ts | 38 +- src/theme/app.scss | 13 + src/theme/common.scss | 8 + src/theme/dark.scss | 235 ++++++ src/theme/element.scss | 27 +- src/theme/iconSelector.scss | 70 ++ src/theme/iconfont/demo.css | 539 +++++++++++++ src/theme/iconfont/demo_index.html | 717 +++++++++++++++++ src/theme/iconfont/iconfont.css | 107 +++ src/theme/iconfont/iconfont.js | 1 + src/theme/iconfont/iconfont.json | 170 ++++ src/theme/iconfont/iconfont.ttf | Bin 0 -> 9144 bytes src/theme/iconfont/iconfont.woff | Bin 0 -> 5968 bytes src/theme/iconfont/iconfont.woff2 | Bin 0 -> 4980 bytes src/theme/index.scss | 8 +- src/theme/media/alarm.scss | 30 + src/theme/media/chart.scss | 94 +++ src/theme/media/cityLinkage.scss | 10 + src/theme/media/date.scss | 24 + src/theme/media/dialog.scss | 12 + src/theme/media/error.scss | 45 ++ src/theme/media/form.scss | 17 + src/theme/media/layout.scss | 21 + src/theme/media/login.scss | 63 ++ src/theme/media/media.scss | 12 +- src/theme/media/pagination.scss | 16 + src/theme/media/personal.scss | 16 + src/theme/media/scrollbar.scss | 52 ++ src/theme/media/tagsView.scss | 11 + src/theme/mixins/index.scss | 50 ++ src/theme/other.scss | 36 + src/theme/reset.scss | 40 + src/theme/waves.scss | 94 +++ src/types/global.d.ts | 6 + src/types/index.ts | 42 + src/utils/authDirective.ts | 35 + src/utils/authFunction.ts | 26 + src/utils/commonFunction.ts | 70 ++ src/utils/const.ts | 59 ++ src/utils/customDirective.ts | 164 ++++ src/utils/directive.ts | 11 + src/utils/formatTime.ts | 63 +- src/utils/getStyleSheets.ts | 95 +++ src/utils/message.ts | 21 + src/utils/other.ts | 252 ++++++ src/utils/request.ts | 13 +- src/utils/storage.ts | 12 +- src/utils/toolsValidate.ts | 204 +++++ src/utils/wartermark.ts | 40 + src/utils/webSocket.ts | 88 +++ src/views/alarm/info/index.vue | 325 ++++++++ .../alarm/setting/components/alarmNotice.vue | 607 +++++++++++++++ .../setting/components/alarmStrategy.vue | 275 +++++++ src/views/alarm/setting/index.vue | 36 + src/views/alarm/setting/interface/index.ts | 48 ++ .../components/changeVolumeSize.vue | 90 +++ .../components/createVolume.vue | 241 ++++++ .../storage-volume/components/guideData.ts | 91 +++ .../storage-volume/components/volumeGuide.vue | 236 ++++++ .../block-storage/storage-volume/index.vue | 286 +++++++ .../cluster/node/components/diskManage.vue | 204 +++++ src/views/cluster/node/index.vue | 196 +++++ .../storage/components/createStoragePool.vue | 202 +++++ .../components/storagePoolDiskList.vue | 345 +++++++++ src/views/cluster/storage/index.vue | 226 ++++++ src/views/cluster/storage/interface/index.ts | 30 + src/views/error/401.vue | 106 +++ src/views/error/404.vue | 104 +++ .../directory/components/createDir.vue | 61 ++ .../directory/components/dirGuide.vue | 44 ++ src/views/file-storage/directory/index.vue | 215 ++++++ .../components/createFileSystem.vue | 146 ++++ src/views/file-storage/file-system/index.vue | 173 +++++ src/views/home/index.vue | 226 +++++- src/views/login/component/account.vue | 7 +- src/views/login/index.vue | 102 ++- .../components/cluster.vue | 134 ++++ .../cluster-performance/components/file.vue | 123 +++ .../cluster-performance/components/node.vue | 254 ++++++ .../cluster-performance/components/osd.vue | 262 +++++++ .../cluster-performance/components/pool.vue | 150 ++++ .../cluster-performance/components/volume.vue | 231 ++++++ .../cluster-performance/index.vue | 385 +++++++++ .../monitor-center/cluster-status/index.vue | 231 ++++++ src/views/no-cluster/index.vue | 28 + src/views/system-event/task/index.vue | 13 + tsconfig.json | 143 ++-- vite.config.ts | 50 +- 329 files changed, 34742 insertions(+), 660 deletions(-) create mode 100644 Makefile create mode 100644 build/dsms-ui.conf create mode 100644 build/dsms-ui.spec create mode 100644 build/dsms.key create mode 100644 build/dsms.pem create mode 100644 settings.ts create mode 100644 src/api/about/index.ts create mode 100644 src/api/alarm/index.ts create mode 100644 src/api/block-storage/index.ts create mode 100644 src/api/cluster/index.ts create mode 100644 src/api/file-storage/index.ts create mode 100644 src/api/home/index.ts create mode 100644 src/api/monitor-center/index.ts create mode 100644 src/api/node/index.ts create mode 100644 src/api/storage/index.ts create mode 100644 src/api/task/index.ts create mode 100644 src/api/user/index.ts create mode 100644 src/assets/avatar.png create mode 100644 src/assets/dsms_logo_.png create mode 100644 src/assets/dsms_logo_mini.png create mode 100644 src/components/auth/auth.vue create mode 100644 src/components/auth/authAll.vue create mode 100644 src/components/auth/auths.vue create mode 100644 src/components/description/index.vue create mode 100644 src/components/echarts/line.vue create mode 100644 src/components/echarts/pie.vue create mode 100644 src/components/iconSelector/index.vue create mode 100644 src/components/svgIcon/index.vue create mode 100644 src/components/task/index.vue create mode 100644 src/layout/component/columnsAside.vue create mode 100644 src/layout/main/classic.vue create mode 100644 src/layout/main/columns.vue create mode 100644 src/layout/main/defaults.vue create mode 100644 src/layout/main/transverse.vue create mode 100644 src/layout/navBars/breadcrumb/closeFull.vue create mode 100644 src/layout/navBars/breadcrumb/cluster.vue create mode 100644 src/layout/navBars/breadcrumb/interface/cluster.ts create mode 100644 src/layout/navBars/breadcrumb/setings.vue create mode 100644 src/layout/navBars/breadcrumb/userNews.vue create mode 100644 src/layout/navBars/breadcrumb/version.vue create mode 100644 src/layout/navMenu/horizontal.vue create mode 100644 src/layout/routerView/iframes.vue create mode 100644 src/layout/routerView/parent.vue create mode 100644 src/router/frontEnd.ts create mode 100644 src/router/route.ts create mode 100644 src/router/routeEE.ts create mode 100644 src/router/routeTitle.ts create mode 100644 src/src/App.vue create mode 100644 src/src/api/about/index.ts create mode 100644 src/src/api/alarm/index.ts create mode 100644 src/src/api/block-storage/index.ts create mode 100644 src/src/api/cluster/index.ts create mode 100644 src/src/api/file-storage/index.ts create mode 100644 src/src/api/home/index.ts create mode 100644 src/src/api/login/index.ts create mode 100644 src/src/api/monitor-center/index.ts create mode 100644 src/src/api/node/index.ts create mode 100644 src/src/api/storage/index.ts create mode 100644 src/src/api/task/index.ts create mode 100644 src/src/api/user/index.ts create mode 100644 src/src/assets/401.png create mode 100644 src/src/assets/404.png create mode 100644 src/src/assets/avatar.png create mode 100644 src/src/assets/dsms_logo_.png create mode 100644 src/src/assets/dsms_logo_mini.png create mode 100644 src/src/assets/login-bg.png create mode 100644 src/src/components/auth/auth.vue create mode 100644 src/src/components/auth/authAll.vue create mode 100644 src/src/components/auth/auths.vue create mode 100644 src/src/components/description/index.vue create mode 100644 src/src/components/echarts/line.vue create mode 100644 src/src/components/echarts/pie.vue create mode 100644 src/src/components/iconSelector/index.vue create mode 100644 src/src/components/svgIcon/index.vue create mode 100644 src/src/components/task/index.vue create mode 100644 src/src/layout/component/aside.vue create mode 100644 src/src/layout/component/columnsAside.vue create mode 100644 src/src/layout/component/header.vue create mode 100644 src/src/layout/component/main.vue create mode 100644 src/src/layout/footer/index.vue create mode 100644 src/src/layout/index.vue create mode 100644 src/src/layout/logo/index.vue create mode 100644 src/src/layout/main/classic.vue create mode 100644 src/src/layout/main/columns.vue create mode 100644 src/src/layout/main/defaults.vue create mode 100644 src/src/layout/main/transverse.vue create mode 100644 src/src/layout/navBars/breadcrumb/breadcrumb.vue create mode 100644 src/src/layout/navBars/breadcrumb/closeFull.vue create mode 100644 src/src/layout/navBars/breadcrumb/cluster.vue create mode 100644 src/src/layout/navBars/breadcrumb/index.vue create mode 100644 src/src/layout/navBars/breadcrumb/interface/cluster.ts create mode 100644 src/src/layout/navBars/breadcrumb/setings.vue create mode 100644 src/src/layout/navBars/breadcrumb/user.vue create mode 100644 src/src/layout/navBars/breadcrumb/userNews.vue create mode 100644 src/src/layout/navBars/breadcrumb/version.vue create mode 100644 src/src/layout/navBars/index.vue create mode 100644 src/src/layout/navBars/tagsView/contextmenu.vue create mode 100644 src/src/layout/navBars/tagsView/tagsView.vue create mode 100644 src/src/layout/navMenu/horizontal.vue create mode 100644 src/src/layout/navMenu/subItem.vue create mode 100644 src/src/layout/navMenu/vertical.vue create mode 100644 src/src/layout/routerView/iframes.vue create mode 100644 src/src/layout/routerView/parent.vue create mode 100644 src/src/main.ts create mode 100644 src/src/router/frontEnd.ts create mode 100644 src/src/router/index.ts create mode 100644 src/src/router/route.ts create mode 100644 src/src/router/routeEE.ts create mode 100644 src/src/router/routeTitle.ts create mode 100644 src/src/stores/charts.ts create mode 100644 src/src/stores/global.ts create mode 100644 src/src/stores/index.ts create mode 100644 src/src/stores/interface/index.ts create mode 100644 src/src/stores/keepAliveNames.ts create mode 100644 src/src/stores/routesList.ts create mode 100644 src/src/stores/tagsViewRoutes.ts create mode 100644 src/src/stores/themeConfig.ts create mode 100644 src/src/stores/userInfo.ts create mode 100644 src/src/theme/app.scss create mode 100644 src/src/theme/common.scss create mode 100644 src/src/theme/common/transition.scss create mode 100644 src/src/theme/dark.scss create mode 100644 src/src/theme/element.scss create mode 100644 src/src/theme/iconSelector.scss create mode 100644 src/src/theme/iconfont/demo.css create mode 100644 src/src/theme/iconfont/demo_index.html create mode 100644 src/src/theme/iconfont/iconfont.css create mode 100644 src/src/theme/iconfont/iconfont.js create mode 100644 src/src/theme/iconfont/iconfont.json create mode 100644 src/src/theme/iconfont/iconfont.ttf create mode 100644 src/src/theme/iconfont/iconfont.woff create mode 100644 src/src/theme/iconfont/iconfont.woff2 create mode 100644 src/src/theme/index.scss create mode 100644 src/src/theme/loading.scss create mode 100644 src/src/theme/media/alarm.scss create mode 100644 src/src/theme/media/chart.scss create mode 100644 src/src/theme/media/cityLinkage.scss create mode 100644 src/src/theme/media/date.scss create mode 100644 src/src/theme/media/dialog.scss create mode 100644 src/src/theme/media/error.scss create mode 100644 src/src/theme/media/form.scss create mode 100644 src/src/theme/media/home.scss create mode 100644 src/src/theme/media/index.scss create mode 100644 src/src/theme/media/layout.scss create mode 100644 src/src/theme/media/login.scss create mode 100644 src/src/theme/media/media.scss create mode 100644 src/src/theme/media/pagination.scss create mode 100644 src/src/theme/media/personal.scss create mode 100644 src/src/theme/media/scrollbar.scss create mode 100644 src/src/theme/media/tagsView.scss create mode 100644 src/src/theme/mixins/index.scss create mode 100644 src/src/theme/other.scss create mode 100644 src/src/theme/reset.scss create mode 100644 src/src/theme/waves.scss create mode 100644 src/src/types/global.d.ts create mode 100644 src/src/types/index.ts create mode 100644 src/src/utils/arrayOperation.ts create mode 100644 src/src/utils/authDirective.ts create mode 100644 src/src/utils/authFunction.ts create mode 100644 src/src/utils/commonFunction.ts create mode 100644 src/src/utils/const.ts create mode 100644 src/src/utils/customDirective.ts create mode 100644 src/src/utils/directive.ts create mode 100644 src/src/utils/formatTime.ts create mode 100644 src/src/utils/getStyleSheets.ts create mode 100644 src/src/utils/loading.ts create mode 100644 src/src/utils/message.ts create mode 100644 src/src/utils/other.ts create mode 100644 src/src/utils/request.ts create mode 100644 src/src/utils/setIconfont.ts create mode 100644 src/src/utils/storage.ts create mode 100644 src/src/utils/theme.ts create mode 100644 src/src/utils/toolsValidate.ts create mode 100644 src/src/utils/wartermark.ts create mode 100644 src/src/utils/webSocket.ts create mode 100644 src/src/views/alarm/info/index.vue create mode 100644 src/src/views/alarm/setting/components/alarmNotice.vue create mode 100644 src/src/views/alarm/setting/components/alarmStrategy.vue create mode 100644 src/src/views/alarm/setting/index.vue create mode 100644 src/src/views/alarm/setting/interface/index.ts create mode 100644 src/src/views/block-storage/storage-volume/components/changeVolumeSize.vue create mode 100644 src/src/views/block-storage/storage-volume/components/createVolume.vue create mode 100644 src/src/views/block-storage/storage-volume/components/guideData.ts create mode 100644 src/src/views/block-storage/storage-volume/components/volumeGuide.vue create mode 100644 src/src/views/block-storage/storage-volume/index.vue create mode 100644 src/src/views/cluster/node/components/diskManage.vue create mode 100644 src/src/views/cluster/node/index.vue create mode 100644 src/src/views/cluster/storage/components/createStoragePool.vue create mode 100644 src/src/views/cluster/storage/components/storagePoolDiskList.vue create mode 100644 src/src/views/cluster/storage/index.vue create mode 100644 src/src/views/cluster/storage/interface/index.ts create mode 100644 src/src/views/error/401.vue create mode 100644 src/src/views/error/404.vue create mode 100644 src/src/views/file-storage/directory/components/createDir.vue create mode 100644 src/src/views/file-storage/directory/components/dirGuide.vue create mode 100644 src/src/views/file-storage/directory/index.vue create mode 100644 src/src/views/file-storage/file-system/components/createFileSystem.vue create mode 100644 src/src/views/file-storage/file-system/index.vue create mode 100644 src/src/views/home/index.vue create mode 100644 src/src/views/login/component/account.vue create mode 100644 src/src/views/login/index.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/cluster.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/file.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/node.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/osd.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/pool.vue create mode 100644 src/src/views/monitor-center/cluster-performance/components/volume.vue create mode 100644 src/src/views/monitor-center/cluster-performance/index.vue create mode 100644 src/src/views/monitor-center/cluster-status/index.vue create mode 100644 src/src/views/no-cluster/index.vue create mode 100644 src/src/views/system-event/task/index.vue create mode 100644 src/stores/charts.ts create mode 100644 src/stores/global.ts create mode 100644 src/theme/common.scss create mode 100644 src/theme/dark.scss create mode 100644 src/theme/iconSelector.scss create mode 100644 src/theme/iconfont/demo.css create mode 100644 src/theme/iconfont/demo_index.html create mode 100644 src/theme/iconfont/iconfont.css create mode 100644 src/theme/iconfont/iconfont.js create mode 100644 src/theme/iconfont/iconfont.json create mode 100644 src/theme/iconfont/iconfont.ttf create mode 100644 src/theme/iconfont/iconfont.woff create mode 100644 src/theme/iconfont/iconfont.woff2 create mode 100644 src/theme/media/alarm.scss create mode 100644 src/theme/media/chart.scss create mode 100644 src/theme/media/cityLinkage.scss create mode 100644 src/theme/media/date.scss create mode 100644 src/theme/media/dialog.scss create mode 100644 src/theme/media/error.scss create mode 100644 src/theme/media/form.scss create mode 100644 src/theme/media/login.scss create mode 100644 src/theme/media/pagination.scss create mode 100644 src/theme/media/personal.scss create mode 100644 src/theme/media/scrollbar.scss create mode 100644 src/theme/media/tagsView.scss create mode 100644 src/theme/mixins/index.scss create mode 100644 src/theme/other.scss create mode 100644 src/theme/reset.scss create mode 100644 src/theme/waves.scss create mode 100644 src/types/global.d.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/authDirective.ts create mode 100644 src/utils/authFunction.ts create mode 100644 src/utils/commonFunction.ts create mode 100644 src/utils/const.ts create mode 100644 src/utils/customDirective.ts create mode 100644 src/utils/directive.ts create mode 100644 src/utils/getStyleSheets.ts create mode 100644 src/utils/message.ts create mode 100644 src/utils/other.ts create mode 100644 src/utils/toolsValidate.ts create mode 100644 src/utils/wartermark.ts create mode 100644 src/utils/webSocket.ts create mode 100644 src/views/alarm/info/index.vue create mode 100644 src/views/alarm/setting/components/alarmNotice.vue create mode 100644 src/views/alarm/setting/components/alarmStrategy.vue create mode 100644 src/views/alarm/setting/index.vue create mode 100644 src/views/alarm/setting/interface/index.ts create mode 100644 src/views/block-storage/storage-volume/components/changeVolumeSize.vue create mode 100644 src/views/block-storage/storage-volume/components/createVolume.vue create mode 100644 src/views/block-storage/storage-volume/components/guideData.ts create mode 100644 src/views/block-storage/storage-volume/components/volumeGuide.vue create mode 100644 src/views/block-storage/storage-volume/index.vue create mode 100644 src/views/cluster/node/components/diskManage.vue create mode 100644 src/views/cluster/node/index.vue create mode 100644 src/views/cluster/storage/components/createStoragePool.vue create mode 100644 src/views/cluster/storage/components/storagePoolDiskList.vue create mode 100644 src/views/cluster/storage/index.vue create mode 100644 src/views/cluster/storage/interface/index.ts create mode 100644 src/views/error/401.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/file-storage/directory/components/createDir.vue create mode 100644 src/views/file-storage/directory/components/dirGuide.vue create mode 100644 src/views/file-storage/directory/index.vue create mode 100644 src/views/file-storage/file-system/components/createFileSystem.vue create mode 100644 src/views/file-storage/file-system/index.vue create mode 100644 src/views/monitor-center/cluster-performance/components/cluster.vue create mode 100644 src/views/monitor-center/cluster-performance/components/file.vue create mode 100644 src/views/monitor-center/cluster-performance/components/node.vue create mode 100644 src/views/monitor-center/cluster-performance/components/osd.vue create mode 100644 src/views/monitor-center/cluster-performance/components/pool.vue create mode 100644 src/views/monitor-center/cluster-performance/components/volume.vue create mode 100644 src/views/monitor-center/cluster-performance/index.vue create mode 100644 src/views/monitor-center/cluster-status/index.vue create mode 100644 src/views/no-cluster/index.vue create mode 100644 src/views/system-event/task/index.vue diff --git a/.env b/.env index d546358..3166b32 100644 --- a/.env +++ b/.env @@ -1,8 +1,8 @@ # port -VITE_PORT = 16801 +VITE_PORT = 8888 # Automatically open the browser when running npm run dev -VITE_OPEN = false +VITE_OPEN = http://localhost:8888/ # When public path configures online environment path (packaging) and local access through http server, please leave it blank VITE_PUBLIC_PATH = \ No newline at end of file diff --git a/.env.development b/.env.development index 76f6759..682ca90 100644 --- a/.env.development +++ b/.env.development @@ -2,4 +2,5 @@ ENV = 'development' # Local environment interface address -VITE_API_URL = 'https://localhost:18443' \ No newline at end of file +VITE_API_URL = 'https://localhost:18443' +VITE_PUBLIC_PATH = './' \ No newline at end of file diff --git a/.env.production b/.env.production index e1d7110..3cf7aee 100644 --- a/.env.production +++ b/.env.production @@ -2,4 +2,5 @@ ENV = 'production' # Online environment interface address -VITE_API_URL = 'http://127.0.0.1:2122' \ No newline at end of file +VITE_API_URL = '' +VITE_PUBLIC_PATH = './' \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 850b2db..cfc877d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,4 @@ -/dist/ + *.sh node_modules lib diff --git a/.eslintrc.js b/.eslintrc.js index 1593b03..fbb10b0 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,9 +12,18 @@ module.exports = { }, extends: ['plugin:vue/vue3-essential', 'plugin:vue/essential', 'eslint:recommended'], plugins: ['vue', '@typescript-eslint'], + overrides: [ + { + files: ['*.ts', '*.tsx', '*.vue'], + rules: { + 'no-undef': 'off', + }, + }, + ], rules: { // http://eslint.cn/docs/rules/ // https://eslint.vuejs.org/rules/ + // https://typescript-eslint.io/rules/no-unused-vars/ '@typescript-eslint/ban-ts-ignore': 'off', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/no-explicit-any': 'off', @@ -25,6 +34,7 @@ module.exports = { '@typescript-eslint/ban-types': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': 'warn', 'accessor-pairs': 2, 'arrow-spacing': [2, { 'before': true, @@ -142,6 +152,7 @@ module.exports = { 'vars': 'all', 'args': 'none' }], + 'no-useless-call': 2, 'no-useless-computed-key': 2, 'no-useless-constructor': 2, 'no-useless-escape': 0, diff --git a/.gitignore b/.gitignore index 8b8e95d..878b7b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -node_modules .DS_Store -dist -dist-ssr -*.local -*-lock.* +node_modules +/dist +/dfs +/dsms-ui # local env files .env.local @@ -13,6 +12,7 @@ dist-ssr npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* # Editor directories and files .idea @@ -21,4 +21,6 @@ yarn-error.log* *.ntvs* *.njsproj *.sln -*.sw? \ No newline at end of file +*.sw? +/rpmbuild/ +/target/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5e63149 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +RPM_NAME=dsms-ui +RPM_VERSION=V1.0.0 +RPM_RELEASE=V1.0 +RPM_ARCH=x86_64 +RPM_BUILD_DIR=$(shell pwd)/rpmbuild +RPM_SPEC_FILE=${RPM_BUILD_DIR}/SPECS/${RPM_NAME}.spec + + +.PHONY: clean build + +clean: + rm -rf target + rm -rf ${RPM_BUILD_DIR} + +build: clean + npm install --force && npm run build + mkdir -p ${RPM_BUILD_DIR}/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} + mkdir -p ${RPM_BUILD_DIR}/BUILD/dsms-ui/ + cp -r dsms-ui/* ${RPM_BUILD_DIR}/BUILD/dsms-ui/ + cp build/* ${RPM_BUILD_DIR}/BUILD/ + + sed -e "s/@RPM_NAME@/${RPM_NAME}/g" \ + -e "s/@RPM_VERSION@/${RPM_VERSION}/g" \ + -e "s/@RPM_RELEASE@/${RPM_RELEASE}/g" \ + -e "s/@RPM_ARCH@/${RPM_ARCH}/g" \ + -e "s|@RPM_BUILD_DIR@|${RPM_BUILD_DIR}|g" \ + build/dsms-ui.spec > ${RPM_SPEC_FILE} + + + rpmbuild -bb ${RPM_SPEC_FILE} + + mkdir target + + find ${RPM_BUILD_DIR}/RPMS -type f -name "*.rpm" -exec cp {} ./target \; + + rm -rf ${RPM_BUILD_DIR} + + diff --git a/README.en.md b/README.en.md index 751b477..6f77081 100644 --- a/README.en.md +++ b/README.en.md @@ -9,6 +9,8 @@ This component works with dsms-engine (the management engine component) to enabl - Vue3 - Es6 - Element-plus +- Pinia +- Typescript ### Installation and use 1. Get the project code ``` diff --git a/README.md b/README.md index bfb6fcb..472567c 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ dsms-ui是为DSMS (Distributed Storage Management System) 分布式存储管理 - Vue3 - Es6 - Element-plus +- Pinia +- Typescript ### 安装和使用 1. 获取代码 ``` diff --git a/build/dsms-ui.conf b/build/dsms-ui.conf new file mode 100644 index 0000000..9329450 --- /dev/null +++ b/build/dsms-ui.conf @@ -0,0 +1,23 @@ +server { + listen 8081 ssl; + ssl_certificate /etc/nginx/conf.d/dsms.pem; + ssl_certificate_key /etc/nginx/conf.d/dsms.key; + location / { + root /etc/dsms/dsms-ui/; + index index.html index.htm; + } + + location /api/ { + proxy_pass https://127.0.0.1:18443; + } + # WebSocket Configuration + location /websocket/ { + proxy_pass https://127.0.0.1:18443; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Proto https; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + } +} \ No newline at end of file diff --git a/build/dsms-ui.spec b/build/dsms-ui.spec new file mode 100644 index 0000000..ee0cfaa --- /dev/null +++ b/build/dsms-ui.spec @@ -0,0 +1,33 @@ +%define _topdir @RPM_BUILD_DIR@ +%define name @RPM_NAME@ +%define version @RPM_VERSION@ +%define release @RPM_RELEASE@ +%define arch @RPM_ARCH@ + +Name: %{name} +Version: %{version} +Release: %{release} +Summary: DSMS UI components, providing a web-based graphical interface. +License: MIT +BuildArch: %{arch} + +Requires: nginx + +%description +UI components, providing a web-based graphical interface for user management and use of DSMS systems. +%install +mkdir -p %{buildroot}/etc/dsms/dsms-ui/ +mkdir -p %{buildroot}/etc/nginx/conf.d/ +cp dsms-ui.conf %{buildroot}/etc/nginx/conf.d +cp dsms.key %{buildroot}/etc/nginx/conf.d +cp dsms.pem %{buildroot}/etc/nginx/conf.d +cp -r dsms-ui/* %{buildroot}/etc/dsms/dsms-ui + +%post +systemctl start nginx +systemctl enable nginx + +%files +/etc/* + +%changelog \ No newline at end of file diff --git a/build/dsms.key b/build/dsms.key new file mode 100644 index 0000000..b4f6fa7 --- /dev/null +++ b/build/dsms.key @@ -0,0 +1,32 @@ +Bag Attributes + friendlyName: dsms + localKeyID: 54 69 6D 65 20 31 36 36 39 32 38 32 30 31 36 38 31 32 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCmdmgmHMFi6ou+ +wYdopPM/X3oyLisvw+DGt1IvCyHb6MhwNZq/+0FAu/RHRjP5ud66RkVVaoiqxn6d +M2oeLjk1M4T3Y+AEopIjy+VaU/Bf6l9Hz+UNmIGn0qjnrL9OIQrDzetEn3HUtru6 +FZJjIacy//6BvqxXknRS3NUJcjw7dUfEVqzymmi4NMGx3ft7YHZdobTIxrAo77hS +tFetuu4GeimLvt4hlB19nGl0kF8OuJ0IDFZ684J2h9XEintOk9QtXmVlyhT5M15V +Rby0IvZgholDrFPkwJvAcdOj3EDNnQJycESsQpvvIhV1CYddtyz7bdrUchImDI14 +4O7G+zlRAgMBAAECggEBAIIASwoovubvYb/SCFwzJj1B5X63C8c75JmMpcRTn1fN +DmyDkJ2KLcXOg9H+A61t+YHkS1WP47frWQqQEroLQ2ZHG/rQpy03gYYvQKkwkLN3 +qH2+4JWjmu5j2MFF6gmsSGnusWRgWVfUdfu3ySFeMOPlhO/y50lk+S+Vg1LjQiL0 +C/G4sl+y+T1b/W/J9Da/mQeaVAAcJ+TI1cZKkTaWefxlt9BgmzoiCoGn+w1YGbLF +gpjzv8HF7oDKV94kXNAkU5Bt3Jz48okOSJQLQkKH4c2cC4SBKzwHyrwG1MgDjG/o +7/CpJW+BX/rQw9twTnGXbsNLW9OBMMB2z6xVQDqHeVkCgYEA2hb+1t5g/mA1Wefm +hjbQVNuwRqYGgC0x7XiHkqsv82joZSzbuo7vRw4qRe4+EMio3iEIcvA3lSdFYcnh +BBeEh/Ejb1LoRlQEL5V9DoJQ/KfiDSet2i9kJx6y5y0TqgQ83dqVKFzzoEBMxmwX +5Rb9ylGHyUv+7jhXkMur7WbQGksCgYEAw2X+rKcHdpD910TsQ53qVW4KD5SPWanP +Fe7Ztn0ykzRshd5Ci2K4gFi5tdwJL1GE/XZLOGoGLoTYHMQclNU9Wv8m1sTBvQdv +TAceq039Sf31KFPADgZLYsGmMOJCeseMTJlpOFYd6yBMpbbiW+6akqMLsjSGciNE +m1i+JAn4OVMCgYEAqtsfFRis5jxbL68082rX9dMSm5aQOzStC7zEgYwpicljX3gw +QEygeotHZPfLmfyKB1Pbuagl820LtxugdEM0agfpWdqa7BYAHYNAsPA5IGcp+mJe +mjNMhDVRtTikUir1wFzxQ+jmWGJng3/FjI1hkHIlLfeipeBwAZj+fYNxf1cCgYAU +IxTF8kjAnVyrrLy0kzetKjP7OxIy6V8gIYdqWSi3JvXwLeGpv7jH8VziMxT3PW15 +OZGy9KpCbQpgnI1dgURbdmQoSgq1UmjT6v/sI5Nw5q03RLpMN7XZLZ/U9dxoDtyU +oFLJrYZTzvZXNavKUaK4bfksmmEorh3J7LFbwXNFZQKBgD9eIrXApN6efAg3l/4N +eo2zjLk+GXVtMJwGvknxTpx1oMhBIxPZuclvGENBi/OsPNCY462bnC1GwerKfaw3 +AGFN8d12FtEbTlwtwWAnDYXNV6k2UVNUH6wT3/XLN934IOKD3oTV91hfodbaqiu4 +ty82/atl6DvWpeS1bW7ZxGmZ +-----END PRIVATE KEY----- diff --git a/build/dsms.pem b/build/dsms.pem new file mode 100644 index 0000000..a08cc0c --- /dev/null +++ b/build/dsms.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIEMH36gjANBgkqhkiG9w0BAQsFADBaMQ0wCwYDVQQGEwRk +c21zMQ0wCwYDVQQIEwRkc21zMQ0wCwYDVQQHEwRkc21zMQ0wCwYDVQQKEwRkc21z +MQ0wCwYDVQQLEwRkc21zMQ0wCwYDVQQDEwRkc21zMB4XDTIyMTEyNDA5MjY1NloX +DTIzMDIyMjA5MjY1NlowWjENMAsGA1UEBhMEZHNtczENMAsGA1UECBMEZHNtczEN +MAsGA1UEBxMEZHNtczENMAsGA1UEChMEZHNtczENMAsGA1UECxMEZHNtczENMAsG +A1UEAxMEZHNtczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKZ2aCYc +wWLqi77Bh2ik8z9fejIuKy/D4Ma3Ui8LIdvoyHA1mr/7QUC79EdGM/m53rpGRVVq +iKrGfp0zah4uOTUzhPdj4ASikiPL5VpT8F/qX0fP5Q2YgafSqOesv04hCsPN60Sf +cdS2u7oVkmMhpzL//oG+rFeSdFLc1QlyPDt1R8RWrPKaaLg0wbHd+3tgdl2htMjG +sCjvuFK0V6267gZ6KYu+3iGUHX2caXSQXw64nQgMVnrzgnaH1cSKe06T1C1eZWXK +FPkzXlVFvLQi9mCGiUOsU+TAm8Bx06PcQM2dAnJwRKxCm+8iFXUJh123LPtt2tRy +EiYMjXjg7sb7OVECAwEAAaMhMB8wHQYDVR0OBBYEFOeqvs6S6mG2jZ+27a7QgL0Z +ArQRMA0GCSqGSIb3DQEBCwUAA4IBAQAq9TEEbx5mkKJuKEiLFeFFEOnJKCKFqlV4 +EQAm4hRtyqheK0qatZCiThmpxqFlK15p+sG4065B7cGWc0hC8JSoXZaqy3yuvTh/ +fmKxon0Un0LY6mSlDxTtngtuTPIPRwcGePGPSfTDWkuEu3bvd2rlnQ/1Nr86ggOz +6tju3WmSol84Vu0K2fcxu+XDe2wW8A7rF08NVOknJ5Xo1pl9KLeW2aX/xhmEPj4l +P+TWId+n2RyzsSeX7WcjyoMKLeDYri4Ed5fIHnpZklk8X2h4XAlS1BaSGauIHMus +iJ7DYn98fbb9ZHgbMjLK/De2rKCydzOGPag6QZRFlDT2B68tNEXB +-----END CERTIFICATE----- diff --git a/index.html b/index.html index f34437b..8c7c059 100644 --- a/index.html +++ b/index.html @@ -6,22 +6,13 @@ - - DFS-management + + dsms
- diff --git a/package.json b/package.json index 35fda17..25f1315 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,69 @@ { - "name": "dsms-ui", - "version": "0.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" - }, - "dependencies": { - "element-plus": "^2.2.2", - "axios": "^0.27.2", - "js-cookie": "^3.0.1", - "mitt": "^3.0.0", - "pinia": "^2.0.14", - "sortablejs": "^1.10.2", - "vue": "^3.2.36", - "vue-grid-layout": "^3.0.0-beta1", - "vue-router": "^4.0.1" - }, - "devDependencies": { - "@types/js-cookie": "^3.0.2", - "@types/sortablejs": "^1.10.6", - "@typescript-eslint/eslint-plugin": "^5.27.0", - "@typescript-eslint/parser": "^5.27.0", - "@vitejs/plugin-vue": "^2.3.3", - "@vue/compiler-sfc": "^3.0.4", - "eslint": "^8.17.0", - "eslint-plugin-vue": "^9.1.0", - "sass": "^1.30.0", - "sass-loader": "^10.1.0", - "typescript": "^4.1.2", - "vite": "^3.1.0", - "vue-eslint-parser": "^9.0.2" - } + "name": "dsms-admin", + "version": "1.0.0", + "description": "template", + "author": "linx", + "license": "MIT", + "scripts": { + "dev": "vite --force", + "build": "vite build", + "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.0.3", + "axios": "^0.27.2", + "babel-polyfill": "^6.26.0", + "countup.js": "^2.2.0", + "echarts": "^5.3.2", + "echarts-gl": "^2.0.9", + "echarts-wordcloud": "^2.0.0", + "element-plus": "^2.2.2", + "js-cookie": "^3.0.1", + "jsplumb": "^2.15.6", + "mitt": "^3.0.0", + "nprogress": "^0.2.0", + "pinia": "^2.0.14", + "qrcodejs2-fixes": "^0.0.2", + "screenfull": "^6.0.1", + "sortablejs": "^1.15.0", + "spark-md5": "^3.0.2", + "splitpanes": "^3.1.1", + "terser": "^5.15.1", + "vue": "^3.2.36", + "vue-clipboard3": "^2.0.0", + "vue-grid-layout": "^3.0.0-beta1", + "vue-router": "^4.0.15" + }, + "devDependencies": { + "@types/node": "^17.0.39", + "@types/nprogress": "^0.2.0", + "@types/sortablejs": "^1.13.0", + "@typescript-eslint/eslint-plugin": "^5.27.0", + "@typescript-eslint/parser": "^5.27.0", + "@vitejs/plugin-legacy": "^2.3.1", + "@vitejs/plugin-vue": "^2.3.3", + "@vue/compiler-sfc": "^3.2.36", + "dotenv": "^16.0.1", + "eslint": "^8.17.0", + "eslint-plugin-vue": "^9.1.0", + "prettier": "^2.6.2", + "sass": "^1.52.2", + "sass-loader": "^13.0.0", + "typescript": "^4.7.3", + "vite": "^4.0.0", + "vue-eslint-parser": "^9.0.2" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ], + "engines": { + "node": ">=12.0.0", + "npm": ">= 6.0.0" + }, + "keywords": [ + "vue", + "vue3" + ] } diff --git a/plugins.d.ts b/plugins.d.ts index 457e784..4129414 100644 --- a/plugins.d.ts +++ b/plugins.d.ts @@ -1,2 +1,5 @@ declare module 'vue-grid-layout'; -declare module 'js-cookie'; \ No newline at end of file +declare module 'qrcodejs2-fixes'; +declare module 'splitpanes'; +declare module 'js-cookie'; +declare module 'spark-md5' diff --git a/public/favicon.ico b/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..635fc11e98976eca165cf7e7ecf5a2a51663ba89 100644 GIT binary patch literal 23030 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 diff --git a/settings.ts b/settings.ts new file mode 100644 index 0000000..9982d96 --- /dev/null +++ b/settings.ts @@ -0,0 +1 @@ +export const uiVersion = 'V1.0.0'; \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 970cdf9..af269e8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,15 +1,26 @@ - diff --git a/src/api/about/index.ts b/src/api/about/index.ts new file mode 100644 index 0000000..43439f8 --- /dev/null +++ b/src/api/about/index.ts @@ -0,0 +1,13 @@ +import request from '/@/utils/request'; + +export function useAboutApi() { + return { + // get version + getComponentsVersion: () => { + return request({ + url: '/api/component/about', + method: 'post' + }); + }, + }; +} diff --git a/src/api/alarm/index.ts b/src/api/alarm/index.ts new file mode 100644 index 0000000..a3b5df5 --- /dev/null +++ b/src/api/alarm/index.ts @@ -0,0 +1,128 @@ +import request from '/@/utils/request'; + +export function useAlarmApi() { + return { + getAlarmStrategyList: (data:object) => { + return request({ + url: '/api/alertrule/list', + method: 'post', + data + }); + }, + + getAlarmStrategy: (ruleId: number | null) => { + return request({ + url: '/api/alertrule/get', + method: 'post', + data: { ruleId } + }); + }, + + updateAlarmStrategy: (data: Object) => { + return request({ + url: '/api/alertrule/update_rule', + method: 'post', + data + }); + }, + + resetAlarmStrategy: (ruleId: number) => { + return request({ + url: '/api/alertrule/reset_rule', + method: 'post', + data: { ruleId } + }); + }, + + getAlarmAppriseList: (data: object) => { + return request({ + url: '/api/alertapprise/list', + method: 'post', + data + }); + }, + + updateAlarmApprise: (data: object) => { + return request({ + url: '/api/alertapprise/update_apprise', + method: 'post', + data + }); + }, + + addAlarmContact: (data: { + contactAccount:string, + contactName:string, + contactType:number + }) => { + return request({ + url: '/api/alertcontact/create', + method: 'post', + data + }); + }, + + deleteAlarmContact: (data: {contactId:number}) => { + return request({ + url: '/api/alertcontact/delete', + method: 'post', + data + }); + }, + + sendEmailTest: () => { + return request({ + url: '/api/alertapprise/send_email', + method: 'post', + }); + }, + + sendSmsTest: () => { + return request({ + url: '/api/alertapprise/send_sms', + method: 'post', + }); + }, + + getAlertMessageList: (data: { + level?: string | number | undefined | null, + model?: string | undefined | null, + pageNo: string | number, + pageSize: string | number, + status?: string | number | undefined | null, + }) => { + return request({ + url: '/api/alertmessage/list', + method: 'post', + data + }); + }, + + confirmAlertMessage: (data: { + ids: number[] + }) => { + return request({ + url: '/api/alertmessage/confirm_message', + method: 'post', + data + }); + }, + + delAlertMessage: (data: { + ids: number[] + }) => { + return request({ + url: '/api/alertmessage/delete_message', + method: 'post', + data + }); + }, + + getUnconfirmMessageNum: () => { + return request({ + url: '/api/alertmessage/get_unconfirmed_message_num', + method: 'post', + }); + }, + }; +} \ No newline at end of file diff --git a/src/api/block-storage/index.ts b/src/api/block-storage/index.ts new file mode 100644 index 0000000..549bc80 --- /dev/null +++ b/src/api/block-storage/index.ts @@ -0,0 +1,67 @@ +import request from '/@/utils/request'; + +export function useBlockStorageApi() { + return { + getVolumeList: (params:{ + poolName?:string, + rbdName?:string, + pageNo?:number, + pageSize?:number + }) => { + return request({ + url: '/api/volume/list', + method: 'post', + data: params, + timeout: 30000 + }); + }, + addVolume: (params:{ + poolName:string|null, + rbdName:string, + rbdSize:string, + basedOnEra:boolean, + }) => { + return request({ + url: '/api/volume/create_rbd', + method: 'post', + data: params + }); + }, + delVolume: (params:{ + poolName:string | undefined, + rbdName:string | undefined, + }) => { + return request({ + url: '/api/volume/delete_rbd', + method: 'post', + data: params + }); + }, + updataVolume: (params:{ + poolName:string, + rbdName:string, + rbdSize:string + }) => { + return request({ + url: '/api/volume/update_rbd', + method: 'post', + data: params + }); + }, + downloadKey: () => { + return request({ + url: '/api/volume/download_key', + method: 'post', + }); + }, + getPool: (params:{ + poolName:string | undefined, + }) => { + return request({ + url: '/api/pool/get', + method: 'post', + data: params + }); + } + }; +} \ No newline at end of file diff --git a/src/api/cluster/index.ts b/src/api/cluster/index.ts new file mode 100644 index 0000000..ddcd63c --- /dev/null +++ b/src/api/cluster/index.ts @@ -0,0 +1,33 @@ +import request from '/@/utils/request'; + +export function useClusterApi() { + return { + // query cluster + getCluster: (params?: object) => { + return request({ + url: '/api/cluster/about', + method: 'post', + data: params, + headers: { + tip: 'no' + } + }); + }, + // binding cluster + bindingCluster: (params: object) => { + return request({ + url: '/api/cluster/bind', + method: 'post', + data: params, + }); + }, + // unbinding cluster + unbindcluster: (params?: object) => { + return request({ + url: '/api/cluster/unbind', + method: 'post', + data: params + }); + } + }; +} \ No newline at end of file diff --git a/src/api/file-storage/index.ts b/src/api/file-storage/index.ts new file mode 100644 index 0000000..a726513 --- /dev/null +++ b/src/api/file-storage/index.ts @@ -0,0 +1,57 @@ +import request from '/@/utils/request'; + +export function useFileStorageApi() { + return { + getFileSystemList: () => { + return request({ + url: '/api/cephfs/list', + method: 'post', + }); + }, + addFileSystem: (params: object) => { + return request({ + url: '/api/cephfs/create_fs', + method: 'post', + data: params + }); + }, + delFileSystem: (params: object) => { + return request({ + url: '/api/cephfs/delete_fs', + method: 'post', + data: params + }); + }, + getStorageDirList: (data:{ + pageNo: number, + pageSize: number, + storageDirName?:string, + }) => { + return request({ + url: '/api/storagedir/list', + method: 'post', + data + }); + }, + addStorageDir: (params: object) => { + return request({ + url: '/api/storagedir/create_dir', + method: 'post', + data: params + }); + }, + delStorageDir: (params: object) => { + return request({ + url: '/api/storagedir/delete_dir', + method: 'post', + data: params + }); + }, + getStorageDirGuide: () => { + return request({ + url: '/api/storagedir/guide', + method: 'post' + }); + }, + }; +} \ No newline at end of file diff --git a/src/api/home/index.ts b/src/api/home/index.ts new file mode 100644 index 0000000..d8d1bb9 --- /dev/null +++ b/src/api/home/index.ts @@ -0,0 +1,12 @@ +import request from '/@/utils/request'; + +export function useHomeApi() { + return { + getOverview: () => { + return request({ + url: '/api/overview/get', + method: 'post' + }); + }, + }; +} diff --git a/src/api/login/index.ts b/src/api/login/index.ts index 91feee8..3b1b321 100644 --- a/src/api/login/index.ts +++ b/src/api/login/index.ts @@ -11,7 +11,7 @@ export function useLoginApi() { }); }, // Logout - signOut: (params: object) => { + signOut: (params?: object) => { return request({ url: '/api/logout', method: 'post', diff --git a/src/api/monitor-center/index.ts b/src/api/monitor-center/index.ts new file mode 100644 index 0000000..eba74d8 --- /dev/null +++ b/src/api/monitor-center/index.ts @@ -0,0 +1,71 @@ +import request from '/@/utils/request'; + +export function useMonitorApi() { + return { + // cluster status list + monitorList: () => { + return request({ + url: '/api/monitor/list_mon_status', + method: 'post', + }); + }, + // cluster performance + getClusterMon: (data:object) => { + return request({ + url: '/api/monitor/get_cluster_mon', + method: 'post', + data, + timeout: 30000 + }); + }, + // node performance + getNodeMon: (data:object) => { + return request({ + url: '/api/monitor/get_node_mon', + method: 'post', + data + }); + }, + // pool performance + getPoolMon: (data:object) => { + return request({ + url: '/api/monitor/get_pool_mon', + method: 'post', + data + }); + }, + // open rbd performance + openRbdMon: (data:object) => { + return request({ + url: '/api/monitor/enable_rbd_mon', + method: 'post', + data + }); + }, + // rbd performance + getRbdMon: (data:object) => { + return request({ + url: '/api/monitor/get_rbd_mon', + method: 'post', + data + }); + }, + // cephfs performance + getCephfsMon: (data:object) => { + return request({ + url: '/api/monitor/get_cephfs_mon', + method: 'post', + data, + timeout: 30000 + }); + }, + // osd performance + getOsdMon: (data:object) => { + return request({ + url: '/api/monitor/get_osd_mon', + method: 'post', + data + }); + }, + }; +} diff --git a/src/api/node/index.ts b/src/api/node/index.ts new file mode 100644 index 0000000..b5f5de1 --- /dev/null +++ b/src/api/node/index.ts @@ -0,0 +1,44 @@ +import request from '/@/utils/request'; + +export function useNodeApi() { + return { + // node list + nodeList: (data:{ + pageNo?: number, + pageSize?: number, + nodeName?: string, + nodeStatus?: number, + }) => { + return request({ + url: '/api/node/list', + method: 'post', + data, + timeout: 30000 + }); + }, + // node info + nodeInfo: (params: object) => { + return request({ + url: '/api/node/get', + method: 'post', + data: params, + }); + }, + // add disk to node + addDiskToNode: (params: object) => { + return request({ + url: '/api/node/add_osd', + method: 'post', + data: params, + }); + }, + // remove disk from node + removeDiskFromNode: (params: object) => { + return request({ + url: '/api/node/remove_osd', + method: 'post', + data: params, + }); + }, + }; +} diff --git a/src/api/storage/index.ts b/src/api/storage/index.ts new file mode 100644 index 0000000..ebb48d0 --- /dev/null +++ b/src/api/storage/index.ts @@ -0,0 +1,85 @@ +import request from '/@/utils/request'; + +export function useStorageApi() { + return { + // get pool list + getPoolList: (data: { + pageNo?: number, + pageSize?: number, + fileSystem?: string, + poolName?: string, + poolType?: number | string, + rbd?: string[] | null, + isAvailable?:boolean + }) => { + return request({ + url: '/api/pool/list', + method: 'post', + data, + timeout: 30000 + }); + }, + // get pool_disk list + getPoolDiskList: (data: object) => { + return request({ + url: '/api/pool/list_used_disk', + method: 'post', + data + }); + }, + // create storage_pool + createStoragePool: (data: object) => { + return request({ + url: '/api/pool/create_pool', + method: 'post', + data + }); + }, + // add storage_pool disk + addStoragePoolDisk: (data: object) => { + return request({ + url: '/api/pool/add_disk', + method: 'post', + data + }); + }, + // remove storage_pool disk + removeStoragePoolDisk: (data: object) => { + return request({ + url: '/api/pool/remove_disk', + method: 'post', + data + }); + }, + // delete storage pool + deleteStoragePool: (data: object) => { + return request({ + url: '/api/pool/delete_pool', + method: 'post', + data + }); + }, + // add node + addNode: (data:object) => { + return request({ + url: '/api/pool/add_node', + method: 'post', + data + }); + }, + removeNode: (data:object) => { + return request({ + url: 'api/pool/remove_node', + method: 'post', + data + }); + }, + getUnusedDisk: (data:object) => { + return request({ + url: '/api/pool/list_unused_disk', + method: 'post', + data + }); + } + }; +} \ No newline at end of file diff --git a/src/api/task/index.ts b/src/api/task/index.ts new file mode 100644 index 0000000..dec1fc6 --- /dev/null +++ b/src/api/task/index.ts @@ -0,0 +1,14 @@ +import request from '/@/utils/request'; + +export function useTaskApi() { + return { + // task list + taskList: (params: object) => { + return request({ + url: '/api/task/list', + method: 'post', + data: params + }); + }, + }; +} diff --git a/src/api/user/index.ts b/src/api/user/index.ts new file mode 100644 index 0000000..fae16cb --- /dev/null +++ b/src/api/user/index.ts @@ -0,0 +1,14 @@ +import request from '/@/utils/request'; + +export function useUserApi() { + return { + // Get userinfo + userInfo: (params: object) => { + return request({ + url: '/api/getLoginUser', + method: 'post', + data: params, + }); + }, + }; +} diff --git a/src/assets/avatar.png b/src/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..e16488e4534d25626ac002e04ce9c64cd834ade2 GIT binary patch literal 4097 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 WWEq)E_6s}!0000i}z000_RdQ@0+Qek%> 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 literal 0 HcmV?d00001 diff --git a/src/components/auth/auth.vue b/src/components/auth/auth.vue new file mode 100644 index 0000000..27c1a11 --- /dev/null +++ b/src/components/auth/auth.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/auth/authAll.vue b/src/components/auth/authAll.vue new file mode 100644 index 0000000..9ae99df --- /dev/null +++ b/src/components/auth/authAll.vue @@ -0,0 +1,31 @@ + + + diff --git a/src/components/auth/auths.vue b/src/components/auth/auths.vue new file mode 100644 index 0000000..97f1a4b --- /dev/null +++ b/src/components/auth/auths.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/components/description/index.vue b/src/components/description/index.vue new file mode 100644 index 0000000..b054067 --- /dev/null +++ b/src/components/description/index.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/src/components/echarts/line.vue b/src/components/echarts/line.vue new file mode 100644 index 0000000..e00fb12 --- /dev/null +++ b/src/components/echarts/line.vue @@ -0,0 +1,394 @@ + + + \ No newline at end of file diff --git a/src/components/echarts/pie.vue b/src/components/echarts/pie.vue new file mode 100644 index 0000000..9be51fd --- /dev/null +++ b/src/components/echarts/pie.vue @@ -0,0 +1,145 @@ + + + \ No newline at end of file diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue new file mode 100644 index 0000000..59c523c --- /dev/null +++ b/src/components/iconSelector/index.vue @@ -0,0 +1,245 @@ + + + diff --git a/src/components/svgIcon/index.vue b/src/components/svgIcon/index.vue new file mode 100644 index 0000000..2011f94 --- /dev/null +++ b/src/components/svgIcon/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/task/index.vue b/src/components/task/index.vue new file mode 100644 index 0000000..a046636 --- /dev/null +++ b/src/components/task/index.vue @@ -0,0 +1,188 @@ + + + \ No newline at end of file diff --git a/src/layout/component/columnsAside.vue b/src/layout/component/columnsAside.vue new file mode 100644 index 0000000..fd808fe --- /dev/null +++ b/src/layout/component/columnsAside.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/src/layout/component/main.vue b/src/layout/component/main.vue index 0244b6c..920c416 100644 --- a/src/layout/component/main.vue +++ b/src/layout/component/main.vue @@ -14,7 +14,7 @@ transition: 'padding 0.3s ease-in-out', }" /> - + 任务列表