You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampark.apache.org by be...@apache.org on 2022/10/08 10:06:32 UTC
[incubator-streampark] branch dev updated: [Feature] Add new front-end version (vue3) (#1767)
This is an automated email from the ASF dual-hosted git repository.
benjobs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
The following commit(s) were added to refs/heads/dev by this push:
new e4d4aada1 [Feature] Add new front-end version (vue3) (#1767)
e4d4aada1 is described below
commit e4d4aada1047c4d385170088fe3d01cd1c6519cf
Author: WangSizhu0504 <39...@users.noreply.github.com>
AuthorDate: Sat Oct 8 18:06:25 2022 +0800
[Feature] Add new front-end version (vue3) (#1767)
* [Feature] Add new front-end version (vue3)
---
.../streampark-console-newui/.editorconfig | 19 +
streampark-console/streampark-console-newui/.env | 8 +
.../streampark-console-newui/.env.development | 27 +
.../streampark-console-newui/.env.production | 35 +
.../streampark-console-newui/.eslintignore | 15 +
.../streampark-console-newui/.eslintrc.js | 76 +
.../streampark-console-newui/.gitignore | 33 +
.../streampark-console-newui/.gitpod.yml | 6 +
.../streampark-console-newui/.husky/commit-msg | 6 +
.../streampark-console-newui/.husky/common.sh | 9 +
.../streampark-console-newui/.husky/pre-commit | 8 +
.../streampark-console-newui/.prettierignore | 9 +
.../streampark-console-newui/.stylelintignore | 3 +
.../streampark-console-newui/LICENSE | 201 ++
.../streampark-console-newui/README.md | 143 +
.../streampark-console-newui/README.zh-CN.md | 145 +
.../build/config/themeConfig.ts | 79 +
.../streampark-console-newui/build/constant.ts | 6 +
.../build/generate/generateModifyVars.ts | 37 +
.../build/getConfigFileName.ts | 9 +
.../build/script/buildConf.ts | 45 +
.../build/script/postBuild.ts | 23 +
.../streampark-console-newui/build/utils.ts | 92 +
.../build/vite/plugin/compress.ts | 35 +
.../build/vite/plugin/html.ts | 40 +
.../build/vite/plugin/imagemin.ts | 34 +
.../build/vite/plugin/index.ts | 83 +
.../build/vite/plugin/mock.ts | 19 +
.../build/vite/plugin/pwa.ts | 33 +
.../build/vite/plugin/styleImport.ts | 80 +
.../build/vite/plugin/svgSprite.ts | 17 +
.../build/vite/plugin/theme.ts | 91 +
.../build/vite/plugin/visualizer.ts | 17 +
.../streampark-console-newui/build/vite/proxy.ts | 34 +
.../streampark-console-newui/commitlint.config.js | 33 +
.../streampark-console-newui/index.html | 159 ++
.../mock/_createProductionServer.ts | 18 +
.../streampark-console-newui/mock/_util.ts | 60 +
.../streampark-console-newui/mock/sys/user.ts | 138 +
.../streampark-console-newui/package.json | 192 ++
.../streampark-console-newui/postcss.config.js | 5 +
.../streampark-console-newui/prettier.config.js | 10 +
.../streampark-console-newui/public/favicon.ico | Bin 0 -> 21238 bytes
.../public/resource/img/logo.svg | 1 +
.../public/resource/img/pwa-192x192.png | Bin 0 -> 12205 bytes
.../public/resource/img/pwa-512x512.png | Bin 0 -> 52656 bytes
.../public/resource/tinymce/langs/en.js | 419 +++
.../public/resource/tinymce/langs/zh_CN.js | 389 +++
.../skins/ui/oxide-dark/content.inline.min.css | 239 ++
.../tinymce/skins/ui/oxide-dark/content.min.css | 235 ++
.../skins/ui/oxide-dark/content.mobile.min.css | 17 +
.../tinymce/skins/ui/oxide-dark/skin.min.css | 875 ++++++
.../skins/ui/oxide-dark/skin.mobile.min.css | 239 ++
.../tinymce/skins/ui/oxide/content.inline.min.css | 239 ++
.../tinymce/skins/ui/oxide/content.min.css | 235 ++
.../tinymce/skins/ui/oxide/content.mobile.min.css | 17 +
.../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes
.../resource/tinymce/skins/ui/oxide/skin.min.css | 875 ++++++
.../tinymce/skins/ui/oxide/skin.mobile.min.css | 239 ++
.../streampark-console-newui/src/App.vue | 21 +
.../src/adapter/api/baseUrl.ts | 9 +
.../src/adapter/api/index.ts | 189 ++
.../src/adapter/api/passport.ts | 10 +
.../src/adapter/index.less | 5 +
.../streampark-console-newui/src/adapter/index.ts | 23 +
.../src/adapter/store/getters.ts | 9 +
.../src/adapter/store/index.ts | 5 +
.../src/adapter/store/modules/user.ts | 84 +
.../src/adapter/store/mutation-types.ts | 24 +
.../src/adapter/utils/request.ts | 201 ++
.../src/adapter/utils/storage.ts | 84 +
.../src/api/demo/cascader.ts | 9 +
.../streampark-console-newui/src/api/demo/error.ts | 12 +
.../src/api/demo/model/accountModel.ts | 7 +
.../src/api/demo/model/areaModel.ts | 12 +
.../src/api/demo/model/optionsModel.ts | 15 +
.../src/api/demo/model/systemModel.ts | 98 +
.../src/api/demo/model/tableModel.ts | 20 +
.../src/api/demo/select.ts | 11 +
.../src/api/demo/system.ts | 71 +
.../streampark-console-newui/src/api/demo/table.ts | 20 +
.../streampark-console-newui/src/api/demo/tree.ts | 11 +
.../src/api/flink/app/app.ts | 351 +++
.../src/api/flink/app/app.type.ts | 138 +
.../src/api/flink/app/flinkBuild.ts | 37 +
.../src/api/flink/app/flinkHistory.ts | 84 +
.../src/api/flink/app/flinkPodtmpl.ts | 59 +
.../src/api/flink/app/flinkSql.ts | 44 +
.../src/api/flink/app/metrics.ts | 30 +
.../src/api/flink/app/savepoint.ts | 41 +
.../src/api/flink/config/index.ts | 71 +
.../src/api/flink/config/index.type.ts | 10 +
.../src/api/flink/notebook.ts | 45 +
.../src/api/flink/project/index.ts | 194 ++
.../src/api/flink/project/model/projectModel.ts | 24 +
.../src/api/flink/setting/alert.ts | 103 +
.../src/api/flink/setting/flinkCluster.ts | 132 +
.../src/api/flink/setting/flinkEnv.ts | 126 +
.../src/api/flink/setting/index.ts | 49 +
.../src/api/flink/setting/types/alert.type.ts | 50 +
.../api/flink/setting/types/flinkCluster.type.ts | 26 +
.../src/api/flink/setting/types/flinkEnv.type.ts | 20 +
.../src/api/flink/setting/types/setting.type.ts | 12 +
.../src/api/model/baseModel.ts | 9 +
.../streampark-console-newui/src/api/sys/menu.ts | 42 +
.../src/api/sys/model/menuModel.ts | 16 +
.../src/api/sys/model/notifyModel.ts | 15 +
.../src/api/sys/model/uploadModel.ts | 5 +
.../src/api/sys/model/userModel.ts | 38 +
.../streampark-console-newui/src/api/sys/notify.ts | 39 +
.../streampark-console-newui/src/api/sys/role.ts | 43 +
.../streampark-console-newui/src/api/sys/team.ts | 43 +
.../streampark-console-newui/src/api/sys/token.ts | 79 +
.../streampark-console-newui/src/api/sys/upload.ts | 22 +
.../streampark-console-newui/src/api/sys/user.ts | 151 +
.../src/assets/icons/alarm.svg | 2 +
.../src/assets/icons/analyse.svg | 1 +
.../src/assets/icons/auth.svg | 1 +
.../src/assets/icons/code.svg | 1 +
.../src/assets/icons/copy.svg | 1 +
.../src/assets/icons/deploy.svg | 1 +
.../src/assets/icons/dingtalk.svg | 2 +
.../src/assets/icons/docker.svg | 1 +
.../src/assets/icons/download-count.svg | 1 +
.../src/assets/icons/dynamic-avatar-1.svg | 1 +
.../src/assets/icons/dynamic-avatar-2.svg | 1 +
.../src/assets/icons/dynamic-avatar-3.svg | 1 +
.../src/assets/icons/dynamic-avatar-4.svg | 1 +
.../src/assets/icons/dynamic-avatar-5.svg | 1 +
.../src/assets/icons/dynamic-avatar-6.svg | 1 +
.../src/assets/icons/edit.svg | 1 +
.../src/assets/icons/flame.svg | 1 +
.../src/assets/icons/flink.svg | 738 +++++
.../src/assets/icons/flink2.svg | 1 +
.../src/assets/icons/flinksql.svg | 1 +
.../src/assets/icons/format.svg | 1 +
.../src/assets/icons/fql.svg | 1 +
.../src/assets/icons/github.svg | 1 +
.../src/assets/icons/host.svg | 1 +
.../src/assets/icons/http.svg | 1 +
.../src/assets/icons/keys.svg | 1 +
.../src/assets/icons/lark.svg | 3 +
.../src/assets/icons/mail.svg | 1 +
.../src/assets/icons/mapping.svg | 1 +
.../src/assets/icons/maven.svg | 1 +
.../src/assets/icons/message.svg | 2 +
.../src/assets/icons/moon.svg | 16 +
.../src/assets/icons/mvnpass.svg | 1 +
.../src/assets/icons/namespace.svg | 2 +
.../src/assets/icons/password.svg | 1 +
.../src/assets/icons/pause.svg | 1 +
.../src/assets/icons/play.svg | 1 +
.../src/assets/icons/plus.svg | 1 +
.../src/assets/icons/port.svg | 1 +
.../src/assets/icons/question.svg | 1 +
.../src/assets/icons/remove.svg | 1 +
.../src/assets/icons/resetpass.svg | 1 +
.../src/assets/icons/rollback.svg | 1 +
.../src/assets/icons/see.svg | 1 +
.../src/assets/icons/shutdown.svg | 1 +
.../src/assets/icons/sms.svg | 1 +
.../src/assets/icons/spark.svg | 1 +
.../src/assets/icons/ssl.svg | 1 +
.../src/assets/icons/stream.svg | 1 +
.../src/assets/icons/sun.svg | 42 +
.../src/assets/icons/swap.svg | 1 +
.../src/assets/icons/test.svg | 21 +
.../src/assets/icons/testalarm.svg | 2 +
.../src/assets/icons/theme.svg | 1 +
.../src/assets/icons/threshold.svg | 1 +
.../src/assets/icons/thunderbolt.svg | 1 +
.../src/assets/icons/total-sales.svg | 1 +
.../src/assets/icons/transaction.svg | 1 +
.../src/assets/icons/upload.svg | 1 +
.../src/assets/icons/user.svg | 1 +
.../src/assets/icons/visit-count.svg | 1 +
.../src/assets/icons/wechat.svg | 1 +
.../src/assets/icons/wecom.svg | 2 +
.../src/assets/icons/workspace.svg | 1 +
.../src/assets/images/demo.png | Bin 0 -> 33342 bytes
.../src/assets/images/header.jpg | Bin 0 -> 16880 bytes
.../src/assets/images/logo.svg | 1 +
.../src/assets/svg/default-avator.svg | 1 +
.../src/assets/svg/illustration.svg | 1 +
.../src/assets/svg/login-bg-dark.svg | 19 +
.../src/assets/svg/login-bg.svg | 17 +
.../src/assets/svg/login-box-bg.svg | 1 +
.../src/assets/svg/net-error.svg | 1 +
.../src/assets/svg/no-data.svg | 1 +
.../src/assets/svg/preview/p-rotate.svg | 1 +
.../src/assets/svg/preview/resume.svg | 1 +
.../src/assets/svg/preview/scale.svg | 1 +
.../src/assets/svg/preview/unrotate.svg | 1 +
.../src/assets/svg/preview/unscale.svg | 1 +
.../src/components/Application/index.ts | 15 +
.../Application/src/AppDarkModeToggle.vue | 76 +
.../components/Application/src/AppLocalePicker.vue | 76 +
.../src/components/Application/src/AppLogo.vue | 110 +
.../src/components/Application/src/AppProvider.vue | 82 +
.../Application/src/search/AppSearch.vue | 33 +
.../Application/src/search/AppSearchFooter.vue | 56 +
.../Application/src/search/AppSearchKeyItem.vue | 11 +
.../Application/src/search/AppSearchModal.vue | 267 ++
.../Application/src/search/useMenuSearch.ts | 166 ++
.../components/Application/src/useAppContext.ts | 17 +
.../src/components/Authority/index.ts | 4 +
.../src/components/Authority/src/Authority.vue | 45 +
.../src/components/Basic/index.ts | 8 +
.../src/components/Basic/src/BasicArrow.vue | 84 +
.../src/components/Basic/src/BasicHelp.vue | 114 +
.../src/components/Basic/src/BasicTitle.vue | 76 +
.../src/components/Button/index.ts | 9 +
.../src/components/Button/src/BasicButton.vue | 40 +
.../src/components/Button/src/PopConfirmButton.vue | 54 +
.../src/components/Button/src/props.ts | 19 +
.../src/components/CardList/index.ts | 4 +
.../src/components/CardList/src/CardList.vue | 177 ++
.../src/components/CardList/src/data.ts | 25 +
.../src/components/ClickOutSide/index.ts | 4 +
.../components/ClickOutSide/src/ClickOutSide.vue | 19 +
.../src/components/CodeEditor/index.ts | 8 +
.../src/components/CodeEditor/src/CodeEditor.vue | 54 +
.../CodeEditor/src/codemirror/CodeMirror.vue | 113 +
.../CodeEditor/src/codemirror/codeMirror.ts | 21 +
.../CodeEditor/src/codemirror/codemirror.css | 525 ++++
.../CodeEditor/src/json-preview/JsonPreview.vue | 12 +
.../src/components/CodeEditor/src/typing.ts | 5 +
.../src/components/Container/index.ts | 10 +
.../src/components/Container/src/LazyContainer.vue | 145 +
.../components/Container/src/ScrollContainer.vue | 93 +
.../Container/src/collapse/CollapseContainer.vue | 110 +
.../Container/src/collapse/CollapseHeader.vue | 38 +
.../src/components/Container/src/typing.ts | 17 +
.../src/components/ContextMenu/index.ts | 3 +
.../src/components/ContextMenu/src/ContextMenu.vue | 209 ++
.../ContextMenu/src/createContextMenu.ts | 75 +
.../src/components/ContextMenu/src/typing.ts | 36 +
.../src/components/CountDown/index.ts | 6 +
.../src/components/CountDown/src/CountButton.vue | 62 +
.../components/CountDown/src/CountdownInput.vue | 54 +
.../src/components/CountDown/src/useCountdown.ts | 51 +
.../src/components/CountTo/index.ts | 4 +
.../src/components/CountTo/src/CountTo.vue | 110 +
.../src/components/Cropper/index.ts | 7 +
.../src/components/Cropper/src/CopperModal.vue | 283 ++
.../src/components/Cropper/src/Cropper.vue | 188 ++
.../src/components/Cropper/src/CropperAvatar.vue | 163 ++
.../src/components/Cropper/src/typing.ts | 8 +
.../src/components/Description/index.ts | 6 +
.../src/components/Description/src/Description.vue | 184 ++
.../src/components/Description/src/typing.ts | 50 +
.../components/Description/src/useDescription.ts | 28 +
.../src/components/Drawer/index.ts | 6 +
.../src/components/Drawer/src/BasicDrawer.vue | 256 ++
.../Drawer/src/components/DrawerFooter.vue | 82 +
.../Drawer/src/components/DrawerHeader.vue | 74 +
.../src/components/Drawer/src/props.ts | 44 +
.../src/components/Drawer/src/typing.ts | 193 ++
.../src/components/Drawer/src/useDrawer.ts | 161 ++
.../src/components/Dropdown/index.ts | 5 +
.../src/components/Dropdown/src/Dropdown.vue | 123 +
.../src/components/Dropdown/src/typing.ts | 9 +
.../src/components/Excel/index.ts | 8 +
.../src/components/Excel/src/Export2Excel.ts | 59 +
.../src/components/Excel/src/ExportExcelModal.vue | 91 +
.../src/components/Excel/src/ImportExcel.vue | 157 ++
.../src/components/Excel/src/typing.ts | 27 +
.../src/components/FlowChart/index.ts | 4 +
.../src/components/FlowChart/src/FlowChart.vue | 158 ++
.../components/FlowChart/src/FlowChartToolbar.vue | 162 ++
.../src/components/FlowChart/src/adpterForTurbo.ts | 75 +
.../src/components/FlowChart/src/config.ts | 96 +
.../src/components/FlowChart/src/enum.ts | 11 +
.../src/components/FlowChart/src/types.ts | 14 +
.../src/components/FlowChart/src/useFlowContext.ts | 17 +
.../src/components/Form/index.ts | 16 +
.../src/components/Form/src/BasicForm.vue | 353 +++
.../src/components/Form/src/componentMap.ts | 82 +
.../components/Form/src/components/ApiCascader.vue | 198 ++
.../Form/src/components/ApiRadioGroup.vue | 130 +
.../components/Form/src/components/ApiSelect.vue | 147 +
.../src/components/Form/src/components/ApiTree.vue | 90 +
.../Form/src/components/ApiTreeSelect.vue | 86 +
.../components/Form/src/components/FormAction.vue | 135 +
.../components/Form/src/components/FormItem.vue | 392 +++
.../Form/src/components/RadioButtonGroup.vue | 57 +
.../src/components/Form/src/helper.ts | 74 +
.../src/components/Form/src/hooks/useAdvanced.ts | 165 ++
.../src/components/Form/src/hooks/useAutoFocus.ts | 40 +
.../Form/src/hooks/useComponentRegister.ts | 11 +
.../src/components/Form/src/hooks/useForm.ts | 122 +
.../components/Form/src/hooks/useFormContext.ts | 17 +
.../src/components/Form/src/hooks/useFormEvents.ts | 314 +++
.../src/components/Form/src/hooks/useFormValues.ts | 131 +
.../src/components/Form/src/hooks/useLabelWidth.ts | 42 +
.../src/components/Form/src/props.ts | 103 +
.../src/components/Form/src/types/form.ts | 223 ++
.../src/components/Form/src/types/formItem.ts | 91 +
.../src/components/Form/src/types/hooks.ts | 6 +
.../src/components/Form/src/types/index.ts | 117 +
.../src/components/Loading/index.ts | 5 +
.../src/components/Loading/src/Loading.vue | 79 +
.../src/components/Loading/src/createLoading.ts | 65 +
.../src/components/Loading/src/typing.ts | 10 +
.../src/components/Loading/src/useLoading.ts | 49 +
.../src/components/Markdown/index.ts | 7 +
.../src/components/Markdown/src/Markdown.vue | 147 +
.../src/components/Markdown/src/MarkdownViewer.vue | 23 +
.../src/components/Markdown/src/typing.ts | 4 +
.../src/components/Menu/index.ts | 3 +
.../src/components/Menu/src/BasicMenu.vue | 164 ++
.../Menu/src/components/BasicMenuItem.vue | 20 +
.../Menu/src/components/BasicSubMenuItem.vue | 55 +
.../Menu/src/components/MenuItemContent.vue | 34 +
.../src/components/Menu/src/index.less | 74 +
.../src/components/Menu/src/props.ts | 60 +
.../src/components/Menu/src/types.ts | 25 +
.../src/components/Menu/src/useOpenKeys.ts | 83 +
.../src/components/Modal/index.ts | 8 +
.../src/components/Modal/src/BasicModal.vue | 242 ++
.../src/components/Modal/src/components/Modal.tsx | 31 +
.../components/Modal/src/components/ModalClose.vue | 106 +
.../Modal/src/components/ModalFooter.vue | 40 +
.../Modal/src/components/ModalHeader.vue | 22 +
.../Modal/src/components/ModalWrapper.vue | 169 ++
.../src/components/Modal/src/hooks/useModal.ts | 163 ++
.../components/Modal/src/hooks/useModalContext.ts | 16 +
.../src/components/Modal/src/hooks/useModalDrag.ts | 107 +
.../Modal/src/hooks/useModalFullScreen.ts | 43 +
.../src/components/Modal/src/index.less | 127 +
.../src/components/Modal/src/props.ts | 83 +
.../src/components/Modal/src/typing.ts | 209 ++
.../src/components/Page/index.ts | 9 +
.../src/components/Page/src/PageFooter.vue | 50 +
.../src/components/Page/src/PageWrapper.vue | 191 ++
.../src/components/Preview/index.ts | 2 +
.../src/components/Preview/src/Functional.vue | 546 ++++
.../src/components/Preview/src/Preview.vue | 94 +
.../src/components/Preview/src/functional.ts | 17 +
.../src/components/Preview/src/typing.ts | 49 +
.../src/components/Qrcode/index.ts | 5 +
.../src/components/Qrcode/src/Qrcode.vue | 112 +
.../src/components/Qrcode/src/drawCanvas.ts | 37 +
.../src/components/Qrcode/src/drawLogo.ts | 88 +
.../src/components/Qrcode/src/qrcodePlus.ts | 4 +
.../src/components/Qrcode/src/toCanvas.ts | 10 +
.../src/components/Qrcode/src/typing.ts | 38 +
.../src/components/Scrollbar/index.ts | 8 +
.../src/components/Scrollbar/src/Scrollbar.vue | 206 ++
.../src/components/Scrollbar/src/bar.ts | 110 +
.../src/components/Scrollbar/src/types.d.ts | 18 +
.../src/components/Scrollbar/src/util.ts | 50 +
.../src/components/SimpleMenu/index.ts | 2 +
.../src/components/SimpleMenu/src/SimpleMenu.vue | 160 ++
.../components/SimpleMenu/src/SimpleMenuTag.vue | 68 +
.../components/SimpleMenu/src/SimpleSubMenu.vue | 115 +
.../components/SimpleMenu/src/components/Menu.vue | 158 ++
.../src/components/MenuCollapseTransition.vue | 78 +
.../SimpleMenu/src/components/MenuItem.vue | 107 +
.../SimpleMenu/src/components/SubMenuItem.vue | 334 +++
.../components/SimpleMenu/src/components/menu.less | 309 ++
.../components/SimpleMenu/src/components/types.ts | 25 +
.../SimpleMenu/src/components/useMenu.ts | 84 +
.../src/components/useSimpleMenuContext.ts | 18 +
.../src/components/SimpleMenu/src/index.less | 77 +
.../src/components/SimpleMenu/src/types.ts | 5 +
.../src/components/SimpleMenu/src/useOpenKeys.ts | 50 +
.../src/components/StrengthMeter/index.ts | 4 +
.../components/StrengthMeter/src/StrengthMeter.vue | 142 +
.../src/components/Table/index.ts | 11 +
.../src/components/Table/src/BasicTable.vue | 450 +++
.../src/components/Table/src/componentMap.ts | 36 +
.../Table/src/components/EditTableHeaderIcon.vue | 16 +
.../components/Table/src/components/HeaderCell.vue | 48 +
.../Table/src/components/TableAction.vue | 202 ++
.../Table/src/components/TableFooter.vue | 94 +
.../Table/src/components/TableHeader.vue | 81 +
.../components/Table/src/components/TableImg.vue | 85 +
.../components/Table/src/components/TableTitle.vue | 53 +
.../Table/src/components/editable/CellComponent.ts | 44 +
.../Table/src/components/editable/EditableCell.vue | 512 ++++
.../Table/src/components/editable/helper.ts | 28 +
.../Table/src/components/editable/index.ts | 68 +
.../src/components/settings/ColumnSetting.vue | 482 ++++
.../src/components/settings/FullScreenSetting.vue | 38 +
.../Table/src/components/settings/RedoSetting.vue | 33 +
.../Table/src/components/settings/SizeSetting.vue | 64 +
.../Table/src/components/settings/index.vue | 76 +
.../src/components/Table/src/const.ts | 38 +
.../src/components/Table/src/hooks/useColumns.ts | 317 +++
.../src/components/Table/src/hooks/useCustomRow.ts | 100 +
.../components/Table/src/hooks/useDataSource.ts | 381 +++
.../src/components/Table/src/hooks/useLoading.ts | 21 +
.../components/Table/src/hooks/usePagination.tsx | 85 +
.../components/Table/src/hooks/useRowSelection.ts | 122 +
.../src/components/Table/src/hooks/useScrollTo.ts | 55 +
.../src/components/Table/src/hooks/useTable.ts | 170 ++
.../components/Table/src/hooks/useTableContext.ts | 22 +
.../components/Table/src/hooks/useTableExpand.ts | 65 +
.../components/Table/src/hooks/useTableFooter.ts | 57 +
.../src/components/Table/src/hooks/useTableForm.ts | 50 +
.../components/Table/src/hooks/useTableHeader.ts | 54 +
.../components/Table/src/hooks/useTableScroll.ts | 220 ++
.../components/Table/src/hooks/useTableStyle.ts | 20 +
.../src/components/Table/src/props.ts | 151 +
.../src/components/Table/src/types/column.ts | 198 ++
.../components/Table/src/types/componentType.ts | 11 +
.../src/components/Table/src/types/pagination.ts | 115 +
.../src/components/Table/src/types/table.ts | 478 ++++
.../src/components/Table/src/types/tableAction.ts | 39 +
.../src/components/Time/index.ts | 4 +
.../src/components/Time/src/Time.vue | 108 +
.../src/components/Tinymce/index.ts | 4 +
.../src/components/Tinymce/src/Editor.vue | 346 +++
.../src/components/Tinymce/src/ImgUpload.vue | 96 +
.../src/components/Tinymce/src/helper.ts | 81 +
.../src/components/Tinymce/src/tinymce.ts | 13 +
.../src/components/Transition/index.ts | 27 +
.../Transition/src/CollapseTransition.vue | 78 +
.../components/Transition/src/CreateTransition.tsx | 73 +
.../components/Transition/src/ExpandTransition.ts | 89 +
.../src/components/Tree/index.ts | 6 +
.../src/components/Tree/src/BasicTree.vue | 455 +++
.../src/components/Tree/src/TreeIcon.ts | 13 +
.../components/Tree/src/components/TreeHeader.vue | 170 ++
.../src/components/Tree/src/hooks/useTree.ts | 207 ++
.../src/components/Tree/src/types/tree.ts | 194 ++
.../src/components/Tree/style/index.less | 52 +
.../src/components/Tree/style/index.ts | 1 +
.../src/components/Upload/index.ts | 4 +
.../src/components/Upload/src/BasicUpload.vue | 123 +
.../src/components/Upload/src/FileList.vue | 104 +
.../src/components/Upload/src/ThumbUrl.vue | 29 +
.../src/components/Upload/src/UploadModal.vue | 322 +++
.../components/Upload/src/UploadPreviewModal.vue | 99 +
.../src/components/Upload/src/data.tsx | 153 +
.../src/components/Upload/src/helper.ts | 27 +
.../src/components/Upload/src/props.ts | 83 +
.../src/components/Upload/src/typing.ts | 55 +
.../src/components/Upload/src/useUpload.ts | 60 +
.../src/components/Verify/index.ts | 7 +
.../src/components/Verify/src/DragVerify.vue | 371 +++
.../src/components/Verify/src/ImgRotate.vue | 220 ++
.../src/components/Verify/src/props.ts | 87 +
.../src/components/Verify/src/typing.ts | 14 +
.../src/components/VirtualScroll/index.ts | 4 +
.../components/VirtualScroll/src/VirtualScroll.vue | 190 ++
.../src/components/registerGlobComp.ts | 7 +
.../src/design/ant/btn.less | 285 ++
.../src/design/ant/index.less | 59 +
.../src/design/ant/input.less | 24 +
.../src/design/ant/pagination.less | 96 +
.../src/design/ant/table.less | 76 +
.../streampark-console-newui/src/design/color.less | 138 +
.../src/design/config.less | 2 +
.../streampark-console-newui/src/design/index.less | 63 +
.../src/design/public.less | 51 +
.../streampark-console-newui/src/design/theme.less | 52 +
.../src/design/transition/base.less | 18 +
.../src/design/transition/fade.less | 93 +
.../src/design/transition/index.less | 10 +
.../src/design/transition/scale.less | 21 +
.../src/design/transition/scroll.less | 67 +
.../src/design/transition/slide.less | 39 +
.../src/design/transition/zoom.less | 27 +
.../src/design/var/breakpoint.less | 33 +
.../src/design/var/easing.less | 18 +
.../src/design/var/index.less | 39 +
.../src/directives/clickOutside.ts | 86 +
.../src/directives/index.ts | 11 +
.../src/directives/loading.ts | 39 +
.../src/directives/permission.ts | 32 +
.../src/directives/repeatClick.ts | 31 +
.../src/directives/ripple/index.less | 21 +
.../src/directives/ripple/index.ts | 191 ++
.../streampark-console-newui/src/enums/appEnum.ts | 56 +
.../src/enums/breakpointEnum.ts | 28 +
.../src/enums/cacheEnum.ts | 35 +
.../src/enums/exceptionEnum.ts | 27 +
.../src/enums/flinkEnum.ts | 7 +
.../streampark-console-newui/src/enums/formEnum.ts | 5 +
.../streampark-console-newui/src/enums/httpEnum.ts | 31 +
.../streampark-console-newui/src/enums/menuEnum.ts | 50 +
.../streampark-console-newui/src/enums/pageEnum.ts | 11 +
.../streampark-console-newui/src/enums/roleEnum.ts | 7 +
.../streampark-console-newui/src/enums/sizeEnum.ts | 19 +
.../src/hooks/component/useFormItem.ts | 60 +
.../src/hooks/component/usePageContext.ts | 18 +
.../src/hooks/core/onMountedOrActivated.ts | 18 +
.../src/hooks/core/useAttrs.ts | 40 +
.../src/hooks/core/useContext.ts | 44 +
.../src/hooks/core/useLockFn.ts | 17 +
.../src/hooks/core/useRefs.ts | 16 +
.../src/hooks/core/useTimeout.ts | 45 +
.../src/hooks/event/useBreakpoint.ts | 89 +
.../src/hooks/event/useEventListener.ts | 58 +
.../src/hooks/event/useIntersectionObserver.ts | 48 +
.../src/hooks/event/useScroll.ts | 65 +
.../src/hooks/event/useScrollTo.ts | 59 +
.../src/hooks/event/useWindowSizeFn.ts | 35 +
.../src/hooks/setting/index.ts | 30 +
.../src/hooks/setting/useHeaderSetting.ts | 105 +
.../src/hooks/setting/useMenuSetting.ts | 170 ++
.../src/hooks/setting/useMultipleTabSetting.ts | 28 +
.../src/hooks/setting/useRootSetting.ts | 95 +
.../src/hooks/setting/useTransitionSetting.ts | 31 +
.../src/hooks/web/useAppInject.ts | 10 +
.../src/hooks/web/useContentHeight.ts | 191 ++
.../src/hooks/web/useContextMenu.ts | 12 +
.../src/hooks/web/useCopyToClipboard.ts | 69 +
.../src/hooks/web/useDesign.ts | 22 +
.../src/hooks/web/useECharts.ts | 121 +
.../src/hooks/web/useFullContent.ts | 28 +
.../src/hooks/web/useI18n.ts | 55 +
.../src/hooks/web/useLockPage.ts | 72 +
.../src/hooks/web/useMessage.tsx | 123 +
.../src/hooks/web/useMonaco.ts | 122 +
.../src/hooks/web/usePage.ts | 53 +
.../src/hooks/web/usePagination.ts | 34 +
.../src/hooks/web/usePermission.ts | 110 +
.../src/hooks/web/useScript.ts | 46 +
.../src/hooks/web/useSortable.ts | 21 +
.../src/hooks/web/useTabs.ts | 108 +
.../src/hooks/web/useTitle.ts | 35 +
.../src/hooks/web/useWatermark.ts | 100 +
.../src/layouts/default/content/index.vue | 51 +
.../layouts/default/content/useContentContext.ts | 17 +
.../default/content/useContentViewHeight.ts | 42 +
.../src/layouts/default/feature/index.vue | 83 +
.../src/layouts/default/footer/index.vue | 107 +
.../src/layouts/default/header/MultipleHeader.vue | 126 +
.../default/header/components/Breadcrumb.vue | 204 ++
.../default/header/components/ErrorAction.vue | 48 +
.../default/header/components/FullScreen.vue | 37 +
.../layouts/default/header/components/Github.vue | 50 +
.../layouts/default/header/components/Slogan.vue | 64 +
.../src/layouts/default/header/components/index.ts | 18 +
.../default/header/components/lock/LockModal.vue | 126 +
.../header/components/notify/NoticeList.vue | 219 ++
.../default/header/components/notify/index.vue | 194 ++
.../components/user-dropdown/DropMenuItem.vue | 32 +
.../components/user-dropdown/PasswordModal.vue | 100 +
.../header/components/user-dropdown/index.vue | 190 ++
.../src/layouts/default/header/index.less | 196 ++
.../src/layouts/default/header/index.vue | 226 ++
.../src/layouts/default/index.vue | 92 +
.../src/layouts/default/menu/index.vue | 197 ++
.../src/layouts/default/menu/useLayoutMenu.ts | 109 +
.../src/layouts/default/setting/SettingDrawer.tsx | 427 +++
.../default/setting/components/InputNumberItem.vue | 56 +
.../default/setting/components/SelectItem.vue | 75 +
.../default/setting/components/SettingFooter.vue | 99 +
.../default/setting/components/SwitchItem.vue | 66 +
.../setting/components/ThemeColorPicker.vue | 88 +
.../default/setting/components/TypePicker.vue | 178 ++
.../layouts/default/setting/components/index.ts | 8 +
.../src/layouts/default/setting/enum.ts | 156 ++
.../src/layouts/default/setting/handler.ts | 174 ++
.../src/layouts/default/setting/index.vue | 26 +
.../src/layouts/default/sider/DragBar.vue | 66 +
.../src/layouts/default/sider/LayoutSider.vue | 185 ++
.../src/layouts/default/sider/MixSider.vue | 591 ++++
.../src/layouts/default/sider/index.vue | 57 +
.../src/layouts/default/sider/useLayoutSider.ts | 143 +
.../layouts/default/tabs/components/FoldButton.vue | 42 +
.../layouts/default/tabs/components/TabContent.vue | 76 +
.../layouts/default/tabs/components/TabRedo.vue | 33 +
.../src/layouts/default/tabs/index.less | 207 ++
.../src/layouts/default/tabs/index.vue | 144 +
.../src/layouts/default/tabs/types.ts | 25 +
.../src/layouts/default/tabs/useMultipleTabs.ts | 80 +
.../src/layouts/default/tabs/useTabDropdown.ts | 140 +
.../src/layouts/default/trigger/HeaderTrigger.vue | 25 +
.../src/layouts/default/trigger/SiderTrigger.vue | 21 +
.../src/layouts/default/trigger/index.vue | 22 +
.../src/layouts/iframe/index.vue | 29 +
.../src/layouts/iframe/useFrameKeepAlive.ts | 59 +
.../src/layouts/page/index.vue | 70 +
.../src/layouts/page/transition.ts | 33 +
.../streampark-console-newui/src/locales/helper.ts | 37 +
.../src/locales/lang/en.ts | 12 +
.../src/locales/lang/en/common.ts | 38 +
.../src/locales/lang/en/component.ts | 130 +
.../src/locales/lang/en/flink/app.ts | 57 +
.../src/locales/lang/en/flink/setting.ts | 16 +
.../src/locales/lang/en/layout.ts | 116 +
.../src/locales/lang/en/routes/basic.ts | 4 +
.../src/locales/lang/en/routes/dashboard.ts | 6 +
.../src/locales/lang/en/routes/demo.ts | 202 ++
.../src/locales/lang/en/sys.ts | 104 +
.../src/locales/lang/zh-CN/common.ts | 37 +
.../src/locales/lang/zh-CN/component.ts | 135 +
.../src/locales/lang/zh-CN/flink/app.ts | 56 +
.../src/locales/lang/zh-CN/flink/setting.ts | 16 +
.../src/locales/lang/zh-CN/layout.ts | 116 +
.../src/locales/lang/zh-CN/routes/basic.ts | 4 +
.../src/locales/lang/zh-CN/routes/dashboard.ts | 6 +
.../src/locales/lang/zh-CN/routes/demo.ts | 193 ++
.../src/locales/lang/zh-CN/sys.ts | 98 +
.../src/locales/lang/zh_CN.ts | 10 +
.../src/locales/setupI18n.ts | 44 +
.../src/locales/useLocale.ts | 69 +
.../src/logics/error-handle/index.ts | 184 ++
.../src/logics/initAppConfig.ts | 84 +
.../src/logics/mitt/routeChange.ts | 31 +
.../src/logics/theme/dark.ts | 24 +
.../src/logics/theme/index.ts | 17 +
.../src/logics/theme/updateBackground.ts | 75 +
.../src/logics/theme/updateColorWeak.ts | 9 +
.../src/logics/theme/updateGrayMode.ts | 9 +
.../src/logics/theme/util.ts | 11 +
.../streampark-console-newui/src/main.ts | 64 +
.../streampark-console-newui/src/monaco/index.ts | 108 +
.../src/router/constant.ts | 24 +
.../src/router/guard/index.ts | 147 +
.../src/router/guard/paramMenuGuard.ts | 47 +
.../src/router/guard/permissionGuard.ts | 118 +
.../src/router/guard/stateGuard.ts | 24 +
.../src/router/helper/menuHelper.ts | 106 +
.../src/router/helper/routeHelper.ts | 176 ++
.../streampark-console-newui/src/router/index.ts | 42 +
.../src/router/menus/index.ts | 126 +
.../src/router/routes/basic.ts | 78 +
.../src/router/routes/index.ts | 42 +
.../src/router/routes/modules/about.ts | 31 +
.../src/router/routes/modules/demo/StreamX.ts | 55 +
.../src/router/routes/modules/demo/System.ts | 64 +
.../streampark-console-newui/src/router/types.ts | 58 +
.../src/settings/componentSetting.ts | 51 +
.../src/settings/designSetting.ts | 48 +
.../src/settings/encryptionSetting.ts | 13 +
.../src/settings/localeSetting.ts | 29 +
.../src/settings/projectSetting.ts | 182 ++
.../src/settings/siteSetting.ts | 8 +
.../streampark-console-newui/src/store/index.ts | 10 +
.../src/store/modules/app.ts | 108 +
.../src/store/modules/errorLog.ts | 77 +
.../src/store/modules/flinkApplication.ts | 24 +
.../src/store/modules/locale.ts | 55 +
.../src/store/modules/lock.ts | 59 +
.../src/store/modules/multipleTab.ts | 362 +++
.../src/store/modules/permission.ts | 266 ++
.../src/store/modules/user.ts | 196 ++
.../src/utils/auth/index.ts | 26 +
.../streampark-console-newui/src/utils/bem.ts | 52 +
.../src/utils/cache/index.ts | 32 +
.../src/utils/cache/memory.ts | 107 +
.../src/utils/cache/persistent.ts | 136 +
.../src/utils/cache/storageCache.ts | 111 +
.../streampark-console-newui/src/utils/cipher.ts | 55 +
.../streampark-console-newui/src/utils/color.ts | 151 +
.../streampark-console-newui/src/utils/dateUtil.ts | 45 +
.../streampark-console-newui/src/utils/domUtils.ts | 180 ++
.../streampark-console-newui/src/utils/env.ts | 83 +
.../src/utils/event/index.ts | 42 +
.../src/utils/factory/createAsyncComponent.tsx | 63 +
.../src/utils/file/base64Conver.ts | 41 +
.../src/utils/file/download.ts | 96 +
.../src/utils/helper/treeHelper.ts | 216 ++
.../src/utils/helper/tsxHelper.tsx | 35 +
.../src/utils/http/axios/Axios.ts | 237 ++
.../src/utils/http/axios/axiosCancel.ts | 60 +
.../src/utils/http/axios/axiosRetry.ts | 28 +
.../src/utils/http/axios/axiosTransform.ts | 52 +
.../src/utils/http/axios/checkStatus.ts | 80 +
.../src/utils/http/axios/helper.ts | 48 +
.../src/utils/http/axios/index.ts | 271 ++
.../streampark-console-newui/src/utils/index.ts | 92 +
.../streampark-console-newui/src/utils/is.ts | 99 +
.../src/utils/lib/echarts.ts | 57 +
.../streampark-console-newui/src/utils/log.ts | 9 +
.../streampark-console-newui/src/utils/mitt.ts | 101 +
.../src/utils/propTypes.ts | 34 +
.../streampark-console-newui/src/utils/props.ts | 185 ++
.../streampark-console-newui/src/utils/types.ts | 42 +
.../streampark-console-newui/src/utils/uuid.ts | 28 +
.../src/views/flink/app/Add.vue | 364 +++
.../src/views/flink/app/Detail.vue | 234 ++
.../src/views/flink/app/EditFlink.vue | 228 ++
.../src/views/flink/app/EditStreamPark.vue | 370 +++
.../src/views/flink/app/FlinkSqlFormatter.js | 408 +++
.../src/views/flink/app/View.vue | 572 ++++
.../src/views/flink/app/components/AppConf.tsx | 115 +
.../app/components/AppDetail/CompareModal.vue | 154 +
.../flink/app/components/AppDetail/DetailTab.vue | 329 +++
.../flink/app/components/AppDetail/Different.vue | 138 +
.../app/components/AppDetail/ExecOptionModal.vue | 108 +
.../flink/app/components/AppView/BuildDrawer.vue | 245 ++
.../flink/app/components/AppView/BuildLayer.vue | 51 +
.../flink/app/components/AppView/LogModal.vue | 107 +
.../components/AppView/StartApplicationModal.vue | 185 ++
.../components/AppView/StopApplicationModal.vue | 154 +
.../flink/app/components/AppView/statisticCard.vue | 60 +
.../src/views/flink/app/components/CompareConf.tsx | 104 +
.../src/views/flink/app/components/Dependency.vue | 229 ++
.../flink/app/components/HadoopConfDrawer.vue | 82 +
.../src/views/flink/app/components/Mergely.vue | 207 ++
.../app/components/PodTemplate/HistoryDrawer.vue | 75 +
.../app/components/PodTemplate/HostAliasDrawer.vue | 144 +
.../app/components/PodTemplate/PomTemplateTab.vue | 315 +++
.../components/PodTemplate/TemplateButtonGroup.vue | 74 +
.../src/views/flink/app/components/State.less | 132 +
.../src/views/flink/app/components/State.tsx | 164 ++
.../views/flink/app/components/UploadJobJar.vue | 88 +
.../flink/app/components/UseSysHadoopConf.vue | 66 +
.../src/views/flink/app/components/flinkSql.vue | 203 ++
.../views/flink/app/components/flinkSqlHistory.vue | 60 +
.../src/views/flink/app/data/detail.data.ts | 164 ++
.../src/views/flink/app/data/index.ts | 135 +
.../src/views/flink/app/data/option.ts | 488 ++++
.../src/views/flink/app/hooks/useApp.tsx | 311 ++
.../flink/app/hooks/useCreateAndEditSchema.ts | 537 ++++
.../src/views/flink/app/hooks/useCreateSchema.ts | 301 ++
.../src/views/flink/app/hooks/useDetail.ts | 98 +
.../src/views/flink/app/hooks/useDetailContext.ts | 17 +
.../src/views/flink/app/hooks/useDiffMonaco.ts | 102 +
.../src/views/flink/app/hooks/useEdit.ts | 90 +
.../views/flink/app/hooks/useEditFlinkSchema.ts | 120 +
.../src/views/flink/app/hooks/useEditStreamPark.ts | 170 ++
.../src/views/flink/app/hooks/useFlinkRender.tsx | 485 ++++
.../src/views/flink/app/hooks/useFlinkSchema.ts | 472 ++++
.../src/views/flink/app/hooks/useLog.ts | 50 +
.../src/views/flink/app/styles/Add.less | 298 ++
.../src/views/flink/app/styles/Detail.less | 58 +
.../src/views/flink/app/styles/View.less | 190 ++
.../src/views/flink/app/utils/Pom.ts | 67 +
.../src/views/flink/app/utils/index.ts | 268 ++
.../src/views/flink/notebook/Submit.less | 75 +
.../src/views/flink/notebook/Submit.vue | 195 ++
.../src/views/flink/project/Add.vue | 68 +
.../src/views/flink/project/Edit.vue | 116 +
.../src/views/flink/project/View.vue | 145 +
.../views/flink/project/components/ListItem.vue | 241 ++
.../views/flink/project/components/LogModal.vue | 103 +
.../src/views/flink/project/project.data.ts | 65 +
.../src/views/flink/project/useProject.ts | 248 ++
.../src/views/flink/setting/AddCluster.vue | 97 +
.../src/views/flink/setting/EditCluster.vue | 144 +
.../src/views/flink/setting/View.less | 394 +++
.../src/views/flink/setting/View.vue | 46 +
.../views/flink/setting/components/AlertModal.vue | 358 +++
.../flink/setting/components/AlertSetting.vue | 223 ++
.../setting/components/FlinkClusterSetting.vue | 325 +++
.../flink/setting/components/FlinkEnvDraw.vue | 109 +
.../flink/setting/components/FlinkEnvModal.vue | 164 ++
.../flink/setting/components/FlinkEnvSetting.vue | 135 +
.../views/flink/setting/components/SettingList.vue | 139 +
.../flink/setting/components/SystemSetting.vue | 99 +
.../views/flink/setting/components/alert.data.ts | 107 +
.../views/flink/setting/hooks/useClusterSetting.ts | 357 +++
.../src/views/sys/about/index.vue | 98 +
.../src/views/sys/error-log/DetailModal.vue | 27 +
.../src/views/sys/error-log/data.tsx | 67 +
.../src/views/sys/error-log/index.vue | 92 +
.../src/views/sys/exception/Exception.vue | 148 +
.../src/views/sys/exception/index.ts | 1 +
.../src/views/sys/iframe/FrameBlank.vue | 9 +
.../src/views/sys/iframe/index.vue | 126 +
.../src/views/sys/lock/LockPage.vue | 234 ++
.../src/views/sys/lock/index.vue | 13 +
.../src/views/sys/lock/useNow.ts | 60 +
.../src/views/sys/login/ForgetPasswordForm.vue | 64 +
.../src/views/sys/login/Login.vue | 215 ++
.../src/views/sys/login/LoginForm.vue | 159 ++
.../src/views/sys/login/LoginFormTitle.vue | 25 +
.../src/views/sys/login/MobileForm.vue | 63 +
.../src/views/sys/login/QrCodeForm.vue | 31 +
.../src/views/sys/login/RegisterForm.vue | 104 +
.../src/views/sys/login/SessionTimeoutLogin.vue | 53 +
.../src/views/sys/login/useLogin.ts | 118 +
.../src/views/sys/redirect/index.vue | 30 +
.../src/views/system/account/AccountDetail.vue | 62 +
.../src/views/system/account/AccountModal.vue | 74 +
.../src/views/system/account/DeptTree.vue | 42 +
.../src/views/system/account/account.data.ts | 127 +
.../src/views/system/account/index.vue | 135 +
.../src/views/system/dept/DeptModal.vue | 62 +
.../src/views/system/dept/dept.data.ts | 108 +
.../src/views/system/dept/index.vue | 101 +
.../src/views/system/menu/Menu.vue | 98 +
.../src/views/system/menu/MenuDrawer.vue | 74 +
.../src/views/system/menu/menu.data.ts | 174 ++
.../src/views/system/password/index.vue | 45 +
.../src/views/system/password/pwd.data.ts | 46 +
.../src/views/system/role/Role.vue | 113 +
.../src/views/system/role/RoleDrawer.vue | 117 +
.../src/views/system/role/role.data.ts | 63 +
.../src/views/system/team/Team.vue | 119 +
.../src/views/system/team/TeamDrawer.vue | 64 +
.../src/views/system/team/team.data.ts | 49 +
.../src/views/system/user/User.vue | 146 +
.../src/views/system/user/UserDrawer.vue | 81 +
.../src/views/system/user/user.data.ts | 199 ++
.../streampark-console-newui/stylelint.config.js | 100 +
.../tests/server/README.md | 15 +
.../tests/server/controller/FileController.ts | 18 +
.../tests/server/controller/UserController.ts | 15 +
.../tests/server/ecosystem.config.js | 18 +
.../streampark-console-newui/tests/server/index.ts | 63 +
.../tests/server/nodemon.json | 8 +
.../tests/server/package.json | 36 +
.../tests/server/routes.ts | 23 +
.../tests/server/service/FileService.ts | 54 +
.../tests/server/service/UserService.ts | 25 +
.../tests/server/tsconfig.json | 15 +
.../streampark-console-newui/tests/server/utils.ts | 9 +
.../tests/server/yarn.lock | 2955 ++++++++++++++++++++
.../streampark-console-newui/tsconfig.json | 44 +
.../streampark-console-newui/types/axios.d.ts | 53 +
.../streampark-console-newui/types/config.d.ts | 162 ++
.../streampark-console-newui/types/global.d.ts | 101 +
.../streampark-console-newui/types/index.d.ts | 27 +
.../streampark-console-newui/types/module.d.ts | 16 +
.../streampark-console-newui/types/store.d.ts | 48 +
.../streampark-console-newui/types/utils.d.ts | 5 +
.../streampark-console-newui/types/vue-router.d.ts | 47 +
.../streampark-console-newui/vite.config.ts | 127 +
.../streampark-console-newui/windi.config.ts | 74 +
818 files changed, 74148 insertions(+)
diff --git a/streampark-console/streampark-console-newui/.editorconfig b/streampark-console/streampark-console-newui/.editorconfig
new file mode 100644
index 000000000..dccf841d4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.editorconfig
@@ -0,0 +1,19 @@
+root = true
+
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=true
+indent_style=space
+indent_size=2
+max_line_length = 100
+
+[*.{yml,yaml,json}]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
diff --git a/streampark-console/streampark-console-newui/.env b/streampark-console/streampark-console-newui/.env
new file mode 100644
index 000000000..351329c08
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.env
@@ -0,0 +1,8 @@
+# port
+VITE_PORT=3100
+
+# spa-title
+VITE_GLOB_APP_TITLE=StreamPark
+
+# spa shortname
+VITE_GLOB_APP_SHORT_NAME=vue_vben_admin
diff --git a/streampark-console/streampark-console-newui/.env.development b/streampark-console/streampark-console-newui/.env.development
new file mode 100644
index 000000000..718465476
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.env.development
@@ -0,0 +1,27 @@
+# Whether to open mock
+VITE_USE_MOCK=false
+
+# public path
+VITE_PUBLIC_PATH = /
+
+# Cross-domain proxy, you can configure multiple
+# Please note that no line breaks
+VITE_PROXY = [
+ ["/basic-api","http://localhost:10000"],
+ ["/upload","http://localhost:10000/upload"],
+ ["/streamx-api","http://localhost:10000"]
+]
+
+# Delete console
+VITE_DROP_CONSOLE = false
+
+# Basic interface address SPA
+VITE_GLOB_API_URL=/streamx-api
+
+# File upload address, optional
+VITE_GLOB_UPLOAD_URL=/upload
+
+# Interface prefix
+VITE_GLOB_API_URL_PREFIX=
+
+VITE_APP_BASE_API = /streamx-api
diff --git a/streampark-console/streampark-console-newui/.env.production b/streampark-console/streampark-console-newui/.env.production
new file mode 100644
index 000000000..a0bdfb7f4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.env.production
@@ -0,0 +1,35 @@
+# Whether to open mock
+VITE_USE_MOCK = true
+
+# public path
+VITE_PUBLIC_PATH = /
+
+# Delete console
+VITE_DROP_CONSOLE = true
+
+# Whether to enable gzip or brotli compression
+# Optional: gzip | brotli | none
+# If you need multiple forms, you can use `,` to separate
+VITE_BUILD_COMPRESS = 'none'
+
+# Whether to delete origin files when using compress, default false
+VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
+
+# Basic interface address SPA
+VITE_GLOB_API_URL=/basic-api
+
+# File upload address, optional
+# It can be forwarded by nginx or write the actual address directly
+VITE_GLOB_UPLOAD_URL=/upload
+
+# Interface prefix
+VITE_GLOB_API_URL_PREFIX=
+
+# Whether to enable image compression
+VITE_USE_IMAGEMIN= true
+
+# use pwa
+VITE_USE_PWA = false
+
+# Is it compatible with older browsers
+VITE_LEGACY = false
diff --git a/streampark-console/streampark-console-newui/.eslintignore b/streampark-console/streampark-console-newui/.eslintignore
new file mode 100644
index 000000000..348631b27
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.eslintignore
@@ -0,0 +1,15 @@
+
+*.sh
+node_modules
+*.md
+*.woff
+*.ttf
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+Dockerfile
diff --git a/streampark-console/streampark-console-newui/.eslintrc.js b/streampark-console/streampark-console-newui/.eslintrc.js
new file mode 100644
index 000000000..9aa3e10ce
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.eslintrc.js
@@ -0,0 +1,76 @@
+module.exports = {
+ root: true,
+ env: {
+ browser: true,
+ node: true,
+ es6: true,
+ },
+ parser: 'vue-eslint-parser',
+ parserOptions: {
+ parser: '@typescript-eslint/parser',
+ ecmaVersion: 2020,
+ sourceType: 'module',
+ jsxPragma: 'React',
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ extends: [
+ 'plugin:vue/vue3-recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:prettier/recommended',
+ ],
+ rules: {
+ 'vue/script-setup-uses-vars': 'error',
+ '@typescript-eslint/ban-ts-ignore': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-var-requires': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ 'vue/custom-event-name-casing': 'off',
+ 'no-use-before-define': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/ban-ts-comment': 'off',
+ '@typescript-eslint/ban-types': 'off',
+ '@typescript-eslint/no-non-null-assertion': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ },
+ ],
+ 'no-unused-vars': [
+ 'error',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ },
+ ],
+ 'space-before-function-paren': 'off',
+
+ 'vue/attributes-order': 'off',
+ 'vue/one-component-per-file': 'off',
+ 'vue/html-closing-bracket-newline': 'off',
+ 'vue/max-attributes-per-line': 'off',
+ 'vue/multiline-html-element-content-newline': 'off',
+ 'vue/singleline-html-element-content-newline': 'off',
+ 'vue/attribute-hyphenation': 'off',
+ 'vue/require-default-prop': 'off',
+ 'vue/require-explicit-emits': 'off',
+ 'vue/html-self-closing': [
+ 'error',
+ {
+ html: {
+ void: 'always',
+ normal: 'never',
+ component: 'always',
+ },
+ svg: 'always',
+ math: 'always',
+ },
+ ],
+ 'vue/multi-word-component-names': 'off',
+ },
+};
diff --git a/streampark-console/streampark-console-newui/.gitignore b/streampark-console/streampark-console-newui/.gitignore
new file mode 100644
index 000000000..e6922c46d
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.gitignore
@@ -0,0 +1,33 @@
+node_modules
+.DS_Store
+dist
+.npmrc
+.cache
+
+tests/server/static
+tests/server/static/upload
+
+.local
+# local env files
+.env.local
+.env.*.local
+.eslintcache
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+# .vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+package-lock.json
+pnpm-lock.yaml
+
diff --git a/streampark-console/streampark-console-newui/.gitpod.yml b/streampark-console/streampark-console-newui/.gitpod.yml
new file mode 100644
index 000000000..866381fcc
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.gitpod.yml
@@ -0,0 +1,6 @@
+ports:
+ - port: 3344
+ onOpen: open-preview
+tasks:
+ - init: pnpm install
+ command: pnpm run dev
diff --git a/streampark-console/streampark-console-newui/.husky/commit-msg b/streampark-console/streampark-console-newui/.husky/commit-msg
new file mode 100644
index 000000000..567ff71f0
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.husky/commit-msg
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# shellcheck source=./_/husky.sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit "$1"
diff --git a/streampark-console/streampark-console-newui/.husky/common.sh b/streampark-console/streampark-console-newui/.husky/common.sh
new file mode 100644
index 000000000..9d5129bd7
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.husky/common.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+command_exists () {
+ command -v "$1" >/dev/null 2>&1
+}
+
+# Workaround for Windows 10, Git Bash and Yarn
+if command_exists winpty && test -t 1; then
+ exec < /dev/tty
+fi
diff --git a/streampark-console/streampark-console-newui/.husky/pre-commit b/streampark-console/streampark-console-newui/.husky/pre-commit
new file mode 100644
index 000000000..35f92427c
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.husky/pre-commit
@@ -0,0 +1,8 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+. "$(dirname "$0")/common.sh"
+
+[ -n "$CI" ] && exit 0
+
+# Format and submit code according to lintstagedrc.js configuration
+npm run lint:lint-staged
diff --git a/streampark-console/streampark-console-newui/.prettierignore b/streampark-console/streampark-console-newui/.prettierignore
new file mode 100644
index 000000000..f7e39e60b
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.prettierignore
@@ -0,0 +1,9 @@
+/dist/*
+.local
+.output.js
+/node_modules/**
+
+**/*.svg
+**/*.sh
+
+/public/*
diff --git a/streampark-console/streampark-console-newui/.stylelintignore b/streampark-console/streampark-console-newui/.stylelintignore
new file mode 100644
index 000000000..051707612
--- /dev/null
+++ b/streampark-console/streampark-console-newui/.stylelintignore
@@ -0,0 +1,3 @@
+/dist/*
+/public/*
+public/*
diff --git a/streampark-console/streampark-console-newui/LICENSE b/streampark-console/streampark-console-newui/LICENSE
new file mode 100644
index 000000000..261eeb9e9
--- /dev/null
+++ b/streampark-console/streampark-console-newui/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/streampark-console/streampark-console-newui/README.md b/streampark-console/streampark-console-newui/README.md
new file mode 100644
index 000000000..ddce15dc7
--- /dev/null
+++ b/streampark-console/streampark-console-newui/README.md
@@ -0,0 +1,143 @@
+<div align="center">
+ <br/>
+ <h1>
+ <a href="https://streampark.apache.org" target="_blank" rel="noopener noreferrer">
+ <img width="600" src="https://streampark.apache.org/image/logo1.svg" alt="StreamPark logo">
+ </a>
+ </h1>
+ <strong style="font-size: 1.5rem">Make stream processing easier!!!</strong>
+</div>
+
+<br/>
+
+<p align="center">
+ <img src="https://tokei.rs/b1/github/apache/streampark">
+ <img src="https://img.shields.io/github/v/release/apache/streampark.svg">
+ <img src="https://img.shields.io/github/stars/apache/streampark">
+ <img src="https://img.shields.io/github/forks/apache/streampark">
+ <img src="https://img.shields.io/github/issues/apache/streampark">
+ <img src="https://img.shields.io/github/downloads/apache/streampark/total.svg">
+ <img src="https://img.shields.io/github/languages/count/apache/streampark">
+ <a href="https://www.apache.org/licenses/LICENSE-2.0.html"><img src="https://img.shields.io/badge/license-Apache%202-4EB1BA.svg"></a>
+</p>
+
+<div align="center">
+
+**[Official Website](https://streampark.apache.org)**
+
+</div>
+
+#### English | [中文](README.zh-CN.md)
+
+# Apache StreamPark (Incubating)
+
+Make stream processing easier
+
+> A magical framework that make stream processing easier!
+
+![](https://streampark.apache.org/image/dashboard.png)
+
+### Use Gitpod
+
+Open the project in Gitpod (free online dev environment for GitHub) and start coding immediately.
+
+[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/streamxhub/streamx-webapp)
+
+## Documentation
+
+[Document](https://vvbin.cn/doc-next/)
+
+## Preparation
+
+- [node](http://nodejs.org/) and [git](https://git-scm.com/) - Project development environment
+- [Vite](https://vitejs.dev/) - Familiar with vite features
+- [Vue3](https://vuejs.org/) - Familiar with Vue basic syntax
+- [TypeScript](https://www.typescriptlang.org/) - Familiar with the basic syntax of `TypeScript`
+- [Es6+](http://es6.ruanyifeng.com/) - Familiar with es6 basic syntax
+- [Vue-Router-Next](https://next.router.vuejs.org/) - Familiar with the basic use of vue-router
+- [Ant-Design-Vue](https://antdv.com/docs/vue/introduce-cn/) - ui basic use
+
+## Install and use
+
+- Get the project code
+
+```bash
+git clone https://github.com/streamxhub/streamx-webapp.git
+```
+
+- Installation dependencies
+
+```bash
+cd streamx-webapp
+
+pnpm install
+
+```
+
+- run
+
+```bash
+pnpm serve
+```
+
+- build
+
+```bash
+pnpm build
+```
+
+## How to contribute
+
+You are very welcome to join![Raise an issue](https://github.com/streamxhub/streamx-webapp/issues/new/choose) Or submit a Pull Request。
+
+**Pull Request:**
+
+1. Fork code!
+2. Create your own branch: `git checkout -b feat/xxxx`
+3. Submit your changes: `git commit -am 'feat(function): add xxxxx'`
+4. Push your branch: `git push origin feat/xxxx`
+5. submit`pull request`
+
+## Git Contribution submission specification
+
+- reference [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) specification ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
+
+ - `feat` Add new features
+ - `fix` Fix the problem/BUG
+ - `style` The code style is related and does not affect the running result
+ - `perf` Optimization/performance improvement
+ - `refactor` Refactor
+ - `revert` Undo edit
+ - `test` Test related
+ - `docs` Documentation/notes
+ - `chore` Dependency update/scaffolding configuration modification etc.
+ - `workflow` Workflow improvements
+ - `ci` Continuous integration
+ - `types` Type definition file changes
+ - `wip` In development
+
+## Related warehouse
+
+If these plugins are helpful to you, you can give a star support
+
+- [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - Used for local and development environment data mock
+- [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - Used for html template conversion and compression
+- [vite-plugin-style-import](https://github.com/anncwb/vite-plugin-style-import) - Used for component library style introduction on demand
+- [vite-plugin-theme](https://github.com/anncwb/vite-plugin-theme) - Used for online switching of theme colors and other color-related configurations
+- [vite-plugin-imagemin](https://github.com/anncwb/vite-plugin-imagemin) - Used to pack compressed image resources
+- [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - Used to pack input .gz|.brotil files
+- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - Used to quickly generate svg sprite
+
+## Browser support
+
+The `Chrome 80+` browser is recommended for local development
+
+Support modern browsers, not IE
+
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefo [...]
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+# Reference project
+
+- [vue-vben-admin](https://github.com/vbenjs/vue-vben-admin)
diff --git a/streampark-console/streampark-console-newui/README.zh-CN.md b/streampark-console/streampark-console-newui/README.zh-CN.md
new file mode 100644
index 000000000..03cdf7ba9
--- /dev/null
+++ b/streampark-console/streampark-console-newui/README.zh-CN.md
@@ -0,0 +1,145 @@
+<div align="center">
+ <br/>
+ <h1>
+ <a href="https://streampark.apache.org" target="_blank" rel="noopener noreferrer">
+ <img width="600" src="https://streampark.apache.org/image/logo1.svg" alt="StreamPark logo">
+ </a>
+ </h1>
+ <strong style="font-size: 1.5rem">Make stream processing easier!!!</strong>
+</div>
+
+<br/>
+
+<p align="center">
+ <img src="https://tokei.rs/b1/github/apache/streampark">
+ <img src="https://img.shields.io/github/v/release/apache/streampark.svg">
+ <img src="https://img.shields.io/github/stars/apache/streampark">
+ <img src="https://img.shields.io/github/forks/apache/streampark">
+ <img src="https://img.shields.io/github/issues/apache/streampark">
+ <img src="https://img.shields.io/github/downloads/apache/streampark/total.svg">
+ <img src="https://img.shields.io/github/languages/count/apache/streampark">
+ <a href="https://www.apache.org/licenses/LICENSE-2.0.html"><img src="https://img.shields.io/badge/license-Apache%202-4EB1BA.svg"></a>
+</p>
+
+
+<div align="center">
+
+**[官网](https://streampark.apache.org)**
+
+</div>
+
+#### [English](README.md) | 中文
+
+# Apache StreamPark (Incubating)
+
+Make stream processing easier
+
+> 一个神奇的框架,让流处理更简单。
+
+![](https://streampark.apache.org/image/dashboard.png)
+
+### 使用 Gitpod
+
+在 Gitpod(适用于 GitHub 的免费在线开发环境)中打开项目,并立即开始编码.
+
+[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/streamxhub/streamx-webapp)
+
+## 文档
+
+[文档地址](https://vvbin.cn/doc-next/)
+
+## 准备
+
+- [node](http://nodejs.org/) 和 [git](https://git-scm.com/) -项目开发环境
+- [Vite](https://vitejs.dev/) - 熟悉 vite 特性
+- [Vue3](https://vuejs.org/) - 熟悉 Vue 基础语法
+- [TypeScript](https://www.typescriptlang.org/) - 熟悉`TypeScript`基本语法
+- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 es6 基本语法
+- [Vue-Router-Next](https://next.router.vuejs.org/) - 熟悉 vue-router 基本使用
+- [Ant-Design-Vue](https://antdv.com/docs/vue/introduce-cn/) - ui 基本使用
+- [Mock.js](https://github.com/nuysoft/Mock) - mockjs 基本语法
+
+## 安装使用
+
+- 获取项目代码
+
+```bash
+git clone https://github.com/streamxhub/streamx-webapp.git
+```
+
+- 安装依赖
+
+```bash
+cd streamx-webapp
+
+pnpm install
+
+```
+
+- 运行
+
+```bash
+pnpm serve
+```
+
+- 打包
+
+```bash
+pnpm build
+```
+
+## 如何贡献
+
+非常欢迎你的加入![提一个 Issue](https://github.com/streamxhub/streamx-webapp/issues/new/choose) 或者提交一个 Pull Request。
+
+**Pull Request:**
+
+1. Fork 代码!
+2. 创建自己的分支: `git checkout -b feat/xxxx`
+3. 提交你的修改: `git commit -am 'feat(function): add xxxxx'`
+4. 推送您的分支: `git push origin feat/xxxx`
+5. 提交`pull request`
+
+## Git 贡献提交规范
+
+- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
+
+ - `feat` 增加新功能
+ - `fix` 修复问题/BUG
+ - `style` 代码风格相关无影响运行结果的
+ - `perf` 优化/性能提升
+ - `refactor` 重构
+ - `revert` 撤销修改
+ - `test` 测试相关
+ - `docs` 文档/注释
+ - `chore` 依赖更新/脚手架配置修改等
+ - `workflow` 工作流改进
+ - `ci` 持续集成
+ - `types` 类型定义文件更改
+ - `wip` 开发中
+
+## 浏览器支持
+
+本地开发推荐使用`Chrome 80+` 浏览器
+
+支持现代浏览器, 不支持 IE
+
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefo [...]
+| :-: | :-: | :-: | :-: | :-: |
+| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+
+## 相关仓库
+
+如果这些插件对你有帮助,可以给一个 star 支持下
+
+- [vite-plugin-mock](https://github.com/anncwb/vite-plugin-mock) - 用于本地及开发环境数据 mock
+- [vite-plugin-html](https://github.com/anncwb/vite-plugin-html) - 用于 html 模版转换及压缩
+- [vite-plugin-style-import](https://github.com/anncwb/vite-plugin-style-import) - 用于组件库样式按需引入
+- [vite-plugin-theme](https://github.com/anncwb/vite-plugin-theme) - 用于在线切换主题色等颜色相关配置
+- [vite-plugin-imagemin](https://github.com/anncwb/vite-plugin-imagemin) - 用于打包压缩图片资源
+- [vite-plugin-compression](https://github.com/anncwb/vite-plugin-compression) - 用于打包输出.gz|.brotil 文件
+- [vite-plugin-svg-icons](https://github.com/anncwb/vite-plugin-svg-icons) - 用于快速生成 svg 雪碧图
+
+# 参考项目
+
+- [vue-vben-admin](https://github.com/vbenjs/vue-vben-admin)
diff --git a/streampark-console/streampark-console-newui/build/config/themeConfig.ts b/streampark-console/streampark-console-newui/build/config/themeConfig.ts
new file mode 100644
index 000000000..c7e251096
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/config/themeConfig.ts
@@ -0,0 +1,79 @@
+import { generate } from '@ant-design/colors';
+
+export const primaryColor = '#1890ff';
+
+export const darkMode = 'light';
+
+type Fn = (...arg: any) => any;
+
+type GenerateTheme = 'default' | 'dark';
+
+export interface GenerateColorsParams {
+ mixLighten: Fn;
+ mixDarken: Fn;
+ tinycolor: any;
+ color?: string;
+}
+
+export function generateAntColors(color: string, theme: GenerateTheme = 'default') {
+ return generate(color, {
+ theme,
+ });
+}
+
+export function getThemeColors(color?: string) {
+ const tc = color || primaryColor;
+ const lightColors = generateAntColors(tc);
+ const primary = lightColors[5];
+ const modeColors = generateAntColors(primary, 'dark');
+
+ return [...lightColors, ...modeColors];
+}
+
+export function generateColors({
+ color = primaryColor,
+ mixLighten,
+ mixDarken,
+ tinycolor,
+}: GenerateColorsParams) {
+ const arr = new Array(19).fill(0);
+ const lightens = arr.map((_t, i) => {
+ return mixLighten(color, i / 5);
+ });
+
+ const darkens = arr.map((_t, i) => {
+ return mixDarken(color, i / 5);
+ });
+
+ const alphaColors = arr.map((_t, i) => {
+ return tinycolor(color)
+ .setAlpha(i / 20)
+ .toRgbString();
+ });
+
+ const shortAlphaColors = alphaColors.map((item) => item.replace(/\s/g, '').replace(/0\./g, '.'));
+
+ const tinycolorLightens = arr
+ .map((_t, i) => {
+ return tinycolor(color)
+ .lighten(i * 5)
+ .toHexString();
+ })
+ .filter((item) => item !== '#ffffff');
+
+ const tinycolorDarkens = arr
+ .map((_t, i) => {
+ return tinycolor(color)
+ .darken(i * 5)
+ .toHexString();
+ })
+ .filter((item) => item !== '#000000');
+ return [
+ ...lightens,
+ ...darkens,
+ ...alphaColors,
+ ...shortAlphaColors,
+ ...tinycolorDarkens,
+ ...tinycolorLightens,
+ ].filter((item) => !item.includes('-'));
+}
diff --git a/streampark-console/streampark-console-newui/build/constant.ts b/streampark-console/streampark-console-newui/build/constant.ts
new file mode 100644
index 000000000..2c6119c8d
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/constant.ts
@@ -0,0 +1,6 @@
+/**
+ * The name of the configuration file entered in the production environment
+ */
+export const GLOB_CONFIG_FILE_NAME = '_app.config.js';
+
+export const OUTPUT_DIR = 'dist';
diff --git a/streampark-console/streampark-console-newui/build/generate/generateModifyVars.ts b/streampark-console/streampark-console-newui/build/generate/generateModifyVars.ts
new file mode 100644
index 000000000..44670e2f6
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/generate/generateModifyVars.ts
@@ -0,0 +1,37 @@
+import { generateAntColors, primaryColor } from '../config/themeConfig';
+import { getThemeVariables } from 'ant-design-vue/dist/theme';
+import { resolve } from 'path';
+
+/**
+ * less global variable
+ */
+export function generateModifyVars(dark = false) {
+ const palettes = generateAntColors(primaryColor);
+ const primary = palettes[5];
+
+ const primaryColorObj: Record<string, string> = {};
+
+ for (let index = 0; index < 10; index++) {
+ primaryColorObj[`primary-${index + 1}`] = palettes[index];
+ }
+
+ const modifyVars = getThemeVariables({ dark });
+ return {
+ ...modifyVars,
+ // Used for global import to avoid the need to import each style file separately
+ // reference: Avoid repeated references
+ hack: `${modifyVars.hack} @import (reference) "${resolve('src/design/config.less')}";`,
+ 'primary-color': primary,
+ ...primaryColorObj,
+ 'info-color': primary,
+ 'processing-color': primary,
+ 'success-color': '#55D187', // Success color
+ 'error-color': '#ED6F6F', // False color
+ 'warning-color': '#EFBD47', // Warning color
+ //'border-color-base': '#EEEEEE',
+ 'font-size-base': '14px', // Main font size
+ 'border-radius-base': '2px', // Component/float fillet
+ 'link-color': primary, // Link color
+ 'app-content-background': '#fafafa', // Link color
+ };
+}
diff --git a/streampark-console/streampark-console-newui/build/getConfigFileName.ts b/streampark-console/streampark-console-newui/build/getConfigFileName.ts
new file mode 100644
index 000000000..d61cd4162
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/getConfigFileName.ts
@@ -0,0 +1,9 @@
+/**
+ * Get the configuration file variable name
+ * @param env
+ */
+export const getConfigFileName = (env: Record<string, any>) => {
+ return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`
+ .toUpperCase()
+ .replace(/\s/g, '');
+};
diff --git a/streampark-console/streampark-console-newui/build/script/buildConf.ts b/streampark-console/streampark-console-newui/build/script/buildConf.ts
new file mode 100644
index 000000000..aa7b84399
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/script/buildConf.ts
@@ -0,0 +1,45 @@
+/**
+ * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging
+ */
+import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
+import fs, { writeFileSync } from 'fs-extra';
+import colors from 'picocolors';
+
+import { getEnvConfig, getRootPath } from '../utils';
+import { getConfigFileName } from '../getConfigFileName';
+
+import pkg from '../../package.json';
+
+interface CreateConfigParams {
+ configName: string;
+ config: any;
+ configFileName?: string;
+}
+
+function createConfig(params: CreateConfigParams) {
+ const { configName, config, configFileName } = params;
+ try {
+ const windowConf = `window.${configName}`;
+ // Ensure that the variable will not be modified
+ const configStr = `${windowConf}=${JSON.stringify(config)};
+ Object.freeze(${windowConf});
+ Object.defineProperty(window, "${configName}", {
+ configurable: false,
+ writable: false,
+ });
+ `.replace(/\s/g, '');
+ fs.mkdirp(getRootPath(OUTPUT_DIR));
+ writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
+
+ console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
+ console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n');
+ } catch (error) {
+ console.log(colors.red('configuration file configuration file failed to package:\n' + error));
+ }
+}
+
+export function runBuildConfig() {
+ const config = getEnvConfig();
+ const configFileName = getConfigFileName(config);
+ createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME });
+}
diff --git a/streampark-console/streampark-console-newui/build/script/postBuild.ts b/streampark-console/streampark-console-newui/build/script/postBuild.ts
new file mode 100644
index 000000000..42635d88b
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/script/postBuild.ts
@@ -0,0 +1,23 @@
+// #!/usr/bin/env node
+
+import { runBuildConfig } from './buildConf';
+import colors from 'picocolors';
+
+import pkg from '../../package.json';
+
+export const runBuild = async () => {
+ try {
+ const argvList = process.argv.splice(2);
+
+ // Generate configuration file
+ if (!argvList.includes('disabled-config')) {
+ runBuildConfig();
+ }
+
+ console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
+ } catch (error) {
+ console.log(colors.red('vite build error:\n' + error));
+ process.exit(1);
+ }
+};
+runBuild();
diff --git a/streampark-console/streampark-console-newui/build/utils.ts b/streampark-console/streampark-console-newui/build/utils.ts
new file mode 100644
index 000000000..c201514f9
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/utils.ts
@@ -0,0 +1,92 @@
+import fs from 'fs';
+import path from 'path';
+import dotenv from 'dotenv';
+
+export function isDevFn(mode: string): boolean {
+ return mode === 'development';
+}
+
+export function isProdFn(mode: string): boolean {
+ return mode === 'production';
+}
+
+/**
+ * Whether to generate package preview
+ */
+export function isReportMode(): boolean {
+ return process.env.REPORT === 'true';
+}
+
+// Read all environment variable configuration files to process.env
+export function wrapperEnv(envConf: Recordable): ViteEnv {
+ const ret: any = {};
+
+ for (const envName of Object.keys(envConf)) {
+ let realName = envConf[envName].replace(/\\n/g, '\n');
+ realName = realName === 'true' ? true : realName === 'false' ? false : realName;
+
+ if (envName === 'VITE_PORT') {
+ realName = Number(realName);
+ }
+ if (envName === 'VITE_PROXY' && realName) {
+ try {
+ realName = JSON.parse(realName.replace(/'/g, '"'));
+ } catch (error) {
+ realName = '';
+ }
+ }
+ ret[envName] = realName;
+ if (typeof realName === 'string') {
+ process.env[envName] = realName;
+ } else if (typeof realName === 'object') {
+ process.env[envName] = JSON.stringify(realName);
+ }
+ }
+ return ret;
+}
+
+/**
+ * 获取当前环境下生效的配置文件名
+ */
+function getConfFiles() {
+ const script = process.env.npm_lifecycle_script;
+ const reg = new RegExp('--mode ([a-z_\\d]+)');
+ const result = reg.exec(script as string) as any;
+ if (result) {
+ const mode = result[1] as string;
+ return ['.env', `.env.${mode}`];
+ }
+ return ['.env', '.env.production'];
+}
+
+/**
+ * Get the environment variables starting with the specified prefix
+ * @param match prefix
+ * @param confFiles ext
+ */
+export function getEnvConfig(match = 'VITE_GLOB_', confFiles = getConfFiles()) {
+ let envConfig = {};
+ confFiles.forEach((item) => {
+ try {
+ const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
+ envConfig = { ...envConfig, ...env };
+ } catch (e) {
+ console.error(`Error in parsing ${item}`, e);
+ }
+ });
+ const reg = new RegExp(`^(${match})`);
+ Object.keys(envConfig).forEach((key) => {
+ if (!reg.test(key)) {
+ Reflect.deleteProperty(envConfig, key);
+ }
+ });
+ return envConfig;
+}
+
+/**
+ * Get user root directory
+ * @param dir file path
+ */
+export function getRootPath(...dir: string[]) {
+ return path.resolve(process.cwd(), ...dir);
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/compress.ts b/streampark-console/streampark-console-newui/build/vite/plugin/compress.ts
new file mode 100644
index 000000000..ff4f6311d
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/compress.ts
@@ -0,0 +1,35 @@
+/**
+ * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
+ * https://github.com/anncwb/vite-plugin-compression
+ */
+import type { PluginOption } from 'vite';
+import compressPlugin from 'vite-plugin-compression';
+
+export function configCompressPlugin(
+ compress: 'gzip' | 'brotli' | 'none',
+ deleteOriginFile = false,
+): PluginOption | PluginOption[] {
+ const compressList = compress.split(',');
+
+ const plugins: PluginOption[] = [];
+
+ if (compressList.includes('gzip')) {
+ plugins.push(
+ compressPlugin({
+ ext: '.gz',
+ deleteOriginFile,
+ }),
+ );
+ }
+
+ if (compressList.includes('brotli')) {
+ plugins.push(
+ compressPlugin({
+ ext: '.br',
+ algorithm: 'brotliCompress',
+ deleteOriginFile,
+ }),
+ );
+ }
+ return plugins;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/html.ts b/streampark-console/streampark-console-newui/build/vite/plugin/html.ts
new file mode 100644
index 000000000..6af034ac4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/html.ts
@@ -0,0 +1,40 @@
+/**
+ * Plugin to minimize and use ejs template syntax in index.html.
+ * https://github.com/anncwb/vite-plugin-html
+ */
+import type { PluginOption } from 'vite';
+import { createHtmlPlugin } from 'vite-plugin-html';
+import pkg from '../../../package.json';
+import { GLOB_CONFIG_FILE_NAME } from '../../constant';
+
+export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
+ const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env;
+
+ const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;
+
+ const getAppConfigSrc = () => {
+ return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
+ };
+
+ const htmlPlugin: PluginOption[] = createHtmlPlugin({
+ minify: isBuild,
+ inject: {
+ // Inject data into ejs template
+ data: {
+ title: VITE_GLOB_APP_TITLE,
+ },
+ // Embed the generated app.config.js file
+ tags: isBuild
+ ? [
+ {
+ tag: 'script',
+ attrs: {
+ src: getAppConfigSrc(),
+ },
+ },
+ ]
+ : [],
+ },
+ });
+ return htmlPlugin;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/imagemin.ts b/streampark-console/streampark-console-newui/build/vite/plugin/imagemin.ts
new file mode 100644
index 000000000..a0235732e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/imagemin.ts
@@ -0,0 +1,34 @@
+// Image resource files used to compress the output of the production environment
+// https://github.com/anncwb/vite-plugin-imagemin
+import viteImagemin from 'vite-plugin-imagemin';
+
+export function configImageminPlugin() {
+ const plugin = viteImagemin({
+ gifsicle: {
+ optimizationLevel: 7,
+ interlaced: false,
+ },
+ optipng: {
+ optimizationLevel: 7,
+ },
+ mozjpeg: {
+ quality: 20,
+ },
+ pngquant: {
+ quality: [0.8, 0.9],
+ speed: 4,
+ },
+ svgo: {
+ plugins: [
+ {
+ name: 'removeViewBox',
+ },
+ {
+ name: 'removeEmptyAttrs',
+ active: false,
+ },
+ ],
+ },
+ });
+ return plugin;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/index.ts b/streampark-console/streampark-console-newui/build/vite/plugin/index.ts
new file mode 100644
index 000000000..51d992b56
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/index.ts
@@ -0,0 +1,83 @@
+import { PluginOption } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import vueJsx from '@vitejs/plugin-vue-jsx';
+import legacy from '@vitejs/plugin-legacy';
+import purgeIcons from 'vite-plugin-purge-icons';
+import windiCSS from 'vite-plugin-windicss';
+import VitePluginCertificate from 'vite-plugin-mkcert';
+import vueSetupExtend from 'vite-plugin-vue-setup-extend';
+import { configHtmlPlugin } from './html';
+// import { configPwaConfig } from './pwa';
+import { configMockPlugin } from './mock';
+import { configCompressPlugin } from './compress';
+import { configStyleImportPlugin } from './styleImport';
+import { configVisualizerConfig } from './visualizer';
+import { configThemePlugin } from './theme';
+import { configImageminPlugin } from './imagemin';
+import { configSvgIconsPlugin } from './svgSprite';
+
+export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
+ const {
+ VITE_USE_IMAGEMIN,
+ VITE_USE_MOCK,
+ VITE_LEGACY,
+ VITE_BUILD_COMPRESS,
+ VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE,
+ } = viteEnv;
+
+ const vitePlugins: (PluginOption | PluginOption[])[] = [
+ // have to
+ vue(),
+ // have to
+ vueJsx(),
+ // support name
+ vueSetupExtend(),
+
+ VitePluginCertificate({
+ source: 'coding',
+ }),
+ ];
+
+ // vite-plugin-windicss
+ vitePlugins.push(windiCSS());
+
+ // @vitejs/plugin-legacy
+ VITE_LEGACY && isBuild && vitePlugins.push(legacy());
+
+ // vite-plugin-html
+ vitePlugins.push(configHtmlPlugin(viteEnv, isBuild));
+
+ // vite-plugin-svg-icons
+ vitePlugins.push(configSvgIconsPlugin(isBuild));
+
+ // vite-plugin-mock
+ VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild));
+
+ // vite-plugin-purge-icons
+ vitePlugins.push(purgeIcons());
+
+ // vite-plugin-style-import
+ vitePlugins.push(configStyleImportPlugin(isBuild));
+
+ // rollup-plugin-visualizer
+ vitePlugins.push(configVisualizerConfig());
+
+ // vite-plugin-theme
+ vitePlugins.push(configThemePlugin(isBuild));
+
+ // The following plugins only work in the production environment
+ if (isBuild) {
+ // vite-plugin-imagemin
+ VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin());
+
+ // rollup-plugin-gzip
+ vitePlugins.push(
+ configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE),
+ );
+
+ // vite-plugin-pwa
+ // vitePlugins.push(configPwaConfig(viteEnv));
+ }
+
+ return vitePlugins;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/mock.ts b/streampark-console/streampark-console-newui/build/vite/plugin/mock.ts
new file mode 100644
index 000000000..d241e2673
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/mock.ts
@@ -0,0 +1,19 @@
+/**
+ * Mock plugin for development and production.
+ * https://github.com/anncwb/vite-plugin-mock
+ */
+import { viteMockServe } from 'vite-plugin-mock';
+
+export function configMockPlugin(isBuild: boolean) {
+ return viteMockServe({
+ ignore: /^\_/,
+ mockPath: 'mock',
+ localEnabled: !isBuild,
+ prodEnabled: isBuild,
+ injectCode: `
+ import { setupProdMockServer } from '../mock/_createProductionServer';
+
+ setupProdMockServer();
+ `,
+ });
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/pwa.ts b/streampark-console/streampark-console-newui/build/vite/plugin/pwa.ts
new file mode 100644
index 000000000..90ef5bc02
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/pwa.ts
@@ -0,0 +1,33 @@
+/**
+ * Zero-config PWA for Vite
+ * https://github.com/antfu/vite-plugin-pwa
+ */
+import { VitePWA } from 'vite-plugin-pwa';
+
+export function configPwaConfig(env: ViteEnv) {
+ const { VITE_USE_PWA, VITE_GLOB_APP_TITLE, VITE_GLOB_APP_SHORT_NAME } = env;
+
+ if (VITE_USE_PWA) {
+ // vite-plugin-pwa
+ const pwaPlugin = VitePWA({
+ manifest: {
+ name: VITE_GLOB_APP_TITLE,
+ short_name: VITE_GLOB_APP_SHORT_NAME,
+ icons: [
+ {
+ src: './resource/img/pwa-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ },
+ {
+ src: './resource/img/pwa-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ },
+ ],
+ },
+ });
+ return pwaPlugin;
+ }
+ return [];
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/styleImport.ts b/streampark-console/streampark-console-newui/build/vite/plugin/styleImport.ts
new file mode 100644
index 000000000..1f606c4d7
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/styleImport.ts
@@ -0,0 +1,80 @@
+/**
+ * Introduces component library styles on demand.
+ * https://github.com/anncwb/vite-plugin-style-import
+ */
+import { createStyleImportPlugin } from 'vite-plugin-style-import';
+
+export function configStyleImportPlugin(_isBuild: boolean) {
+ // if (!isBuild) {
+ // return [];
+ // }
+ const styleImportPlugin = createStyleImportPlugin({
+ libs: [
+ {
+ libraryName: 'ant-design-vue',
+ esModule: true,
+ resolveStyle: (name) => {
+ // 这里是无需额外引入样式文件的“子组件”列表
+ const ignoreList = [
+ 'anchor-link',
+ 'sub-menu',
+ 'menu-item',
+ 'menu-divider',
+ 'menu-item-group',
+ 'breadcrumb-item',
+ 'breadcrumb-separator',
+ 'form-item',
+ 'step',
+ 'select-option',
+ 'select-opt-group',
+ 'card-grid',
+ 'card-meta',
+ 'collapse-panel',
+ 'descriptions-item',
+ 'list-item',
+ 'list-item-meta',
+ 'table-column',
+ 'table-column-group',
+ 'tab-pane',
+ 'tab-content',
+ 'timeline-item',
+ 'tree-node',
+ 'skeleton-input',
+ 'skeleton-avatar',
+ 'skeleton-title',
+ 'skeleton-paragraph',
+ 'skeleton-image',
+ 'skeleton-button',
+ ];
+ // 这里是需要额外引入样式的子组件列表
+ // 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失
+ const replaceList = {
+ 'typography-text': 'typography',
+ 'typography-title': 'typography',
+ 'typography-paragraph': 'typography',
+ 'typography-link': 'typography',
+ 'dropdown-button': 'dropdown',
+ 'input-password': 'input',
+ 'input-search': 'input',
+ 'input-group': 'input',
+ 'radio-group': 'radio',
+ 'checkbox-group': 'checkbox',
+ 'layout-sider': 'layout',
+ 'layout-content': 'layout',
+ 'layout-footer': 'layout',
+ 'layout-header': 'layout',
+ 'month-picker': 'date-picker',
+ 'range-picker': 'date-picker',
+ };
+
+ return ignoreList.includes(name)
+ ? ''
+ : replaceList.hasOwnProperty(name)
+ ? `ant-design-vue/es/${replaceList[name]}/style/index`
+ : `ant-design-vue/es/${name}/style/index`;
+ },
+ },
+ ],
+ });
+ return styleImportPlugin;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/svgSprite.ts b/streampark-console/streampark-console-newui/build/vite/plugin/svgSprite.ts
new file mode 100644
index 000000000..61f637f4e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/svgSprite.ts
@@ -0,0 +1,17 @@
+/**
+ * Vite Plugin for fast creating SVG sprites.
+ * https://github.com/anncwb/vite-plugin-svg-icons
+ */
+
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
+import path from 'path';
+
+export function configSvgIconsPlugin(isBuild: boolean) {
+ const svgIconsPlugin = createSvgIconsPlugin({
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
+ svgoOptions: isBuild,
+ // default
+ symbolId: 'icon-[dir]-[name]',
+ });
+ return svgIconsPlugin;
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/theme.ts b/streampark-console/streampark-console-newui/build/vite/plugin/theme.ts
new file mode 100644
index 000000000..4e3cc0696
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/theme.ts
@@ -0,0 +1,91 @@
+/**
+ * Vite plugin for website theme color switching
+ * https://github.com/anncwb/vite-plugin-theme
+ */
+import type { PluginOption } from 'vite';
+import path from 'path';
+import {
+ viteThemePlugin,
+ antdDarkThemePlugin,
+ mixLighten,
+ mixDarken,
+ tinycolor,
+} from 'vite-plugin-theme';
+import { getThemeColors, generateColors } from '../../config/themeConfig';
+import { generateModifyVars } from '../../generate/generateModifyVars';
+
+export function configThemePlugin(isBuild: boolean): PluginOption[] {
+ const colors = generateColors({
+ mixDarken,
+ mixLighten,
+ tinycolor,
+ });
+ const plugin = [
+ viteThemePlugin({
+ resolveSelector: (s) => {
+ s = s.trim();
+ switch (s) {
+ case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
+ return '.ant-steps-item-icon > .ant-steps-icon';
+ case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)':
+ case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover':
+ case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active':
+ return s;
+ case '.ant-steps-item-icon > .ant-steps-icon':
+ return s;
+ case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)':
+ return s;
+ default:
+ if (s.indexOf('.ant-btn') >= -1) {
+ // 按钮被重新定制过,需要过滤掉class防止覆盖
+ return s;
+ }
+ }
+ return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`;
+ },
+ colorVariables: [...getThemeColors(), ...colors],
+ }),
+ antdDarkThemePlugin({
+ preloadFiles: [
+ path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'),
+ //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),
+ path.resolve(process.cwd(), 'src/design/index.less'),
+ ],
+ filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),
+ // extractCss: false,
+ darkModifyVars: {
+ ...generateModifyVars(true),
+ 'text-color': '#c9d1d9',
+ 'primary-1': 'rgb(255 255 255 / 8%)',
+ 'text-color-base': '#c9d1d9',
+ 'component-background': '#151515',
+ 'heading-color': 'rgb(255 255 255 / 65%)',
+ // black: '#0e1117',
+ // #8b949e
+ 'text-color-secondary': '#8b949e',
+ 'border-color-base': '#303030',
+ // 'border-color-split': '#30363d',
+ 'item-active-bg': '#111b26',
+ 'app-content-background': '#1e1e1e',
+ 'tree-node-selected-bg': '#11263c',
+
+ 'alert-success-border-color': '#274916',
+ 'alert-success-bg-color': '#162312',
+ 'alert-success-icon-color': '#49aa19',
+ 'alert-info-border-color': '#153450',
+ 'alert-info-bg-color': '#111b26',
+ 'alert-info-icon-color': '#177ddc',
+ 'alert-warning-border-color': '#594214',
+ 'alert-warning-bg-color': '#2b2111',
+ 'alert-warning-icon-color': '#d89614',
+ 'alert-error-border-color': '#58181c',
+ 'alert-error-bg-color': '#2a1215',
+ 'alert-error-icon-color': '#a61d24',
+ 'background-color-light': '#fafafa',
+ 'background-color-base': '#e6f7ff',
+ },
+ }),
+ ];
+
+ return plugin as unknown as PluginOption[];
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/plugin/visualizer.ts b/streampark-console/streampark-console-newui/build/vite/plugin/visualizer.ts
new file mode 100644
index 000000000..75d4451eb
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/plugin/visualizer.ts
@@ -0,0 +1,17 @@
+/**
+ * Package file volume analysis
+ */
+import visualizer from 'rollup-plugin-visualizer';
+import { isReportMode } from '../../utils';
+
+export function configVisualizerConfig() {
+ if (isReportMode()) {
+ return visualizer({
+ filename: './node_modules/.cache/visualizer/stats.html',
+ open: true,
+ gzipSize: true,
+ brotliSize: true,
+ }) as Plugin;
+ }
+ return [];
+}
diff --git a/streampark-console/streampark-console-newui/build/vite/proxy.ts b/streampark-console/streampark-console-newui/build/vite/proxy.ts
new file mode 100644
index 000000000..8525397b6
--- /dev/null
+++ b/streampark-console/streampark-console-newui/build/vite/proxy.ts
@@ -0,0 +1,34 @@
+/**
+ * Used to parse the .env.development proxy configuration
+ */
+import type { ProxyOptions } from 'vite';
+
+type ProxyItem = [string, string];
+
+type ProxyList = ProxyItem[];
+
+type ProxyTargetList = Record<string, ProxyOptions>;
+
+const httpsRE = /^https:\/\//;
+
+/**
+ * Generate proxy
+ * @param list
+ */
+export function createProxy(list: ProxyList = []) {
+ const ret: ProxyTargetList = {};
+ for (const [prefix, target] of list) {
+ const isHttps = httpsRE.test(target);
+
+ // https://github.com/http-party/node-http-proxy#options
+ ret[prefix] = {
+ target: target,
+ changeOrigin: true,
+ ws: true,
+ rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
+ // https is require secure=false
+ ...(isHttps ? { secure: false } : {}),
+ };
+ }
+ return ret;
+}
diff --git a/streampark-console/streampark-console-newui/commitlint.config.js b/streampark-console/streampark-console-newui/commitlint.config.js
new file mode 100644
index 000000000..54598876e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/commitlint.config.js
@@ -0,0 +1,33 @@
+module.exports = {
+ ignores: [(commit) => commit.includes('init')],
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'body-leading-blank': [2, 'always'],
+ 'footer-leading-blank': [1, 'always'],
+ 'header-max-length': [2, 'always', 108],
+ 'subject-empty': [2, 'never'],
+ 'type-empty': [2, 'never'],
+ 'subject-case': [0],
+ 'type-enum': [
+ 2,
+ 'always',
+ [
+ 'feat',
+ 'fix',
+ 'perf',
+ 'style',
+ 'docs',
+ 'test',
+ 'refactor',
+ 'build',
+ 'ci',
+ 'chore',
+ 'revert',
+ 'wip',
+ 'workflow',
+ 'types',
+ 'release',
+ ],
+ ],
+ },
+};
diff --git a/streampark-console/streampark-console-newui/index.html b/streampark-console/streampark-console-newui/index.html
new file mode 100644
index 000000000..62ea4fc05
--- /dev/null
+++ b/streampark-console/streampark-console-newui/index.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html>
+<html lang="en" id="htmlRoot">
+ <head>
+ <meta charset="UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta name="renderer" content="webkit" />
+ <meta
+ name="viewport"
+ content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
+ />
+ <title><%= title %></title>
+ <link rel="icon" href="/favicon.ico" />
+ </head>
+ <body>
+ <script>
+ (() => {
+ var htmlRoot = document.getElementById('htmlRoot');
+ var theme = window.localStorage.getItem('__APP__DARK__MODE__');
+ if (htmlRoot && theme) {
+ htmlRoot.setAttribute('data-theme', theme);
+ theme = htmlRoot = null;
+ }
+ })();
+ </script>
+ <div id="app">
+ <style>
+ html[data-theme='dark'] .app-loading {
+ background-color: #2c344a;
+ }
+
+ html[data-theme='dark'] .app-loading .app-loading-title {
+ color: rgb(255 255 255 / 85%);
+ }
+
+ .app-loading {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ background-color: #f4f7f9;
+ }
+
+ .app-loading .app-loading-wrap {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ display: flex;
+ transform: translate3d(-50%, -50%, 0);
+ justify-content: center;
+ align-items: center;
+ flex-direction: column;
+ }
+
+ .app-loading .dots {
+ display: flex;
+ padding: 98px;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .app-loading .app-loading-title {
+ display: flex;
+ margin-top: 30px;
+ font-size: 30px;
+ color: rgb(0 0 0 / 85%);
+ justify-content: center;
+ align-items: center;
+ }
+
+ .app-loading .app-loading-logo {
+ display: block;
+ width: 90px;
+ margin: 0 auto;
+ margin-bottom: 20px;
+ }
+
+ .dot {
+ position: relative;
+ display: inline-block;
+ width: 48px;
+ height: 48px;
+ margin-top: 30px;
+ font-size: 32px;
+ transform: rotate(45deg);
+ box-sizing: border-box;
+ animation: antRotate 1.2s infinite linear;
+ }
+
+ .dot i {
+ position: absolute;
+ display: block;
+ width: 20px;
+ height: 20px;
+ background-color: #0065cc;
+ border-radius: 100%;
+ opacity: 30%;
+ transform: scale(0.75);
+ animation: antSpinMove 1s infinite linear alternate;
+ transform-origin: 50% 50%;
+ }
+
+ .dot i:nth-child(1) {
+ top: 0;
+ left: 0;
+ }
+
+ .dot i:nth-child(2) {
+ top: 0;
+ right: 0;
+ animation-delay: 0.4s;
+ }
+
+ .dot i:nth-child(3) {
+ right: 0;
+ bottom: 0;
+ animation-delay: 0.8s;
+ }
+
+ .dot i:nth-child(4) {
+ bottom: 0;
+ left: 0;
+ animation-delay: 1.2s;
+ }
+ @keyframes antRotate {
+ to {
+ transform: rotate(405deg);
+ }
+ }
+ @keyframes antRotate {
+ to {
+ transform: rotate(405deg);
+ }
+ }
+ @keyframes antSpinMove {
+ to {
+ opacity: 100%;
+ }
+ }
+ @keyframes antSpinMove {
+ to {
+ opacity: 100%;
+ }
+ }
+ </style>
+ <div class="app-loading">
+ <div class="app-loading-wrap">
+ <img src="/resource/img/logo.svg" class="app-loading-logo" alt="Logo" />
+ <div class="app-loading-dots">
+ <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
+ </div>
+ <div class="app-loading-title"><%= title %></div>
+ </div>
+ </div>
+ </div>
+ <script type="module" src="/src/main.ts"></script>
+ </body>
+</html>
diff --git a/streampark-console/streampark-console-newui/mock/_createProductionServer.ts b/streampark-console/streampark-console-newui/mock/_createProductionServer.ts
new file mode 100644
index 000000000..8f47c2340
--- /dev/null
+++ b/streampark-console/streampark-console-newui/mock/_createProductionServer.ts
@@ -0,0 +1,18 @@
+import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';
+
+const modules = import.meta.glob('./**/*.ts', { eager: true });
+
+const mockModules: any[] = [];
+Object.keys(modules).forEach((key) => {
+ if (key.includes('/_')) {
+ return;
+ }
+ mockModules.push(...(modules as Recordable)[key].default);
+});
+
+/**
+ * Used in a production environment. Need to manually import all modules
+ */
+export function setupProdMockServer() {
+ createProdMockServer(mockModules);
+}
diff --git a/streampark-console/streampark-console-newui/mock/_util.ts b/streampark-console/streampark-console-newui/mock/_util.ts
new file mode 100644
index 000000000..97c87564f
--- /dev/null
+++ b/streampark-console/streampark-console-newui/mock/_util.ts
@@ -0,0 +1,60 @@
+// Interface data format used to return a unified format
+
+export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {
+ return {
+ code: 0,
+ result,
+ message,
+ type: 'success',
+ };
+}
+
+export function resultPageSuccess<T = any>(
+ page: number,
+ pageSize: number,
+ list: T[],
+ { message = 'ok' } = {},
+) {
+ const pageData = pagination(page, pageSize, list);
+
+ return {
+ ...resultSuccess({
+ items: pageData,
+ total: list.length,
+ }),
+ message,
+ };
+}
+
+export function resultError(message = 'Request failed', { code = -1, result = null } = {}) {
+ return {
+ code,
+ result,
+ message,
+ type: 'error',
+ };
+}
+
+export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
+ const offset = (pageNo - 1) * Number(pageSize);
+ const ret =
+ offset + Number(pageSize) >= array.length
+ ? array.slice(offset, array.length)
+ : array.slice(offset, offset + Number(pageSize));
+ return ret;
+}
+
+export interface requestParams {
+ method: string;
+ body: any;
+ headers?: { authorization?: string };
+ query: any;
+}
+
+/**
+ * @description 本函数用于从request数据中获取token,请根据项目的实际情况修改
+ *
+ */
+export function getRequestToken({ headers }: requestParams): string | undefined {
+ return headers?.authorization;
+}
diff --git a/streampark-console/streampark-console-newui/mock/sys/user.ts b/streampark-console/streampark-console-newui/mock/sys/user.ts
new file mode 100644
index 000000000..fe9d5a906
--- /dev/null
+++ b/streampark-console/streampark-console-newui/mock/sys/user.ts
@@ -0,0 +1,138 @@
+import { MockMethod } from 'vite-plugin-mock';
+import { resultError, resultSuccess, getRequestToken, requestParams } from '../_util';
+
+export function createFakeUserList() {
+ return [
+ {
+ userId: '1',
+ username: 'admin',
+ realName: 'Vben Admin',
+ avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',
+ desc: 'manager',
+ password: 'streamx',
+ token: 'fakeToken1',
+ homePath: '/streamx-flink/app',
+ roles: [
+ {
+ roleName: 'Super Admin',
+ value: 'super',
+ },
+ ],
+ },
+ {
+ userId: '1',
+ username: 'vben',
+ realName: 'Vben Admin',
+ avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',
+ desc: 'manager',
+ password: '123456',
+ token: 'fakeToken1',
+ homePath: '/dashboard/analysis',
+ roles: [
+ {
+ roleName: 'Super Admin',
+ value: 'super',
+ },
+ ],
+ },
+ {
+ userId: '2',
+ username: 'test',
+ password: '123456',
+ realName: 'test user',
+ avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
+ desc: 'tester',
+ token: 'fakeToken2',
+ homePath: '/dashboard/workbench',
+ roles: [
+ {
+ roleName: 'Tester',
+ value: 'test',
+ },
+ ],
+ },
+ ];
+}
+
+const fakeCodeList: any = {
+ '1': ['1000', '3000', '5000'],
+
+ '2': ['2000', '4000', '6000'],
+};
+export default [
+ // mock user login
+ {
+ url: '/basic-api/login',
+ timeout: 200,
+ method: 'post',
+ response: ({ body }) => {
+ const { username, password } = body;
+ const checkUser = createFakeUserList().find(
+ (item) => item.username === username && password === item.password,
+ );
+ if (!checkUser) {
+ return resultError('Incorrect account or password!');
+ }
+ const { userId, username: _username, token, realName, desc, roles } = checkUser;
+ return resultSuccess({
+ roles,
+ userId,
+ username: _username,
+ token,
+ realName,
+ desc,
+ });
+ },
+ },
+ {
+ url: '/basic-api/getUserInfo',
+ method: 'get',
+ response: (request: requestParams) => {
+ const token = getRequestToken(request);
+ if (!token) return resultError('Invalid token');
+ const checkUser = createFakeUserList().find((item) => item.token === token);
+ if (!checkUser) {
+ return resultError('The corresponding user information was not obtained!');
+ }
+ return resultSuccess(checkUser);
+ },
+ },
+ {
+ url: '/basic-api/getPermCode',
+ timeout: 200,
+ method: 'get',
+ response: (request: requestParams) => {
+ const token = getRequestToken(request);
+ if (!token) return resultError('Invalid token');
+ const checkUser = createFakeUserList().find((item) => item.token === token);
+ if (!checkUser) {
+ return resultError('Invalid token!');
+ }
+ const codeList = fakeCodeList[checkUser.userId];
+
+ return resultSuccess(codeList);
+ },
+ },
+ {
+ url: '/basic-api/logout',
+ timeout: 200,
+ method: 'get',
+ response: (request: requestParams) => {
+ const token = getRequestToken(request);
+ if (!token) return resultError('Invalid token');
+ const checkUser = createFakeUserList().find((item) => item.token === token);
+ if (!checkUser) {
+ return resultError('Invalid token!');
+ }
+ return resultSuccess(undefined, { message: 'Token has been destroyed' });
+ },
+ },
+ {
+ url: '/basic-api/testRetry',
+ statusCode: 405,
+ method: 'get',
+ response: () => {
+ return resultError('Error!');
+ },
+ },
+] as MockMethod[];
diff --git a/streampark-console/streampark-console-newui/package.json b/streampark-console/streampark-console-newui/package.json
new file mode 100644
index 000000000..a60459911
--- /dev/null
+++ b/streampark-console/streampark-console-newui/package.json
@@ -0,0 +1,192 @@
+{
+ "name": "streamx-webapp",
+ "version": "2.0.0",
+ "author": {
+ "name": "streampark",
+ "email": "benjobs@apache.org",
+ "url": "http://www.streamxhub.com"
+ },
+ "scripts": {
+ "bootstrap": "pnpm install",
+ "serve": "npm run dev",
+ "dev": "vite",
+ "build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts",
+ "build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
+ "build:no-cache": "pnpm clean:cache && npm run build",
+ "report": "cross-env REPORT=true npm run build",
+ "type:check": "vue-tsc --noEmit --skipLibCheck",
+ "preview": "npm run build && vite preview",
+ "preview:dist": "vite preview",
+ "log": "conventional-changelog -p angular -i CHANGELOG.md -s",
+ "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
+ "clean:lib": "rimraf node_modules",
+ "lint:eslint": "eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
+ "lint:prettier": "prettier --write \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
+ "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+ "lint:lint-staged": "lint-staged",
+ "test:unit": "jest",
+ "test:gzip": "npx http-server dist --cors --gzip -c-1",
+ "test:br": "npx http-server dist --cors --brotli -c-1",
+ "reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
+ "prepare": "husky install",
+ "gen:icon": "esno ./build/generate/icon/index.ts"
+ },
+ "dependencies": {
+ "@ant-design/colors": "^6.0.0",
+ "@ant-design/icons-vue": "^6.1.0",
+ "@iconify/iconify": "^3.0.0",
+ "@logicflow/core": "^1.1.28",
+ "@logicflow/extension": "^1.1.28",
+ "@vue/runtime-core": "^3.2.39",
+ "@vue/shared": "^3.2.39",
+ "@vueuse/core": "^9.2.0",
+ "@vueuse/shared": "^9.2.0",
+ "@zxcvbn-ts/core": "^2.0.5",
+ "ant-design-vue": "^3.2.12",
+ "axios": "^0.27.2",
+ "codemirror": "^6.0.1",
+ "cropperjs": "^1.5.12",
+ "crypto-js": "^4.1.1",
+ "dayjs": "^1.11.5",
+ "echarts": "^5.3.3",
+ "intro.js": "^6.0.0",
+ "lodash-es": "^4.17.21",
+ "mockjs": "^1.1.0",
+ "monaco-editor": "^0.34.0",
+ "nprogress": "^0.2.0",
+ "path-to-regexp": "^6.2.1",
+ "penpal": "^6.2.2",
+ "pinia": "2.0.22",
+ "print-js": "^1.6.0",
+ "qrcode": "^1.5.1",
+ "qs": "^6.11.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "sql-formatter": "^4.0.2",
+ "showdown": "^2.1.0",
+ "sortablejs": "^1.15.0",
+ "sweetalert2": "^11.4.18",
+ "tinymce": "^5.10.3",
+ "vditor": "^3.8.13",
+ "vue": "^3.2.39",
+ "vue-i18n": "^9.2.2",
+ "vue-json-pretty": "^2.0.6",
+ "vue-router": "^4.1.5",
+ "vue-sweetalert2": "^5.0.5",
+ "vue-types": "^4.2.1",
+ "xlsx": "^0.18.5"
+ },
+ "devDependencies": {
+ "@commitlint/cli": "^17.1.2",
+ "@commitlint/config-conventional": "^17.1.0",
+ "@iconify/json": "^2.1.111",
+ "@purge-icons/generated": "^0.9.0",
+ "@types/codemirror": "^5.60.5",
+ "@types/crypto-js": "^4.1.1",
+ "@types/fs-extra": "^9.0.13",
+ "@types/inquirer": "^9.0.1",
+ "@types/intro.js": "^5.1.0",
+ "@types/lodash-es": "^4.17.6",
+ "@types/mockjs": "^1.0.6",
+ "@types/node": "^17.0.25",
+ "@types/nprogress": "^0.2.0",
+ "@types/qrcode": "^1.5.0",
+ "@types/qs": "^6.9.7",
+ "@types/showdown": "^2.0.0",
+ "@types/sortablejs": "^1.15.0",
+ "@typescript-eslint/eslint-plugin": "^5.38.0",
+ "@typescript-eslint/parser": "^5.38.0",
+ "@vitejs/plugin-legacy": "^2.2.0",
+ "@vitejs/plugin-vue": "^3.1.0",
+ "@vitejs/plugin-vue-jsx": "^2.0.1",
+ "@vue/compiler-sfc": "^3.2.33",
+ "@vue/test-utils": "^2.0.0-rc.21",
+ "autoprefixer": "^10.4.12",
+ "commitizen": "^4.2.5",
+ "conventional-changelog-cli": "^2.2.2",
+ "cross-env": "^7.0.3",
+ "dotenv": "^16.0.2",
+ "eslint": "^8.23.1",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "eslint-plugin-vue": "^8.6.0",
+ "esno": "^0.14.1",
+ "fs-extra": "^10.1.0",
+ "husky": "^7.0.4",
+ "inquirer": "^8.2.2",
+ "less": "^4.1.2",
+ "lint-staged": "12.3.7",
+ "npm-run-all": "^4.1.5",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.12",
+ "postcss-html": "^1.4.1",
+ "postcss-less": "^6.0.0",
+ "prettier": "^2.6.2",
+ "rimraf": "^3.0.2",
+ "rollup": "^2.70.2",
+ "rollup-plugin-visualizer": "^5.6.0",
+ "stylelint": "^14.7.1",
+ "stylelint-config-prettier": "^9.0.3",
+ "stylelint-config-recommended": "^7.0.0",
+ "stylelint-config-recommended-vue": "^1.4.0",
+ "stylelint-config-standard": "^25.0.0",
+ "stylelint-order": "^5.0.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^4.8.3",
+ "vite": "~3.0.2",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-html": "^3.2.0",
+ "vite-plugin-imagemin": "^0.6.1",
+ "vite-plugin-mkcert": "^1.10.1",
+ "vite-plugin-mock": "^2.9.6",
+ "vite-plugin-purge-icons": "^0.9.1",
+ "vite-plugin-pwa": "^0.13.1",
+ "vite-plugin-style-import": "^2.0.0",
+ "vite-plugin-svg-icons": "^2.0.1",
+ "vite-plugin-theme": "^0.8.6",
+ "vite-plugin-vue-setup-extend": "^0.4.0",
+ "vite-plugin-windicss": "^1.8.8",
+ "vue-eslint-parser": "^9.1.0",
+ "vue-tsc": "^0.40.13"
+ },
+ "resolutions": {
+ "bin-wrapper": "npm:bin-wrapper-china",
+ "rollup": "^2.56.3",
+ "gifsicle": "5.2.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/streamxhub/streamx-webapp.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/streamxhub/streamx-webapp/issues"
+ },
+ "homepage": "https://github.com/streamxhub/streamx-webapp",
+ "engines": {
+ "node": "^12 || >=14"
+ },
+ "lint-staged": {
+ "*.{js,jsx,ts,tsx}": [
+ "eslint --fix",
+ "prettier --write"
+ ],
+ "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
+ "prettier --write--parser json"
+ ],
+ "package.json": [
+ "prettier --write"
+ ],
+ "*.vue": [
+ "eslint --fix",
+ "prettier --write",
+ "stylelint --fix"
+ ],
+ "*.{scss,less,styl,html}": [
+ "stylelint --fix",
+ "prettier --write"
+ ],
+ "*.md": [
+ "prettier --write"
+ ]
+ }
+}
diff --git a/streampark-console/streampark-console-newui/postcss.config.js b/streampark-console/streampark-console-newui/postcss.config.js
new file mode 100644
index 000000000..a47ef4f95
--- /dev/null
+++ b/streampark-console/streampark-console-newui/postcss.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ plugins: {
+ autoprefixer: {},
+ },
+};
diff --git a/streampark-console/streampark-console-newui/prettier.config.js b/streampark-console/streampark-console-newui/prettier.config.js
new file mode 100644
index 000000000..51f8d01be
--- /dev/null
+++ b/streampark-console/streampark-console-newui/prettier.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+ printWidth: 100,
+ semi: true,
+ vueIndentScriptAndStyle: true,
+ singleQuote: true,
+ trailingComma: 'all',
+ proseWrap: 'never',
+ htmlWhitespaceSensitivity: 'strict',
+ endOfLine: 'auto',
+};
diff --git a/streampark-console/streampark-console-newui/public/favicon.ico b/streampark-console/streampark-console-newui/public/favicon.ico
new file mode 100644
index 000000000..1c4fc2d83
Binary files /dev/null and b/streampark-console/streampark-console-newui/public/favicon.ico differ
diff --git a/streampark-console/streampark-console-newui/public/resource/img/logo.svg b/streampark-console/streampark-console-newui/public/resource/img/logo.svg
new file mode 100644
index 000000000..4da99d065
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/img/logo.svg
@@ -0,0 +1 @@
+<svg id="streampark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 167.25 97.54"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{fill:url(#linear-gradient-2);}.cls-3{fill:url(#linear-gradient-3);}.cls-4{fill:url(#streampark_2);}.cls-5{fill:url(#streampark_2-2);}.cls-6{fill:url(#streampark_2-3);}.cls-7{fill:url(#streampark_2-4);}.cls-8{fill:url(#streampark_2-5);}.cls-9{fill:url(#streampark_2-6);}.cls-10{fill:url(#streampark_2-7);}.cls-11 [...]
\ No newline at end of file
diff --git a/streampark-console/streampark-console-newui/public/resource/img/pwa-192x192.png b/streampark-console/streampark-console-newui/public/resource/img/pwa-192x192.png
new file mode 100644
index 000000000..00fb81521
Binary files /dev/null and b/streampark-console/streampark-console-newui/public/resource/img/pwa-192x192.png differ
diff --git a/streampark-console/streampark-console-newui/public/resource/img/pwa-512x512.png b/streampark-console/streampark-console-newui/public/resource/img/pwa-512x512.png
new file mode 100644
index 000000000..a41707331
Binary files /dev/null and b/streampark-console/streampark-console-newui/public/resource/img/pwa-512x512.png differ
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/langs/en.js b/streampark-console/streampark-console-newui/public/resource/tinymce/langs/en.js
new file mode 100644
index 000000000..27337c394
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/langs/en.js
@@ -0,0 +1,419 @@
+tinymce.addI18n('es', {
+ Redo: 'Rehacer',
+ Undo: 'Deshacer',
+ Cut: 'Cortar',
+ Copy: 'Copiar',
+ Paste: 'Pegar',
+ 'Select all': 'Seleccionar todo',
+ 'New document': 'Nuevo documento',
+ Ok: 'Ok',
+ Cancel: 'Cancelar',
+ 'Visual aids': 'Ayudas visuales',
+ Bold: 'Negrita',
+ Italic: 'Cursiva',
+ Underline: 'Subrayado',
+ Strikethrough: 'Tachado',
+ Superscript: 'Super\u00edndice',
+ Subscript: 'Sub\u00edndice',
+ 'Clear formatting': 'Limpiar formato',
+ 'Align left': 'Alinear a la izquierda',
+ 'Align center': 'Alinear al centro',
+ 'Align right': 'Alinear a la derecha',
+ Justify: 'Justificar',
+ 'Bullet list': 'Lista de vi\u00f1etas',
+ 'Numbered list': 'Lista numerada',
+ 'Decrease indent': 'Disminuir sangr\u00eda',
+ 'Increase indent': 'Incrementar sangr\u00eda',
+ Close: 'Cerrar',
+ Formats: 'Formatos',
+ "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": 'Su navegador no es compatible con el acceso directo al portapapeles. Use las teclas Crtl+X\/C\/V de su teclado.',
+ Headers: 'Encabezados',
+ 'Header 1': 'Encabezado 1',
+ 'Header 2': 'Encabezado 2',
+ 'Header 3': 'Encabezado 3',
+ 'Header 4': 'Encabezado 4',
+ 'Header 5': 'Encabezado 5',
+ 'Header 6': 'Encabezado 6',
+ Headings: 'Encabezados',
+ 'Heading 1': 'Encabezado 1',
+ 'Heading 2': 'Encabezado 2',
+ 'Heading 3': 'Encabezado 3',
+ 'Heading 4': 'Encabezado 4',
+ 'Heading 5': 'Encabezado 5',
+ 'Heading 6': 'Encabezado 6',
+ Preformatted: 'Con formato previo',
+ Div: 'Div',
+ Pre: 'Pre',
+ Code: 'C\u00f3digo',
+ Paragraph: 'P\u00e1rrafo',
+ Blockquote: 'Blockquote',
+ Inline: 'Alineado',
+ Blocks: 'Bloques',
+ 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': 'Pegar est\u00e1 ahora en modo de texto plano. El contenido se pegar\u00e1 como texto plano hasta que desactive esta opci\u00f3n.',
+ Fonts: 'Fuentes',
+ 'Font Sizes': 'Tama\u00f1os de fuente',
+ Class: 'Clase',
+ 'Browse for an image': 'Buscar una imagen',
+ OR: 'OR',
+ 'Drop an image here': 'Arrastre una imagen aqu\u00ed',
+ Upload: 'Cargar',
+ Block: 'Bloque',
+ Align: 'Alinear',
+ Default: 'Por defecto',
+ Circle: 'C\u00edrculo',
+ Disc: 'Disco',
+ Square: 'Cuadrado',
+ 'Lower Alpha': 'Inferior Alfa',
+ 'Lower Greek': 'Inferior Griega',
+ 'Lower Roman': 'Inferior Romana',
+ 'Upper Alpha': 'Superior Alfa',
+ 'Upper Roman': 'Superior Romana',
+ 'Anchor...': 'Anclaje...',
+ Name: 'Nombre',
+ Id: 'Id',
+ 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': 'Deber\u00eda comenzar por una letra, seguida solo de letras, n\u00fameros, guiones, puntos, dos puntos o guiones bajos.',
+ 'You have unsaved changes are you sure you want to navigate away?': 'Tiene cambios sin guardar. \u00bfEst\u00e1 seguro de que quiere salir?',
+ 'Restore last draft': 'Restaurar el \u00faltimo borrador',
+ 'Special character...': 'Car\u00e1cter especial...',
+ 'Source code': 'C\u00f3digo fuente',
+ 'Insert\/Edit code sample': 'Insertar\/editar c\u00f3digo de prueba',
+ Language: 'Idioma',
+ 'Code sample...': 'Ejemplo de c\u00f3digo...',
+ 'Color Picker': 'Selector de colores',
+ R: 'R',
+ G: 'V',
+ B: 'A',
+ 'Left to right': 'De izquierda a derecha',
+ 'Right to left': 'De derecha a izquierda',
+ 'Emoticons...': 'Emoticones...',
+ 'Metadata and Document Properties': 'Metadatos y propiedades del documento',
+ Title: 'T\u00edtulo',
+ Keywords: 'Palabras clave',
+ Description: 'Descripci\u00f3n',
+ Robots: 'Robots',
+ Author: 'Autor',
+ Encoding: 'Codificaci\u00f3n',
+ Fullscreen: 'Pantalla completa',
+ Action: 'Acci\u00f3n',
+ Shortcut: 'Atajo',
+ Help: 'Ayuda',
+ Address: 'Direcci\u00f3n',
+ 'Focus to menubar': 'Enfocar la barra del men\u00fa',
+ 'Focus to toolbar': 'Enfocar la barra de herramientas',
+ 'Focus to element path': 'Enfocar la ruta del elemento',
+ 'Focus to contextual toolbar': 'Enfocar la barra de herramientas contextual',
+ 'Insert link (if link plugin activated)': 'Insertar enlace (si el complemento de enlace est\u00e1 activado)',
+ 'Save (if save plugin activated)': 'Guardar (si el componente de salvar est\u00e1 activado)',
+ 'Find (if searchreplace plugin activated)': 'Buscar (si el complemento buscar-remplazar est\u00e1 activado)',
+ 'Plugins installed ({0}):': 'Plugins instalados ({0}):',
+ 'Premium plugins:': 'Complementos premium:',
+ 'Learn more...': 'Aprende m\u00e1s...',
+ 'You are using {0}': 'Estas usando {0}',
+ Plugins: 'Complementos',
+ 'Handy Shortcuts': 'Accesos directos',
+ 'Horizontal line': 'L\u00ednea horizontal',
+ 'Insert\/edit image': 'Insertar\/editar imagen',
+ 'Image description': 'Descripci\u00f3n de la imagen',
+ Source: 'Enlace',
+ Dimensions: 'Dimensiones',
+ 'Constrain proportions': 'Restringir proporciones',
+ General: 'General',
+ Advanced: 'Avanzado',
+ Style: 'Estilo',
+ 'Vertical space': 'Espacio vertical',
+ 'Horizontal space': 'Espacio horizontal',
+ Border: 'Borde',
+ 'Insert image': 'Insertar imagen',
+ 'Image...': 'Imagen...',
+ 'Image list': 'Lista de im\u00e1genes',
+ 'Rotate counterclockwise': 'Girar a la izquierda',
+ 'Rotate clockwise': 'Girar a la derecha',
+ 'Flip vertically': 'Invertir verticalmente',
+ 'Flip horizontally': 'Invertir horizontalmente',
+ 'Edit image': 'Editar imagen',
+ 'Image options': 'Opciones de imagen',
+ 'Zoom in': 'Acercar',
+ 'Zoom out': 'Alejar',
+ Crop: 'Recortar',
+ Resize: 'Redimensionar',
+ Orientation: 'Orientaci\u00f3n',
+ Brightness: 'Brillo',
+ Sharpen: 'Forma',
+ Contrast: 'Contraste',
+ 'Color levels': 'Niveles de color',
+ Gamma: 'Gamma',
+ Invert: 'Invertir',
+ Apply: 'Aplicar',
+ Back: 'Atr\u00e1s',
+ 'Insert date\/time': 'Insertar fecha\/hora',
+ 'Date\/time': 'Fecha\/hora',
+ 'Insert\/Edit Link': 'Insertar\/editar enlace',
+ 'Insert\/edit link': 'Insertar\/editar enlace',
+ 'Text to display': 'Texto para mostrar',
+ Url: 'URL',
+ 'Open link in...': 'Abrir enlace en...',
+ 'Current window': 'Ventana actual',
+ None: 'Ninguno',
+ 'New window': 'Nueva ventana',
+ 'Remove link': 'Quitar enlace',
+ Anchors: 'Anclas',
+ 'Link...': 'Enlace...',
+ 'Paste or type a link': 'Pega o introduce un enlace',
+ 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': 'El enlace que has introducido no parece ser una direcci\u00f3n de correo electr\u00f3nico. Quieres a\u00f1adir el prefijo necesario mailto: ?',
+ 'The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?': 'El enlace que has introducido no parece ser una enlace externo. Quieres a\u00f1adir el prefijo necesario http:\/\/ ?',
+ 'Link list': 'Lista de enlaces',
+ 'Insert video': 'Insertar video',
+ 'Insert\/edit video': 'Insertar\/editar video',
+ 'Insert\/edit media': 'Insertar\/editar medio',
+ 'Alternative source': 'Enlace alternativo',
+ 'Alternative source URL': 'Origen de URL alternativo',
+ 'Media poster (Image URL)': 'P\u00f3ster de medio (URL de imagen)',
+ 'Paste your embed code below:': 'Pega tu c\u00f3digo embebido debajo',
+ Embed: 'Incrustado',
+ 'Media...': 'Medios...',
+ 'Nonbreaking space': 'Espacio fijo',
+ 'Page break': 'Salto de p\u00e1gina',
+ 'Paste as text': 'Pegar como texto',
+ Preview: 'Previsualizar',
+ 'Print...': 'Imprimir...',
+ Save: 'Guardar',
+ Find: 'Buscar',
+ 'Replace with': 'Reemplazar con',
+ Replace: 'Reemplazar',
+ 'Replace all': 'Reemplazar todo',
+ Previous: 'Anterior',
+ Next: 'Siguiente',
+ 'Find and replace...': 'Buscar y reemplazar...',
+ 'Could not find the specified string.': 'No se encuentra la cadena de texto especificada',
+ 'Match case': 'Coincidencia exacta',
+ 'Find whole words only': 'Solo palabras completas',
+ 'Spell check': 'Revisar ortograf\u00eda',
+ Ignore: 'Ignorar',
+ 'Ignore all': 'Ignorar todos',
+ Finish: 'Finalizar',
+ 'Add to Dictionary': 'A\u00f1adir al Diccionario',
+ 'Insert table': 'Insertar tabla',
+ 'Table properties': 'Propiedades de la tabla',
+ 'Delete table': 'Eliminar tabla',
+ Cell: 'Celda',
+ Row: 'Fila',
+ Column: 'Columna',
+ 'Cell properties': 'Propiedades de la celda',
+ 'Merge cells': 'Combinar celdas',
+ 'Split cell': 'Dividir celdas',
+ 'Insert row before': 'Insertar fila antes',
+ 'Insert row after': 'Insertar fila despu\u00e9s ',
+ 'Delete row': 'Eliminar fila',
+ 'Row properties': 'Propiedades de la fila',
+ 'Cut row': 'Cortar fila',
+ 'Copy row': 'Copiar fila',
+ 'Paste row before': 'Pegar la fila antes',
+ 'Paste row after': 'Pegar la fila despu\u00e9s',
+ 'Insert column before': 'Insertar columna antes',
+ 'Insert column after': 'Insertar columna despu\u00e9s',
+ 'Delete column': 'Eliminar columna',
+ Cols: 'Columnas',
+ Rows: 'Filas',
+ Width: 'Ancho',
+ Height: 'Alto',
+ 'Cell spacing': 'Espacio entre celdas',
+ 'Cell padding': 'Relleno de celda',
+ 'Show caption': 'Mostrar t\u00edtulo',
+ Left: 'Izquierda',
+ Center: 'Centrado',
+ Right: 'Derecha',
+ 'Cell type': 'Tipo de celda',
+ Scope: '\u00c1mbito',
+ Alignment: 'Alineaci\u00f3n',
+ 'H Align': 'Alineamiento Horizontal',
+ 'V Align': 'Alineamiento Vertical',
+ Top: 'Arriba',
+ Middle: 'Centro',
+ Bottom: 'Abajo',
+ 'Header cell': 'Celda de la cebecera',
+ 'Row group': 'Grupo de filas',
+ 'Column group': 'Grupo de columnas',
+ 'Row type': 'Tipo de fila',
+ Header: 'Cabecera',
+ Body: 'Cuerpo',
+ Footer: 'Pie de p\u00e1gina',
+ 'Border color': 'Color del borde',
+ 'Insert template...': 'Insertar plantilla...',
+ Templates: 'Plantillas',
+ Template: 'Plantilla',
+ 'Text color': 'Color del texto',
+ 'Background color': 'Color de fondo',
+ 'Custom...': 'Personalizar...',
+ 'Custom color': 'Color personalizado',
+ 'No color': 'Sin color',
+ 'Remove color': 'Quitar color',
+ 'Table of Contents': 'Tabla de contenidos',
+ 'Show blocks': 'Mostrar bloques',
+ 'Show invisible characters': 'Mostrar caracteres invisibles',
+ 'Word count': 'Contar palabras',
+ Count: 'Recuento',
+ Document: 'Documento',
+ Selection: 'Selecci\u00f3n',
+ Words: 'Palabras',
+ 'Words: {0}': 'Palabras: {0}',
+ '{0} words': '{0} palabras',
+ File: 'Archivo',
+ Edit: 'Editar',
+ Insert: 'Insertar',
+ View: 'Ver',
+ Format: 'Formato',
+ Table: 'Tabla',
+ Tools: 'Herramientas',
+ 'Powered by {0}': 'Desarrollado por {0}',
+ 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': '\u00c1rea de texto enriquecido. Pulse ALT-F9 para el menu. Pulse ALT-F10 para la barra de herramientas. Pulse ALT-0 para ayuda',
+ 'Image title': 'Titulo de imagen',
+ 'Border width': 'Ancho de borde',
+ 'Border style': 'Estilo de borde',
+ Error: 'Error',
+ Warn: 'Advertencia',
+ Valid: 'V\u00e1lido',
+ 'To open the popup, press Shift+Enter': 'Para abrir el elemento emergente, pulse May\u00fas+Intro',
+ 'Rich Text Area. Press ALT-0 for help.': '\u00c1rea de texto enriquecido. Pulse ALT-0 para abrir la ayuda.',
+ 'System Font': 'Fuente de sistema',
+ 'Failed to upload image: {0}': 'Fallo al cargar imagen: {0}',
+ 'Failed to load plugin: {0} from url {1}': 'Fallo al cargar complemento: {0} desde URL {1}',
+ 'Failed to load plugin url: {0}': 'Fallo al cargar URL del complemento: {0}',
+ 'Failed to initialize plugin: {0}': 'Fallo al iniciar el complemento: {0}',
+ example: 'ejemplo',
+ Search: 'Buscar',
+ All: 'Todo',
+ Currency: 'Divisa',
+ Text: 'Texto',
+ Quotations: 'Comillas',
+ Mathematical: 'S\u00edmbolo matem\u00e1tico',
+ 'Extended Latin': 'Latino extendido A',
+ Symbols: 'S\u00edmbolos',
+ Arrows: 'Flechas',
+ 'User Defined': 'Definido por el usuario',
+ 'dollar sign': 'signo de d\u00f3lar',
+ 'currency sign': 'signo de divisa',
+ 'euro-currency sign': 'signo de euro',
+ 'colon sign': 'signo de dos puntos',
+ 'cruzeiro sign': 'signo de cruceiro',
+ 'french franc sign': 'signo de franco franc\u00e9s',
+ 'lira sign': 'signo de lira',
+ 'mill sign': 'signo de mill',
+ 'naira sign': 'signo de naira',
+ 'peseta sign': 'signo de peseta',
+ 'rupee sign': 'signo de rupia',
+ 'won sign': 'signo de won',
+ 'new sheqel sign': 'signo de nuevo s\u00e9quel',
+ 'dong sign': 'signo de dong',
+ 'kip sign': 'signo de kip',
+ 'tugrik sign': 'signo de tugrik',
+ 'drachma sign': 'signo de dracma',
+ 'german penny symbol': 'signo de penique alem\u00e1n',
+ 'peso sign': 'signo de peso',
+ 'guarani sign': 'signo de guaran\u00ed',
+ 'austral sign': 'signo de austral',
+ 'hryvnia sign': 'signo de grivna',
+ 'cedi sign': 'signo de cedi',
+ 'livre tournois sign': 'signo de libra tornesa',
+ 'spesmilo sign': 'signo de spesmilo',
+ 'tenge sign': 'signo de tenge',
+ 'indian rupee sign': 'signo de rupia india',
+ 'turkish lira sign': 'signo de lira turca',
+ 'nordic mark sign': 'signo de marco n\u00f3rdico',
+ 'manat sign': 'signo de manat',
+ 'ruble sign': 'signo de rublo',
+ 'yen character': 'car\u00e1cter de yen',
+ 'yuan character': 'car\u00e1cter de yuan',
+ 'yuan character, in hong kong and taiwan': 'car\u00e1cter de yuan en Hong Kong y Taiw\u00e1n',
+ 'yen\/yuan character variant one': 'Variante uno de car\u00e1cter de yen\/yuan',
+ 'Loading emoticons...': 'Cargando emoticonos...',
+ 'Could not load emoticons': 'No se han podido cargar los emoticonos',
+ People: 'Personas',
+ 'Animals and Nature': 'Animales y naturaleza',
+ 'Food and Drink': 'Comida y bebida',
+ Activity: 'Actividad',
+ 'Travel and Places': 'Viajes y lugares',
+ Objects: 'Objetos',
+ Flags: 'Banderas',
+ Characters: 'Caracteres',
+ 'Characters (no spaces)': 'Caracteres (sin espacios)',
+ '{0} characters': '{0} caracteres',
+ 'Error: Form submit field collision.': 'Error: Colisi\u00f3n de campo al enviar formulario.',
+ 'Error: No form element found.': 'Error: No se encuentra ning\u00fan elemento de formulario.',
+ Update: 'Actualizar',
+ 'Color swatch': 'Muestrario de colores',
+ Turquoise: 'Turquesa',
+ Green: 'Verde',
+ Blue: 'Azul',
+ Purple: 'P\u00farpura',
+ 'Navy Blue': 'Azul marino',
+ 'Dark Turquoise': 'Turquesa oscuro',
+ 'Dark Green': 'Verde oscuro',
+ 'Medium Blue': 'Azul medio',
+ 'Medium Purple': 'P\u00farpura medio',
+ 'Midnight Blue': 'Azul medio',
+ Yellow: 'Amarillo',
+ Orange: 'Naranja',
+ Red: 'Rojo',
+ 'Light Gray': 'Gris claro',
+ Gray: 'Gris',
+ 'Dark Yellow': 'Amarillo oscuro',
+ 'Dark Orange': 'Naranja oscuro',
+ 'Dark Red': 'Rojo oscuro',
+ 'Medium Gray': 'Gris medio',
+ 'Dark Gray': 'Gris oscuro',
+ 'Light Green': 'Verde claro',
+ 'Light Yellow': 'Amarillo claro',
+ 'Light Red': 'Rojo claro',
+ 'Light Purple': 'Morado claro',
+ 'Light Blue': 'Azul claro',
+ 'Dark Purple': 'Morado oscuro',
+ 'Dark Blue': 'Azul oscuro',
+ Black: 'Negro',
+ White: 'Blanco',
+ 'Switch to or from fullscreen mode': 'Activar o desactivar modo pantalla completa',
+ 'Open help dialog': 'Abrir di\u00e1logo de ayuda',
+ history: 'historial',
+ styles: 'estilos',
+ formatting: 'formato',
+ alignment: 'alineaci\u00f3n',
+ indentation: 'sangr\u00eda',
+ 'permanent pen': 'bol\u00edgrafo permanente',
+ comments: 'comentarios',
+ 'Format Painter': 'Copiar formato',
+ 'Insert\/edit iframe': 'Insertar\/editar iframe',
+ Capitalization: 'Uso de may\u00fasculas',
+ lowercase: 'min\u00fasculas',
+ UPPERCASE: 'MAY\u00daSCULAS',
+ 'Title Case': 'Tipo T\u00edtulo',
+ 'Permanent Pen Properties': 'Propiedades del bol\u00edgrafo permanente',
+ 'Permanent pen properties...': 'Propiedades del bol\u00edgrafo permanente...',
+ Font: 'Fuente',
+ Size: 'Tama\u00f1o',
+ 'More...': 'M\u00e1s...',
+ 'Spellcheck Language': 'Corrector',
+ 'Select...': 'Seleccionar...',
+ Preferences: 'Preferencias',
+ Yes: 'S\u00ed',
+ No: 'No',
+ 'Keyboard Navigation': 'Navegaci\u00f3n con el teclado',
+ Version: 'Versi\u00f3n',
+ Anchor: 'Ancla',
+ 'Special character': 'Car\u00e1cter especial',
+ 'Code sample': 'Ejemplo de c\u00f3digo',
+ Color: 'Color',
+ Emoticons: 'Emoticonos',
+ 'Document properties': 'Propiedades del documento',
+ Image: 'Imagen',
+ 'Insert link': 'Insertar enlace',
+ Target: 'Destino',
+ Link: 'Enlace',
+ Poster: 'Miniatura',
+ Media: 'Media',
+ Print: 'Imprimir',
+ Prev: 'Anterior',
+ 'Find and replace': 'Buscar y reemplazar',
+ 'Whole words': 'Palabras completas',
+ Spellcheck: 'Corrector ortogr\u00e1fico',
+ Caption: 'Subt\u00edtulo',
+ 'Insert template': 'Insertar plantilla'
+})
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/langs/zh_CN.js b/streampark-console/streampark-console-newui/public/resource/tinymce/langs/zh_CN.js
new file mode 100644
index 000000000..f9d8b5cfd
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/langs/zh_CN.js
@@ -0,0 +1,389 @@
+tinymce.addI18n('zh_CN',{
+"Redo": "\u91cd\u505a",
+"Undo": "\u64a4\u9500",
+"Cut": "\u526a\u5207",
+"Copy": "\u590d\u5236",
+"Paste": "\u7c98\u8d34",
+"Select all": "\u5168\u9009",
+"New document": "\u65b0\u6587\u4ef6",
+"Ok": "\u786e\u5b9a",
+"Cancel": "\u53d6\u6d88",
+"Visual aids": "\u7f51\u683c\u7ebf",
+"Bold": "\u7c97\u4f53",
+"Italic": "\u659c\u4f53",
+"Underline": "\u4e0b\u5212\u7ebf",
+"Strikethrough": "\u5220\u9664\u7ebf",
+"Superscript": "\u4e0a\u6807",
+"Subscript": "\u4e0b\u6807",
+"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
+"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
+"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
+"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
+"Justify": "\u4e24\u7aef\u5bf9\u9f50",
+"Bullet list": "\u9879\u76ee\u7b26\u53f7",
+"Numbered list": "\u7f16\u53f7\u5217\u8868",
+"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
+"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
+"Close": "\u5173\u95ed",
+"Formats": "\u683c\u5f0f",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
+"Headers": "\u6807\u9898",
+"Header 1": "\u6807\u98981",
+"Header 2": "\u6807\u98982",
+"Header 3": "\u6807\u98983",
+"Header 4": "\u6807\u98984",
+"Header 5": "\u6807\u98985",
+"Header 6": "\u6807\u98986",
+"Headings": "\u6807\u9898",
+"Heading 1": "\u6807\u98981",
+"Heading 2": "\u6807\u98982",
+"Heading 3": "\u6807\u98983",
+"Heading 4": "\u6807\u98984",
+"Heading 5": "\u6807\u98985",
+"Heading 6": "\u6807\u98986",
+"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
+"Div": "Div",
+"Pre": "Pre",
+"Code": "\u4ee3\u7801",
+"Paragraph": "\u6bb5\u843d",
+"Blockquote": "\u5f15\u6587\u533a\u5757",
+"Inline": "\u6587\u672c",
+"Blocks": "\u57fa\u5757",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
+"Fonts": "\u5b57\u4f53",
+"Font Sizes": "\u5b57\u53f7",
+"Class": "\u7c7b\u578b",
+"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
+"OR": "\u6216",
+"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
+"Upload": "\u4e0a\u4f20",
+"Block": "\u5757",
+"Align": "\u5bf9\u9f50",
+"Default": "\u9ed8\u8ba4",
+"Circle": "\u7a7a\u5fc3\u5706",
+"Disc": "\u5b9e\u5fc3\u5706",
+"Square": "\u65b9\u5757",
+"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
+"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
+"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
+"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
+"Anchor...": "\u951a\u70b9...",
+"Name": "\u540d\u79f0",
+"Id": "\u6807\u8bc6\u7b26",
+"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
+"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
+"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
+"Special characters...": "\u7279\u6b8a\u5b57\u7b26...",
+"Source code": "\u6e90\u4ee3\u7801",
+"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
+"Language": "\u8bed\u8a00",
+"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
+"Color Picker": "\u9009\u8272\u5668",
+"R": "R",
+"G": "G",
+"B": "B",
+"Left to right": "\u4ece\u5de6\u5230\u53f3",
+"Right to left": "\u4ece\u53f3\u5230\u5de6",
+"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
+"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
+"Title": "\u6807\u9898",
+"Keywords": "\u5173\u952e\u8bcd",
+"Description": "\u63cf\u8ff0",
+"Robots": "\u673a\u5668\u4eba",
+"Author": "\u4f5c\u8005",
+"Encoding": "\u7f16\u7801",
+"Fullscreen": "\u5168\u5c4f",
+"Action": "\u64cd\u4f5c",
+"Shortcut": "\u5feb\u6377\u952e",
+"Help": "\u5e2e\u52a9",
+"Address": "\u5730\u5740",
+"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
+"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
+"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
+"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
+"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
+"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
+"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
+"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
+"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
+"Plugins": "\u63d2\u4ef6",
+"Handy Shortcuts": "\u5feb\u6377\u952e",
+"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
+"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
+"Image description": "\u56fe\u7247\u63cf\u8ff0",
+"Source": "\u5730\u5740",
+"Dimensions": "\u5927\u5c0f",
+"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
+"General": "\u666e\u901a",
+"Advanced": "\u9ad8\u7ea7",
+"Style": "\u6837\u5f0f",
+"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
+"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
+"Border": "\u8fb9\u6846",
+"Insert image": "\u63d2\u5165\u56fe\u7247",
+"Image...": "\u56fe\u7247...",
+"Image list": "\u56fe\u7247\u5217\u8868",
+"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
+"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
+"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
+"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
+"Edit image": "\u7f16\u8f91\u56fe\u7247",
+"Image options": "\u56fe\u7247\u9009\u9879",
+"Zoom in": "\u653e\u5927",
+"Zoom out": "\u7f29\u5c0f",
+"Crop": "\u88c1\u526a",
+"Resize": "\u8c03\u6574\u5927\u5c0f",
+"Orientation": "\u65b9\u5411",
+"Brightness": "\u4eae\u5ea6",
+"Sharpen": "\u9510\u5316",
+"Contrast": "\u5bf9\u6bd4\u5ea6",
+"Color levels": "\u989c\u8272\u5c42\u6b21",
+"Gamma": "\u4f3d\u9a6c\u503c",
+"Invert": "\u53cd\u8f6c",
+"Apply": "\u5e94\u7528",
+"Back": "\u540e\u9000",
+"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
+"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
+"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
+"Text to display": "\u663e\u793a\u6587\u5b57",
+"Url": "\u5730\u5740",
+"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
+"Current window": "\u5f53\u524d\u7a97\u53e3",
+"None": "\u65e0",
+"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
+"Remove link": "\u5220\u9664\u94fe\u63a5",
+"Anchors": "\u951a\u70b9",
+"Link...": "\u94fe\u63a5...",
+"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
+"Link list": "\u94fe\u63a5\u5217\u8868",
+"Insert video": "\u63d2\u5165\u89c6\u9891",
+"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
+"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
+"Alternative source": "\u955c\u50cf",
+"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
+"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
+"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
+"Embed": "\u5185\u5d4c",
+"Media...": "\u591a\u5a92\u4f53...",
+"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
+"Page break": "\u5206\u9875\u7b26",
+"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
+"Preview": "\u9884\u89c8",
+"Print...": "\u6253\u5370...",
+"Save": "\u4fdd\u5b58",
+"Find": "\u67e5\u627e",
+"Replace with": "\u66ff\u6362\u4e3a",
+"Replace": "\u66ff\u6362",
+"Replace all": "\u5168\u90e8\u66ff\u6362",
+"Previous": "\u4e0a\u4e00\u4e2a",
+"Next": "\u4e0b\u4e00\u4e2a",
+"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
+"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
+"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
+"Find whole words only": "\u5168\u5b57\u5339\u914d",
+"Spell check": "\u62fc\u5199\u68c0\u67e5",
+"Ignore": "\u5ffd\u7565",
+"Ignore all": "\u5168\u90e8\u5ffd\u7565",
+"Finish": "\u5b8c\u6210",
+"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
+"Insert table": "\u63d2\u5165\u8868\u683c",
+"Table properties": "\u8868\u683c\u5c5e\u6027",
+"Delete table": "\u5220\u9664\u8868\u683c",
+"Cell": "\u5355\u5143\u683c",
+"Row": "\u884c",
+"Column": "\u5217",
+"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
+"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
+"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
+"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
+"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
+"Delete row": "\u5220\u9664\u884c",
+"Row properties": "\u884c\u5c5e\u6027",
+"Cut row": "\u526a\u5207\u884c",
+"Copy row": "\u590d\u5236\u884c",
+"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
+"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
+"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
+"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
+"Delete column": "\u5220\u9664\u5217",
+"Cols": "\u5217",
+"Rows": "\u884c",
+"Width": "\u5bbd",
+"Height": "\u9ad8",
+"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
+"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
+"Show caption": "\u663e\u793a\u6807\u9898",
+"Left": "\u5de6\u5bf9\u9f50",
+"Center": "\u5c45\u4e2d",
+"Right": "\u53f3\u5bf9\u9f50",
+"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
+"Scope": "\u8303\u56f4",
+"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
+"H Align": "\u6c34\u5e73\u5bf9\u9f50",
+"V Align": "\u5782\u76f4\u5bf9\u9f50",
+"Top": "\u9876\u90e8\u5bf9\u9f50",
+"Middle": "\u5782\u76f4\u5c45\u4e2d",
+"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
+"Header cell": "\u8868\u5934\u5355\u5143\u683c",
+"Row group": "\u884c\u7ec4",
+"Column group": "\u5217\u7ec4",
+"Row type": "\u884c\u7c7b\u578b",
+"Header": "\u8868\u5934",
+"Body": "\u8868\u4f53",
+"Footer": "\u8868\u5c3e",
+"Border color": "\u8fb9\u6846\u989c\u8272",
+"Insert template...": "\u63d2\u5165\u6a21\u677f...",
+"Templates": "\u6a21\u677f",
+"Template": "\u6a21\u677f",
+"Text color": "\u6587\u5b57\u989c\u8272",
+"Background color": "\u80cc\u666f\u8272",
+"Custom...": "\u81ea\u5b9a\u4e49...",
+"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
+"No color": "\u65e0",
+"Remove color": "\u79fb\u9664\u989c\u8272",
+"Table of Contents": "\u5185\u5bb9\u5217\u8868",
+"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
+"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
+"Word count": "\u5b57\u6570",
+"Words: {0}": "\u5b57\u6570\uff1a{0}",
+"{0} words": "{0} \u5b57",
+"File": "\u6587\u4ef6",
+"Edit": "\u7f16\u8f91",
+"Insert": "\u63d2\u5165",
+"View": "\u89c6\u56fe",
+"Format": "\u683c\u5f0f",
+"Table": "\u8868\u683c",
+"Tools": "\u5de5\u5177",
+"Powered by {0}": "\u7531{0}\u9a71\u52a8",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
+"Image title": "\u56fe\u7247\u6807\u9898",
+"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
+"Border style": "\u8fb9\u6846\u6837\u5f0f",
+"Error": "\u9519\u8bef",
+"Warn": "\u8b66\u544a",
+"Valid": "\u6709\u6548",
+"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
+"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
+"System Font": "\u7cfb\u7edf\u5b57\u4f53",
+"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
+"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
+"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
+"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
+"example": "\u793a\u4f8b",
+"Search": "\u641c\u7d22",
+"All": "\u5168\u90e8",
+"Currency": "\u8d27\u5e01",
+"Text": "\u6587\u5b57",
+"Quotations": "\u5f15\u7528",
+"Mathematical": "\u6570\u5b66",
+"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
+"Symbols": "\u7b26\u53f7",
+"Arrows": "\u7bad\u5934",
+"User Defined": "\u81ea\u5b9a\u4e49",
+"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
+"currency sign": "\u8d27\u5e01\u7b26\u53f7",
+"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
+"colon sign": "\u5192\u53f7",
+"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
+"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
+"lira sign": "\u91cc\u62c9\u7b26\u53f7",
+"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
+"naira sign": "\u5948\u62c9\u7b26\u53f7",
+"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
+"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
+"won sign": "\u97e9\u5143\u7b26\u53f7",
+"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
+"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
+"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
+"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
+"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
+"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
+"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
+"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
+"austral sign": "\u6fb3\u5143\u7b26\u53f7",
+"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
+"cedi sign": "\u585e\u5730\u7b26\u53f7",
+"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
+"spesmilo sign": "spesmilo\u7b26\u53f7",
+"tenge sign": "\u575a\u6208\u7b26\u53f7",
+"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
+"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
+"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
+"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
+"ruble sign": "\u5362\u5e03\u7b26\u53f7",
+"yen character": "\u65e5\u5143\u5b57\u6837",
+"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
+"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
+"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
+"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
+"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
+"People": "\u4eba\u7c7b",
+"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
+"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
+"Activity": "\u6d3b\u52a8",
+"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
+"Objects": "\u7269\u4ef6",
+"Flags": "\u65d7\u5e1c",
+"Characters": "\u5b57\u7b26",
+"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
+"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
+"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
+"Update": "\u66f4\u65b0",
+"Color swatch": "\u989c\u8272\u6837\u672c",
+"Turquoise": "\u9752\u7eff\u8272",
+"Green": "\u7eff\u8272",
+"Blue": "\u84dd\u8272",
+"Purple": "\u7d2b\u8272",
+"Navy Blue": "\u6d77\u519b\u84dd",
+"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
+"Dark Green": "\u6df1\u7eff\u8272",
+"Medium Blue": "\u4e2d\u84dd\u8272",
+"Medium Purple": "\u4e2d\u7d2b\u8272",
+"Midnight Blue": "\u6df1\u84dd\u8272",
+"Yellow": "\u9ec4\u8272",
+"Orange": "\u6a59\u8272",
+"Red": "\u7ea2\u8272",
+"Light Gray": "\u6d45\u7070\u8272",
+"Gray": "\u7070\u8272",
+"Dark Yellow": "\u6697\u9ec4\u8272",
+"Dark Orange": "\u6df1\u6a59\u8272",
+"Dark Red": "\u6df1\u7ea2\u8272",
+"Medium Gray": "\u4e2d\u7070\u8272",
+"Dark Gray": "\u6df1\u7070\u8272",
+"Black": "\u9ed1\u8272",
+"White": "\u767d\u8272",
+"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
+"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
+"history": "\u5386\u53f2",
+"styles": "\u6837\u5f0f",
+"formatting": "\u683c\u5f0f\u5316",
+"alignment": "\u5bf9\u9f50",
+"indentation": "\u7f29\u8fdb",
+"permanent pen": "\u8bb0\u53f7\u7b14",
+"comments": "\u5907\u6ce8",
+"Anchor": "\u951a\u70b9",
+"Special character": "\u7279\u6b8a\u7b26\u53f7",
+"Code sample": "\u4ee3\u7801\u793a\u4f8b",
+"Color": "\u989c\u8272",
+"Emoticons": "\u8868\u60c5",
+"Document properties": "\u6587\u6863\u5c5e\u6027",
+"Image": "\u56fe\u7247",
+"Insert link": "\u63d2\u5165\u94fe\u63a5",
+"Target": "\u6253\u5f00\u65b9\u5f0f",
+"Link": "\u94fe\u63a5",
+"Poster": "\u5c01\u9762",
+"Media": "\u5a92\u4f53",
+"Print": "\u6253\u5370",
+"Prev": "\u4e0a\u4e00\u4e2a",
+"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
+"Whole words": "\u5168\u5b57\u5339\u914d",
+"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
+"Caption": "\u6807\u9898",
+"Insert template": "\u63d2\u5165\u6a21\u677f"
+});
\ No newline at end of file
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css
new file mode 100644
index 000000000..748f313bb
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.inline.min.css
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modif [...]
+
+.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;}
+
+.tox-comments-visible .tox-comment{background-color: #fff0b7;}
+
+.tox-comments-visible .tox-comment--active{background-color: #ffe168;}
+
+.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;}
+
+.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D% [...]
+
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22% [...]
+
+[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;}
+
+code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;}
+
+code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;}
+
+code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}}
+
+pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;}
+
+:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;}
+
+:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;}
+
+.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;}
+
+.token.punctuation{color: #999;}
+
+.namespace{opacity: .7;}
+
+.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;}
+
+.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;}
+
+.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);}
+
+.token.atrule,.token.attr-value,.token.keyword{color: #07a;}
+
+.token.function{color: #dd4a68;}
+
+.token.important,.token.regex,.token.variable{color: #e90;}
+
+.token.bold,.token.important{font-weight: 700;}
+
+.token.italic{font-style: italic;}
+
+.token.entity{cursor: help;}
+
+:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;}
+
+[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;}
+
+.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;}
+
+.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;}
+
+.mce-content-body .mce-visual-caret-hidden{display: none;}
+
+.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;}
+
+.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;}
+
+.mce-content-body [contentEditable=false]{cursor: default;}
+
+.mce-content-body [contentEditable=true]{cursor: text;}
+
+.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%2 [...]
+
+.mce-content-body figure.align-left{float: left;}
+
+.mce-content-body figure.align-right{float: right;}
+
+.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;}
+
+.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;}
+
+.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;}
+
+.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat cent [...]
+
+.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}}
+
+.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;}
+
+.tiny-pageembed{position: relative;display: inline-block;}
+
+.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;}
+
+.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";}
+
+.tiny-pageembed--21by9::before{padding-top: 42.857143%;}
+
+.tiny-pageembed--16by9::before{padding-top: 56.25%;}
+
+.tiny-pageembed--4by3::before{padding-top: 75%;}
+
+.tiny-pageembed--1by1::before{padding-top: 100%;}
+
+.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;}
+
+.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;}
+
+.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;}
+
+.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;}
+
+.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;}
+
+.mce-match-marker{color: #fff;background: #aaa;}
+
+.mce-match-marker-selected{color: #fff;background: #39f;}
+
+.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;}
+
+.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;}
+
+.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;}
+
+.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;}
+
+.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;}
+
+.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
+
+.mce-content-body img::-moz-selection{background: 0 0;}
+
+.mce-content-body img::selection{background: 0 0;}
+
+.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;}
+
+.ephox-snooker-resizer-cols{cursor: col-resize;}
+
+.ephox-snooker-resizer-rows{cursor: row-resize;}
+
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;}
+
+.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-toc{border: 1px solid gray;}
+
+.mce-toc h2{margin: 4px;}
+
+.mce-toc li{list-style-type: none;}
+
+.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;}
+
+.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding [...]
+
+.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);}
+
+.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);}
+
+.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);}
+
+.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);}
+
+.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);}
+
+.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);}
+
+.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);}
+
+.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);}
+
+.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);}
+
+.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);}
+
+.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);}
+
+.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);}
+
+.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);}
+
+.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);}
+
+.mce-visualblocks figcaption{border: 1px dashed #bbb;}
+
+.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);}
+
+.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);}
+
+.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);}
+
+.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);}
+
+.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);}
+
+.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce [...]
+
+.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblock [...]
+
+.mce-nbsp,.mce-shy{background: #aaa;}
+
+.mce-shy::after{content: '-';}
+
+.tox-toolbar-dock-fadeout{opacity: 0;visibility: hidden;}
+
+.tox-toolbar-dock-fadein{opacity: 1;visibility: visible;}
+
+.tox-toolbar-dock-transition{transition: visibility 0s linear .3s,opacity .3s ease;}
+
+.tox-toolbar-dock-transition.tox-toolbar-dock-fadein{transition-delay: 0s;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.min.css
new file mode 100644
index 000000000..6e7165f09
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.min.css
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modif [...]
+
+.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;}
+
+.tox-comments-visible .tox-comment{background-color: #fff0b7;}
+
+.tox-comments-visible .tox-comment--active{background-color: #ffe168;}
+
+.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;}
+
+.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D% [...]
+
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22% [...]
+
+[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;}
+
+code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;}
+
+code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;}
+
+code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}}
+
+pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;}
+
+:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;}
+
+:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;}
+
+.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;}
+
+.token.punctuation{color: #999;}
+
+.namespace{opacity: .7;}
+
+.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;}
+
+.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;}
+
+.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);}
+
+.token.atrule,.token.attr-value,.token.keyword{color: #07a;}
+
+.token.function{color: #dd4a68;}
+
+.token.important,.token.regex,.token.variable{color: #e90;}
+
+.token.bold,.token.important{font-weight: 700;}
+
+.token.italic{font-style: italic;}
+
+.token.entity{cursor: help;}
+
+:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;}
+
+[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;}
+
+.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;}
+
+.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;}
+
+.mce-content-body .mce-visual-caret-hidden{display: none;}
+
+.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;}
+
+.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;}
+
+.mce-content-body [contentEditable=false]{cursor: default;}
+
+.mce-content-body [contentEditable=true]{cursor: text;}
+
+.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%2 [...]
+
+.mce-content-body figure.align-left{float: left;}
+
+.mce-content-body figure.align-right{float: right;}
+
+.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;}
+
+.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;}
+
+.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;}
+
+.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat cent [...]
+
+.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}}
+
+.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;}
+
+.tiny-pageembed{position: relative;display: inline-block;}
+
+.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;}
+
+.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";}
+
+.tiny-pageembed--21by9::before{padding-top: 42.857143%;}
+
+.tiny-pageembed--16by9::before{padding-top: 56.25%;}
+
+.tiny-pageembed--4by3::before{padding-top: 75%;}
+
+.tiny-pageembed--1by1::before{padding-top: 100%;}
+
+.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;}
+
+.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;}
+
+.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;}
+
+.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;}
+
+.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;}
+
+.mce-match-marker{color: #fff;background: #aaa;}
+
+.mce-match-marker-selected{color: #fff;background: #39f;}
+
+.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;}
+
+.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;}
+
+.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;}
+
+.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;}
+
+.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;}
+
+.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
+
+.mce-content-body img::-moz-selection{background: 0 0;}
+
+.mce-content-body img::selection{background: 0 0;}
+
+.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;}
+
+.ephox-snooker-resizer-cols{cursor: col-resize;}
+
+.ephox-snooker-resizer-rows{cursor: row-resize;}
+
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;}
+
+.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-toc{border: 1px solid gray;}
+
+.mce-toc h2{margin: 4px;}
+
+.mce-toc li{list-style-type: none;}
+
+.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;}
+
+.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding [...]
+
+.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);}
+
+.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);}
+
+.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);}
+
+.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);}
+
+.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);}
+
+.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);}
+
+.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);}
+
+.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);}
+
+.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);}
+
+.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);}
+
+.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);}
+
+.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);}
+
+.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);}
+
+.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);}
+
+.mce-visualblocks figcaption{border: 1px dashed #bbb;}
+
+.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);}
+
+.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);}
+
+.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);}
+
+.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);}
+
+.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);}
+
+.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce [...]
+
+.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblock [...]
+
+.mce-nbsp,.mce-shy{background: #aaa;}
+
+.mce-shy::after{content: '-';}
+
+body{font-family: sans-serif;}
+
+table{border-collapse: collapse;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css
new file mode 100644
index 000000000..c0522520e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/content.mobile.min.css
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;}
+
+body{-webkit-text-size-adjust: none;}
+
+body img{max-width: 96vw;}
+
+body table img{max-width: 95%;}
+
+body{font-family: sans-serif;}
+
+table{border-collapse: collapse;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css
new file mode 100644
index 000000000..d8dc9b2da
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.min.css
@@ -0,0 +1,875 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-style: normal;font-weight: 400;line-height: normal;color: #222f3e;text-decoration: none;text-shadow: none;text-transform: none;white-space: normal;vertical-align: initial;cursor: auto;box-sizing: content-box;-webkit-tap-highlight-color: transparent;}
+
+.tox :not(svg){font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;line-height: inherit;color: inherit;text-align: inherit;text-decoration: inherit;text-shadow: inherit;text-transform: inherit;white-space: inherit;vertical-align: inherit;cursor: inherit;box-sizing: inherit;direction: inherit;-webkit-tap-highlight-color: inherit;}
+
+.tox :not(svg){position: static;float: none;width: auto;height: auto;max-width: none;padding: 0;margin: 0;background: 0 0;border: 0;outline: 0;}
+
+.tox:not([dir=rtl]){text-align: left;direction: ltr;}
+
+.tox[dir=rtl]{text-align: right;direction: rtl;}
+
+.tox-tinymce{position: relative;display: flex;overflow: hidden;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;border: 1px solid #000;border-radius: 0;visibility: inherit !important;box-shadow: none;box-sizing: border-box;flex-direction: column;}
+
+.tox-editor-container{display: flex;flex: 1 1 auto;flex-direction: column;overflow: hidden;}
+
+.tox-editor-container>:first-child{border-top: none !important;}
+
+.tox-tinymce-aux{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;}
+
+.tox-tinymce :focus,.tox-tinymce-aux :focus{outline: 0;}
+
+button::-moz-focus-inner{border: 0;}
+
+.tox-silver-sink{z-index: 1300;}
+
+.tox .tox-anchorbar{display: flex;flex: 0 0 auto;}
+
+.tox .tox-bar{display: flex;flex: 0 0 auto;}
+
+.tox .tox-button{display: inline-block;padding: 4px 16px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 14px;font-weight: 700;line-height: 24px;letter-spacing: 1;color: #fff;text-align: center;text-decoration: none;text-transform: capitalize;white-space: nowrap;cursor: pointer;background-color: #207ab7;background-image: none;background-position: none;background-repeat: none;border-color: #207ab [...]
+
+.tox .tox-button[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: #207ab7;background-image: none;border-color: #207ab7;box-shadow: none;}
+
+.tox .tox-button:focus:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;}
+
+.tox .tox-button:hover:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;}
+
+.tox .tox-button:active:not(:disabled){color: #fff;background-color: #185d8c;background-image: none;border-color: #185d8c;box-shadow: none;}
+
+.tox .tox-button--secondary{padding: 4px 16px;color: #fff;text-decoration: none;text-transform: capitalize;background-color: #3d546f;background-image: none;background-position: none;background-repeat: none;border-color: #3d546f;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;}
+
+.tox .tox-button--secondary[disabled]{color: rgba(255,255,255,.5);background-color: #3d546f;background-image: none;border-color: #3d546f;box-shadow: none;}
+
+.tox .tox-button--secondary:focus:not(:disabled){color: #fff;background-color: #34485f;background-image: none;border-color: #34485f;box-shadow: none;}
+
+.tox .tox-button--secondary:hover:not(:disabled){color: #fff;background-color: #34485f;background-image: none;border-color: #34485f;box-shadow: none;}
+
+.tox .tox-button--secondary:active:not(:disabled){color: #fff;background-color: #2b3b4e;background-image: none;border-color: #2b3b4e;box-shadow: none;}
+
+.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding: 4px;}
+
+.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display: block;fill: currentColor;}
+
+.tox .tox-button-link{display: inline-block;padding: 0;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-weight: 400;line-height: 1.3;white-space: nowrap;cursor: pointer;background: 0;border: none;box-sizing: border-box;}
+
+.tox .tox-button-link--sm{font-size: 14px;}
+
+.tox .tox-button--naked{color: #fff;background-color: transparent;border-color: transparent;box-shadow: unset;}
+
+.tox .tox-button--naked:hover:not(:disabled){color: #fff;background-color: #34485f;border-color: #34485f;box-shadow: none;}
+
+.tox .tox-button--naked:focus:not(:disabled){color: #fff;background-color: #34485f;border-color: #34485f;box-shadow: none;}
+
+.tox .tox-button--naked:active:not(:disabled){color: #fff;background-color: #2b3b4e;border-color: #2b3b4e;box-shadow: none;}
+
+.tox .tox-button--naked .tox-icon svg{fill: currentColor;}
+
+.tox .tox-button--naked.tox-button--icon{color: currentColor;}
+
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color: #fff;}
+
+.tox .tox-checkbox{display: flex;height: 36px;min-width: 36px;cursor: pointer;border-radius: 3px;align-items: center;}
+
+.tox .tox-checkbox__input{position: absolute;top: auto;left: -10000px;width: 1px;height: 1px;overflow: hidden;}
+
+.tox .tox-checkbox__icons{width: 24px;height: 24px;padding: calc(4px - 1px);border-radius: 3px;box-shadow: 0 0 0 2px transparent;box-sizing: content-box;}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: block;fill: rgba(255,255,255,.2);}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: none;fill: #207ab7;}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display: none;fill: #207ab7;}
+
+.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;}
+
+.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display: block;}
+
+.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;}
+
+.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: block;}
+
+.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{padding: calc(4px - 1px);border-radius: 3px;box-shadow: inset 0 0 0 1px #207ab7;}
+
+.tox:not([dir=rtl]) .tox-checkbox__label{margin-left: 4px;}
+
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-checkbox__label{margin-right: 4px;}
+
+.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right: 4px;}
+
+.tox .tox-collection--toolbar .tox-collection__group{display: flex;padding: 0;}
+
+.tox .tox-collection--grid .tox-collection__group{display: flex;max-height: 208px;padding: 0;overflow-x: hidden;overflow-y: auto;flex-wrap: wrap;}
+
+.tox .tox-collection--list .tox-collection__group{padding: 4px 0;border-color: #1a1a1a;border-style: solid;border-top-width: 1px;border-right-width: 0;border-bottom-width: 0;border-left-width: 0;}
+
+.tox .tox-collection--list .tox-collection__group:first-child{border-top-width: 0;}
+
+.tox .tox-collection__group-heading{padding: 4px 8px;margin-top: -4px;margin-bottom: 4px;font-size: 12px;font-style: normal;font-weight: 400;color: #fff;text-transform: none;cursor: default;background-color: #333;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;}
+
+.tox .tox-collection__item{display: flex;color: #fff;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;align-items: center;-webkit-touch-callout: none;}
+
+.tox .tox-collection--list .tox-collection__item{padding: 4px 8px;}
+
+.tox .tox-collection--toolbar .tox-collection__item{padding: 4px;border-radius: 3px;}
+
+.tox .tox-collection--grid .tox-collection__item{padding: 4px;border-radius: 3px;}
+
+.tox .tox-collection--list .tox-collection__item--enabled{color: contrast(inherit,#222f3e,#fff);background-color: inherit;}
+
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;}
+
+.tox .tox-collection--toolbar .tox-collection__item--enabled{color: #fff;background-color: #6f7882;}
+
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;}
+
+.tox .tox-collection--grid .tox-collection__item--enabled{color: #fff;background-color: #6f7882;}
+
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #fff;background-color: #434e5b;}
+
+.tox .tox-collection__item--state-disabled{color: rgba(255,255,255,.5);cursor: default;background-color: transparent;}
+
+.tox .tox-collection__item-icon{display: flex;width: 24px;height: 24px;align-items: center;justify-content: center;}
+
+.tox .tox-collection__item-icon svg{fill: currentColor;}
+
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon{width: 48px;height: 48px;}
+
+.tox .tox-collection__item[role=menuitemcheckbox]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display: none;}
+
+.tox .tox-collection__item-label{display: inline-block;font-size: 14px;font-style: normal;font-weight: 400;line-height: 24px;color: currentColor;text-transform: none;word-break: break-all;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-collection__item-accessory{display: inline-block;height: 24px;font-size: 14px;line-height: 24px;color: rgba(255,255,255,.5);text-transform: normal;}
+
+.tox .tox-collection__item-caret{align-items: center;display: flex;min-height: 24px;}
+
+.tox .tox-collection__item-caret::after{min-height: inherit;font-size: 0;content: '';}
+
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item-label:first-child{margin-left: 4px;}
+
+.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left: 16px;text-align: right;}
+
+.tox:not([dir=rtl]) .tox-collection__item-caret{margin-left: 16px;}
+
+.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right: 8px;}
+
+.tox[dir=rtl] .tox-collection--list .tox-collection__item-label:first-child{margin-right: 4px;}
+
+.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform: rotateY(180deg);}
+
+.tox[dir=rtl] .tox-collection__item-accessory{margin-right: 16px;text-align: left;}
+
+.tox[dir=rtl] .tox-collection__item-caret{margin-right: 16px;transform: rotateY(180deg);}
+
+.tox .tox-color-picker-container{display: flex;flex-direction: row;height: 225px;margin: 0;}
+
+.tox .tox-sv-palette{display: flex;height: 100%;box-sizing: border-box;}
+
+.tox .tox-sv-palette-spectrum{height: 100%;}
+
+.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width: 225px;}
+
+.tox .tox-sv-palette-thumb{position: absolute;width: 12px;height: 12px;background: 0 0;border: 1px solid #000;border-radius: 50%;box-sizing: content-box;}
+
+.tox .tox-sv-palette-inner-thumb{position: absolute;width: 10px;height: 10px;border: 1px solid #fff;border-radius: 50%;}
+
+.tox .tox-hue-slider{width: 25px;height: 100%;box-sizing: border-box;}
+
+.tox .tox-hue-slider-spectrum{width: 100%;height: 100%;background: linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);}
+
+.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width: 20px;}
+
+.tox .tox-hue-slider-thumb{width: 100%;height: 4px;background: #fff;border: 1px solid #000;box-sizing: content-box;}
+
+.tox .tox-rgb-form{display: flex;flex-direction: column;justify-content: space-between;}
+
+.tox .tox-rgb-form div{display: flex;width: inherit;margin-bottom: 5px;align-items: center;justify-content: space-between;}
+
+.tox .tox-rgb-form input{width: 6em;}
+
+.tox .tox-rgb-form input.tox-invalid{border: 1px solid red !important;}
+
+.tox .tox-rgb-form .tox-rgba-preview{margin-bottom: 0;border: 1px solid #000;flex-grow: 2;}
+
+.tox:not([dir=rtl]) .tox-sv-palette{margin-right: 15px;}
+
+.tox:not([dir=rtl]) .tox-hue-slider{margin-right: 15px;}
+
+.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left: -1px;}
+
+.tox:not([dir=rtl]) .tox-rgb-form label{margin-right: .5em;}
+
+.tox[dir=rtl] .tox-sv-palette{margin-left: 15px;}
+
+.tox[dir=rtl] .tox-hue-slider{margin-left: 15px;}
+
+.tox[dir=rtl] .tox-hue-slider-thumb{margin-right: -1px;}
+
+.tox[dir=rtl] .tox-rgb-form label{margin-left: .5em;}
+
+.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin: 2px 0 3px 4px;}
+
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{margin: -4px 0;border: 0;}
+
+.tox .tox-swatches__row{display: flex;}
+
+.tox .tox-swatch{width: 30px;height: 30px;transition: transform .15s,box-shadow .15s;}
+
+.tox .tox-swatch:focus,.tox .tox-swatch:hover{transform: scale(.8);box-shadow: 0 0 0 1px rgba(127,127,127,.3) inset;}
+
+.tox .tox-swatch--remove{align-items: center;display: flex;justify-content: center;}
+
+.tox .tox-swatch--remove svg path{stroke: #e74c3c;}
+
+.tox .tox-swatches__picker-btn{display: flex;width: 30px;height: 30px;padding: 0;cursor: pointer;background-color: transparent;border: 0;outline: 0;align-items: center;justify-content: center;}
+
+.tox .tox-swatches__picker-btn svg{width: 24px;height: 24px;}
+
+.tox .tox-swatches__picker-btn:hover{background: #434e5b;}
+
+.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left: auto;}
+
+.tox[dir=rtl] .tox-swatches__picker-btn{margin-right: auto;}
+
+.tox .tox-comment-thread{position: relative;background: #2b3b4e;}
+
+.tox .tox-comment-thread>:not(:first-child){margin-top: 8px;}
+
+.tox .tox-comment{position: relative;padding: 8px 8px 16px 8px;background: #2b3b4e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);}
+
+.tox .tox-comment__header{display: flex;color: #fff;align-items: center;justify-content: space-between;}
+
+.tox .tox-comment__date{font-size: 12px;color: rgba(255,255,255,.5);}
+
+.tox .tox-comment__body{position: relative;margin-top: 8px;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: #fff;text-transform: initial;}
+
+.tox .tox-comment__body textarea{width: 100%;white-space: normal;resize: none;}
+
+.tox .tox-comment__expander{padding-top: 8px;}
+
+.tox .tox-comment__expander p{font-size: 14px;font-style: normal;color: rgba(255,255,255,.5);}
+
+.tox .tox-comment__body p{margin: 0;}
+
+.tox .tox-comment__buttonspacing{padding-top: 16px;text-align: center;}
+
+.tox .tox-comment-thread__overlay::after{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;background: #2b3b4e;content: "";opacity: .9;}
+
+.tox .tox-comment__reply{display: flex;flex-shrink: 0;flex-wrap: wrap;justify-content: flex-end;margin-top: 8px;}
+
+.tox .tox-comment__reply>:first-child{width: 100%;margin-bottom: 8px;}
+
+.tox .tox-comment__edit{display: flex;flex-wrap: wrap;justify-content: flex-end;margin-top: 16px;}
+
+.tox .tox-comment__gradient::after{position: absolute;bottom: 0;display: block;width: 100%;height: 5em;margin-top: -40px;background: linear-gradient(rgba(43,59,78,0),#2b3b4e);content: "";}
+
+.tox .tox-comment__overlay{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;text-align: center;background: #2b3b4e;opacity: .9;flex-direction: column;flex-grow: 1;}
+
+.tox .tox-comment__loading-text{position: relative;display: flex;color: #fff;align-items: center;flex-direction: column;}
+
+.tox .tox-comment__loading-text>div{padding-bottom: 16px;}
+
+.tox .tox-comment__overlaytext{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 10;padding: 1em;font-size: 14px;flex-direction: column;}
+
+.tox .tox-comment__overlaytext p{color: #fff;text-align: center;background-color: #2b3b4e;box-shadow: 0 0 8px 8px #2b3b4e;}
+
+.tox .tox-comment__overlaytext div:nth-of-type(2){font-size: .8em;}
+
+.tox .tox-comment__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: #2b3b4e;align-items: center;justify-content: center;}
+
+.tox .tox-comment__scroll{display: flex;flex-direction: column;flex-shrink: 1;overflow: auto;}
+
+.tox .tox-conversations{margin: 8px;}
+
+.tox:not([dir=rtl]) .tox-comment__edit{margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-comment__edit{margin-right: 8px;}
+
+.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right: 8px;}
+
+.tox .tox-user{align-items: center;display: flex;}
+
+.tox .tox-user__avatar svg{fill: rgba(255,255,255,.5);}
+
+.tox .tox-user__name{font-size: 12px;font-style: normal;font-weight: 700;color: rgba(255,255,255,.5);text-transform: uppercase;}
+
+.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right: 8px;}
+
+.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-user__avatar svg{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right: 8px;}
+
+.tox .tox-dialog-wrap{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1100;display: flex;align-items: center;justify-content: center;}
+
+.tox .tox-dialog-wrap__backdrop{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1101;background-color: rgba(34,47,62,.75);}
+
+.tox .tox-dialog{position: relative;z-index: 1102;display: flex;width: 95vw;max-width: 480px;max-height: 100%;overflow: hidden;background-color: #2b3b4e;border-color: #000;border-style: solid;border-width: 1px;border-radius: 3px;box-shadow: 0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);flex-direction: column;}
+
+.tox .tox-dialog__header{position: relative;display: flex;padding: 8px 16px 0 16px;margin-bottom: 16px;font-size: 16px;color: #fff;background-color: #2b3b4e;border-bottom: none;align-items: center;justify-content: space-between;}
+
+.tox .tox-dialog__header .tox-button{z-index: 1;}
+
+.tox .tox-dialog__draghandle{position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: grab;}
+
+.tox .tox-dialog__draghandle:active{cursor: grabbing;}
+
+.tox .tox-dialog__dismiss{margin-left: auto;}
+
+.tox .tox-dialog__title{margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 20px;font-style: normal;font-weight: 400;line-height: 1.3;text-transform: normal;}
+
+.tox .tox-dialog__body{display: flex;min-width: 0;padding: 0 16px;font-size: 16px;font-style: normal;font-weight: 400;line-height: 1.3;color: #fff;text-align: left;text-transform: normal;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-nav{align-items: flex-start;display: flex;flex-direction: column;}
+
+.tox .tox-dialog__body-nav-item{display: inline-block;margin-bottom: 8px;font-size: 14px;line-height: 1.3;color: rgba(255,255,255,.5);text-decoration: none;border-bottom: 2px solid transparent;}
+
+.tox .tox-dialog__body-nav-item--active{color: #207ab7;border-bottom: 2px solid #207ab7;}
+
+.tox .tox-dialog__body-content{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;max-height: 650px;overflow: auto;}
+
+.tox .tox-dialog__body-content>*{margin-top: 16px;margin-bottom: 0;}
+
+.tox .tox-dialog__body-content>:first-child{margin-top: 0;}
+
+.tox .tox-dialog__body-content>:last-child{margin-bottom: 0;}
+
+.tox .tox-dialog__body-content>:only-child{margin-top: 0;margin-bottom: 0;}
+
+.tox .tox-dialog--width-lg{height: 650px;max-width: 1200px;}
+
+.tox .tox-dialog--width-md{max-width: 800px;}
+
+.tox .tox-dialog--width-md .tox-dialog__body-content{overflow: auto;}
+
+.tox .tox-dialog__body-content--centered{text-align: center;}
+
+.tox .tox-dialog__body-content--spacious{margin-bottom: 16px;}
+
+.tox .tox-dialog__footer{display: flex;padding: 8px 16px;margin-top: 16px;background-color: #2b3b4e;border-top: 1px solid #000;align-items: center;justify-content: space-between;}
+
+.tox .tox-dialog__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: rgba(34,47,62,.75);align-items: center;justify-content: center;}
+
+.tox .tox-dialog__table{width: 100%;border-collapse: collapse;}
+
+.tox .tox-dialog__table thead th{padding-bottom: 8px;font-weight: 700;}
+
+.tox .tox-dialog__table tbody tr{border-bottom: 1px solid #000;}
+
+.tox .tox-dialog__table tbody tr:last-child{border-bottom: none;}
+
+.tox .tox-dialog__table td{padding-top: 8px;padding-bottom: 8px;}
+
+.tox .tox-dialog__popups{position: absolute;z-index: 1100;width: 100%;}
+
+.tox .tox-dialog__body-iframe{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-iframe .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;}
+
+body.tox-dialog__disable-scroll{overflow: hidden;}
+
+.tox.tox-platform-ie .tox-dialog-wrap{position: -ms-device-fixed;}
+
+.tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right: 32px;}
+
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-dialog__body{text-align: right;}
+
+.tox[dir=rtl] .tox-dialog__body-nav{margin-left: 32px;}
+
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right: 8px;}
+
+.tox .tox-dropzone-container{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dropzone{display: flex;min-height: 100px;padding: 10px;background: #fff;border: 2px dashed #000;box-sizing: border-box;align-items: center;flex-direction: column;flex-grow: 1;justify-content: center;}
+
+.tox .tox-dropzone p{margin: 0 0 16px 0;color: rgba(255,255,255,.5);}
+
+.tox .tox-edit-area{position: relative;display: flex;overflow: hidden;border-top: 1px solid #000;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-edit-area__iframe{position: absolute;width: 100%;height: 100%;background-color: #fff;border: 0;box-sizing: border-box;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox.tox-inline-edit-area{border: 1px dotted #000;}
+
+.tox .tox-control-wrap{flex: 1;position: relative;}
+
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display: none;}
+
+.tox .tox-control-wrap svg{display: block;}
+
+.tox .tox-control-wrap__status-icon-wrap{position: absolute;top: 50%;transform: translateY(-50%);}
+
+.tox .tox-control-wrap__status-icon-invalid svg{fill: #c00;}
+
+.tox .tox-control-wrap__status-icon-unknown svg{fill: orange;}
+
+.tox .tox-control-wrap__status-icon-valid svg{fill: green;}
+
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right: 32px;}
+
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right: 4px;}
+
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left: 32px;}
+
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left: 4px;}
+
+.tox .tox-autocompleter{max-width: 25em;}
+
+.tox .tox-autocompleter .tox-menu{max-width: 25em;}
+
+.tox .tox-color-input{display: flex;}
+
+.tox .tox-color-input .tox-textfield{display: flex;border-radius: 3px 0 0 3px;}
+
+.tox .tox-color-input span{display: flex;width: 35px;cursor: pointer;border-color: rgba(34,47,62,.2);border-style: solid;border-width: 1px 1px 1px 0;border-radius: 0 3px 3px 0;box-shadow: none;box-sizing: border-box;}
+
+.tox .tox-color-input span:focus{border-color: #207ab7;}
+
+.tox[dir=rtl] .tox-color-input .tox-textfield{border-radius: 0 3px 3px 0;}
+
+.tox[dir=rtl] .tox-color-input span{border-width: 1px 0 1px 1px;border-radius: 3px 0 0 3px;}
+
+.tox .tox-label,.tox .tox-toolbar-label{display: block;padding: 0 8px 0 0;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: rgba(255,255,255,.5);text-transform: normal;white-space: nowrap;}
+
+.tox .tox-toolbar-label{padding: 0 8px;}
+
+.tox[dir=rtl] .tox-label{padding: 0 0 0 8px;}
+
+.tox .tox-form{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group{margin-bottom: 4px;box-sizing: border-box;}
+
+.tox .tox-form__group--error{color: #c00;}
+
+.tox .tox-form__group--collection{display: flex;}
+
+.tox .tox-form__grid{display: flex;flex-direction: row;flex-wrap: wrap;justify-content: space-between;}
+
+.tox .tox-form__grid--2col>.tox-form__group{width: calc(50% - (8px / 2));}
+
+.tox .tox-form__grid--3col>.tox-form__group{width: calc(100% / 3 - (8px / 2));}
+
+.tox .tox-form__grid--4col>.tox-form__group{width: calc(25% - (8px / 2));}
+
+.tox .tox-form__controls-h-stack{align-items: center;display: flex;}
+
+.tox .tox-form__group--inline{align-items: center;display: flex;}
+
+.tox .tox-form__group--stretched{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-textarea{flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;}
+
+.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left: 4px;}
+
+.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right: 4px;}
+
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display: none;}
+
+.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield,.tox:not([dir=rtl]) .tox-selectfield select,.tox[dir=rtl] .tox-selectfield select{width: 100%;padding: 5px 4.75px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;line-height: 24px;color: #fff;background-color: #2b3b4e;border-color: #000;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box- [...]
+
+.tox .tox-selectfield select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{border-color: #207ab7;outline: 0;box-shadow: none;}
+
+.tox .tox-toolbar-textfield{max-width: 250px;margin-top: 2px;margin-bottom: 3px;border-width: 0;}
+
+.tox .tox-naked-btn{display: block;padding: 0;margin: 0;color: #207ab7;cursor: pointer;background-color: transparent;border: 0;border-color: transparent;box-shadow: unset;}
+
+.tox .tox-naked-btn svg{display: block;fill: #fff;}
+
+.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right: 4px;}
+
+.tox .tox-selectfield{position: relative;cursor: pointer;}
+
+.tox .tox-selectfield select::-ms-expand{display: none;}
+
+.tox .tox-selectfield svg{position: absolute;top: 50%;pointer-events: none;transform: translateY(-50%);}
+
+.tox:not([dir=rtl]) .tox-selectfield select{padding-right: 24px;}
+
+.tox:not([dir=rtl]) .tox-selectfield svg{right: 8px;}
+
+.tox[dir=rtl] .tox-selectfield select{padding-left: 24px;}
+
+.tox[dir=rtl] .tox-selectfield svg{left: 8px;}
+
+.tox .tox-textarea{white-space: pre-wrap;-webkit-appearance: textarea;-moz-appearance: textarea;appearance: textarea;}
+
+.tox-fullscreen{position: fixed;top: 0;left: 0;width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;border: 0;}
+
+.tox-fullscreen .tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display: none;}
+
+.tox-fullscreen .tox.tox-tinymce.tox-fullscreen{z-index: 1200;}
+
+.tox-fullscreen .tox.tox-tinymce-aux{z-index: 1201;}
+
+.tox .tox-image-tools{width: 100%;}
+
+.tox .tox-image-tools__toolbar{align-items: center;display: flex;justify-content: center;}
+
+.tox .tox-image-tools__image{position: relative;width: 100%;height: 380px;overflow: auto;background-color: #666;}
+
+.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top: 8px;}
+
+.tox .tox-image-tools__image-bg{background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);}
+
+.tox .tox-image-tools__toolbar>.tox-spacer{flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-croprect-block{position: absolute;background: #000;opacity: .5;zoom: 1;}
+
+.tox .tox-croprect-handle{position: absolute;top: 0;left: 0;width: 20px;height: 20px;border: 2px solid #fff;}
+
+.tox .tox-croprect-handle-move{position: absolute;cursor: move;border: 0;}
+
+.tox .tox-croprect-handle-nw{top: 100px;left: 100px;margin: -2px 0 0 -2px;cursor: nw-resize;border-width: 2px 0 0 2px;}
+
+.tox .tox-croprect-handle-ne{top: 100px;left: 200px;margin: -2px 0 0 -20px;cursor: ne-resize;border-width: 2px 2px 0 0;}
+
+.tox .tox-croprect-handle-sw{top: 200px;left: 100px;margin: -20px 2px 0 -2px;cursor: sw-resize;border-width: 0 0 2px 2px;}
+
+.tox .tox-croprect-handle-se{top: 200px;left: 200px;margin: -20px 0 0 -20px;cursor: se-resize;border-width: 0 2px 2px 0;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left: 32px;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left: 32px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right: 8px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right: 32px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right: 32px;}
+
+.tox .tox-insert-table-picker{display: flex;flex-wrap: wrap;width: 169px;}
+
+.tox .tox-insert-table-picker>div{width: 16px;height: 16px;border-color: #070a0d;border-style: solid;border-width: 0 1px 1px 0;box-sizing: content-box;}
+
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin: -4px 0;}
+
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color: rgba(32,122,183,.5);border-color: rgba(32,122,183,.5);}
+
+.tox .tox-insert-table-picker__label{display: block;width: 100%;padding: 4px;font-size: 14px;color: #fff;text-align: center;}
+
+.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right: 0;}
+
+.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right: 0;}
+
+.tox .tox-menu{z-index: 1;display: inline-block;overflow: hidden;vertical-align: top;background-color: #2b3b4e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);}
+
+.tox .tox-menu.tox-collection.tox-collection--list{padding: 0;}
+
+.tox .tox-menu.tox-collection.tox-collection--toolbar{padding: 4px;}
+
+.tox .tox-menu.tox-collection.tox-collection--grid{padding: 4px;}
+
+.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin: 0;}
+
+.tox .tox-menubar{display: flex;padding: 0 4px;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color: #222f3e;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;}
+
+.tox .tox-mbtn{display: flex;width: auto;height: 34px;padding: 0 4px;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #fff;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;}
+
+.tox .tox-mbtn[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: none;border-color: none;box-shadow: none;}
+
+.tox .tox-mbtn:hover:not(:disabled){color: #fff;background: #434e5b;box-shadow: none;}
+
+.tox .tox-mbtn:focus:not(:disabled){color: #fff;background: #434e5b;box-shadow: none;}
+
+.tox .tox-mbtn--active{color: #fff;background: #6f7882;box-shadow: none;}
+
+.tox .tox-mbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;}
+
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor: not-allowed;}
+
+.tox .tox-mbtn__select-chevron{display: flex;display: none;width: 16px;align-items: center;justify-content: center;}
+
+.tox .tox-notification{display: grid;padding: 5px;margin-top: 5px;background-color: #fffaea;border-color: #ffe89d;border-style: solid;border-width: 1px;opacity: 0;box-sizing: border-box;transition: transform .1s ease-in,opacity 150ms ease-in;grid-template-columns: minmax(40px,1fr) auto minmax(40px,1fr);}
+
+.tox .tox-notification--in{opacity: 1;}
+
+.tox .tox-notification--success{background-color: #dff0d8;border-color: #d6e9c6;}
+
+.tox .tox-notification--error{background-color: #f2dede;border-color: #ebccd1;}
+
+.tox .tox-notification--warn{background-color: #fcf8e3;border-color: #faebcc;}
+
+.tox .tox-notification--info{background-color: #d9edf7;border-color: #779ecb;}
+
+.tox .tox-notification__body{font-size: 14px;color: #fff;text-align: center;word-break: break-all;word-break: break-word;white-space: normal;align-self: center;grid-column-end: 3;-ms-grid-column-span: 1;grid-column-start: 2;grid-row-end: 2;grid-row-start: 1;}
+
+.tox .tox-notification__body>*{margin: 0;}
+
+.tox .tox-notification__body>*+*{margin-top: 1rem;}
+
+.tox .tox-notification__icon{align-self: center;-ms-grid-column-align: end;grid-column-end: 2;-ms-grid-column-span: 1;grid-column-start: 1;grid-row-end: 2;grid-row-start: 1;justify-self: end;}
+
+.tox .tox-notification__icon svg{display: block;}
+
+.tox .tox-notification__dismiss{align-self: start;-ms-grid-column-align: end;grid-column-end: 4;-ms-grid-column-span: 1;grid-column-start: 3;grid-row-end: 2;grid-row-start: 1;justify-self: end;}
+
+.tox .tox-notification .tox-progress-bar{-ms-grid-column-align: center;grid-column-end: 4;-ms-grid-column-span: 3;grid-column-start: 1;grid-row-end: 3;-ms-grid-row-span: 1;grid-row-start: 2;justify-self: center;}
+
+.tox .tox-pop{position: relative;display: inline-block;}
+
+.tox .tox-pop--resizing{transition: width .1s ease;}
+
+.tox .tox-pop--resizing .tox-toolbar{flex-wrap: nowrap;}
+
+.tox .tox-pop__dialog{min-width: 0;overflow: hidden;background-color: #222f3e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);}
+
+.tox .tox-pop__dialog>:not(.tox-toolbar){margin: 4px 4px 4px 8px;}
+
+.tox .tox-pop__dialog .tox-toolbar{background-color: transparent;}
+
+.tox .tox-pop::after,.tox .tox-pop::before{position: absolute;display: block;width: 0;height: 0;border-style: solid;content: '';}
+
+.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{top: 100%;left: 50%;}
+
+.tox .tox-pop.tox-pop--bottom::after{margin-top: -1px;margin-left: -8px;border-color: #222f3e transparent transparent transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--bottom::before{margin-left: -9px;border-color: #000 transparent transparent transparent;border-width: 9px;}
+
+.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{top: 0;left: 50%;transform: translateY(-100%);}
+
+.tox .tox-pop.tox-pop--top::after{margin-top: 1px;margin-left: -8px;border-color: transparent transparent #222f3e transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--top::before{margin-left: -9px;border-color: transparent transparent #000 transparent;border-width: 9px;}
+
+.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{top: calc(50% - 1px);left: 0;transform: translateY(-50%);}
+
+.tox .tox-pop.tox-pop--left::after{margin-left: -15px;border-color: transparent #222f3e transparent transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--left::before{margin-left: -19px;border-color: transparent #000 transparent transparent;border-width: 10px;}
+
+.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{top: calc(50% + 1px);left: 100%;transform: translateY(-50%);}
+
+.tox .tox-pop.tox-pop--right::after{margin-left: -1px;border-color: transparent transparent transparent #222f3e;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--right::before{margin-left: -1px;border-color: transparent transparent transparent #000;border-width: 10px;}
+
+.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left: 20px;}
+
+.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left: calc(100% - 20px);}
+
+.tox .tox-sidebar-wrap{display: flex;flex-direction: row;flex-grow: 1;min-height: 0;}
+
+.tox .tox-sidebar{display: flex;flex-direction: row;justify-content: flex-end;}
+
+.tox .tox-sidebar__slider{display: flex;overflow: hidden;}
+
+.tox .tox-sidebar__pane-container{display: flex;}
+
+.tox .tox-sidebar__pane{display: flex;}
+
+.tox .tox-sidebar--sliding-closed{opacity: 0;}
+
+.tox .tox-sidebar--sliding-open{opacity: 1;}
+
+.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition: width .5s ease,opacity .5s ease;}
+
+.tox .tox-slider{position: relative;display: flex;height: 24px;align-items: center;flex: 1;-ms-flex-preferred-size: auto;justify-content: center;}
+
+.tox .tox-slider__rail{width: 100%;height: 10px;min-width: 120px;background-color: transparent;border: 1px solid #000;border-radius: 3px;}
+
+.tox .tox-slider__handle{position: absolute;top: 50%;left: 50%;width: 14px;height: 24px;background-color: #207ab7;border: 2px solid #185d8c;border-radius: 3px;transform: translateX(-50%) translateY(-50%);box-shadow: none;}
+
+.tox .tox-source-code{overflow: auto;}
+
+.tox .tox-spinner{display: flex;}
+
+.tox .tox-spinner>div{width: 8px;height: 8px;background-color: rgba(255,255,255,.5);border-radius: 100%;animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;}
+
+.tox .tox-spinner>div:nth-child(1){animation-delay: -.32s;}
+
+.tox .tox-spinner>div:nth-child(2){animation-delay: -.16s;}@keyframes tam-bouncing-dots{0%,100%,80%{transform: scale(0);}
+
+40%{transform: scale(1);}}
+
+.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left: 4px;}
+
+.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right: 4px;}
+
+.tox .tox-statusbar{position: relative;display: flex;height: 18px;padding: 0 8px;overflow: hidden;font-size: 12px;color: rgba(255,255,255,.5);text-transform: uppercase;background-color: #222f3e;border-top: 1px solid #000;align-items: center;flex: 0 0 auto;}
+
+.tox .tox-statusbar a{color: rgba(255,255,255,.5);text-decoration: none;}
+
+.tox .tox-statusbar a:hover{text-decoration: underline;}
+
+.tox .tox-statusbar__text-container{display: flex;flex: 1 1 auto;justify-content: flex-end;overflow: hidden;}
+
+.tox .tox-statusbar__path{display: flex;flex: 1 1 auto;margin-right: auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
+
+.tox .tox-statusbar__path>*{display: inline;white-space: nowrap;}
+
+.tox .tox-statusbar__wordcount{flex: 0 0 auto;margin-left: 1ch;}
+
+.tox .tox-statusbar__resize-handle{display: flex;padding-left: 1ch;margin-right: -8px;margin-left: auto;cursor: nwse-resize;align-items: flex-end;align-self: stretch;flex: 0 0 auto;justify-content: flex-end;}
+
+.tox .tox-statusbar__resize-handle svg{display: block;fill: rgba(255,255,255,.5);}
+
+.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right: 4px;}
+
+.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left: 1ch;}
+
+.tox[dir=rtl] .tox-statusbar{flex-direction: row-reverse;}
+
+.tox[dir=rtl] .tox-statusbar__path>*{margin-left: 4px;}
+
+.tox .tox-throbber{z-index: 1400;}
+
+.tox .tox-throbber__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;display: flex;background-color: rgba(34,47,62,.6);align-items: center;justify-content: center;}
+
+.tox .tox-tbtn{display: flex;width: 34px;height: 34px;padding: 0;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #fff;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;}
+
+.tox .tox-tbtn svg{display: block;fill: #fff;}
+
+.tox .tox-tbtn.tox-tbtn-more{width: inherit;padding-right: 5px;padding-left: 5px;}
+
+.tox .tox-tbtn--enabled{color: #fff;background: #6f7882;box-shadow: none;}
+
+.tox .tox-tbtn--enabled>*{transform: none;}
+
+.tox .tox-tbtn--enabled svg{fill: #fff;}
+
+.tox .tox-tbtn:hover{color: #fff;background: #434e5b;box-shadow: none;}
+
+.tox .tox-tbtn:hover svg{fill: #fff;}
+
+.tox .tox-tbtn:focus{color: #fff;background: #434e5b;box-shadow: none;}
+
+.tox .tox-tbtn:focus svg{fill: #fff;}
+
+.tox .tox-tbtn:active{color: #fff;background: #6f7882;box-shadow: none;}
+
+.tox .tox-tbtn:active svg{fill: #fff;}
+
+.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{color: rgba(255,255,255,.5);cursor: not-allowed;background: 0 0;box-shadow: none;}
+
+.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill: rgba(255,255,255,.5);}
+
+.tox .tox-tbtn:active>*{transform: none;}
+
+.tox .tox-tbtn--md{width: 51px;height: 51px;}
+
+.tox .tox-tbtn--lg{width: 68px;height: 68px;flex-direction: column;}
+
+.tox .tox-tbtn--return{width: 16px;height: unset;align-self: stretch;}
+
+.tox .tox-tbtn--labeled{width: unset;padding: 0 4px;}
+
+.tox .tox-tbtn__vlabel{display: block;margin-bottom: 4px;font-size: 10px;font-weight: 400;letter-spacing: -.025em;white-space: nowrap;}
+
+.tox .tox-tbtn--select{width: auto;padding: 0 4px;margin: 2px 0 3px 0;}
+
+.tox .tox-tbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;}
+
+.tox .tox-tbtn__select-chevron{align-items: center;display: flex;justify-content: center;width: 16px;}
+
+.tox .tox-tbtn__select-chevron svg{fill: rgba(255,255,255,.5);}
+
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label{width: 7em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
+
+.tox .tox-split-button{display: flex;margin: 2px 0 3px 0;overflow: hidden;border: 0;border-radius: 3px;box-sizing: border-box;}
+
+.tox .tox-split-button:hover{box-shadow: 0 0 0 1px #434e5b inset;}
+
+.tox .tox-split-button:focus{color: #fff;background: #434e5b;box-shadow: none;}
+
+.tox .tox-split-button>*{border-radius: 0;}
+
+.tox .tox-split-button__chevron{width: 16px;}
+
+.tox .tox-split-button__chevron svg{fill: rgba(255,255,255,.5);}
+
+.tox .tox-pop .tox-split-button__chevron svg{transform: rotate(-90deg);}
+
+.tox .tox-split-button .tox-tbtn{margin: 0;}
+
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{color: rgba(255,255,255,.5);background: 0 0;box-shadow: none;}
+
+.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{display: flex;padding: 0 0;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color: #222f3e;border-top: 1px solid #000;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;}
+
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height: 0;opacity: 0;visibility: hidden;}
+
+.tox .tox-toolbar__overflow--growing{transition: height .3s ease,opacity .2s linear .1s;}
+
+.tox .tox-toolbar__overflow--shrinking{transition: opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s;}
+
+.tox .tox-pop .tox-toolbar{border-width: 0;}
+
+.tox .tox-toolbar--no-divider{background-image: none;}
+
+.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color: #222f3e;border: 1px solid #000;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);}
+
+.tox.tox-tinymce-aux:not([dir=rtl]) .tox-toolbar__overflow{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform: rotateY(180deg);}
+
+.tox[dir=rtl].tox-tinymce-aux .tox-toolbar__overflow{margin-right: 4px;}
+
+.tox .tox-toolbar__group{display: flex;padding: 0 4px;margin: 0 0;align-items: center;flex-wrap: wrap;}
+
+.tox .tox-toolbar__group--pull-right{margin-left: auto;}
+
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right: 1px solid #000;}
+
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left: 1px solid #000;}
+
+.tox .tox-tooltip{position: relative;display: inline-block;padding: 8px;}
+
+.tox .tox-tooltip__body{padding: 4px 8px;font-size: 14px;font-style: normal;font-weight: 400;color: rgba(255,255,255,.75);text-transform: normal;background-color: #3d546f;border-radius: 3px;box-shadow: 0 2px 4px rgba(34,47,62,.3);}
+
+.tox .tox-tooltip__arrow{position: absolute;}
+
+.tox .tox-tooltip--down .tox-tooltip__arrow{position: absolute;bottom: 0;left: 50%;border-top: 8px solid #3d546f;border-right: 8px solid transparent;border-left: 8px solid transparent;transform: translateX(-50%);}
+
+.tox .tox-tooltip--up .tox-tooltip__arrow{position: absolute;top: 0;left: 50%;border-right: 8px solid transparent;border-bottom: 8px solid #3d546f;border-left: 8px solid transparent;transform: translateX(-50%);}
+
+.tox .tox-tooltip--right .tox-tooltip__arrow{position: absolute;top: 50%;right: 0;border-top: 8px solid transparent;border-bottom: 8px solid transparent;border-left: 8px solid #3d546f;transform: translateY(-50%);}
+
+.tox .tox-tooltip--left .tox-tooltip__arrow{position: absolute;top: 50%;left: 0;border-top: 8px solid transparent;border-right: 8px solid #3d546f;border-bottom: 8px solid transparent;transform: translateY(-50%);}
+
+.tox .tox-well{width: 100%;padding: 8px;border: 1px solid #000;border-radius: 3px;}
+
+.tox .tox-well>:first-child{margin-top: 0;}
+
+.tox .tox-well>:last-child{margin-bottom: 0;}
+
+.tox .tox-well>:only-child{margin: 0;}
+
+.tox .tox-custom-editor{display: flex;height: 525px;border: 1px solid #000;border-radius: 3px;}
+
+.tox .tox-dialog-loading::before{position: absolute;z-index: 1000;width: 100%;height: 100%;background-color: rgba(0,0,0,.5);content: "";}
+
+.tox .tox-tab{cursor: pointer;}
+
+.tox .tox-dialog__content-js{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-content .tox-collection{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox ul{display: block;list-style-type: disc;-webkit-margin-before: 1em;margin-block-start: 1em;-webkit-margin-after: 1em;margin-block-end: 1em;-webkit-margin-start: 0;margin-inline-start: 0;-webkit-margin-end: 0;margin-inline-end: 0;-webkit-padding-start: 40px;padding-inline-start: 40px;}
+
+.tox a{color: #2276d2;cursor: pointer;}
+
+.tox .tox-image-tools-edit-panel{height: 60px;}
+
+.tox .tox-image-tools__sidebar{height: 60px;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css
new file mode 100644
index 000000000..14847d0a2
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide-dark/skin.mobile.min.css
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all: initial;display: block;}
+
+.tinymce-mobile-outer-container *{float: none;padding: 0;margin: 0;line-height: 1;text-shadow: none;white-space: nowrap;cursor: inherit;border: 0;outline: 0;box-sizing: initial;-webkit-tap-highlight-color: transparent;}
+
+.tinymce-mobile-icon-arrow-back::before{content: "\e5cd";}
+
+.tinymce-mobile-icon-image::before{content: "\e412";}
+
+.tinymce-mobile-icon-cancel-circle::before{content: "\e5c9";}
+
+.tinymce-mobile-icon-full-dot::before{content: "\e061";}
+
+.tinymce-mobile-icon-align-center::before{content: "\e234";}
+
+.tinymce-mobile-icon-align-left::before{content: "\e236";}
+
+.tinymce-mobile-icon-align-right::before{content: "\e237";}
+
+.tinymce-mobile-icon-bold::before{content: "\e238";}
+
+.tinymce-mobile-icon-italic::before{content: "\e23f";}
+
+.tinymce-mobile-icon-unordered-list::before{content: "\e241";}
+
+.tinymce-mobile-icon-ordered-list::before{content: "\e242";}
+
+.tinymce-mobile-icon-font-size::before{content: "\e245";}
+
+.tinymce-mobile-icon-underline::before{content: "\e249";}
+
+.tinymce-mobile-icon-link::before{content: "\e157";}
+
+.tinymce-mobile-icon-unlink::before{content: "\eca2";}
+
+.tinymce-mobile-icon-color::before{content: "\e891";}
+
+.tinymce-mobile-icon-previous::before{content: "\e314";}
+
+.tinymce-mobile-icon-next::before{content: "\e315";}
+
+.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content: "\e264";}
+
+.tinymce-mobile-icon-undo::before{content: "\e166";}
+
+.tinymce-mobile-icon-redo::before{content: "\e15a";}
+
+.tinymce-mobile-icon-removeformat::before{content: "\e239";}
+
+.tinymce-mobile-icon-small-font::before{content: "\e906";}
+
+.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content: "\e5ca";}
+
+.tinymce-mobile-icon-small-heading::before{content: "small";}
+
+.tinymce-mobile-icon-large-heading::before{content: "large";}
+
+.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family: sans-serif;font-size: 80%;}
+
+.tinymce-mobile-mask-edit-icon::before{content: "\e254";}
+
+.tinymce-mobile-icon-back::before{content: "\e5c4";}
+
+.tinymce-mobile-icon-heading::before{font-family: sans-serif;font-size: 80%;font-weight: 700;content: "Headings";}
+
+.tinymce-mobile-icon-h1::before{font-weight: 700;content: "H1";}
+
+.tinymce-mobile-icon-h2::before{font-weight: 700;content: "H2";}
+
+.tinymce-mobile-icon-h3::before{font-weight: 700;content: "H3";}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{position: absolute;top: 0;display: flex;width: 100%;height: 100%;background: rgba(51,51,51,.5);align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{display: flex;font-family: sans-serif;font-size: 1em;border-radius: 50%;align-items: center;flex-direction: column;justify-content: space-between;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{display: flex;width: 2.1em;height: 2.1em;border-radius: 50%;align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items: center;display: flex;justify-content: center;flex-direction: column;font-size: 1em;}@media only screen and (min-device-width: 700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size: 1.2em;}}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{display: flex;width: 2.1em;height: 2.1em;color: #207ab7;background-color: #fff;border-radius: 50%;align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{font-family: tinymce-mobile,sans-serif;content: "\e900";}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index: 2;}
+
+.tinymce-mobile-android-container.tinymce-mobile-android-maximized{position: fixed;top: 0;right: 0;bottom: 0;left: 0;display: flex;background: #fff;border: none;flex-direction: column;}
+
+.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position: relative;}
+
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display: flex;flex-grow: 1;}
+
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display: flex !important;flex-grow: 1;height: auto !important;}
+
+.tinymce-mobile-android-scroll-reload{overflow: hidden;}
+
+:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top: 23px;}
+
+.tinymce-mobile-toolstrip{z-index: 1;display: flex;background: #fff;flex: 0 0 auto;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{display: flex;width: 100%;height: 2.5em;background-color: #fff;border-bottom: 1px solid #ccc;align-items: center;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items: center;display: flex;height: 100%;flex-shrink: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background: #f44336;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-right: .5em;padding-left: .5em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{display: flex;height: 80%;margin-right: 2px;margin-left: 2px;align-items: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{color: #ccc;background: #c8cbcf;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{color: #eceff1;background: #207ab7;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{display: flex;height: 100%;padding-top: .4em;padding-bottom: .4em;align-items: center;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{position: relative;display: flex;width: 100%;min-height: 1.5em;padding-right: 0;padding-left: 0;overflow: hidden;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display: flex;width: 100%;height: 100%;transition: left cubic-bezier(.4,0,1,1) .15s;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display: flex;flex: 0 0 auto;justify-content: space-between;width: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family: sans-serif;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{position: relative;display: flex;flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{position: absolute;right: 0;height: 100%;padding-right: 2px;font-size: .6em;font-weight: 700;color: #888;background: inherit;border: none;border-radius: 50%;align-self: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display: none;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobil [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinym [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tin [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{padding-top: 3px;margin: 0 2px;font-size: 10px;line-height: 10px;color: #ccc;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color: #c8cbcf;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-right: .9em;margin-left: .5em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-right: .5em;margin-left: .9em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{position: relative;display: flex;padding: .28em 0;margin-right: 0;margin-left: 0;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items: center;display: flex;flex-grow: 1;height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #ccc;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-right: 2em;padding-left: 2em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items: center;display: flex;flex-grow: 1;height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #000;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #fff;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{position: absolute;top: 0;bottom: 0;left: -10px;display: flex;width: .5em;height: .5em;margin: auto;color: #fff;background-color: #455a64;border: .5em solid rgba(136,136,136,0);border-radius: 3em;transition: border 120ms cubic-bezier(.39,.58,.57,1);background-clip: padding-box;align-items: center;justify-content: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border: .5em solid rgba(136,136,136,.39);}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction: column;justify-content: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items: center;display: flex;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display: flex;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{padding-top: .1em;padding-bottom: .1em;padding-left: 5px;font-size: .85em;color: #455a64;background: #fff;border: none;border-radius: 0;flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color: #888;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color: #888;}
+
+.tinymce-mobile-dropup{display: flex;width: 100%;overflow: hidden;background: #fff;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition: height .3s ease-out;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition: height .3s ease-in;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow: 0;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow: 1;}
+
+.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}@media only screen and (orientation: landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 150px;}}
+
+.tinymce-mobile-styles-menu{position: relative;width: 100%;overflow: hidden;font-family: sans-serif;outline: 4px solid #000;}
+
+.tinymce-mobile-styles-menu [role=menu]{position: absolute;display: flex;width: 100%;height: 100%;flex-direction: column;}
+
+.tinymce-mobile-styles-menu [role=menu].transitioning{transition: transform .5s ease-in-out;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{position: relative;display: flex;padding: 1em 1em;color: #455a64;cursor: pointer;border-bottom: 1px solid #ddd;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e314";}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e315";}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{display: flex;min-height: 2.5em;padding-right: 1em;padding-left: 1em;color: #455a64;background: #fff;border-top: #455a64;align-items: center;}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform: translate(-100%);}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform: translate(0);}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform: translate(100%);}@font-face{font-family: tinymce-mobile;font-style: normal;font-weight: 400;src: url(fonts/tinymce-mobile.woff?8x92w3) format('woff');}@media (min-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 25px;}}@media (max-device-width: 700px){.tinymce-mobile-outer- [...]
+
+.tinymce-mobile-icon{font-family: tinymce-mobile,sans-serif;}
+
+.mixin-flex-and-centre{align-items: center;display: flex;justify-content: center;}
+
+.mixin-flex-bar{align-items: center;display: flex;height: 100%;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{width: 100%;background-color: #fff;}
+
+.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{position: fixed;right: 2em;bottom: 1em;display: flex;width: 2.1em;height: 2.1em;font-size: 1em;color: #fff;background-color: #207ab7;border-radius: 50%;align-items: center;justify-content: center;}@media only screen and (min-device-width: 700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size: 1.2em;}}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height: 300px;overflow: hidden;}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height: 100%;}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display: none;}
+
+input[type=file]::-webkit-file-upload-button{display: none;}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom: 50%;}}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.inline.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.inline.min.css
new file mode 100644
index 000000000..748f313bb
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.inline.min.css
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modif [...]
+
+.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;}
+
+.tox-comments-visible .tox-comment{background-color: #fff0b7;}
+
+.tox-comments-visible .tox-comment--active{background-color: #ffe168;}
+
+.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;}
+
+.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D% [...]
+
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22% [...]
+
+[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;}
+
+code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;}
+
+code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;}
+
+code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}}
+
+pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;}
+
+:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;}
+
+:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;}
+
+.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;}
+
+.token.punctuation{color: #999;}
+
+.namespace{opacity: .7;}
+
+.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;}
+
+.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;}
+
+.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);}
+
+.token.atrule,.token.attr-value,.token.keyword{color: #07a;}
+
+.token.function{color: #dd4a68;}
+
+.token.important,.token.regex,.token.variable{color: #e90;}
+
+.token.bold,.token.important{font-weight: 700;}
+
+.token.italic{font-style: italic;}
+
+.token.entity{cursor: help;}
+
+:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;}
+
+[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;}
+
+.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;}
+
+.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;}
+
+.mce-content-body .mce-visual-caret-hidden{display: none;}
+
+.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;}
+
+.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;}
+
+.mce-content-body [contentEditable=false]{cursor: default;}
+
+.mce-content-body [contentEditable=true]{cursor: text;}
+
+.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%2 [...]
+
+.mce-content-body figure.align-left{float: left;}
+
+.mce-content-body figure.align-right{float: right;}
+
+.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;}
+
+.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;}
+
+.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;}
+
+.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat cent [...]
+
+.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}}
+
+.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;}
+
+.tiny-pageembed{position: relative;display: inline-block;}
+
+.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;}
+
+.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";}
+
+.tiny-pageembed--21by9::before{padding-top: 42.857143%;}
+
+.tiny-pageembed--16by9::before{padding-top: 56.25%;}
+
+.tiny-pageembed--4by3::before{padding-top: 75%;}
+
+.tiny-pageembed--1by1::before{padding-top: 100%;}
+
+.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;}
+
+.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;}
+
+.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;}
+
+.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;}
+
+.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;}
+
+.mce-match-marker{color: #fff;background: #aaa;}
+
+.mce-match-marker-selected{color: #fff;background: #39f;}
+
+.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;}
+
+.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;}
+
+.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;}
+
+.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;}
+
+.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;}
+
+.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
+
+.mce-content-body img::-moz-selection{background: 0 0;}
+
+.mce-content-body img::selection{background: 0 0;}
+
+.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;}
+
+.ephox-snooker-resizer-cols{cursor: col-resize;}
+
+.ephox-snooker-resizer-rows{cursor: row-resize;}
+
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;}
+
+.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-toc{border: 1px solid gray;}
+
+.mce-toc h2{margin: 4px;}
+
+.mce-toc li{list-style-type: none;}
+
+.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;}
+
+.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding [...]
+
+.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);}
+
+.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);}
+
+.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);}
+
+.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);}
+
+.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);}
+
+.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);}
+
+.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);}
+
+.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);}
+
+.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);}
+
+.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);}
+
+.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);}
+
+.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);}
+
+.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);}
+
+.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);}
+
+.mce-visualblocks figcaption{border: 1px dashed #bbb;}
+
+.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);}
+
+.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);}
+
+.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);}
+
+.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);}
+
+.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);}
+
+.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce [...]
+
+.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblock [...]
+
+.mce-nbsp,.mce-shy{background: #aaa;}
+
+.mce-shy::after{content: '-';}
+
+.tox-toolbar-dock-fadeout{opacity: 0;visibility: hidden;}
+
+.tox-toolbar-dock-fadein{opacity: 1;visibility: visible;}
+
+.tox-toolbar-dock-transition{transition: visibility 0s linear .3s,opacity .3s ease;}
+
+.tox-toolbar-dock-transition.tox-toolbar-dock-fadein{transition-delay: 0s;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.min.css
new file mode 100644
index 000000000..6e7165f09
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.min.css
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{display: inline-block;width: 8px !important;height: 12px !important;padding: 0 2px;cursor: default;background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;-webkit-user-select: all;-moz-user-select: all;-ms-user-select: all;user-select: all;-webkit-user-modif [...]
+
+.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset: 1px;}
+
+.tox-comments-visible .tox-comment{background-color: #fff0b7;}
+
+.tox-comments-visible .tox-comment--active{background-color: #ffe168;}
+
+.tox-checklist>li:not(.tox-checklist--hidden){margin: .25em 0;list-style: none;}
+
+.tox-checklist>li:not(.tox-checklist--hidden)::before{position: absolute;width: 1em;height: 1em;margin-top: .125em;margin-left: -1.5em;cursor: pointer;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D% [...]
+
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22% [...]
+
+[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-right: -1.5em;margin-left: 0;}
+
+code[class*=language-],pre[class*=language-]{font-family: Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size: .875rem;-webkit-hyphens: none;-ms-hyphens: none;hyphens: none;line-height: 1.5;word-spacing: normal;color: #000;text-shadow: 0 1px #fff;word-break: normal;word-wrap: normal;white-space: pre;-moz-tab-size: 4;tab-size: 4;}
+
+code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow: none;background: #b3d4fc;}
+
+code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow: none;background: #b3d4fc;}@media print{code[class*=language-],pre[class*=language-]{text-shadow: none;}}
+
+pre[class*=language-]{padding: 1em;margin: .5em 0;overflow: auto;}
+
+:not(pre)>code[class*=language-],pre[class*=language-]{background: 0 0 !important;border: 1px solid #ccc;}
+
+:not(pre)>code[class*=language-]{padding: .1em;border-radius: .3em;}
+
+.token.cdata,.token.comment,.token.doctype,.token.prolog{color: #708090;}
+
+.token.punctuation{color: #999;}
+
+.namespace{opacity: .7;}
+
+.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color: #905;}
+
+.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color: #690;}
+
+.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color: #a67f59;background: hsla(0,0%,100%,.5);}
+
+.token.atrule,.token.attr-value,.token.keyword{color: #07a;}
+
+.token.function{color: #dd4a68;}
+
+.token.important,.token.regex,.token.variable{color: #e90;}
+
+.token.bold,.token.important{font-weight: 700;}
+
+.token.italic{font-style: italic;}
+
+.token.entity{cursor: help;}
+
+:not([dir=rtl]) code[class*=language-],:not([dir=rtl]) pre[class*=language-]{text-align: left;direction: ltr;}
+
+[dir=rtl] code[class*=language-],[dir=rtl] pre[class*=language-]{text-align: right;direction: rtl;}
+
+.mce-content-body{overflow-wrap: break-word;word-wrap: break-word;}
+
+.mce-content-body .mce-visual-caret{position: absolute;background-color: #000;background-color: currentColor;}
+
+.mce-content-body .mce-visual-caret-hidden{display: none;}
+
+.mce-content-body [data-mce-caret]{position: absolute;top: 0;right: auto;left: -1000px;padding: 0;margin: 0;}
+
+.mce-content-body .mce-offscreen-selection{position: absolute;left: -9999999999px;max-width: 1000000px;}
+
+.mce-content-body [contentEditable=false]{cursor: default;}
+
+.mce-content-body [contentEditable=true]{cursor: text;}
+
+.tox-cursor-format-painter{cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%2 [...]
+
+.mce-content-body figure.align-left{float: left;}
+
+.mce-content-body figure.align-right{float: right;}
+
+.mce-content-body figure.image.align-center{display: table;margin-right: auto;margin-left: auto;}
+
+.mce-preview-object{position: relative;display: inline-block;margin: 0 2px 0 2px;line-height: 0;border: 1px solid gray;}
+
+.mce-preview-object .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.mce-preview-object[data-mce-selected="2"] .mce-shim{display: none;}
+
+.mce-object{background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat cent [...]
+
+.mce-pagebreak{display: block;width: 100%;height: 5px;margin-top: 15px;cursor: default;border: 1px dashed #aaa;page-break-before: always;}@media print{.mce-pagebreak{border: 0;}}
+
+.tiny-pageembed .mce-shim{position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);}
+
+.tiny-pageembed[data-mce-selected="2"] .mce-shim{display: none;}
+
+.tiny-pageembed{position: relative;display: inline-block;}
+
+.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{position: relative;display: block;width: 100%;padding: 0;overflow: hidden;}
+
+.tiny-pageembed--16by9::before,.tiny-pageembed--1by1::before,.tiny-pageembed--21by9::before,.tiny-pageembed--4by3::before{display: block;content: "";}
+
+.tiny-pageembed--21by9::before{padding-top: 42.857143%;}
+
+.tiny-pageembed--16by9::before{padding-top: 56.25%;}
+
+.tiny-pageembed--4by3::before{padding-top: 75%;}
+
+.tiny-pageembed--1by1::before{padding-top: 100%;}
+
+.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{position: absolute;top: 0;left: 0;width: 100%;height: 100%;border: 0;}
+
+.mce-content-body div.mce-resizehandle{position: absolute;z-index: 10000;width: 10px;height: 10px;background-color: #4099ff;border-color: #4099ff;border-style: solid;border-width: 1px;box-sizing: border-box;}
+
+.mce-content-body div.mce-resizehandle:hover{background-color: #4099ff;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor: nesw-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor: nwse-resize;}
+
+.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor: nesw-resize;}
+
+.mce-content-body .mce-clonedresizable{position: absolute;z-index: 10000;outline: 1px dashed #000;opacity: .5;}
+
+.mce-content-body .mce-resize-helper{position: absolute;z-index: 10001;display: none;padding: 5px;margin: 5px 10px;font-family: sans-serif;font-size: 12px;line-height: 14px;color: #fff;white-space: nowrap;background: #555;background: rgba(0,0,0,.75);border: 1px;border-radius: 3px;}
+
+.mce-match-marker{color: #fff;background: #aaa;}
+
+.mce-match-marker-selected{color: #fff;background: #39f;}
+
+.mce-content-body img[data-mce-selected],.mce-content-body table[data-mce-selected]{outline: 3px solid #b4d7ff;}
+
+.mce-content-body hr[data-mce-selected]{outline: 3px solid #b4d7ff;outline-offset: 1px;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline: 3px solid #b4d7ff;}
+
+.mce-content-body [contentEditable=false][data-mce-selected]{cursor: not-allowed;outline: 3px solid #b4d7ff;}
+
+.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline: 0;}
+
+.mce-content-body [data-mce-selected=inline-boundary]{background-color: #b4d7ff;}
+
+.mce-content-body .mce-edit-focus{outline: 3px solid #b4d7ff;}
+
+.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{background-color: #b4d7ff !important;}
+
+.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background: 0 0;}
+
+.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{-webkit-touch-callout: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
+
+.mce-content-body img::-moz-selection{background: 0 0;}
+
+.mce-content-body img::selection{background: 0 0;}
+
+.ephox-snooker-resizer-bar{background-color: #b4d7ff;opacity: 0;}
+
+.ephox-snooker-resizer-cols{cursor: col-resize;}
+
+.ephox-snooker-resizer-rows{cursor: row-resize;}
+
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity: 1;}
+
+.mce-spellchecker-word{height: 2rem;cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-spellchecker-grammar{cursor: default;background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position: 0 calc(100% + 1px);background-repeat: repeat-x;background-size: auto 6px;}
+
+.mce-toc{border: 1px solid gray;}
+
+.mce-toc h2{margin: 4px;}
+
+.mce-toc li{list-style-type: none;}
+
+.mce-item-table,.mce-item-table caption,.mce-item-table td,.mce-item-table th{border: 1px dashed #bbb;}
+
+.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{padding [...]
+
+.mce-visualblocks p{background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);}
+
+.mce-visualblocks h1{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);}
+
+.mce-visualblocks h2{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);}
+
+.mce-visualblocks h3{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);}
+
+.mce-visualblocks h4{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);}
+
+.mce-visualblocks h5{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);}
+
+.mce-visualblocks h6{background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);}
+
+.mce-visualblocks div:not([data-mce-bogus]){background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);}
+
+.mce-visualblocks section{background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);}
+
+.mce-visualblocks article{background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);}
+
+.mce-visualblocks blockquote{background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);}
+
+.mce-visualblocks address{background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);}
+
+.mce-visualblocks pre{background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);}
+
+.mce-visualblocks figure{background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);}
+
+.mce-visualblocks figcaption{border: 1px dashed #bbb;}
+
+.mce-visualblocks hgroup{background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);}
+
+.mce-visualblocks aside{background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);}
+
+.mce-visualblocks ul{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);}
+
+.mce-visualblocks ol{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);}
+
+.mce-visualblocks dl{background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);}
+
+.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce [...]
+
+.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblock [...]
+
+.mce-nbsp,.mce-shy{background: #aaa;}
+
+.mce-shy::after{content: '-';}
+
+body{font-family: sans-serif;}
+
+table{border-collapse: collapse;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css
new file mode 100644
index 000000000..c0522520e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/content.mobile.min.css
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position: absolute;display: inline-block;background-color: green;opacity: .5;}
+
+body{-webkit-text-size-adjust: none;}
+
+body img{max-width: 96vw;}
+
+body table img{max-width: 95%;}
+
+body{font-family: sans-serif;}
+
+table{border-collapse: collapse;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff
new file mode 100644
index 000000000..1e3be038a
Binary files /dev/null and b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff differ
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.min.css
new file mode 100644
index 000000000..5886c594c
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.min.css
@@ -0,0 +1,875 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-style: normal;font-weight: 400;line-height: normal;color: #222f3e;text-decoration: none;text-shadow: none;text-transform: none;white-space: normal;vertical-align: initial;cursor: auto;box-sizing: content-box;-webkit-tap-highlight-color: transparent;}
+
+.tox :not(svg){font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;line-height: inherit;color: inherit;text-align: inherit;text-decoration: inherit;text-shadow: inherit;text-transform: inherit;white-space: inherit;vertical-align: inherit;cursor: inherit;box-sizing: inherit;direction: inherit;-webkit-tap-highlight-color: inherit;}
+
+.tox :not(svg){position: static;float: none;width: auto;height: auto;max-width: none;padding: 0;margin: 0;background: 0 0;border: 0;outline: 0;}
+
+.tox:not([dir=rtl]){text-align: left;direction: ltr;}
+
+.tox[dir=rtl]{text-align: right;direction: rtl;}
+
+.tox-tinymce{position: relative;display: flex;overflow: hidden;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;border: 1px solid #ccc;border-radius: 0;visibility: inherit !important;box-shadow: none;box-sizing: border-box;flex-direction: column;}
+
+.tox-editor-container{display: flex;flex: 1 1 auto;flex-direction: column;overflow: hidden;}
+
+.tox-editor-container>:first-child{border-top: none !important;}
+
+.tox-tinymce-aux{font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;}
+
+.tox-tinymce :focus,.tox-tinymce-aux :focus{outline: 0;}
+
+button::-moz-focus-inner{border: 0;}
+
+.tox-silver-sink{z-index: 1300;}
+
+.tox .tox-anchorbar{display: flex;flex: 0 0 auto;}
+
+.tox .tox-bar{display: flex;flex: 0 0 auto;}
+
+.tox .tox-button{display: inline-block;padding: 4px 16px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 14px;font-weight: 700;line-height: 24px;letter-spacing: 1;color: #fff;text-align: center;text-decoration: none;text-transform: capitalize;white-space: nowrap;cursor: pointer;background-color: #207ab7;background-image: none;background-position: none;background-repeat: none;border-color: #207ab [...]
+
+.tox .tox-button[disabled]{color: rgba(255,255,255,.5);cursor: not-allowed;background-color: #207ab7;background-image: none;border-color: #207ab7;box-shadow: none;}
+
+.tox .tox-button:focus:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;}
+
+.tox .tox-button:hover:not(:disabled){color: #fff;background-color: #1c6ca1;background-image: none;border-color: #1c6ca1;box-shadow: none;}
+
+.tox .tox-button:active:not(:disabled){color: #fff;background-color: #185d8c;background-image: none;border-color: #185d8c;box-shadow: none;}
+
+.tox .tox-button--secondary{padding: 4px 16px;color: #222f3e;text-decoration: none;text-transform: capitalize;background-color: #f0f0f0;background-image: none;background-position: none;background-repeat: none;border-color: #f0f0f0;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;}
+
+.tox .tox-button--secondary[disabled]{color: rgba(34,47,62,.5);background-color: #f0f0f0;background-image: none;border-color: #f0f0f0;box-shadow: none;}
+
+.tox .tox-button--secondary:focus:not(:disabled){color: #222f3e;background-color: #e3e3e3;background-image: none;border-color: #e3e3e3;box-shadow: none;}
+
+.tox .tox-button--secondary:hover:not(:disabled){color: #222f3e;background-color: #e3e3e3;background-image: none;border-color: #e3e3e3;box-shadow: none;}
+
+.tox .tox-button--secondary:active:not(:disabled){color: #222f3e;background-color: #d6d6d6;background-image: none;border-color: #d6d6d6;box-shadow: none;}
+
+.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding: 4px;}
+
+.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display: block;fill: currentColor;}
+
+.tox .tox-button-link{display: inline-block;padding: 0;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;font-weight: 400;line-height: 1.3;white-space: nowrap;cursor: pointer;background: 0;border: none;box-sizing: border-box;}
+
+.tox .tox-button-link--sm{font-size: 14px;}
+
+.tox .tox-button--naked{color: #222f3e;background-color: transparent;border-color: transparent;box-shadow: unset;}
+
+.tox .tox-button--naked:hover:not(:disabled){color: #222f3e;background-color: #e3e3e3;border-color: #e3e3e3;box-shadow: none;}
+
+.tox .tox-button--naked:focus:not(:disabled){color: #222f3e;background-color: #e3e3e3;border-color: #e3e3e3;box-shadow: none;}
+
+.tox .tox-button--naked:active:not(:disabled){color: #222f3e;background-color: #d6d6d6;border-color: #d6d6d6;box-shadow: none;}
+
+.tox .tox-button--naked .tox-icon svg{fill: currentColor;}
+
+.tox .tox-button--naked.tox-button--icon{color: currentColor;}
+
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color: #222f3e;}
+
+.tox .tox-checkbox{display: flex;height: 36px;min-width: 36px;cursor: pointer;border-radius: 3px;align-items: center;}
+
+.tox .tox-checkbox__input{position: absolute;top: auto;left: -10000px;width: 1px;height: 1px;overflow: hidden;}
+
+.tox .tox-checkbox__icons{width: 24px;height: 24px;padding: calc(4px - 1px);border-radius: 3px;box-shadow: 0 0 0 2px transparent;box-sizing: content-box;}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: block;fill: rgba(34,47,62,.3);}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: none;fill: #207ab7;}
+
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display: none;fill: #207ab7;}
+
+.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;}
+
+.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display: block;}
+
+.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display: none;}
+
+.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display: block;}
+
+.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{padding: calc(4px - 1px);border-radius: 3px;box-shadow: inset 0 0 0 1px #207ab7;}
+
+.tox:not([dir=rtl]) .tox-checkbox__label{margin-left: 4px;}
+
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-checkbox__label{margin-right: 4px;}
+
+.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right: 4px;}
+
+.tox .tox-collection--toolbar .tox-collection__group{display: flex;padding: 0;}
+
+.tox .tox-collection--grid .tox-collection__group{display: flex;max-height: 208px;padding: 0;overflow-x: hidden;overflow-y: auto;flex-wrap: wrap;}
+
+.tox .tox-collection--list .tox-collection__group{padding: 4px 0;border-color: #ccc;border-style: solid;border-top-width: 1px;border-right-width: 0;border-bottom-width: 0;border-left-width: 0;}
+
+.tox .tox-collection--list .tox-collection__group:first-child{border-top-width: 0;}
+
+.tox .tox-collection__group-heading{padding: 4px 8px;margin-top: -4px;margin-bottom: 4px;font-size: 12px;font-style: normal;font-weight: 400;color: rgba(34,47,62,.7);text-transform: none;cursor: default;background-color: #e6e6e6;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-touch-callout: none;}
+
+.tox .tox-collection__item{display: flex;color: #222f3e;cursor: pointer;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;align-items: center;-webkit-touch-callout: none;}
+
+.tox .tox-collection--list .tox-collection__item{padding: 4px 8px;}
+
+.tox .tox-collection--toolbar .tox-collection__item{padding: 4px;border-radius: 3px;}
+
+.tox .tox-collection--grid .tox-collection__item{padding: 4px;border-radius: 3px;}
+
+.tox .tox-collection--list .tox-collection__item--enabled{color: contrast(inherit,#222f3e,#fff);background-color: inherit;}
+
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;}
+
+.tox .tox-collection--toolbar .tox-collection__item--enabled{color: #222f3e;background-color: #c8cbcf;}
+
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;}
+
+.tox .tox-collection--grid .tox-collection__item--enabled{color: #222f3e;background-color: #c8cbcf;}
+
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){color: #222f3e;background-color: #dee0e2;}
+
+.tox .tox-collection__item--state-disabled{color: rgba(34,47,62,.5);cursor: default;background-color: transparent;}
+
+.tox .tox-collection__item-icon{display: flex;width: 24px;height: 24px;align-items: center;justify-content: center;}
+
+.tox .tox-collection__item-icon svg{fill: currentColor;}
+
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon{width: 48px;height: 48px;}
+
+.tox .tox-collection__item[role=menuitemcheckbox]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display: none;}
+
+.tox .tox-collection__item-label{display: inline-block;font-size: 14px;font-style: normal;font-weight: 400;line-height: 24px;color: currentColor;text-transform: none;word-break: break-all;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-collection__item-accessory{display: inline-block;height: 24px;font-size: 14px;line-height: 24px;color: rgba(34,47,62,.7);text-transform: normal;}
+
+.tox .tox-collection__item-caret{align-items: center;display: flex;min-height: 24px;}
+
+.tox .tox-collection__item-caret::after{min-height: inherit;font-size: 0;content: '';}
+
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item-label:first-child{margin-left: 4px;}
+
+.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left: 16px;text-align: right;}
+
+.tox:not([dir=rtl]) .tox-collection__item-caret{margin-left: 16px;}
+
+.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right: 8px;}
+
+.tox[dir=rtl] .tox-collection--list .tox-collection__item-label:first-child{margin-right: 4px;}
+
+.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform: rotateY(180deg);}
+
+.tox[dir=rtl] .tox-collection__item-accessory{margin-right: 16px;text-align: left;}
+
+.tox[dir=rtl] .tox-collection__item-caret{margin-right: 16px;transform: rotateY(180deg);}
+
+.tox .tox-color-picker-container{display: flex;flex-direction: row;height: 225px;margin: 0;}
+
+.tox .tox-sv-palette{display: flex;height: 100%;box-sizing: border-box;}
+
+.tox .tox-sv-palette-spectrum{height: 100%;}
+
+.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width: 225px;}
+
+.tox .tox-sv-palette-thumb{position: absolute;width: 12px;height: 12px;background: 0 0;border: 1px solid #000;border-radius: 50%;box-sizing: content-box;}
+
+.tox .tox-sv-palette-inner-thumb{position: absolute;width: 10px;height: 10px;border: 1px solid #fff;border-radius: 50%;}
+
+.tox .tox-hue-slider{width: 25px;height: 100%;box-sizing: border-box;}
+
+.tox .tox-hue-slider-spectrum{width: 100%;height: 100%;background: linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);}
+
+.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width: 20px;}
+
+.tox .tox-hue-slider-thumb{width: 100%;height: 4px;background: #fff;border: 1px solid #000;box-sizing: content-box;}
+
+.tox .tox-rgb-form{display: flex;flex-direction: column;justify-content: space-between;}
+
+.tox .tox-rgb-form div{display: flex;width: inherit;margin-bottom: 5px;align-items: center;justify-content: space-between;}
+
+.tox .tox-rgb-form input{width: 6em;}
+
+.tox .tox-rgb-form input.tox-invalid{border: 1px solid red !important;}
+
+.tox .tox-rgb-form .tox-rgba-preview{margin-bottom: 0;border: 1px solid #000;flex-grow: 2;}
+
+.tox:not([dir=rtl]) .tox-sv-palette{margin-right: 15px;}
+
+.tox:not([dir=rtl]) .tox-hue-slider{margin-right: 15px;}
+
+.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left: -1px;}
+
+.tox:not([dir=rtl]) .tox-rgb-form label{margin-right: .5em;}
+
+.tox[dir=rtl] .tox-sv-palette{margin-left: 15px;}
+
+.tox[dir=rtl] .tox-hue-slider{margin-left: 15px;}
+
+.tox[dir=rtl] .tox-hue-slider-thumb{margin-right: -1px;}
+
+.tox[dir=rtl] .tox-rgb-form label{margin-left: .5em;}
+
+.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin: 2px 0 3px 4px;}
+
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{margin: -4px 0;border: 0;}
+
+.tox .tox-swatches__row{display: flex;}
+
+.tox .tox-swatch{width: 30px;height: 30px;transition: transform .15s,box-shadow .15s;}
+
+.tox .tox-swatch:focus,.tox .tox-swatch:hover{transform: scale(.8);box-shadow: 0 0 0 1px rgba(127,127,127,.3) inset;}
+
+.tox .tox-swatch--remove{align-items: center;display: flex;justify-content: center;}
+
+.tox .tox-swatch--remove svg path{stroke: #e74c3c;}
+
+.tox .tox-swatches__picker-btn{display: flex;width: 30px;height: 30px;padding: 0;cursor: pointer;background-color: transparent;border: 0;outline: 0;align-items: center;justify-content: center;}
+
+.tox .tox-swatches__picker-btn svg{width: 24px;height: 24px;}
+
+.tox .tox-swatches__picker-btn:hover{background: #dee0e2;}
+
+.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left: auto;}
+
+.tox[dir=rtl] .tox-swatches__picker-btn{margin-right: auto;}
+
+.tox .tox-comment-thread{position: relative;background: #fff;}
+
+.tox .tox-comment-thread>:not(:first-child){margin-top: 8px;}
+
+.tox .tox-comment{position: relative;padding: 8px 8px 16px 8px;background: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);}
+
+.tox .tox-comment__header{display: flex;color: #222f3e;align-items: center;justify-content: space-between;}
+
+.tox .tox-comment__date{font-size: 12px;color: rgba(34,47,62,.7);}
+
+.tox .tox-comment__body{position: relative;margin-top: 8px;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: #222f3e;text-transform: initial;}
+
+.tox .tox-comment__body textarea{width: 100%;white-space: normal;resize: none;}
+
+.tox .tox-comment__expander{padding-top: 8px;}
+
+.tox .tox-comment__expander p{font-size: 14px;font-style: normal;color: rgba(34,47,62,.7);}
+
+.tox .tox-comment__body p{margin: 0;}
+
+.tox .tox-comment__buttonspacing{padding-top: 16px;text-align: center;}
+
+.tox .tox-comment-thread__overlay::after{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;background: #fff;content: "";opacity: .9;}
+
+.tox .tox-comment__reply{display: flex;flex-shrink: 0;flex-wrap: wrap;justify-content: flex-end;margin-top: 8px;}
+
+.tox .tox-comment__reply>:first-child{width: 100%;margin-bottom: 8px;}
+
+.tox .tox-comment__edit{display: flex;flex-wrap: wrap;justify-content: flex-end;margin-top: 16px;}
+
+.tox .tox-comment__gradient::after{position: absolute;bottom: 0;display: block;width: 100%;height: 5em;margin-top: -40px;background: linear-gradient(rgba(255,255,255,0),#fff);content: "";}
+
+.tox .tox-comment__overlay{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 5;display: flex;text-align: center;background: #fff;opacity: .9;flex-direction: column;flex-grow: 1;}
+
+.tox .tox-comment__loading-text{position: relative;display: flex;color: #222f3e;align-items: center;flex-direction: column;}
+
+.tox .tox-comment__loading-text>div{padding-bottom: 16px;}
+
+.tox .tox-comment__overlaytext{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 10;padding: 1em;font-size: 14px;flex-direction: column;}
+
+.tox .tox-comment__overlaytext p{color: #222f3e;text-align: center;background-color: #fff;box-shadow: 0 0 8px 8px #fff;}
+
+.tox .tox-comment__overlaytext div:nth-of-type(2){font-size: .8em;}
+
+.tox .tox-comment__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: #fff;align-items: center;justify-content: center;}
+
+.tox .tox-comment__scroll{display: flex;flex-direction: column;flex-shrink: 1;overflow: auto;}
+
+.tox .tox-conversations{margin: 8px;}
+
+.tox:not([dir=rtl]) .tox-comment__edit{margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-comment__edit{margin-right: 8px;}
+
+.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right: 8px;}
+
+.tox .tox-user{align-items: center;display: flex;}
+
+.tox .tox-user__avatar svg{fill: rgba(34,47,62,.7);}
+
+.tox .tox-user__name{font-size: 12px;font-style: normal;font-weight: 700;color: rgba(34,47,62,.7);text-transform: uppercase;}
+
+.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right: 8px;}
+
+.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-user__avatar svg{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right: 8px;}
+
+.tox .tox-dialog-wrap{position: fixed;top: 0;right: 0;bottom: 0;left: 0;z-index: 1100;display: flex;align-items: center;justify-content: center;}
+
+.tox .tox-dialog-wrap__backdrop{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1101;background-color: rgba(255,255,255,.75);}
+
+.tox .tox-dialog{position: relative;z-index: 1102;display: flex;width: 95vw;max-width: 480px;max-height: 100%;overflow: hidden;background-color: #fff;border-color: #ccc;border-style: solid;border-width: 1px;border-radius: 3px;box-shadow: 0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);flex-direction: column;}
+
+.tox .tox-dialog__header{position: relative;display: flex;padding: 8px 16px 0 16px;margin-bottom: 16px;font-size: 16px;color: #222f3e;background-color: #fff;border-bottom: none;align-items: center;justify-content: space-between;}
+
+.tox .tox-dialog__header .tox-button{z-index: 1;}
+
+.tox .tox-dialog__draghandle{position: absolute;top: 0;left: 0;width: 100%;height: 100%;cursor: grab;}
+
+.tox .tox-dialog__draghandle:active{cursor: grabbing;}
+
+.tox .tox-dialog__dismiss{margin-left: auto;}
+
+.tox .tox-dialog__title{margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 20px;font-style: normal;font-weight: 400;line-height: 1.3;text-transform: normal;}
+
+.tox .tox-dialog__body{display: flex;min-width: 0;padding: 0 16px;font-size: 16px;font-style: normal;font-weight: 400;line-height: 1.3;color: #222f3e;text-align: left;text-transform: normal;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-nav{align-items: flex-start;display: flex;flex-direction: column;}
+
+.tox .tox-dialog__body-nav-item{display: inline-block;margin-bottom: 8px;font-size: 14px;line-height: 1.3;color: rgba(34,47,62,.7);text-decoration: none;border-bottom: 2px solid transparent;}
+
+.tox .tox-dialog__body-nav-item--active{color: #207ab7;border-bottom: 2px solid #207ab7;}
+
+.tox .tox-dialog__body-content{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;max-height: 650px;overflow: auto;}
+
+.tox .tox-dialog__body-content>*{margin-top: 16px;margin-bottom: 0;}
+
+.tox .tox-dialog__body-content>:first-child{margin-top: 0;}
+
+.tox .tox-dialog__body-content>:last-child{margin-bottom: 0;}
+
+.tox .tox-dialog__body-content>:only-child{margin-top: 0;margin-bottom: 0;}
+
+.tox .tox-dialog--width-lg{height: 650px;max-width: 1200px;}
+
+.tox .tox-dialog--width-md{max-width: 800px;}
+
+.tox .tox-dialog--width-md .tox-dialog__body-content{overflow: auto;}
+
+.tox .tox-dialog__body-content--centered{text-align: center;}
+
+.tox .tox-dialog__body-content--spacious{margin-bottom: 16px;}
+
+.tox .tox-dialog__footer{display: flex;padding: 8px 16px;margin-top: 16px;background-color: #fff;border-top: 1px solid #ccc;align-items: center;justify-content: space-between;}
+
+.tox .tox-dialog__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 1103;display: flex;background-color: rgba(255,255,255,.75);align-items: center;justify-content: center;}
+
+.tox .tox-dialog__table{width: 100%;border-collapse: collapse;}
+
+.tox .tox-dialog__table thead th{padding-bottom: 8px;font-weight: 700;}
+
+.tox .tox-dialog__table tbody tr{border-bottom: 1px solid #ccc;}
+
+.tox .tox-dialog__table tbody tr:last-child{border-bottom: none;}
+
+.tox .tox-dialog__table td{padding-top: 8px;padding-bottom: 8px;}
+
+.tox .tox-dialog__popups{position: absolute;z-index: 1100;width: 100%;}
+
+.tox .tox-dialog__body-iframe{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-iframe .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;}
+
+body.tox-dialog__disable-scroll{overflow: hidden;}
+
+.tox.tox-platform-ie .tox-dialog-wrap{position: -ms-device-fixed;}
+
+.tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right: 32px;}
+
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left: 8px;}
+
+.tox[dir=rtl] .tox-dialog__body{text-align: right;}
+
+.tox[dir=rtl] .tox-dialog__body-nav{margin-left: 32px;}
+
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right: 8px;}
+
+.tox .tox-dropzone-container{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dropzone{display: flex;min-height: 100px;padding: 10px;background: #fff;border: 2px dashed #ccc;box-sizing: border-box;align-items: center;flex-direction: column;flex-grow: 1;justify-content: center;}
+
+.tox .tox-dropzone p{margin: 0 0 16px 0;color: rgba(34,47,62,.7);}
+
+.tox .tox-edit-area{position: relative;display: flex;overflow: hidden;border-top: 1px solid #ccc;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-edit-area__iframe{position: absolute;width: 100%;height: 100%;background-color: #fff;border: 0;box-sizing: border-box;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox.tox-inline-edit-area{border: 1px dotted #ccc;}
+
+.tox .tox-control-wrap{flex: 1;position: relative;}
+
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display: none;}
+
+.tox .tox-control-wrap svg{display: block;}
+
+.tox .tox-control-wrap__status-icon-wrap{position: absolute;top: 50%;transform: translateY(-50%);}
+
+.tox .tox-control-wrap__status-icon-invalid svg{fill: #c00;}
+
+.tox .tox-control-wrap__status-icon-unknown svg{fill: orange;}
+
+.tox .tox-control-wrap__status-icon-valid svg{fill: green;}
+
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right: 32px;}
+
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right: 4px;}
+
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left: 32px;}
+
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left: 4px;}
+
+.tox .tox-autocompleter{max-width: 25em;}
+
+.tox .tox-autocompleter .tox-menu{max-width: 25em;}
+
+.tox .tox-color-input{display: flex;}
+
+.tox .tox-color-input .tox-textfield{display: flex;border-radius: 3px 0 0 3px;}
+
+.tox .tox-color-input span{display: flex;width: 35px;cursor: pointer;border-color: rgba(34,47,62,.2);border-style: solid;border-width: 1px 1px 1px 0;border-radius: 0 3px 3px 0;box-shadow: none;box-sizing: border-box;}
+
+.tox .tox-color-input span:focus{border-color: #207ab7;}
+
+.tox[dir=rtl] .tox-color-input .tox-textfield{border-radius: 0 3px 3px 0;}
+
+.tox[dir=rtl] .tox-color-input span{border-width: 1px 0 1px 1px;border-radius: 3px 0 0 3px;}
+
+.tox .tox-label,.tox .tox-toolbar-label{display: block;padding: 0 8px 0 0;font-size: 14px;font-style: normal;font-weight: 400;line-height: 1.3;color: rgba(34,47,62,.7);text-transform: normal;white-space: nowrap;}
+
+.tox .tox-toolbar-label{padding: 0 8px;}
+
+.tox[dir=rtl] .tox-label{padding: 0 0 0 8px;}
+
+.tox .tox-form{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group{margin-bottom: 4px;box-sizing: border-box;}
+
+.tox .tox-form__group--error{color: #c00;}
+
+.tox .tox-form__group--collection{display: flex;}
+
+.tox .tox-form__grid{display: flex;flex-direction: row;flex-wrap: wrap;justify-content: space-between;}
+
+.tox .tox-form__grid--2col>.tox-form__group{width: calc(50% - (8px / 2));}
+
+.tox .tox-form__grid--3col>.tox-form__group{width: calc(100% / 3 - (8px / 2));}
+
+.tox .tox-form__grid--4col>.tox-form__group{width: calc(25% - (8px / 2));}
+
+.tox .tox-form__controls-h-stack{align-items: center;display: flex;}
+
+.tox .tox-form__group--inline{align-items: center;display: flex;}
+
+.tox .tox-form__group--stretched{display: flex;flex: 1;flex-direction: column;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-textarea{flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-navobj{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex: 1;-ms-flex-preferred-size: auto;height: 100%;}
+
+.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left: 4px;}
+
+.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right: 4px;}
+
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display: none;}
+
+.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield,.tox:not([dir=rtl]) .tox-selectfield select,.tox[dir=rtl] .tox-selectfield select{width: 100%;padding: 5px 4.75px;margin: 0;font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size: 16px;line-height: 24px;color: #222f3e;background-color: #fff;border-color: #ccc;border-style: solid;border-width: 1px;border-radius: 3px;outline: 0;box-shadow: none;box- [...]
+
+.tox .tox-selectfield select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{border-color: #207ab7;outline: 0;box-shadow: none;}
+
+.tox .tox-toolbar-textfield{max-width: 250px;margin-top: 2px;margin-bottom: 3px;border-width: 0;}
+
+.tox .tox-naked-btn{display: block;padding: 0;margin: 0;color: #207ab7;cursor: pointer;background-color: transparent;border: 0;border-color: transparent;box-shadow: unset;}
+
+.tox .tox-naked-btn svg{display: block;fill: #222f3e;}
+
+.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right: 4px;}
+
+.tox .tox-selectfield{position: relative;cursor: pointer;}
+
+.tox .tox-selectfield select::-ms-expand{display: none;}
+
+.tox .tox-selectfield svg{position: absolute;top: 50%;pointer-events: none;transform: translateY(-50%);}
+
+.tox:not([dir=rtl]) .tox-selectfield select{padding-right: 24px;}
+
+.tox:not([dir=rtl]) .tox-selectfield svg{right: 8px;}
+
+.tox[dir=rtl] .tox-selectfield select{padding-left: 24px;}
+
+.tox[dir=rtl] .tox-selectfield svg{left: 8px;}
+
+.tox .tox-textarea{white-space: pre-wrap;-webkit-appearance: textarea;-moz-appearance: textarea;appearance: textarea;}
+
+.tox-fullscreen{position: fixed;top: 0;left: 0;width: 100%;height: 100%;padding: 0;margin: 0;overflow: hidden;border: 0;}
+
+.tox-fullscreen .tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display: none;}
+
+.tox-fullscreen .tox.tox-tinymce.tox-fullscreen{z-index: 1200;}
+
+.tox-fullscreen .tox.tox-tinymce-aux{z-index: 1201;}
+
+.tox .tox-image-tools{width: 100%;}
+
+.tox .tox-image-tools__toolbar{align-items: center;display: flex;justify-content: center;}
+
+.tox .tox-image-tools__image{position: relative;width: 100%;height: 380px;overflow: auto;background-color: #666;}
+
+.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top: 8px;}
+
+.tox .tox-image-tools__image-bg{background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);}
+
+.tox .tox-image-tools__toolbar>.tox-spacer{flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-croprect-block{position: absolute;background: #000;opacity: .5;zoom: 1;}
+
+.tox .tox-croprect-handle{position: absolute;top: 0;left: 0;width: 20px;height: 20px;border: 2px solid #fff;}
+
+.tox .tox-croprect-handle-move{position: absolute;cursor: move;border: 0;}
+
+.tox .tox-croprect-handle-nw{top: 100px;left: 100px;margin: -2px 0 0 -2px;cursor: nw-resize;border-width: 2px 0 0 2px;}
+
+.tox .tox-croprect-handle-ne{top: 100px;left: 200px;margin: -2px 0 0 -20px;cursor: ne-resize;border-width: 2px 2px 0 0;}
+
+.tox .tox-croprect-handle-sw{top: 200px;left: 100px;margin: -20px 2px 0 -2px;cursor: sw-resize;border-width: 0 0 2px 2px;}
+
+.tox .tox-croprect-handle-se{top: 200px;left: 200px;margin: -20px 0 0 -20px;cursor: se-resize;border-width: 0 2px 2px 0;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left: 8px;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left: 32px;}
+
+.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left: 32px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right: 8px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right: 32px;}
+
+.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right: 32px;}
+
+.tox .tox-insert-table-picker{display: flex;flex-wrap: wrap;width: 169px;}
+
+.tox .tox-insert-table-picker>div{width: 16px;height: 16px;border-color: #ccc;border-style: solid;border-width: 0 1px 1px 0;box-sizing: content-box;}
+
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin: -4px 0;}
+
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color: rgba(32,122,183,.5);border-color: rgba(32,122,183,.5);}
+
+.tox .tox-insert-table-picker__label{display: block;width: 100%;padding: 4px;font-size: 14px;color: rgba(34,47,62,.7);text-align: center;}
+
+.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right: 0;}
+
+.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right: 0;}
+
+.tox .tox-menu{z-index: 1;display: inline-block;overflow: hidden;vertical-align: top;background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 4px 8px 0 rgba(34,47,62,.1);}
+
+.tox .tox-menu.tox-collection.tox-collection--list{padding: 0;}
+
+.tox .tox-menu.tox-collection.tox-collection--toolbar{padding: 4px;}
+
+.tox .tox-menu.tox-collection.tox-collection--grid{padding: 4px;}
+
+.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin: 0;}
+
+.tox .tox-menubar{display: flex;padding: 0 4px;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color: #fff;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;}
+
+.tox .tox-mbtn{display: flex;width: auto;height: 34px;padding: 0 4px;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #222f3e;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;}
+
+.tox .tox-mbtn[disabled]{color: rgba(34,47,62,.5);cursor: not-allowed;background-color: none;border-color: none;box-shadow: none;}
+
+.tox .tox-mbtn:hover:not(:disabled){color: #222f3e;background: #dee0e2;box-shadow: none;}
+
+.tox .tox-mbtn:focus:not(:disabled){color: #222f3e;background: #dee0e2;box-shadow: none;}
+
+.tox .tox-mbtn--active{color: #222f3e;background: #c8cbcf;box-shadow: none;}
+
+.tox .tox-mbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;}
+
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor: not-allowed;}
+
+.tox .tox-mbtn__select-chevron{display: flex;display: none;width: 16px;align-items: center;justify-content: center;}
+
+.tox .tox-notification{display: grid;padding: 5px;margin-top: 5px;background-color: #fffaea;border-color: #ffe89d;border-style: solid;border-width: 1px;opacity: 0;box-sizing: border-box;transition: transform .1s ease-in,opacity 150ms ease-in;grid-template-columns: minmax(40px,1fr) auto minmax(40px,1fr);}
+
+.tox .tox-notification--in{opacity: 1;}
+
+.tox .tox-notification--success{background-color: #dff0d8;border-color: #d6e9c6;}
+
+.tox .tox-notification--error{background-color: #f2dede;border-color: #ebccd1;}
+
+.tox .tox-notification--warn{background-color: #fcf8e3;border-color: #faebcc;}
+
+.tox .tox-notification--info{background-color: #d9edf7;border-color: #779ecb;}
+
+.tox .tox-notification__body{font-size: 14px;color: #222f3e;text-align: center;word-break: break-all;word-break: break-word;white-space: normal;align-self: center;grid-column-end: 3;-ms-grid-column-span: 1;grid-column-start: 2;grid-row-end: 2;grid-row-start: 1;}
+
+.tox .tox-notification__body>*{margin: 0;}
+
+.tox .tox-notification__body>*+*{margin-top: 1rem;}
+
+.tox .tox-notification__icon{align-self: center;-ms-grid-column-align: end;grid-column-end: 2;-ms-grid-column-span: 1;grid-column-start: 1;grid-row-end: 2;grid-row-start: 1;justify-self: end;}
+
+.tox .tox-notification__icon svg{display: block;}
+
+.tox .tox-notification__dismiss{align-self: start;-ms-grid-column-align: end;grid-column-end: 4;-ms-grid-column-span: 1;grid-column-start: 3;grid-row-end: 2;grid-row-start: 1;justify-self: end;}
+
+.tox .tox-notification .tox-progress-bar{-ms-grid-column-align: center;grid-column-end: 4;-ms-grid-column-span: 3;grid-column-start: 1;grid-row-end: 3;-ms-grid-row-span: 1;grid-row-start: 2;justify-self: center;}
+
+.tox .tox-pop{position: relative;display: inline-block;}
+
+.tox .tox-pop--resizing{transition: width .1s ease;}
+
+.tox .tox-pop--resizing .tox-toolbar{flex-wrap: nowrap;}
+
+.tox .tox-pop__dialog{min-width: 0;overflow: hidden;background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);}
+
+.tox .tox-pop__dialog>:not(.tox-toolbar){margin: 4px 4px 4px 8px;}
+
+.tox .tox-pop__dialog .tox-toolbar{background-color: transparent;}
+
+.tox .tox-pop::after,.tox .tox-pop::before{position: absolute;display: block;width: 0;height: 0;border-style: solid;content: '';}
+
+.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{top: 100%;left: 50%;}
+
+.tox .tox-pop.tox-pop--bottom::after{margin-top: -1px;margin-left: -8px;border-color: #fff transparent transparent transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--bottom::before{margin-left: -9px;border-color: #ccc transparent transparent transparent;border-width: 9px;}
+
+.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{top: 0;left: 50%;transform: translateY(-100%);}
+
+.tox .tox-pop.tox-pop--top::after{margin-top: 1px;margin-left: -8px;border-color: transparent transparent #fff transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--top::before{margin-left: -9px;border-color: transparent transparent #ccc transparent;border-width: 9px;}
+
+.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{top: calc(50% - 1px);left: 0;transform: translateY(-50%);}
+
+.tox .tox-pop.tox-pop--left::after{margin-left: -15px;border-color: transparent #fff transparent transparent;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--left::before{margin-left: -19px;border-color: transparent #ccc transparent transparent;border-width: 10px;}
+
+.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{top: calc(50% + 1px);left: 100%;transform: translateY(-50%);}
+
+.tox .tox-pop.tox-pop--right::after{margin-left: -1px;border-color: transparent transparent transparent #fff;border-width: 8px;}
+
+.tox .tox-pop.tox-pop--right::before{margin-left: -1px;border-color: transparent transparent transparent #ccc;border-width: 10px;}
+
+.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left: 20px;}
+
+.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left: calc(100% - 20px);}
+
+.tox .tox-sidebar-wrap{display: flex;flex-direction: row;flex-grow: 1;min-height: 0;}
+
+.tox .tox-sidebar{display: flex;flex-direction: row;justify-content: flex-end;}
+
+.tox .tox-sidebar__slider{display: flex;overflow: hidden;}
+
+.tox .tox-sidebar__pane-container{display: flex;}
+
+.tox .tox-sidebar__pane{display: flex;}
+
+.tox .tox-sidebar--sliding-closed{opacity: 0;}
+
+.tox .tox-sidebar--sliding-open{opacity: 1;}
+
+.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition: width .5s ease,opacity .5s ease;}
+
+.tox .tox-slider{position: relative;display: flex;height: 24px;align-items: center;flex: 1;-ms-flex-preferred-size: auto;justify-content: center;}
+
+.tox .tox-slider__rail{width: 100%;height: 10px;min-width: 120px;background-color: transparent;border: 1px solid #ccc;border-radius: 3px;}
+
+.tox .tox-slider__handle{position: absolute;top: 50%;left: 50%;width: 14px;height: 24px;background-color: #207ab7;border: 2px solid #185d8c;border-radius: 3px;transform: translateX(-50%) translateY(-50%);box-shadow: none;}
+
+.tox .tox-source-code{overflow: auto;}
+
+.tox .tox-spinner{display: flex;}
+
+.tox .tox-spinner>div{width: 8px;height: 8px;background-color: rgba(34,47,62,.7);border-radius: 100%;animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;}
+
+.tox .tox-spinner>div:nth-child(1){animation-delay: -.32s;}
+
+.tox .tox-spinner>div:nth-child(2){animation-delay: -.16s;}@keyframes tam-bouncing-dots{0%,100%,80%{transform: scale(0);}
+
+40%{transform: scale(1);}}
+
+.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left: 4px;}
+
+.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right: 4px;}
+
+.tox .tox-statusbar{position: relative;display: flex;height: 18px;padding: 0 8px;overflow: hidden;font-size: 12px;color: rgba(34,47,62,.7);text-transform: uppercase;background-color: #fff;border-top: 1px solid #ccc;align-items: center;flex: 0 0 auto;}
+
+.tox .tox-statusbar a{color: rgba(34,47,62,.7);text-decoration: none;}
+
+.tox .tox-statusbar a:hover{text-decoration: underline;}
+
+.tox .tox-statusbar__text-container{display: flex;flex: 1 1 auto;justify-content: flex-end;overflow: hidden;}
+
+.tox .tox-statusbar__path{display: flex;flex: 1 1 auto;margin-right: auto;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
+
+.tox .tox-statusbar__path>*{display: inline;white-space: nowrap;}
+
+.tox .tox-statusbar__wordcount{flex: 0 0 auto;margin-left: 1ch;}
+
+.tox .tox-statusbar__resize-handle{display: flex;padding-left: 1ch;margin-right: -8px;margin-left: auto;cursor: nwse-resize;align-items: flex-end;align-self: stretch;flex: 0 0 auto;justify-content: flex-end;}
+
+.tox .tox-statusbar__resize-handle svg{display: block;fill: rgba(34,47,62,.7);}
+
+.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right: 4px;}
+
+.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left: 1ch;}
+
+.tox[dir=rtl] .tox-statusbar{flex-direction: row-reverse;}
+
+.tox[dir=rtl] .tox-statusbar__path>*{margin-left: 4px;}
+
+.tox .tox-throbber{z-index: 1400;}
+
+.tox .tox-throbber__busy-spinner{position: absolute;top: 0;right: 0;bottom: 0;left: 0;display: flex;background-color: rgba(255,255,255,.6);align-items: center;justify-content: center;}
+
+.tox .tox-tbtn{display: flex;width: 34px;height: 34px;padding: 0;margin: 2px 0 3px 0;overflow: hidden;font-size: 14px;font-style: normal;font-weight: 400;color: #222f3e;text-transform: normal;background: 0 0;border: 0;border-radius: 3px;outline: 0;box-shadow: none;align-items: center;flex: 0 0 auto;justify-content: center;}
+
+.tox .tox-tbtn svg{display: block;fill: #222f3e;}
+
+.tox .tox-tbtn.tox-tbtn-more{width: inherit;padding-right: 5px;padding-left: 5px;}
+
+.tox .tox-tbtn--enabled{color: #222f3e;background: #c8cbcf;box-shadow: none;}
+
+.tox .tox-tbtn--enabled>*{transform: none;}
+
+.tox .tox-tbtn--enabled svg{fill: #222f3e;}
+
+.tox .tox-tbtn:hover{color: #222f3e;background: #dee0e2;box-shadow: none;}
+
+.tox .tox-tbtn:hover svg{fill: #222f3e;}
+
+.tox .tox-tbtn:focus{color: #222f3e;background: #dee0e2;box-shadow: none;}
+
+.tox .tox-tbtn:focus svg{fill: #222f3e;}
+
+.tox .tox-tbtn:active{color: #222f3e;background: #c8cbcf;box-shadow: none;}
+
+.tox .tox-tbtn:active svg{fill: #222f3e;}
+
+.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{color: rgba(34,47,62,.5);cursor: not-allowed;background: 0 0;box-shadow: none;}
+
+.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill: rgba(34,47,62,.5);}
+
+.tox .tox-tbtn:active>*{transform: none;}
+
+.tox .tox-tbtn--md{width: 51px;height: 51px;}
+
+.tox .tox-tbtn--lg{width: 68px;height: 68px;flex-direction: column;}
+
+.tox .tox-tbtn--return{width: 16px;height: unset;align-self: stretch;}
+
+.tox .tox-tbtn--labeled{width: unset;padding: 0 4px;}
+
+.tox .tox-tbtn__vlabel{display: block;margin-bottom: 4px;font-size: 10px;font-weight: 400;letter-spacing: -.025em;white-space: nowrap;}
+
+.tox .tox-tbtn--select{width: auto;padding: 0 4px;margin: 2px 0 3px 0;}
+
+.tox .tox-tbtn__select-label{margin: 0 4px;font-weight: 400;cursor: default;}
+
+.tox .tox-tbtn__select-chevron{align-items: center;display: flex;justify-content: center;width: 16px;}
+
+.tox .tox-tbtn__select-chevron svg{fill: rgba(34,47,62,.7);}
+
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label{width: 7em;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
+
+.tox .tox-split-button{display: flex;margin: 2px 0 3px 0;overflow: hidden;border: 0;border-radius: 3px;box-sizing: border-box;}
+
+.tox .tox-split-button:hover{box-shadow: 0 0 0 1px #dee0e2 inset;}
+
+.tox .tox-split-button:focus{color: #222f3e;background: #dee0e2;box-shadow: none;}
+
+.tox .tox-split-button>*{border-radius: 0;}
+
+.tox .tox-split-button__chevron{width: 16px;}
+
+.tox .tox-split-button__chevron svg{fill: rgba(34,47,62,.7);}
+
+.tox .tox-pop .tox-split-button__chevron svg{transform: rotate(-90deg);}
+
+.tox .tox-split-button .tox-tbtn{margin: 0;}
+
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{color: rgba(34,47,62,.5);background: 0 0;box-shadow: none;}
+
+.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{display: flex;padding: 0 0;margin-bottom: -1px;background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color: #fff;border-top: 1px solid #ccc;flex: 0 0 auto;flex-shrink: 0;flex-wrap: wrap;}
+
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height: 0;opacity: 0;visibility: hidden;}
+
+.tox .tox-toolbar__overflow--growing{transition: height .3s ease,opacity .2s linear .1s;}
+
+.tox .tox-toolbar__overflow--shrinking{transition: opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s;}
+
+.tox .tox-pop .tox-toolbar{border-width: 0;}
+
+.tox .tox-toolbar--no-divider{background-image: none;}
+
+.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color: #fff;border: 1px solid #ccc;border-radius: 3px;box-shadow: 0 1px 3px rgba(0,0,0,.15);}
+
+.tox.tox-tinymce-aux:not([dir=rtl]) .tox-toolbar__overflow{margin-left: 4px;}
+
+.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform: rotateY(180deg);}
+
+.tox[dir=rtl].tox-tinymce-aux .tox-toolbar__overflow{margin-right: 4px;}
+
+.tox .tox-toolbar__group{display: flex;padding: 0 4px;margin: 0 0;align-items: center;flex-wrap: wrap;}
+
+.tox .tox-toolbar__group--pull-right{margin-left: auto;}
+
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right: 1px solid #ccc;}
+
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left: 1px solid #ccc;}
+
+.tox .tox-tooltip{position: relative;display: inline-block;padding: 8px;}
+
+.tox .tox-tooltip__body{padding: 4px 8px;font-size: 14px;font-style: normal;font-weight: 400;color: rgba(255,255,255,.75);text-transform: normal;background-color: #222f3e;border-radius: 3px;box-shadow: 0 2px 4px rgba(34,47,62,.3);}
+
+.tox .tox-tooltip__arrow{position: absolute;}
+
+.tox .tox-tooltip--down .tox-tooltip__arrow{position: absolute;bottom: 0;left: 50%;border-top: 8px solid #222f3e;border-right: 8px solid transparent;border-left: 8px solid transparent;transform: translateX(-50%);}
+
+.tox .tox-tooltip--up .tox-tooltip__arrow{position: absolute;top: 0;left: 50%;border-right: 8px solid transparent;border-bottom: 8px solid #222f3e;border-left: 8px solid transparent;transform: translateX(-50%);}
+
+.tox .tox-tooltip--right .tox-tooltip__arrow{position: absolute;top: 50%;right: 0;border-top: 8px solid transparent;border-bottom: 8px solid transparent;border-left: 8px solid #222f3e;transform: translateY(-50%);}
+
+.tox .tox-tooltip--left .tox-tooltip__arrow{position: absolute;top: 50%;left: 0;border-top: 8px solid transparent;border-right: 8px solid #222f3e;border-bottom: 8px solid transparent;transform: translateY(-50%);}
+
+.tox .tox-well{width: 100%;padding: 8px;border: 1px solid #ccc;border-radius: 3px;}
+
+.tox .tox-well>:first-child{margin-top: 0;}
+
+.tox .tox-well>:last-child{margin-bottom: 0;}
+
+.tox .tox-well>:only-child{margin: 0;}
+
+.tox .tox-custom-editor{display: flex;height: 525px;border: 1px solid #ccc;border-radius: 3px;}
+
+.tox .tox-dialog-loading::before{position: absolute;z-index: 1000;width: 100%;height: 100%;background-color: rgba(0,0,0,.5);content: "";}
+
+.tox .tox-tab{cursor: pointer;}
+
+.tox .tox-dialog__content-js{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox .tox-dialog__body-content .tox-collection{display: flex;flex: 1;-ms-flex-preferred-size: auto;}
+
+.tox ul{display: block;list-style-type: disc;-webkit-margin-before: 1em;margin-block-start: 1em;-webkit-margin-after: 1em;margin-block-end: 1em;-webkit-margin-start: 0;margin-inline-start: 0;-webkit-margin-end: 0;margin-inline-end: 0;-webkit-padding-start: 40px;padding-inline-start: 40px;}
+
+.tox a{color: #2276d2;cursor: pointer;}
+
+.tox .tox-image-tools-edit-panel{height: 60px;}
+
+.tox .tox-image-tools__sidebar{height: 60px;}
diff --git a/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css
new file mode 100644
index 000000000..14847d0a2
--- /dev/null
+++ b/streampark-console/streampark-console-newui/public/resource/tinymce/skins/ui/oxide/skin.mobile.min.css
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all: initial;display: block;}
+
+.tinymce-mobile-outer-container *{float: none;padding: 0;margin: 0;line-height: 1;text-shadow: none;white-space: nowrap;cursor: inherit;border: 0;outline: 0;box-sizing: initial;-webkit-tap-highlight-color: transparent;}
+
+.tinymce-mobile-icon-arrow-back::before{content: "\e5cd";}
+
+.tinymce-mobile-icon-image::before{content: "\e412";}
+
+.tinymce-mobile-icon-cancel-circle::before{content: "\e5c9";}
+
+.tinymce-mobile-icon-full-dot::before{content: "\e061";}
+
+.tinymce-mobile-icon-align-center::before{content: "\e234";}
+
+.tinymce-mobile-icon-align-left::before{content: "\e236";}
+
+.tinymce-mobile-icon-align-right::before{content: "\e237";}
+
+.tinymce-mobile-icon-bold::before{content: "\e238";}
+
+.tinymce-mobile-icon-italic::before{content: "\e23f";}
+
+.tinymce-mobile-icon-unordered-list::before{content: "\e241";}
+
+.tinymce-mobile-icon-ordered-list::before{content: "\e242";}
+
+.tinymce-mobile-icon-font-size::before{content: "\e245";}
+
+.tinymce-mobile-icon-underline::before{content: "\e249";}
+
+.tinymce-mobile-icon-link::before{content: "\e157";}
+
+.tinymce-mobile-icon-unlink::before{content: "\eca2";}
+
+.tinymce-mobile-icon-color::before{content: "\e891";}
+
+.tinymce-mobile-icon-previous::before{content: "\e314";}
+
+.tinymce-mobile-icon-next::before{content: "\e315";}
+
+.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content: "\e264";}
+
+.tinymce-mobile-icon-undo::before{content: "\e166";}
+
+.tinymce-mobile-icon-redo::before{content: "\e15a";}
+
+.tinymce-mobile-icon-removeformat::before{content: "\e239";}
+
+.tinymce-mobile-icon-small-font::before{content: "\e906";}
+
+.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content: "\e5ca";}
+
+.tinymce-mobile-icon-small-heading::before{content: "small";}
+
+.tinymce-mobile-icon-large-heading::before{content: "large";}
+
+.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family: sans-serif;font-size: 80%;}
+
+.tinymce-mobile-mask-edit-icon::before{content: "\e254";}
+
+.tinymce-mobile-icon-back::before{content: "\e5c4";}
+
+.tinymce-mobile-icon-heading::before{font-family: sans-serif;font-size: 80%;font-weight: 700;content: "Headings";}
+
+.tinymce-mobile-icon-h1::before{font-weight: 700;content: "H1";}
+
+.tinymce-mobile-icon-h2::before{font-weight: 700;content: "H2";}
+
+.tinymce-mobile-icon-h3::before{font-weight: 700;content: "H3";}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{position: absolute;top: 0;display: flex;width: 100%;height: 100%;background: rgba(51,51,51,.5);align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{display: flex;font-family: sans-serif;font-size: 1em;border-radius: 50%;align-items: center;flex-direction: column;justify-content: space-between;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{display: flex;width: 2.1em;height: 2.1em;border-radius: 50%;align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items: center;display: flex;justify-content: center;flex-direction: column;font-size: 1em;}@media only screen and (min-device-width: 700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size: 1.2em;}}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{display: flex;width: 2.1em;height: 2.1em;color: #207ab7;background-color: #fff;border-radius: 50%;align-items: center;justify-content: center;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{font-family: tinymce-mobile,sans-serif;content: "\e900";}
+
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index: 2;}
+
+.tinymce-mobile-android-container.tinymce-mobile-android-maximized{position: fixed;top: 0;right: 0;bottom: 0;left: 0;display: flex;background: #fff;border: none;flex-direction: column;}
+
+.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position: relative;}
+
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display: flex;flex-grow: 1;}
+
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display: flex !important;flex-grow: 1;height: auto !important;}
+
+.tinymce-mobile-android-scroll-reload{overflow: hidden;}
+
+:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top: 23px;}
+
+.tinymce-mobile-toolstrip{z-index: 1;display: flex;background: #fff;flex: 0 0 auto;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{display: flex;width: 100%;height: 2.5em;background-color: #fff;border-bottom: 1px solid #ccc;align-items: center;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items: center;display: flex;height: 100%;flex-shrink: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background: #f44336;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-right: .5em;padding-left: .5em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{display: flex;height: 80%;margin-right: 2px;margin-left: 2px;align-items: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{color: #ccc;background: #c8cbcf;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{color: #eceff1;background: #207ab7;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{display: flex;height: 100%;padding-top: .4em;padding-bottom: .4em;align-items: center;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{position: relative;display: flex;width: 100%;min-height: 1.5em;padding-right: 0;padding-left: 0;overflow: hidden;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display: flex;width: 100%;height: 100%;transition: left cubic-bezier(.4,0,1,1) .15s;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display: flex;flex: 0 0 auto;justify-content: space-between;width: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family: sans-serif;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{position: relative;display: flex;flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{position: absolute;right: 0;height: 100%;padding-right: 2px;font-size: .6em;font-weight: 700;color: #888;background: inherit;border: none;border-radius: 50%;align-self: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display: none;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobil [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinym [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tin [...]
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{padding-top: 3px;margin: 0 2px;font-size: 10px;line-height: 10px;color: #ccc;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color: #c8cbcf;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-right: .9em;margin-left: .5em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-right: .5em;margin-left: .9em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{position: relative;display: flex;padding: .28em 0;margin-right: 0;margin-left: 0;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items: center;display: flex;flex-grow: 1;height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #ccc;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-right: 2em;padding-left: 2em;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items: center;display: flex;flex-grow: 1;height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{display: flex;height: .2em;margin-top: .3em;margin-bottom: .3em;background: linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #000;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{width: 1.2em;height: .2em;margin-top: .3em;margin-bottom: .3em;background: #fff;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{position: absolute;top: 0;bottom: 0;left: -10px;display: flex;width: .5em;height: .5em;margin: auto;color: #fff;background-color: #455a64;border: .5em solid rgba(136,136,136,0);border-radius: 3em;transition: border 120ms cubic-bezier(.39,.58,.57,1);background-clip: padding-box;align-items: center;justify-content: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border: .5em solid rgba(136,136,136,.39);}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items: center;display: flex;height: 100%;flex: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction: column;justify-content: center;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items: center;display: flex;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height: 100%;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display: flex;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{padding-top: .1em;padding-bottom: .1em;padding-left: 5px;font-size: .85em;color: #455a64;background: #fff;border: none;border-radius: 0;flex-grow: 1;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color: #888;}
+
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color: #888;}
+
+.tinymce-mobile-dropup{display: flex;width: 100%;overflow: hidden;background: #fff;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition: height .3s ease-out;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition: height .3s ease-in;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow: 0;}
+
+.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow: 1;}
+
+.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}@media only screen and (orientation: landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 200px;}}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height: 150px;}}
+
+.tinymce-mobile-styles-menu{position: relative;width: 100%;overflow: hidden;font-family: sans-serif;outline: 4px solid #000;}
+
+.tinymce-mobile-styles-menu [role=menu]{position: absolute;display: flex;width: 100%;height: 100%;flex-direction: column;}
+
+.tinymce-mobile-styles-menu [role=menu].transitioning{transition: transform .5s ease-in-out;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{position: relative;display: flex;padding: 1em 1em;color: #455a64;cursor: pointer;border-bottom: 1px solid #ddd;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e314";}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;color: #455a64;content: "\e315";}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{position: absolute;right: 0;padding-right: 1em;padding-left: 1em;font-family: tinymce-mobile,sans-serif;}
+
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{display: flex;min-height: 2.5em;padding-right: 1em;padding-left: 1em;color: #455a64;background: #fff;border-top: #455a64;align-items: center;}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform: translate(-100%);}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform: translate(0);}
+
+.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform: translate(100%);}@font-face{font-family: tinymce-mobile;font-style: normal;font-weight: 400;src: url(fonts/tinymce-mobile.woff?8x92w3) format('woff');}@media (min-device-width: 700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size: 25px;}}@media (max-device-width: 700px){.tinymce-mobile-outer- [...]
+
+.tinymce-mobile-icon{font-family: tinymce-mobile,sans-serif;}
+
+.mixin-flex-and-centre{align-items: center;display: flex;justify-content: center;}
+
+.mixin-flex-bar{align-items: center;display: flex;height: 100%;}
+
+.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{width: 100%;background-color: #fff;}
+
+.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{position: fixed;right: 2em;bottom: 1em;display: flex;width: 2.1em;height: 2.1em;font-size: 1em;color: #fff;background-color: #207ab7;border-radius: 50%;align-items: center;justify-content: center;}@media only screen and (min-device-width: 700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size: 1.2em;}}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height: 300px;overflow: hidden;}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height: 100%;}
+
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display: none;}
+
+input[type=file]::-webkit-file-upload-button{display: none;}@media only screen and (min-device-width: 320px) and (max-device-width: 568px) and (orientation: landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom: 50%;}}
diff --git a/streampark-console/streampark-console-newui/src/App.vue b/streampark-console/streampark-console-newui/src/App.vue
new file mode 100644
index 000000000..f4fab182c
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/App.vue
@@ -0,0 +1,21 @@
+<template>
+ <ConfigProvider :locale="getAntdLocale">
+ <AppProvider>
+ <RouterView />
+ </AppProvider>
+ </ConfigProvider>
+</template>
+
+<script lang="ts" setup>
+ import { ConfigProvider } from 'ant-design-vue';
+ import { AppProvider } from '/@/components/Application';
+ import { useTitle } from '/@/hooks/web/useTitle';
+ import { useLocale } from '/@/locales/useLocale';
+
+ import 'dayjs/locale/zh-cn';
+ // support Multi-language
+ const { getAntdLocale } = useLocale();
+
+ // Listening to page changes and dynamically changing site titles
+ useTitle();
+</script>
diff --git a/streampark-console/streampark-console-newui/src/adapter/api/baseUrl.ts b/streampark-console/streampark-console-newui/src/adapter/api/baseUrl.ts
new file mode 100644
index 000000000..10e71c5ca
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/api/baseUrl.ts
@@ -0,0 +1,9 @@
+export function baseUrl() {
+ if (import.meta.env.VITE_APP_ENV) {
+ return `${location.protocol}//${location.host}`;
+ }
+
+ const baseApi = import.meta.env.VITE_APP_BASE_API;
+
+ return baseApi ? baseApi : '';
+}
diff --git a/streampark-console/streampark-console-newui/src/adapter/api/index.ts b/streampark-console/streampark-console-newui/src/adapter/api/index.ts
new file mode 100644
index 000000000..7dc99de7c
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/api/index.ts
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2019 The StreamX Project
+ * <p>
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export default {
+ Passport: {
+ SIGN_IN: '/passport/signin',
+ SIGN_OUT: '/passport/signout',
+ },
+ Project: {
+ BRANCHES: '/flink/project/branches',
+ GIT_CHECK: '/flink/project/gitcheck',
+ EXISTS: '/flink/project/exists',
+ CREATE: '/flink/project/create',
+ GET: '/flink/project/get',
+ UPDATE: '/flink/project/update',
+ BUILD: '/flink/project/build',
+ BUILD_LOG: '/flink/project/buildlog',
+ CLOSE_BUILD: '/flink/project/closebuild',
+ LIST: '/flink/project/list',
+ FILE_LIST: '/flink/project/filelist',
+ MODULES: '/flink/project/modules',
+ LIST_CONF: '/flink/project/listconf',
+ JARS: '/flink/project/jars',
+ DELETE: '/flink/project/delete',
+ SELECT: '/flink/project/select',
+ },
+ Tutorial: {
+ GET: '/tutorial/get',
+ },
+ NoteBook: {
+ SUBMIT: '/flink/notebook/submit',
+ },
+ Metrics: {
+ FLAME_GRAPH: '/metrics/flamegraph',
+ NOTICE: '/metrics/notice',
+ DEL_NOTICE: '/metrics/delnotice',
+ },
+ SavePoint: {
+ LATEST: '/flink/savepoint/latest',
+ HISTORY: '/flink/savepoint/history',
+ DELETE: '/flink/savepoint/delete',
+ },
+ Application: {
+ READ_CONF: '/flink/app/readConf',
+ UPDATE: '/flink/app/update',
+ UPLOAD: '/flink/app/upload',
+ DEPLOY: '/flink/app/deploy',
+ MAPPING: '/flink/app/mapping',
+ YARN: '/flink/app/yarn',
+ LIST: '/flink/app/list',
+ GET: '/flink/app/get',
+ DASHBOARD: '/flink/app/dashboard',
+ MAIN: '/flink/app/main',
+ NAME: '/flink/app/name',
+ CHECK_NAME: '/flink/app/checkName',
+ CANCEL: '/flink/app/cancel',
+ FORCED_STOP: '/flink/app/forcedStop',
+ DELETE: '/flink/app/delete',
+ DELETE_BAK: '/flink/app/deletebak',
+ CREATE: '/flink/app/create',
+ START: '/flink/app/start',
+ CLEAN: '/flink/app/clean',
+ BACKUPS: '/flink/app/backups',
+ ROLLBACK: '/flink/app/rollback',
+ REVOKE: '/flink/app/revoke',
+ OPTION_LOG: '/flink/app/optionlog',
+ DOWN_LOG: '/flink/app/downlog',
+ CHECK_JAR: '/flink/app/checkjar',
+ VERIFY_SCHEMA: '/flink/app/verifySchema',
+ },
+ Config: {
+ GET: '/flink/conf/get',
+ TEMPLATE: '/flink/conf/template',
+ LIST: '/flink/conf/list',
+ HISTORY: '/flink/conf/history',
+ DELETE: '/flink/conf/delete',
+ SYS_HADOOP_CONF: '/flink/conf/sysHadoopConf',
+ },
+ FlinkEnv: {
+ LIST: '/flink/env/list',
+ CREATE: '/flink/env/create',
+ EXISTS: '/flink/env/exists',
+ GET: '/flink/env/get',
+ SYNC: '/flink/env/sync',
+ UPDATE: '/flink/env/update',
+ DEFAULT: '/flink/env/default',
+ },
+ FlinkCluster: {
+ LIST: '/flink/cluster/list',
+ ACTIVE_URL: '/flink/cluster/activeUrl',
+ CREATE: '/flink/cluster/create',
+ CHECK: '/flink/cluster/check',
+ GET: '/flink/cluster/get',
+ UPDATE: '/flink/cluster/update',
+ START: '/flink/cluster/start',
+ SHUTDOWN: '/flink/cluster/shutdown',
+ DELETE: '/flink/cluster/delete',
+ },
+ AppBuild: {
+ BUILD: '/flink/pipe/build',
+ DETAIL: '/flink/pipe/detail',
+ },
+ FlinkHistory: {
+ UPLOAD_JARS: '/flink/history/uploadJars',
+ K8S_NAMESPACES: '/flink/history/k8sNamespaces',
+ SESSION_CLUSTER_IDS: '/flink/history/sessionClusterIds',
+ FLINK_BASE_IMAGES: '/flink/history/flinkBaseImages',
+ FLINK_POD_TEMPLATES: '/flink/history/flinkPodTemplates',
+ FLINK_JM_POD_TEMPLATES: '/flink/history/flinkJmPodTemplates',
+ FLINK_TM_POD_TEMPLATES: '/flink/history/flinkTmPodTemplates',
+ },
+ FlinkPodTemplate: {
+ SYS_HOSTS: '/flink/podtmpl/sysHosts',
+ INIT: '/flink/podtmpl/init',
+ COMP_HOST_ALIAS: '/flink/podtmpl/compHostAlias',
+ EXTRACT_HOST_ALIAS: '/flink/podtmpl/extractHostAlias',
+ PREVIEW_HOST_ALIAS: '/flink/podtmpl/previewHostAlias',
+ },
+ FlinkSQL: {
+ VERIFY: '/flink/sql/verify',
+ GET: '/flink/sql/get',
+ HISTORY: '/flink/sql/history',
+ },
+ SETTING: {
+ GET: '/flink/setting/get',
+ WEB_URL: '/flink/setting/weburl',
+ ALL: '/flink/setting/all',
+ CHECK_HADOOP: '/flink/setting/checkHadoop',
+ SYNC: '/flink/setting/sync',
+ UPDATE: '/flink/setting/update',
+ },
+ User: {
+ LIST: '/user/list',
+ UPDATE: '/user/update',
+ PASSWORD: '/user/password',
+ RESET: '/user/password/reset',
+ GET: '/user/get',
+ GET_NO_TOKEN_USER: '/user/getNoTokenUser',
+ POST: '/user/post',
+ DELETE: '/user/delete',
+ CHECK_NAME: '/user/check/name',
+ CHECK_PASSWORD: '/user/check/password',
+ },
+ Token: {
+ LIST: '/token/list',
+ DELETE: '/token/delete',
+ CREATE: '/token/create',
+ CHECK: '/token/check',
+ CURL: '/token/curl',
+ TOGGLE: '/token/toggle',
+ },
+ Role: {
+ POST: '/role/post',
+ UPDATE: '/role/update',
+ LIST: '/role/list',
+ CHECK_NAME: '/role/check/name',
+ DELETE: '/role/delete',
+ MENU: '/role/menu',
+ },
+ Menu: {
+ LIST: '/menu/list',
+ DELETE: '/menu/delete',
+ POST: '/menu/post',
+ UPDATE: '/menu/update',
+ ROUTER: '/menu/router',
+ },
+ Log: {
+ LIST: '/log/list',
+ DELETE: '/log/delete',
+ },
+};
diff --git a/streampark-console/streampark-console-newui/src/adapter/api/passport.ts b/streampark-console/streampark-console-newui/src/adapter/api/passport.ts
new file mode 100644
index 000000000..2bee70294
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/api/passport.ts
@@ -0,0 +1,10 @@
+import api from './index';
+import http from '/@/adapter/utils/request';
+
+export function signin(parameter) {
+ return http.post(api.Passport.SIGN_IN, parameter);
+}
+
+export function signout() {
+ return http.post(api.Passport.SIGN_OUT);
+}
diff --git a/streampark-console/streampark-console-newui/src/adapter/index.less b/streampark-console/streampark-console-newui/src/adapter/index.less
new file mode 100644
index 000000000..ecc0ab75e
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/index.less
@@ -0,0 +1,5 @@
+// swal <pre class="propException">
+.propException {
+ font-size: 10px;
+ text-align: left;
+}
diff --git a/streampark-console/streampark-console-newui/src/adapter/index.ts b/streampark-console/streampark-console-newui/src/adapter/index.ts
new file mode 100644
index 000000000..6d4cb3999
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/index.ts
@@ -0,0 +1,23 @@
+import type { App } from 'vue';
+import VueSweetalert2 from 'vue-sweetalert2';
+import Swal from 'sweetalert2/dist/sweetalert2.js';
+import 'sweetalert2/dist/sweetalert2.min.css';
+import './index.less';
+
+let swalInstance: typeof Swal | null = null;
+
+function initSwal(options: {}) {
+ if (!swalInstance) {
+ swalInstance = Swal.mixin(options);
+ }
+}
+
+export function swal(...args) {
+ return swalInstance?.fire(...args);
+}
+
+export function setupAdapter(app: App) {
+ const options = {};
+ initSwal(options);
+ app.use(VueSweetalert2, options);
+}
diff --git a/streampark-console/streampark-console-newui/src/adapter/store/getters.ts b/streampark-console/streampark-console-newui/src/adapter/store/getters.ts
new file mode 100644
index 000000000..15e2790fc
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/store/getters.ts
@@ -0,0 +1,9 @@
+import { state } from './modules/user';
+
+const getters = {
+ get expire() {
+ return state.expire;
+ },
+};
+
+export default getters;
diff --git a/streampark-console/streampark-console-newui/src/adapter/store/index.ts b/streampark-console/streampark-console-newui/src/adapter/store/index.ts
new file mode 100644
index 000000000..c7ff7a3b5
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/store/index.ts
@@ -0,0 +1,5 @@
+import getters from './getters';
+
+export default {
+ getters,
+};
diff --git a/streampark-console/streampark-console-newui/src/adapter/store/modules/user.ts b/streampark-console/streampark-console-newui/src/adapter/store/modules/user.ts
new file mode 100644
index 000000000..b8bdb4454
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/store/modules/user.ts
@@ -0,0 +1,84 @@
+import { signin, signout } from '/@/adapter/api/passport';
+import {
+ TOKEN,
+ EXPIRE,
+ PERMISSIONS,
+ ROLES,
+ USER_INFO,
+ USER_NAME,
+ INVALID,
+ USER_ROUTER,
+} from '/@/adapter/store/mutation-types';
+import storage from '/@/adapter/utils/storage';
+
+export const state = {
+ expire: storage.get(EXPIRE),
+ token: storage.get(TOKEN),
+ info: storage.get(USER_INFO),
+ roles: storage.get(ROLES),
+ permissions: storage.get(PERMISSIONS),
+ name: '',
+ welcome: '',
+ avatar: '',
+};
+
+const SET_EXPIRE = (expire) => {
+ storage.set(EXPIRE, expire);
+ state.expire = expire;
+};
+const SET_TOKEN = (token) => {
+ storage.set(TOKEN, token);
+ state.token = token;
+};
+const SET_ROLES = (roles) => {
+ storage.set(ROLES, roles);
+ state.roles = roles;
+};
+const SET_PERMISSIONS = (permissions) => {
+ storage.set(PERMISSIONS, permissions);
+ state.permissions = permissions;
+};
+const SET_INFO = (info) => {
+ storage.set(USER_INFO, info);
+ storage.set(USER_NAME, info.username);
+ state.info = info;
+ state.name = info.username;
+ state.avatar = info.avatar;
+};
+const SET_EMPTY = () => {
+ state.token = null;
+ state.info = null;
+ state.roles = null;
+ state.permissions = null;
+ state.name = '';
+ state.welcome = '';
+ state.avatar = '';
+ storage.rm(USER_INFO);
+ storage.rm(USER_ROUTER);
+ storage.rm(TOKEN);
+ storage.rm(ROLES);
+ storage.rm(PERMISSIONS);
+ storage.rm(EXPIRE);
+};
+
+export async function SignIn(userInfo) {
+ const response = await signin(userInfo);
+ const respData = response.data;
+
+ if (respData != null && respData.token) {
+ SET_EXPIRE(respData.expire);
+ SET_TOKEN(respData.token);
+ SET_ROLES(respData.roles);
+ SET_PERMISSIONS(respData.permissions);
+ SET_INFO(respData.user);
+ }
+
+ storage.rm(INVALID);
+
+ return response;
+}
+
+export async function SignOut() {
+ await signout().catch(() => {});
+ SET_EMPTY();
+}
diff --git a/streampark-console/streampark-console-newui/src/adapter/store/mutation-types.ts b/streampark-console/streampark-console-newui/src/adapter/store/mutation-types.ts
new file mode 100644
index 000000000..69b45eda4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/store/mutation-types.ts
@@ -0,0 +1,24 @@
+export const TOKEN = 'TOKEN';
+export const USER_ROUTER = 'USER_ROUTER';
+export const PERMISSIONS = 'PERMISSIONS';
+export const EXPIRE = 'EXPIRE';
+export const ROLES = 'ROLES';
+export const USER_INFO = 'USER_INFO';
+export const USER_NAME = 'USER_NAME';
+export const INVALID = 'INVALID';
+
+export const SIDEBAR_TYPE = 'SIDEBAR_TYPE';
+export const DEFAULT_THEME = 'DEFAULT_THEME';
+export const DEFAULT_LAYOUT_MODE = 'DEFAULT_LAYOUT_MODE';
+export const DEFAULT_COLOR = 'DEFAULT_COLOR';
+export const DEFAULT_COLOR_WEAK = 'DEFAULT_COLOR_WEAK';
+export const DEFAULT_FIXED_HEADER = 'DEFAULT_FIXED_HEADER';
+export const DEFAULT_FIXED_SIDEMENU = 'DEFAULT_FIXED_SIDEMENU';
+export const DEFAULT_FIXED_HEADER_HIDDEN = 'DEFAULT_FIXED_HEADER_HIDDEN';
+export const DEFAULT_CONTENT_WIDTH_TYPE = 'DEFAULT_CONTENT_WIDTH_TYPE';
+export const DEFAULT_MULTI_TAB = 'DEFAULT_MULTI_TAB';
+
+export const CONTENT_WIDTH_TYPE = {
+ Fluid: 'Fluid',
+ Fixed: 'Fixed',
+};
diff --git a/streampark-console/streampark-console-newui/src/adapter/utils/request.ts b/streampark-console/streampark-console-newui/src/adapter/utils/request.ts
new file mode 100644
index 000000000..9dd388960
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/utils/request.ts
@@ -0,0 +1,201 @@
+import axios from 'axios';
+import $qs from 'qs';
+import notification from 'ant-design-vue/es/notification';
+import { INVALID, TOKEN } from '/@/adapter/store/mutation-types';
+import storage from '/@/adapter/utils/storage';
+import store from '/@/adapter/store';
+import dayjs from 'dayjs';
+import { message, Modal } from 'ant-design-vue';
+
+import { baseUrl } from '/@/adapter/api/baseUrl';
+import { SignOut } from '../store/modules/user';
+
+const http = axios.create({
+ baseURL: baseUrl(),
+ withCredentials: false,
+ timeout: 1000 * 10, // 请求超时时间
+ responseType: 'json',
+ validateStatus(status) {
+ // 200 外的状态码都认定为失败
+ return status === 200;
+ },
+});
+
+// request interceptor
+http.interceptors.request.use(
+ (config) => {
+ const expire = store.getters.expire;
+ const now = dayjs().format('YYYY-MM-DD HH:mm:ss');
+ // 让token早10秒种过期,提升“请重新登录”弹窗体验
+ if (now > expire) {
+ Modal.error({
+ title: 'Sign in expired',
+ content: 'Sorry, Sign in has expired. Please Sign in again',
+ okText: 'Sign in',
+ mask: false,
+ onOk: () => {
+ return new Promise(() => {
+ storage.clear();
+ location.reload();
+ });
+ },
+ });
+ }
+ config.headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'Content-Type':
+ config.headers!['Content-Type'] || 'application/x-www-form-urlencoded; charset=UTF-8',
+ // 'Access-Control-Allow-Origin': '*',
+ };
+ const token = storage.get(TOKEN);
+ if (token) {
+ config.headers['Authorization'] = token;
+ }
+ config.transformRequest = [
+ function (data) {
+ // 在请求之前对data传参进行格式转换
+ if (config.method === 'get' || config.method === 'post') {
+ if (data.sortField && data.sortOrder) {
+ data.sortOrder = data.sortOrder === 'descend' ? 'desc' : 'asc';
+ } else {
+ delete data.sortField;
+ delete data.sortOrder;
+ }
+ }
+ if (config.method === 'get') {
+ data = { params: data };
+ } else if (config.headers!['Content-Type'] !== 'multipart/form-data') {
+ data = $qs.stringify(data);
+ }
+ return data;
+ },
+ ];
+ return config;
+ },
+ (error) => {
+ return Promise.reject(error);
+ },
+);
+
+// response interceptor
+http.interceptors.response.use(
+ (response) => {
+ return response.data;
+ },
+ (error) => {
+ if (error.response) {
+ const errorMessage =
+ error.response.data === null
+ ? 'System error,Please contact the administrator'
+ : error.response.data.message;
+ switch (error.response.status) {
+ case 404:
+ notification.error({
+ message: 'Sorry, resource not found',
+ duration: 4,
+ });
+ break;
+ case 403:
+ case 401:
+ //避免在某些页面有密集的ajax请求数据时反复的弹窗
+ if (!storage.get(INVALID, false)) {
+ storage.set(INVALID, true);
+ notification.warn({
+ message:
+ "Sorry, you can't access. May be because you don't have permissions or the Sign In is invalid",
+ duration: 4,
+ });
+ SignOut().then(() => {
+ storage.clear();
+ location.reload();
+ });
+ }
+ break;
+ default:
+ notification.error({
+ message: errorMessage,
+ duration: 4,
+ });
+ break;
+ }
+ }
+ return Promise.reject(error);
+ },
+);
+
+const respBlob = (content, fileName) => {
+ const blob = new Blob([content]);
+ fileName = fileName || `${new Date().getTime()}_export.xlsx`;
+ if ('download' in document.createElement('a')) {
+ const link = document.createElement('a');
+ link.download = fileName;
+ link.style.display = 'none';
+ link.href = URL.createObjectURL(blob);
+ document.body.appendChild(link);
+ link.click();
+ URL.revokeObjectURL(link.href);
+ document.body.removeChild(link);
+ } else {
+ navigator['msSaveBlob'](blob, fileName);
+ }
+};
+
+const blobTimeout = 1000 * 60 * 10;
+export default {
+ get(url, data = {}) {
+ return http.get(url, data);
+ },
+ post(url, data = {}) {
+ return http.post(url, data);
+ },
+ put(url, data = {}) {
+ return http.put(url, data);
+ },
+ delete(url, data = {}) {
+ return http.delete(url, { data: data });
+ },
+ patch(url, data = {}) {
+ return http.patch(url, data);
+ },
+ download(url, params, filename) {
+ message.loading('File transfer in progress');
+ return http
+ .post(url, params, {
+ responseType: 'blob',
+ timeout: blobTimeout, // 上传文件超时10分钟
+ })
+ .then((resp) => {
+ respBlob(resp, filename);
+ })
+ .catch((r) => {
+ console.error(r);
+ message.error('下载失败');
+ });
+ },
+ upload(url, params) {
+ return http.post(url, params, {
+ headers: {
+ 'Content-Type': 'multipart/form-data',
+ },
+ timeout: blobTimeout, // 上传文件超时10分钟
+ });
+ },
+ export(url, params = {}, blobCallback, msg) {
+ if (blobCallback == null) {
+ blobCallback = respBlob;
+ }
+ msg = msg == null ? {} : msg;
+ message.loading(msg.loading || '导入文件中...');
+ return http
+ .post(url, params, {
+ responseType: 'blob',
+ })
+ .then((resp) => {
+ blobCallback(resp);
+ })
+ .catch((r) => {
+ console.error(r);
+ message.error(msg.error || '导出文件失败!');
+ });
+ },
+};
diff --git a/streampark-console/streampark-console-newui/src/adapter/utils/storage.ts b/streampark-console/streampark-console-newui/src/adapter/utils/storage.ts
new file mode 100644
index 000000000..a87116001
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/adapter/utils/storage.ts
@@ -0,0 +1,84 @@
+const config = {
+ // storage options
+ storageOptions: {
+ namespace: 'STREAMX_', // key prefix
+ name: 'ls', // name variable Vue.[ls] or this.[$ls],
+ storage: 'local', // storage name session, local, memory
+ },
+};
+
+const storage = {
+ /**
+ * Set storage
+ *
+ * @param name
+ * @param content
+ * @param maxAge
+ */
+
+ set: (name, content, maxAge = null) => {
+ name = config.storageOptions.namespace + name;
+ if (!window || !name) {
+ return;
+ }
+
+ if (typeof content !== 'string') {
+ content = JSON.stringify(content);
+ }
+
+ const storage = window.localStorage;
+
+ storage.setItem(name, content);
+ if (maxAge && !isNaN(parseInt(maxAge))) {
+ const timeout = parseInt(new Date().getTime() / 1000);
+ storage.setItem(`${name}_EXPIRE`, timeout + maxAge + '');
+ }
+ },
+
+ /**
+ * Get storage
+ * @param name
+ * @param defValue
+ * @returns {string|any}
+ */
+ get: (name, defValue?) => {
+ name = config.storageOptions.namespace + name;
+ defValue = defValue === undefined ? null : defValue;
+ if (!window || !name) {
+ return defValue;
+ }
+ const content = window.localStorage.getItem(name);
+
+ if (!content) return defValue;
+
+ const _expire = window.localStorage.getItem(`${name}_EXPIRE`);
+ if (_expire) {
+ const now = parseInt(new Date().getTime() / 1000);
+ if (now > parseInt(_expire)) {
+ return defValue;
+ }
+ }
+ try {
+ return JSON.parse(content);
+ } catch (e) {
+ return content;
+ }
+ },
+
+ rm: (name) => {
+ name = config.storageOptions.namespace + name;
+ if (!window || !name) {
+ return;
+ }
+ window.localStorage.removeItem(name);
+ window.localStorage.removeItem(`${name}_EXPIRE`);
+ },
+ clear: () => {
+ if (!window) {
+ return;
+ }
+ window.localStorage.clear();
+ },
+};
+
+export default storage;
diff --git a/streampark-console/streampark-console-newui/src/api/demo/cascader.ts b/streampark-console/streampark-console-newui/src/api/demo/cascader.ts
new file mode 100644
index 000000000..83dcab07c
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/cascader.ts
@@ -0,0 +1,9 @@
+import { defHttp } from '/@/utils/http/axios';
+import { AreaModel, AreaParams } from '/@/api/demo/model/areaModel';
+
+enum Api {
+ AREA_RECORD = '/cascader/getAreaRecord',
+}
+
+export const areaRecord = (data: AreaParams) =>
+ defHttp.post<AreaModel>({ url: Api.AREA_RECORD, data });
diff --git a/streampark-console/streampark-console-newui/src/api/demo/error.ts b/streampark-console/streampark-console-newui/src/api/demo/error.ts
new file mode 100644
index 000000000..3ce607217
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/error.ts
@@ -0,0 +1,12 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+ // The address does not exist
+ Error = '/error',
+}
+
+/**
+ * @description: Trigger ajax error
+ */
+
+export const fireErrorApi = () => defHttp.get({ url: Api.Error });
diff --git a/streampark-console/streampark-console-newui/src/api/demo/model/accountModel.ts b/streampark-console/streampark-console-newui/src/api/demo/model/accountModel.ts
new file mode 100644
index 000000000..4594393e4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/model/accountModel.ts
@@ -0,0 +1,7 @@
+export interface GetAccountInfoModel {
+ email: string;
+ name: string;
+ introduction: string;
+ phone: string;
+ address: string;
+}
diff --git a/streampark-console/streampark-console-newui/src/api/demo/model/areaModel.ts b/streampark-console/streampark-console-newui/src/api/demo/model/areaModel.ts
new file mode 100644
index 000000000..dfaa481bf
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/model/areaModel.ts
@@ -0,0 +1,12 @@
+export interface AreaModel {
+ id: string;
+ code: string;
+ parentCode: string;
+ name: string;
+ levelType: number;
+ [key: string]: string | number;
+}
+
+export interface AreaParams {
+ parentCode: string;
+}
diff --git a/streampark-console/streampark-console-newui/src/api/demo/model/optionsModel.ts b/streampark-console/streampark-console-newui/src/api/demo/model/optionsModel.ts
new file mode 100644
index 000000000..c15ef8fd2
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/model/optionsModel.ts
@@ -0,0 +1,15 @@
+import { BasicFetchResult } from '/@/api/model/baseModel';
+
+export interface DemoOptionsItem {
+ label: string;
+ value: string;
+}
+
+export interface selectParams {
+ id: number | string;
+}
+
+/**
+ * @description: Request list return value
+ */
+export type DemoOptionsGetResultModel = BasicFetchResult<DemoOptionsItem>;
diff --git a/streampark-console/streampark-console-newui/src/api/demo/model/systemModel.ts b/streampark-console/streampark-console-newui/src/api/demo/model/systemModel.ts
new file mode 100644
index 000000000..88e62aac4
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/model/systemModel.ts
@@ -0,0 +1,98 @@
+import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
+
+export type AccountParams = BasicPageParams & {
+ account?: string;
+ nickname?: string;
+};
+
+export type RoleParams = {
+ roleName?: string;
+ status?: string;
+};
+
+export type RolePageParams = BasicPageParams & RoleParams;
+
+export type DeptParams = {
+ deptName?: string;
+ status?: string;
+};
+
+export type MenuParams = {
+ menuName?: string;
+ status?: string;
+ roleId?: number;
+ type?: string;
+};
+
+export type UserParams = {
+ pageNum?: number;
+ pageSize?: number;
+};
+
+export interface AccountListItem {
+ id: string;
+ account: string;
+ email: string;
+ nickname: string;
+ role: number;
+ createTime: string;
+ remark: string;
+ status: number;
+}
+
+export interface DeptListItem {
+ id: string;
+ orderNo: string;
+ createTime: string;
+ remark: string;
+ status: number;
+}
+
+export interface TreeItem {
+ children: number[];
+}
+
+export interface MenuListItem {
+ id: string;
+ orderNo: string;
+ createTime: string;
+ status: number;
+ icon: string;
+ component: string;
+ permission: string;
+ rows: TreeItem;
+}
+
+export interface UserListItem {
+ id: string;
+ orderNo: string;
+ createTime: string;
+ status: number;
+ icon: string;
+ component: string;
+ permission: string;
+}
+
+export interface RoleListItem {
+ id: string;
+ roleName: string;
+ roleValue: string;
+ status: number;
+ orderNo: string;
+ createTime: string;
+}
+
+/**
+ * @description: Request list return value
+ */
+export type AccountListGetResultModel = BasicFetchResult<AccountListItem>;
+
+export type DeptListGetResultModel = BasicFetchResult<DeptListItem>;
+
+export type MenuListGetResultModel = BasicFetchResult<MenuListItem>;
+
+export type UserListGetResultModel = BasicFetchResult<UserListItem>;
+
+export type RolePageListGetResultModel = BasicFetchResult<RoleListItem>;
+
+export type RoleListGetResultModel = RoleListItem[];
diff --git a/streampark-console/streampark-console-newui/src/api/demo/model/tableModel.ts b/streampark-console/streampark-console-newui/src/api/demo/model/tableModel.ts
new file mode 100644
index 000000000..322a8b481
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/model/tableModel.ts
@@ -0,0 +1,20 @@
+import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel';
+/**
+ * @description: Request list interface parameters
+ */
+export type DemoParams = BasicPageParams;
+
+export interface DemoListItem {
+ id: string;
+ beginTime: string;
+ endTime: string;
+ address: string;
+ name: string;
+ no: number;
+ status: number;
+}
+
+/**
+ * @description: Request list return value
+ */
+export type DemoListGetResultModel = BasicFetchResult<DemoListItem>;
diff --git a/streampark-console/streampark-console-newui/src/api/demo/select.ts b/streampark-console/streampark-console-newui/src/api/demo/select.ts
new file mode 100644
index 000000000..54c4ef5ec
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/select.ts
@@ -0,0 +1,11 @@
+import { defHttp } from '/@/utils/http/axios';
+import { DemoOptionsItem, selectParams } from './model/optionsModel';
+enum Api {
+ OPTIONS_LIST = '/select/getDemoOptions',
+}
+
+/**
+ * @description: Get sample options value
+ */
+export const optionsListApi = (params?: selectParams) =>
+ defHttp.get<DemoOptionsItem[]>({ url: Api.OPTIONS_LIST, params });
diff --git a/streampark-console/streampark-console-newui/src/api/demo/system.ts b/streampark-console/streampark-console-newui/src/api/demo/system.ts
new file mode 100644
index 000000000..58130e5d5
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/system.ts
@@ -0,0 +1,71 @@
+import {
+ AccountParams,
+ DeptListItem,
+ MenuParams,
+ UserParams,
+ RoleParams,
+ RolePageParams,
+ MenuListGetResultModel,
+ DeptListGetResultModel,
+ AccountListGetResultModel,
+ RolePageListGetResultModel,
+ RoleListGetResultModel,
+} from './model/systemModel';
+import { defHttp } from '/@/utils/http/axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+
+enum Api {
+ AccountList = '/system/getAccountList',
+ IsAccountExist = '/system/accountExist',
+ DeptList = '/system/getDeptList',
+ setRoleStatus = '/system/setRoleStatus',
+ MenuList = '/menu/list',
+ RoleMenu = '/role/menu',
+ RolePageList = '/role/list',
+ GetAllRoleList = '/system/getAllRoleList',
+ userList = '/user/list',
+}
+
+export const getAccountList = (params: AccountParams) =>
+ defHttp.get<AccountListGetResultModel>({ url: Api.AccountList, params });
+
+export const getDeptList = (params?: DeptListItem) =>
+ defHttp.get<DeptListGetResultModel>({ url: Api.DeptList, params });
+
+export const getMenuList = (params?: MenuParams) =>
+ defHttp.post<MenuListGetResultModel>({
+ url: Api.MenuList,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+
+export const getRoleMenu = (params?: MenuParams) =>
+ defHttp.post<MenuListGetResultModel>(
+ {
+ url: Api.RoleMenu,
+ params,
+ },
+ { joinParamsToUrl: true },
+ );
+
+export const getRoleListByPage = (params?: RolePageParams) =>
+ defHttp.post<RolePageListGetResultModel>({
+ url: Api.RolePageList,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+
+export const getAllRoleList = (params?: RoleParams) =>
+ defHttp.get<RoleListGetResultModel>({ url: Api.GetAllRoleList, params });
+
+export const setRoleStatus = (id: number, status: string) =>
+ defHttp.post({ url: Api.setRoleStatus, params: { id, status } });
+
+export const isAccountExist = (account: string) =>
+ defHttp.post({ url: Api.IsAccountExist, params: { account } }, { errorMessageMode: 'none' });
+
+export const getUserList = (params?: UserParams) => defHttp.post({ url: Api.userList, params });
diff --git a/streampark-console/streampark-console-newui/src/api/demo/table.ts b/streampark-console/streampark-console-newui/src/api/demo/table.ts
new file mode 100644
index 000000000..b9b60df64
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/table.ts
@@ -0,0 +1,20 @@
+import { defHttp } from '/@/utils/http/axios';
+import { DemoParams, DemoListGetResultModel } from './model/tableModel';
+
+enum Api {
+ DEMO_LIST = '/table/getDemoList',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+export const demoListApi = (params: DemoParams) =>
+ defHttp.get<DemoListGetResultModel>({
+ url: Api.DEMO_LIST,
+ params,
+ headers: {
+ // @ts-ignore
+ ignoreCancelToken: true,
+ },
+ });
diff --git a/streampark-console/streampark-console-newui/src/api/demo/tree.ts b/streampark-console/streampark-console-newui/src/api/demo/tree.ts
new file mode 100644
index 000000000..8b8a94f1a
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/demo/tree.ts
@@ -0,0 +1,11 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+ TREE_OPTIONS_LIST = '/tree/getDemoOptions',
+}
+
+/**
+ * @description: Get sample options value
+ */
+export const treeOptionsListApi = (params?: Recordable) =>
+ defHttp.get<Recordable[]>({ url: Api.TREE_OPTIONS_LIST, params });
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/app.ts b/streampark-console/streampark-console-newui/src/api/flink/app/app.ts
new file mode 100644
index 000000000..eabb1b88d
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/app.ts
@@ -0,0 +1,351 @@
+import { AxiosResponse } from 'axios';
+import { AppListRecord, AppListResponse, CancelParam, DashboardResponse } from './app.type';
+import { Result } from '/#/axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum APP_API {
+ READ_CONF = '/flink/app/readConf',
+ UPDATE = '/flink/app/update',
+ COPY = '/flink/app/copy',
+ UPLOAD = '/flink/app/upload',
+ START_LOG = '/flink/app/detail',
+ DEPLOY = '/flink/app/deploy',
+ MAPPING = '/flink/app/mapping',
+ YARN = '/flink/app/yarn',
+ LIST = '/flink/app/list',
+ GET = '/flink/app/get',
+ DASHBOARD = '/flink/app/dashboard',
+ MAIN = '/flink/app/main',
+ NAME = '/flink/app/name',
+ CHECK_NAME = '/flink/app/checkName',
+ CANCEL = '/flink/app/cancel',
+ FORCED_STOP = '/flink/app/forcedStop',
+ DELETE = '/flink/app/delete',
+ DELETE_BAK = '/flink/app/deletebak',
+ CREATE = '/flink/app/create',
+ START = '/flink/app/start',
+ CLEAN = '/flink/app/clean',
+ BACKUPS = '/flink/app/backups',
+ ROLLBACK = '/flink/app/rollback',
+ REVOKE = '/flink/app/revoke',
+ OPTION_LOG = '/flink/app/optionlog',
+ DOWN_LOG = '/flink/app/downlog',
+ CHECK_JAR = '/flink/app/checkjar',
+ VERIFY_SCHEMA = '/flink/app/verifySchema',
+ CHECK_SAVEPOINT_PATH = '/flink/app/checkSavepointPath',
+}
+
+/**
+ * 读取配置文件
+ * @returns Promise<any>
+ */
+export function fetchAppConf(params?: { config: any }) {
+ return defHttp.post<any>({
+ url: APP_API.READ_CONF,
+ params,
+ });
+}
+
+/**
+ * 仪表盘数据
+ * @returns Promise<DashboardResponse>
+ */
+export function fetchDashboard() {
+ return defHttp.post<DashboardResponse>({
+ url: APP_API.DASHBOARD,
+ params: {},
+ });
+}
+
+/**
+ * 获取 app 列表数据
+ * @returns Promise<AppListResponse>
+ */
+export function fetchAppRecord(params) {
+ return defHttp.post<AppListResponse>({
+ url: APP_API.LIST,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 移出 app
+ * @returns Promise<boolean>
+ */
+export function fetchAppRemove(id: string) {
+ return defHttp.post<boolean>({
+ url: APP_API.DELETE,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 获取 yarn 地址
+ * @returns Promise<any>
+ */
+export function fetchYarn() {
+ return defHttp.post<string>({
+ url: APP_API.YARN,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+/**
+ * 获取项目
+ * @returns Promise<any>
+ */
+export function fetchCheckName(params: { id?: string; jobName: string }) {
+ return defHttp.post<number>({
+ url: APP_API.CHECK_NAME,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchMain(params) {
+ return defHttp.post({
+ url: APP_API.MAIN,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 上传
+ * @param params
+ * @returns {String} 文件路径
+ */
+export function fetchUpload(params) {
+ return defHttp.post<string>({
+ url: APP_API.UPLOAD,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_DATA,
+ },
+ timeout: 1000 * 60 * 10, // 上传文件超时10分钟
+ });
+}
+
+/**
+ * 创建
+ * @param params 创建参数
+ * @returns {Promise<AxiosResponse<Result>>} data 创建是否成功 message: 错误提示
+ */
+export function fetchCreate(params) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: APP_API.CREATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * 更新
+ * @param params 更新参数
+ * @returns {Promise<AxiosResponse<Result>>} data 更新是否成功 message: 错误提示
+ */
+export function fetchUpdate(params) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: APP_API.UPDATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+/**
+ * 通过id 获取application 信息
+ * @param params 创建参数
+ * @returns {Promise<AxiosResponse<Result>>} data 创建是否成功 message: 错误提示
+ */
+export function fetchGet(params: { id: string }) {
+ return defHttp.post<AppListRecord>({
+ url: APP_API.GET,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchBackUps(params) {
+ return defHttp.post({
+ url: APP_API.BACKUPS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchOptionLog(params) {
+ return defHttp.post({
+ url: APP_API.OPTION_LOG,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 强制停止
+ * @param params id:string
+ * @returns
+ */
+export function fetchForcedStop(params: { id: string }) {
+ return defHttp.post<boolean>({
+ url: APP_API.FORCED_STOP,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchStart(params) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: APP_API.START,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+export function fetchCopy(params) {
+ return defHttp.post<AxiosResponse<any>>(
+ {
+ url: APP_API.COPY,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ errorMessageMode: 'none',
+ },
+ );
+}
+/**
+ * mapping
+ * @param params {id:string,appId:string,jobId:string}
+ * @returns {Promise<Boolean>}
+ */
+export function fetchMapping(params) {
+ return defHttp.post<boolean>({
+ url: APP_API.MAPPING,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+/**
+ * log
+ * @param params
+ * @returns
+ */
+export function fetchStartLog(params) {
+ return defHttp.post<AxiosResponse<any>>(
+ {
+ url: APP_API.START_LOG,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * SavepointPath
+ * @param {String} id app Id
+ * @returns {Promise<AxiosResponse<Result>>}
+ */
+export function fetchCheckSavepointPath(params: { id: string }) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: APP_API.CHECK_SAVEPOINT_PATH,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * verify Schema
+ * @param {String} path
+ * @returns {Promise<AxiosResponse<Result>>}
+ */
+export function fetchVerifySchema(params: { path: string }) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: APP_API.CHECK_SAVEPOINT_PATH,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+/**
+ * Cancel
+ * @param {CancelParam} params
+ * @returns {Promise<Boolean>}
+ */
+export function fetchCancel(params: CancelParam) {
+ return defHttp.post<boolean>({
+ url: APP_API.CANCEL,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchName(params) {
+ return defHttp.post({
+ url: APP_API.NAME,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/app.type.ts b/streampark-console/streampark-console-newui/src/api/flink/app/app.type.ts
new file mode 100644
index 000000000..00769c58a
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/app.type.ts
@@ -0,0 +1,138 @@
+// 仪表盘
+export interface DashboardResponse {
+ totalTM: number;
+ task: Task;
+ availableSlot: number;
+ totalSlot: number;
+ runningJob: number;
+ tmMemory: number;
+ jmMemory: number;
+}
+
+interface Task {
+ total: number;
+ created: number;
+ scheduled: number;
+ deploying: number;
+ running: number;
+ finished: number;
+ canceling: number;
+ canceled: number;
+ failed: number;
+ reconciling: number;
+}
+// 列表数据
+export interface AppListResponse {
+ total: string;
+ records: AppListRecord[];
+}
+export interface AppListRecord {
+ id: string;
+ jobType: number;
+ projectId?: any;
+ tags?: any;
+ userId: string;
+ teamId: string;
+ jobName: string;
+ appId?: string;
+ jobId?: string;
+ versionId: string;
+ clusterId?: string;
+ flinkImage?: string;
+ k8sNamespace: string;
+ state: number;
+ launch: number;
+ build: boolean;
+ restartSize: number;
+ restartCount?: number;
+ optionState: number;
+ alertId?: any;
+ args?: string;
+ module?: any;
+ options: string;
+ hotParams?: string;
+ resolveOrder: number;
+ executionMode: number;
+ dynamicOptions?: string;
+ appType: number;
+ flameGraph: boolean;
+ tracking: number;
+ jar?: string;
+ jarCheckSum?: string;
+ mainClass?: string;
+ startTime?: string;
+ endTime?: string;
+ duration?: string;
+ cpMaxFailureInterval?: any;
+ cpFailureRateInterval?: any;
+ cpFailureAction?: any;
+ totalTM?: any;
+ totalSlot?: any;
+ availableSlot?: any;
+ jmMemory?: number;
+ tmMemory?: number;
+ totalTask?: number;
+ flinkClusterId?: any;
+ description?: string;
+ createTime: string;
+ optionTime?: string;
+ modifyTime: string;
+ k8sRestExposedType?: any;
+ k8sPodTemplate?: any;
+ k8sJmPodTemplate?: any;
+ k8sTmPodTemplate?: any;
+ ingressTemplate?: any;
+ defaultModeIngress?: any;
+ resourceFrom?: number;
+ k8sHadoopIntegration: boolean;
+ overview?: any;
+ dependency?: any;
+ sqlId?: any;
+ flinkSql?: any;
+ stateArray?: any;
+ jobTypeArray?: any;
+ backUp: boolean;
+ restart: boolean;
+ userName: string;
+ nickName: string;
+ config?: any;
+ configId?: any;
+ flinkVersion: string;
+ confPath?: any;
+ format?: any;
+ savePoint?: any;
+ savePointed: boolean;
+ drain: boolean;
+ allowNonRestored: boolean;
+ socketId?: any;
+ projectName?: any;
+ createTimeFrom?: any;
+ createTimeTo?: any;
+ backUpDescription?: any;
+ yarnQueue?: any;
+ yarnSessionClusterId?: any;
+ teamIdList?: any;
+ teamName: string;
+ flinkRestUrl?: any;
+ buildStatus: number;
+ appControl: AppControl;
+ fsOperator: any;
+ workspace: any;
+ k8sPodTemplates: {
+ empty: boolean;
+ };
+ streamXJob: boolean;
+}
+
+interface AppControl {
+ allowStart: boolean;
+ allowStop: boolean;
+ allowBuild: boolean;
+}
+/* cancel params */
+export interface CancelParam {
+ id: string;
+ savePointed: boolean;
+ drain: boolean;
+ savePoint: string;
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/flinkBuild.ts b/streampark-console/streampark-console-newui/src/api/flink/app/flinkBuild.ts
new file mode 100644
index 000000000..b4f75e968
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/flinkBuild.ts
@@ -0,0 +1,37 @@
+import { AxiosResponse } from 'axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum BUILD_API {
+ BUILD = '/flink/pipe/build',
+ DETAIL = '/flink/pipe/detail',
+}
+
+export function fetchBuild(params) {
+ return defHttp.post<AxiosResponse<any>>(
+ {
+ url: BUILD_API.BUILD,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * 获取构建详情
+ * @param params appId:string
+ * @returns
+ */
+export function fetchBuildDetail(params: { appId: string }) {
+ return defHttp.post<{ pipeline: any; docker: any }>({
+ url: BUILD_API.DETAIL,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/flinkHistory.ts b/streampark-console/streampark-console-newui/src/api/flink/app/flinkHistory.ts
new file mode 100644
index 000000000..a60a4b374
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/flinkHistory.ts
@@ -0,0 +1,84 @@
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum HISTORY_API {
+ UPLOAD_JARS = '/flink/history/uploadJars',
+ K8S_NAMESPACES = '/flink/history/k8sNamespaces',
+ SESSION_CLUSTER_IDS = '/flink/history/sessionClusterIds',
+ FLINK_BASE_IMAGES = '/flink/history/flinkBaseImages',
+ FLINK_POD_TEMPLATES = '/flink/history/flinkPodTemplates',
+ FLINK_JM_POD_TEMPLATES = '/flink/history/flinkJmPodTemplates',
+ FLINK_TM_POD_TEMPLATES = '/flink/history/flinkTmPodTemplates',
+}
+
+/**
+ * 获取k8s
+ * @returns Promise<any>
+ */
+export function fetchK8sNamespaces() {
+ return defHttp.post<string[]>({
+ url: HISTORY_API.K8S_NAMESPACES,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+/**
+ * 上传jar
+ * @returns Promise<DashboardResponse>
+ */
+export function fetchUploadJars() {
+ return defHttp.post<string[]>({
+ url: HISTORY_API.UPLOAD_JARS,
+ });
+}
+
+export function fetchSessionClusterIds(params) {
+ return defHttp.post({
+ url: HISTORY_API.SESSION_CLUSTER_IDS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchFlinkBaseImages() {
+ return defHttp.post({
+ url: HISTORY_API.FLINK_BASE_IMAGES,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchFlinkPodTemplates(params) {
+ return defHttp.post<string[]>({
+ url: HISTORY_API.FLINK_POD_TEMPLATES,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchFlinkJmPodTemplates(params) {
+ return defHttp.post<string[]>({
+ url: HISTORY_API.FLINK_JM_POD_TEMPLATES,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchFlinkTmPodTemplates(params) {
+ return defHttp.post<string[]>({
+ url: HISTORY_API.FLINK_TM_POD_TEMPLATES,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/flinkPodtmpl.ts b/streampark-console/streampark-console-newui/src/api/flink/app/flinkPodtmpl.ts
new file mode 100644
index 000000000..72afb578b
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/flinkPodtmpl.ts
@@ -0,0 +1,59 @@
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum PODTEMPLATE_API {
+ SYS_HOSTS = '/flink/podtmpl/sysHosts',
+ INIT = '/flink/podtmpl/init',
+ COMP_HOST_ALIAS = '/flink/podtmpl/compHostAlias',
+ EXTRACT_HOST_ALIAS = '/flink/podtmpl/extractHostAlias',
+ PREVIEW_HOST_ALIAS = '/flink/podtmpl/previewHostAlias',
+}
+
+export function fetchSysHosts(params) {
+ return defHttp.post({
+ url: PODTEMPLATE_API.SYS_HOSTS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchInitPodTemplate(params) {
+ return defHttp.post({
+ url: PODTEMPLATE_API.INIT,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchCompleteHostAliasToPodTemplate(params) {
+ return defHttp.post({
+ url: PODTEMPLATE_API.COMP_HOST_ALIAS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchExtractHostAliasFromPodTemplate(params) {
+ return defHttp.post({
+ url: PODTEMPLATE_API.EXTRACT_HOST_ALIAS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchPreviewHostAlias(params) {
+ return defHttp.post({
+ url: PODTEMPLATE_API.PREVIEW_HOST_ALIAS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/flinkSql.ts b/streampark-console/streampark-console-newui/src/api/flink/app/flinkSql.ts
new file mode 100644
index 000000000..0b1645c45
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/flinkSql.ts
@@ -0,0 +1,44 @@
+import { AxiosResponse } from 'axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum FLINK_SQL_API {
+ VERIFY = '/flink/sql/verify',
+ GET = '/flink/sql/get',
+ HISTORY = '/flink/sql/history',
+}
+
+export function fetchFlinkSqlVerify(params) {
+ return defHttp.post<AxiosResponse<any>>(
+ {
+ url: FLINK_SQL_API.VERIFY,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+export function fetchFlinkSql(params) {
+ return defHttp.post({
+ url: FLINK_SQL_API.GET,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchFlinkHistory(params) {
+ return defHttp.post({
+ url: FLINK_SQL_API.HISTORY,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/metrics.ts b/streampark-console/streampark-console-newui/src/api/flink/app/metrics.ts
new file mode 100644
index 000000000..c8876e124
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/metrics.ts
@@ -0,0 +1,30 @@
+import { AxiosResponse } from 'axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum Metrics_API {
+ FLAME_GRAPH = '/metrics/flamegraph',
+ NOTICE = '/metrics/notice',
+ DEL_NOTICE = '/metrics/delnotice',
+}
+/**
+ * 导出
+ * @param {String} appId application id
+ * @param {Number} width The width of the screen
+ * @returns {Promise<AxiosResponse<Blob>>} Promise<AxiosResponse<Blob>>
+ */
+export function fetchFlamegraph(params) {
+ return defHttp.post<AxiosResponse<Blob>>(
+ {
+ url: Metrics_API.FLAME_GRAPH,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ responseType: 'blob',
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/app/savepoint.ts b/streampark-console/streampark-console-newui/src/api/flink/app/savepoint.ts
new file mode 100644
index 000000000..c376c54e3
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/app/savepoint.ts
@@ -0,0 +1,41 @@
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum SAVE_POINT_API {
+ LATEST = '/flink/savepoint/latest',
+ HISTORY = '/flink/savepoint/history',
+ DELETE = '/flink/savepoint/delete',
+}
+
+export function fetchLatest(params) {
+ return defHttp.post({
+ url: SAVE_POINT_API.LATEST,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchSavePonitHistory(params) {
+ return defHttp.post({
+ url: SAVE_POINT_API.HISTORY,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 删除
+ * @param params id
+ * @returns
+ */
+export function fetchRemoveSavePoint(params: { id: string }) {
+ return defHttp.post<boolean>({
+ url: SAVE_POINT_API.DELETE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/config/index.ts b/streampark-console/streampark-console-newui/src/api/flink/config/index.ts
new file mode 100644
index 000000000..fb1ee546f
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/config/index.ts
@@ -0,0 +1,71 @@
+import { HadoopConf } from './index.type';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum CONFIG_API {
+ GET = '/flink/conf/get',
+ TEMPLATE = '/flink/conf/template',
+ LIST = '/flink/conf/list',
+ HISTORY = '/flink/conf/history',
+ DELETE = '/flink/conf/delete',
+ SYS_HADOOP_CONF = '/flink/conf/sysHadoopConf',
+}
+
+export function fetchGetVer(params: { id: string }) {
+ return defHttp.post({
+ url: CONFIG_API.GET,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function handleConfTemplate() {
+ return defHttp.post<string>({
+ url: CONFIG_API.TEMPLATE,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchSysHadoopConf() {
+ return defHttp.post<HadoopConf>({
+ url: CONFIG_API.SYS_HADOOP_CONF,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchListVer(params) {
+ return defHttp.post({
+ url: CONFIG_API.LIST,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 删除配置
+ * @param {String}
+ * @returns {Promise<Boolean>}
+ */
+export function fetchRemoveConf(params: { id: string }) {
+ return defHttp.post<boolean>({
+ url: CONFIG_API.DELETE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchConfHistory(params) {
+ return defHttp.post({
+ url: CONFIG_API.HISTORY,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/config/index.type.ts b/streampark-console/streampark-console-newui/src/api/flink/config/index.type.ts
new file mode 100644
index 000000000..e581dd95d
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/config/index.type.ts
@@ -0,0 +1,10 @@
+export interface HadoopConf {
+ hadoop: Hadoop;
+ hive: any;
+}
+
+interface Hadoop {
+ 'core-site.xml': string;
+ 'hdfs-site.xml': string;
+ 'yarn-site.xml': string;
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/notebook.ts b/streampark-console/streampark-console-newui/src/api/flink/notebook.ts
new file mode 100644
index 000000000..a874e9757
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/notebook.ts
@@ -0,0 +1,45 @@
+import { AxiosResponse } from 'axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum NOTEBOOK_API {
+ TUTORIAL = '/tutorial/get',
+ SUBMIT = '/flink/notebook/submit',
+}
+interface TutorialResponse {
+ id: string;
+ name: string;
+ type: number;
+ content: string;
+ createTime: string;
+}
+/**
+ * @returns Promise<TutorialResponse>
+ */
+export function fetchReadmd(params: { name: string }) {
+ return defHttp.post<TutorialResponse>({
+ url: NOTEBOOK_API.TUTORIAL,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * submit notebook
+ * @returns Promise<AxiosResponse>
+ */
+export function fetchNotebookSubmit(params: { env: string; text: string }) {
+ return defHttp.post<AxiosResponse<any>>(
+ {
+ url: NOTEBOOK_API.SUBMIT,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/project/index.ts b/streampark-console/streampark-console-newui/src/api/flink/project/index.ts
new file mode 100644
index 000000000..4391e7320
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/project/index.ts
@@ -0,0 +1,194 @@
+import { defHttp } from '/@/utils/http/axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { ProjectModel } from '/@/api/flink/project/model/projectModel';
+import { Result } from '/#/axios';
+import { AxiosResponse } from 'axios';
+
+enum Api {
+ BRANCHES = '/flink/project/branches',
+ GIT_CHECK = '/flink/project/gitcheck',
+ EXISTS = '/flink/project/exists',
+ CREATE = '/flink/project/create',
+ GET = '/flink/project/get',
+ UPDATE = '/flink/project/update',
+ COPY = '/flink/project/copy',
+ BUILD = '/flink/project/build',
+ BUILD_LOG = '/flink/project/buildlog',
+ CLOSE_BUILD = '/flink/project/closebuild',
+ LIST = '/flink/project/list',
+ FILE_LIST = '/flink/project/filelist',
+ MODULES = '/flink/project/modules',
+ LIST_CONF = '/flink/project/listconf',
+ JARS = '/flink/project/jars',
+ DELETE = '/flink/project/delete',
+ SELECT = '/flink/project/select',
+}
+
+export function getList(params?) {
+ return defHttp.post<ProjectModel>({
+ url: Api.LIST,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function isExist(params) {
+ return defHttp.post({
+ url: Api.EXISTS,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function gitCheck(params) {
+ return defHttp.post({
+ url: Api.GIT_CHECK,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function branches(params) {
+ return defHttp.post({
+ url: Api.BRANCHES,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function createProject(params) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: Api.CREATE,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+export function getDetail(params) {
+ return defHttp.post({
+ url: Api.GET,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function updateProject(params) {
+ return defHttp.post({
+ url: Api.UPDATE,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function buildProject(params) {
+ return defHttp.post<boolean>({
+ url: Api.BUILD,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function buildLog(params) {
+ return defHttp.post(
+ {
+ url: Api.BUILD_LOG,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+export function closeBuild(params) {
+ return defHttp.post({
+ url: Api.CLOSE_BUILD,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function deleteProject(params) {
+ return defHttp.post({
+ url: Api.DELETE,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function modules(params) {
+ return defHttp.post({
+ url: Api.MODULES,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function jars(params) {
+ return defHttp.post({
+ url: Api.JARS,
+ data: params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchListConf(params) {
+ return defHttp.post<any>({
+ url: Api.LIST_CONF,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchSelect(params) {
+ return defHttp.post<any>({
+ url: Api.SELECT,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchListJars(params) {
+ return defHttp.post<string[]>({
+ url: Api.JARS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/project/model/projectModel.ts b/streampark-console/streampark-console-newui/src/api/flink/project/model/projectModel.ts
new file mode 100644
index 000000000..fb0f6db7f
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/project/model/projectModel.ts
@@ -0,0 +1,24 @@
+export interface ProjectModel {
+ records: ProjectRecord[];
+ total: number;
+}
+export interface ProjectRecord {
+ id: string;
+ name: string;
+ url: string;
+ branches: string;
+ lastBuild?: any;
+ userName?: any;
+ password?: any;
+ repository: number;
+ pom?: any;
+ buildArgs?: any;
+ description: string;
+ buildState: number | string;
+ type: number;
+ createTime: string;
+ modifyTime: string;
+ module?: any;
+ dateFrom?: any;
+ dateTo?: any;
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/setting/alert.ts b/streampark-console/streampark-console-newui/src/api/flink/setting/alert.ts
new file mode 100644
index 000000000..15d7a5e3b
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/setting/alert.ts
@@ -0,0 +1,103 @@
+import { AlertCreate, AlertSetting } from './types/alert.type';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum ALERT_APi {
+ ADD = '/flink/alert/add',
+ EXISTS = '/flink/alert/exists',
+ UPDATE = '/flink/alert/update',
+ GET = '/flink/alert/get',
+ LIST = '/flink/alert/list',
+ LIST_WITHOUTPAGE = '/flink/alert/listWithOutPage',
+ DELETE = '/flink/alert/delete',
+ SEND = '/flink/alert/send',
+}
+/**
+ * 获取告警设置
+ * @returns Promise<AlertSetting[]>
+ */
+export function fetchAlertSetting() {
+ return defHttp.post<AlertSetting[]>({
+ url: ALERT_APi.LIST_WITHOUTPAGE,
+ });
+}
+/**
+ * 测试告警设置
+ * @returns Promise<boolean>
+ */
+export function fetchSendAlert(params: { id: string }) {
+ return defHttp.post<boolean>(
+ {
+ url: ALERT_APi.SEND,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ errorMessageMode: 'none',
+ },
+ );
+}
+/**
+ * 删除告警设置
+ * @returns Promise<MavenSetting[]>
+ */
+export function fetchAlertDelete(params: { id: string }) {
+ return defHttp.delete<boolean>({
+ url: ALERT_APi.DELETE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 告警名称测试
+ * @returns Promise<boolean>
+ */
+export function fetchExistsAlert(params: { alertName: string; isJsonType?: boolean }) {
+ return defHttp.post<boolean>({
+ url: ALERT_APi.EXISTS,
+ params,
+ });
+}
+
+/**
+ * 添加告警设置
+ * @param {AlertCreate} params
+ * @returns Promise<boolean>
+ */
+export function fetchAlertAdd(params: AlertCreate) {
+ return defHttp.post<boolean>({
+ url: ALERT_APi.ADD,
+ params,
+ });
+}
+/**
+ * 更新告警设置
+ * @param {AlertCreate} params
+ * @returns Promise<boolean>
+ */
+export function fetchAlertUpdate(params: AlertCreate) {
+ return defHttp.post<boolean>({
+ url: ALERT_APi.UPDATE,
+ params,
+ });
+}
+
+/**
+ * 更新系统设置
+ * @param {String} settingKey key
+ * @param {Boolean} settingValue value
+ * @returns Promise<boolean>
+ */
+export function fetchSystemSettingUpdate(params: { settingKey: string; settingValue: boolean }) {
+ return defHttp.post<boolean>({
+ url: ALERT_APi.UPDATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/setting/flinkCluster.ts b/streampark-console/streampark-console-newui/src/api/flink/setting/flinkCluster.ts
new file mode 100644
index 000000000..136d3ae42
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/setting/flinkCluster.ts
@@ -0,0 +1,132 @@
+import { AxiosResponse } from 'axios';
+import { FlinkCluster } from './types/flinkCluster.type';
+import { Result } from '/#/axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum FLINK_API {
+ LIST = '/flink/cluster/list',
+ ACTIVE_URL = '/flink/cluster/activeUrl',
+ CREATE = '/flink/cluster/create',
+ CHECK = '/flink/cluster/check',
+ GET = '/flink/cluster/get',
+ UPDATE = '/flink/cluster/update',
+ START = '/flink/cluster/start',
+ SHUTDOWN = '/flink/cluster/shutdown',
+ DELETE = '/flink/cluster/delete',
+}
+/**
+ * flink cluster
+ * @returns Promise<FlinkEnv[]>
+ */
+export function fetchFlinkCluster() {
+ return defHttp.post<FlinkCluster[]>({
+ url: FLINK_API.LIST,
+ });
+}
+/**
+ * flink cluster start
+ * @returns Promise<AxiosResponse>
+ */
+export function fetchClusterStart(id: string) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: FLINK_API.START,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * flink cluster remove
+ * @returns Promise<AxiosResponse>
+ */
+export function fetchClusterRemove(id: string) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: FLINK_API.DELETE,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * flink cluster shutdown
+ * @returns Promise<AxiosResponse>
+ */
+export function fetchClusterShutdown(id: string) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: FLINK_API.SHUTDOWN,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+/**
+ * flink cluster shutdown
+ * @returns Promise<AxiosResponse>
+ */
+export function fetchActiveURL(id: string) {
+ return defHttp.post<string>({
+ url: FLINK_API.ACTIVE_URL,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchCheckCluster(params: Recordable) {
+ return defHttp.post({
+ url: FLINK_API.CHECK,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchCreateCluster(params: Recordable) {
+ return defHttp.post({
+ url: FLINK_API.CREATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+export function fetchUpdateCluster(params: Recordable) {
+ return defHttp.post({
+ url: FLINK_API.UPDATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+export function fetchGetCluster(params: Recordable) {
+ return defHttp.post({
+ url: FLINK_API.GET,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
diff --git a/streampark-console/streampark-console-newui/src/api/flink/setting/flinkEnv.ts b/streampark-console/streampark-console-newui/src/api/flink/setting/flinkEnv.ts
new file mode 100644
index 000000000..b436215db
--- /dev/null
+++ b/streampark-console/streampark-console-newui/src/api/flink/setting/flinkEnv.ts
@@ -0,0 +1,126 @@
+import { AxiosResponse } from 'axios';
+import { FlinkCreate, FlinkEnv } from './types/flinkEnv.type';
+import { Result } from '/#/axios';
+import { ContentTypeEnum } from '/@/enums/httpEnum';
+import { defHttp } from '/@/utils/http/axios';
+
+enum FLINK_API {
+ LIST = '/flink/env/list',
+ CREATE = '/flink/env/create',
+ EXISTS = '/flink/env/exists',
+ GET = '/flink/env/get',
+ SYNC = '/flink/env/sync',
+ UPDATE = '/flink/env/update',
+ DEFAULT = '/flink/env/default',
+}
+/**
+ * flink 环境数据
+ * @returns Promise<FlinkEnv[]>
+ */
+export function fetchFlinkEnv() {
+ return defHttp.post<FlinkEnv[]>({
+ url: FLINK_API.LIST,
+ });
+}
+
+/**
+ * 设置默认
+ * @param {String} id
+ * @returns Promise<Boolean>
+ */
+export function fetchDefaultSet(id: string) {
+ return defHttp.post<FlinkEnv[]>({
+ url: FLINK_API.DEFAULT,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 获取flink 详细信息
+ * @param {String} id
+ * @returns Promise<Boolean>
+ */
+export function fetchFlinkInfo(id: string) {
+ return defHttp.post<FlinkEnv>({
+ url: FLINK_API.GET,
+ params: { id },
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+
+/**
+ * 检测环境是否存在
+ * @param {String} id
+ * @returns Promise<Boolean>
+ */
+export function fetchExistsEnv(params: {
+ id: string | null;
+ flinkName: string;
+ flinkHome: string;
+}) {
+ return defHttp.post<boolean>({
+ url: FLINK_API.EXISTS,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ });
+}
+/**
+ * 创建 flink
+ * @param {FlinkCreate} params
+ * @returns Promise<Boolean>
+ */
+export function fetchFlinkCreate(params: FlinkCreate) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: FLINK_API.CREATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+/**
+ * 更新 flink
+ * @param {FlinkCreate} params
+ * @returns Promise<Boolean>
+ */
+export function fetchFlinkUpdate(params: FlinkCreate) {
+ return defHttp.post<AxiosResponse<Result>>(
+ {
+ url: FLINK_API.UPDATE,
+ params,
+ headers: {
+ 'Content-Type': ContentTypeEnum.FORM_URLENCODED,
+ },
+ },
+ {
+ isReturnNativeResponse: true,
+ },
+ );
+}
+
+/**
+ * 配置同步
+ * @param {String} id
+ * @returns Promise<Boolean>
+ */
+export function fetchFlinkSync(id: string) {
+ return defHttp.post<boolean>({
+ url: FLINK_API.SYNC,
+ params: { id },
+ headers: {
... 69918 lines suppressed ...