已合并
[feature] 修改插件的默认实现 #219
justbk创建于 2023年5月20日
[feature] 修改插件的默认实现 #219
已合并
justbk创建于 2023年5月20日
refs/pull/219/head合入到master
45 个文件变更+1692-6153
MopenGauss-visualtool-plugin/pom.xml+32-2
@@ -14,6 +14,8 @@
14 <junit.version>4.13</junit.version>14 <junit.version>4.13</junit.version>
15 <spring-brick.version>3.1.0</spring-brick.version>15 <spring-brick.version>3.1.0</spring-brick.version>
16 <spring-boot.version>2.5.6</spring-boot.version>16 <spring-boot.version>2.5.6</spring-boot.version>
17+ <java.version>11</java.version>
18+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17 </properties>19 </properties>
18 20 
19 <dependencies>21 <dependencies>
@@ -32,6 +34,14 @@
32 <groupId>com.alibaba</groupId>34 <groupId>com.alibaba</groupId>
33 <artifactId>druid-spring-boot-starter</artifactId>35 <artifactId>druid-spring-boot-starter</artifactId>
34 </exclusion>36 </exclusion>
37+<!-- <exclusion>-->
38+<!-- <groupId>com.baomidou</groupId>-->
39+<!-- <artifactId>mybatis-plus-boot-starter</artifactId>-->
40+<!-- </exclusion>-->
41+ <exclusion>
42+ <groupId>com.github.pagehelper</groupId>
43+ <artifactId>pagehelper-spring-boot-starter</artifactId>
44+ </exclusion>
35 </exclusions>45 </exclusions>
36 </dependency>46 </dependency>
37 <dependency>47 <dependency>
@@ -58,6 +68,26 @@
58 <version>${lombok.version}</version>68 <version>${lombok.version}</version>
59 <scope>provided</scope>69 <scope>provided</scope>
60 </dependency>70 </dependency>
71+ <dependency>
72+ <groupId>cn.hutool</groupId>
73+ <artifactId>hutool-all</artifactId>
74+ <version>5.8.11</version>
75+ </dependency>
76+ <dependency>
77+ <groupId>com.alibaba</groupId>
78+ <artifactId>druid</artifactId>
79+ <version>1.2.16</version>
80+ </dependency>
81+ <dependency>
82+ <groupId>org.opengauss</groupId>
83+ <artifactId>opengauss-jdbc</artifactId>
84+ <version>3.0.0</version>
85+ </dependency>
86+ <dependency>
87+ <groupId>com.alibaba</groupId>
88+ <artifactId>fastjson</artifactId>
89+ <version>1.2.83</version>
90+ </dependency>
61 </dependencies>91 </dependencies>
62 92 
63 <build>93 <build>
@@ -80,8 +110,8 @@
80 <pluginInfo>110 <pluginInfo>
81 <id>test-plugin</id>111 <id>test-plugin</id>
82 <bootstrapClass>org.opengauss.admin.plugin.PluginApplication</bootstrapClass>112 <bootstrapClass>org.opengauss.admin.plugin.PluginApplication</bootstrapClass>
83- <version>1.0.0</version>113+ <version>5.0.0</version>
84- <provider>xielibo</provider>114+ <provider>opengauss</provider>
85 <description>example</description>115 <description>example</description>
86 </pluginInfo>116 </pluginInfo>
87 </configuration>117 </configuration>
AopenGauss-visualtool-plugin/src/main/java/org/opengauss/admin/plugin/config/ExtensionInfoServiceImpl.java+35-0
@@ -0,0 +1,35 @@
1+package org.opengauss.admin.plugin.config;
2+ 
3+ 
4+import com.gitee.starblues.annotation.Extract;
5+import lombok.extern.slf4j.Slf4j;
6+import org.opengauss.admin.common.enums.PluginLicenseType;
7+import org.opengauss.admin.system.plugin.beans.PluginExtensionInfoDto;
8+import org.opengauss.admin.system.plugin.extract.PluginExtensionInfoExtract;
9+import org.springframework.stereotype.Service;
10+ 
11+import java.util.Date;
12+ 
13+import static org.opengauss.admin.plugin.config.PluginExtensionInfoConfig.PLUGIN_ID;
14+ 
15+@Slf4j
16+@Service
17+@Extract(bus = PLUGIN_ID)
18+public class ExtensionInfoServiceImpl implements PluginExtensionInfoExtract {
19+
20+ @Override
21+ public PluginExtensionInfoDto getPluginExtensionInfo() {
22+ PluginExtensionInfoDto dto = new PluginExtensionInfoDto();
23+ dto.setPluginId(PLUGIN_ID);
24+ dto.setPluginName("插件DEMO");
25+ dto.setPluginHome(PLUGIN_ID);
26+ dto.setPluginDevelopmentCompany("openGauss社区");
27+ dto.setPhoneNumber("400-123-4567");
28+ dto.setEmail("community@opengauss.org");
29+ dto.setCompanyAddress("opengauss.org");
30+ dto.setAuthAddress("/license");
31+ dto.setPluginLicenseType(PluginLicenseType.TRIAL);
32+ dto.setPluginExpirationTime(new Date());
33+ return dto;
34+ }
35+}
MopenGauss-visualtool-plugin/src/main/java/org/opengauss/admin/plugin/config/PluginExtensionInfoConfig.java+2-1
@@ -37,7 +37,8 @@ import java.util.Map;
37 **/37 **/
38@Component38@Component
39public class PluginExtensionInfoConfig implements PluginExtensionInfo {39public class PluginExtensionInfoConfig implements PluginExtensionInfo {
40- 40+ public static final String PLUGIN_ID = "test-plugin";
41+
41 @Override42 @Override
42 public Map<String, Object> extensionInfo() {43 public Map<String, Object> extensionInfo() {
43 Map<String, Object> map = new HashMap<>();44 Map<String, Object> map = new HashMap<>();
MopenGauss-visualtool-plugin/src/main/java/org/opengauss/admin/plugin/listener/PluginListener.java+7-2
@@ -27,6 +27,8 @@ package org.opengauss.admin.plugin.listener;
27import com.gitee.starblues.spring.MainApplicationContext;27import com.gitee.starblues.spring.MainApplicationContext;
28import com.gitee.starblues.spring.SpringBeanFactory;28import com.gitee.starblues.spring.SpringBeanFactory;
29import lombok.extern.slf4j.Slf4j;29import lombok.extern.slf4j.Slf4j;
30+import org.opengauss.admin.common.core.vo.MenuVo;
31+import org.opengauss.admin.plugin.config.PluginExtensionInfoConfig;
30import org.opengauss.admin.system.plugin.facade.MenuFacade;32import org.opengauss.admin.system.plugin.facade.MenuFacade;
31import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;33import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
32import org.springframework.boot.context.event.ApplicationPreparedEvent;34import org.springframework.boot.context.event.ApplicationPreparedEvent;
@@ -47,6 +49,7 @@ public class PluginListener implements ApplicationListener<ApplicationEvent> {
47 49 
48 @Override50 @Override
49 public void onApplicationEvent(ApplicationEvent event) {51 public void onApplicationEvent(ApplicationEvent event) {
52+ String pluginId = PluginExtensionInfoConfig.PLUGIN_ID;
50 if (event instanceof ApplicationEnvironmentPreparedEvent) {53 if (event instanceof ApplicationEnvironmentPreparedEvent) {
51 log.info("plugin init env");54 log.info("plugin init env");
52 } else if (event instanceof ApplicationPreparedEvent) {55 } else if (event instanceof ApplicationPreparedEvent) {
@@ -58,7 +61,9 @@ public class PluginListener implements ApplicationListener<ApplicationEvent> {
58 SpringBeanFactory factory = context.getSpringBeanFactory();61 SpringBeanFactory factory = context.getSpringBeanFactory();
59 MenuFacade menuFacade = factory.getBean(MenuFacade.class);62 MenuFacade menuFacade = factory.getBean(MenuFacade.class);
60 if (menuFacade != null) {63 if (menuFacade != null) {
61- menuFacade.savePluginMenu("test-plugin","测试插件菜单","test menu",100,"index");64+ MenuVo parentMenu = menuFacade.savePluginMenu(pluginId,"测试插件菜单","test menu",50,"");
65+ menuFacade.savePluginMenu(pluginId,"测试页","HelloWorld",2,"index", parentMenu.getMenuId());
66+ menuFacade.savePluginRoute(pluginId, "注册license", "license", parentMenu.getMenuId());
62 }67 }
63 log.info("plugin start complete");68 log.info("plugin start complete");
64 } else if (event instanceof ContextClosedEvent) {69 } else if (event instanceof ContextClosedEvent) {
@@ -66,7 +71,7 @@ public class PluginListener implements ApplicationListener<ApplicationEvent> {
66 SpringBeanFactory factory = context.getSpringBeanFactory();71 SpringBeanFactory factory = context.getSpringBeanFactory();
67 MenuFacade menuFacade = factory.getBean(MenuFacade.class);72 MenuFacade menuFacade = factory.getBean(MenuFacade.class);
68 if (menuFacade != null) {73 if (menuFacade != null) {
69- menuFacade.deletePluginMenu("test-plugin");74+ menuFacade.deletePluginMenu(pluginId);
70 }75 }
71 log.info("plugin is stopped");76 log.info("plugin is stopped");
72 }77 }
AopenGauss-visualtool-plugin/src/main/resources/favicon.ico+0-0
AopenGauss-visualtool-plugin/src/main/resources/index.html+1-0
@@ -0,0 +1 @@
1+<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/static-plugin/test-plugin/favicon.ico"><title>web-ui</title><script defer="defer" src="/static-plugin/test-plugin/js/chunk-vendors.5b05040f.js"></script><script defer="defer" src="/static-plugin/test-plugin/js/app.f514c872.js"></script><link href="/static-plugin/test-plugin/css/chunk-vendors.3077220a.css" rel="stylesheet"><link href="/static-plugin/test-plugin/css/app.cba2b53d.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but web-ui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
MopenGauss-visualtool-plugin/web-ui/.env.development+10-1
@@ -1,5 +1,14 @@
1+# Development environment configuration
1ENV = 'development'2ENV = 'development'
2 3 
4+# development environment
3VUE_APP_BASE_API = '/dev-api'5VUE_APP_BASE_API = '/dev-api'
4 6 
5-VUE_CLI_BABEL_TRANSPILE_MODULES = true7+# test api address
8+VUE_APP_API_BASE_URL= 'http://localhost:9494'
9+ 
10+# Test environment port
11+port = 8081
12+ 
13+# websocket address
14+VUE_APP_WS_BASE_URL='localhost:9494'
MopenGauss-visualtool-plugin/web-ui/.env.production+1-1
@@ -1,3 +1,3 @@
1+# production environment configuration
1ENV = 'production'2ENV = 'production'
2 3 
3-VUE_APP_BASE_API = '/prod-api'
MopenGauss-visualtool-plugin/web-ui/.env.staging+1-1
@@ -1,5 +1,5 @@
1NODE_ENV = production1NODE_ENV = production
2 2 
3+# test environment configuration
3ENV = 'staging'4ENV = 'staging'
4 5 
5-VUE_APP_BASE_API = '/stage-api'
AopenGauss-visualtool-plugin/web-ui/.eslintrc.js+85-0
@@ -0,0 +1,85 @@
1+module.exports = {
2+ root: true,
3+ env: {
4+ node: true,
5+ 'vue/setup-compiler-macros': true
6+ },
7+ extends: [
8+ 'plugin:vue/vue3-essential',
9+ 'eslint:recommended'
10+ ],
11+ parserOptions: {
12+ parser: '@babel/eslint-parser'
13+ },
14+ rules: {
15+ 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
16+ 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
17+ 'vue/multi-word-component-names': 'off',
18+ 'prefer-promise-reject-errors': 'off',
19+ 'arrow-spacing': [2, {
20+ before: true,
21+ after: true
22+ }],
23+ 'block-spacing': [2, 'always'],
24+ 'brace-style': [2, '1tbs', {
25+ allowSingleLine: true
26+ }],
27+ quotes: [2, 'single', {
28+ avoidEscape: true,
29+ allowTemplateLiterals: true
30+ }],
31+ camelcase: [0, {
32+ properties: 'always'
33+ }],
34+ 'comma-dangle': [2, 'never'],
35+ 'comma-spacing': [2, {
36+ before: false,
37+ after: true
38+ }],
39+ 'comma-style': [2, 'last'],
40+ 'jsx-quotes': [2, 'prefer-single'],
41+ 'key-spacing': [2, {
42+ beforeColon: false,
43+ afterColon: true
44+ }],
45+ 'keyword-spacing': [2, {
46+ before: true,
47+ after: true
48+ }],
49+ 'no-dupe-args': 2,
50+ 'no-dupe-class-members': 2,
51+ 'no-dupe-keys': 2,
52+ 'no-duplicate-case': 2,
53+ 'no-empty-character-class': 2,
54+ 'no-empty-pattern': 2,
55+ 'no-lone-blocks': 2,
56+ 'no-mixed-spaces-and-tabs': 2,
57+ 'no-multi-spaces': 2,
58+ 'no-multi-str': 2,
59+ 'no-multiple-empty-lines': [2, {
60+ max: 1
61+ }],
62+ 'require-atomic-updates': 'off',
63+ semi: ['error', 'never'],
64+ 'semi-spacing': [2, {
65+ before: false,
66+ after: true
67+ }],
68+ 'space-before-blocks': [2, 'always'],
69+ 'space-before-function-paren': [2, 'always'],
70+ 'space-in-parens': [2, 'never'],
71+ 'space-infix-ops': 2,
72+ 'space-unary-ops': [2, {
73+ words: true,
74+ nonwords: false
75+ }],
76+ 'spaced-comment': [2, 'always', {
77+ markers: ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
78+ }],
79+ 'template-curly-spacing': [2, 'never'],
80+ 'object-curly-spacing': [2, 'always', {
81+ objectsInObjects: false
82+ }],
83+ 'array-bracket-spacing': [2, 'never']
84+ }
85+}
MopenGauss-visualtool-plugin/web-ui/README.md+0-3
@@ -19,6 +19,3 @@ yarn build
19```19```
20yarn lint20yarn lint
21```21```
22- 
23-### Customize configuration
24-See [Configuration Reference](https://cli.vuejs.org/config/).
MopenGauss-visualtool-plugin/web-ui/package.json+21-22
@@ -9,33 +9,32 @@
9 "lint": "vue-cli-service lint"9 "lint": "vue-cli-service lint"
10 },10 },
11 "dependencies": {11 "dependencies": {
12- "core-js": "^3.8.3",12+ "@arco-design/web-vue": "2.43.2",
13- "element-ui": "^2.15.10",13+ "axios": "1.1.3",
14- "vue": "^2.6.14"14+ "core-js": "^3.26.0",
15+ "dayjs": "^1.11.7",
16+ "jsencrypt": "3.0.0-rc.1",
17+ "qrcode": "^1.5.3",
18+ "vue": "3.2.41",
19+ "vue-i18n": "^9.3.0-beta.6",
20+ "vue-router": "4.0.3",
21+ "vue3-ace-editor": "2.2.2"
15 },22 },
16 "devDependencies": {23 "devDependencies": {
17- "@babel/core": "^7.12.16",24+ "@babel/core": "7.12.16",
18- "@babel/eslint-parser": "^7.12.16",25+ "@babel/eslint-parser": "7.12.16",
19 "@vue/cli-plugin-babel": "~5.0.0",26 "@vue/cli-plugin-babel": "~5.0.0",
20 "@vue/cli-plugin-eslint": "~5.0.0",27 "@vue/cli-plugin-eslint": "~5.0.0",
28+ "@vue/cli-plugin-router": "~5.0.0",
21 "@vue/cli-service": "~5.0.0",29 "@vue/cli-service": "~5.0.0",
22- "eslint": "^7.32.0",30+ "eslint": "7.32.0",
23- "eslint-plugin-vue": "^8.0.3",31+ "eslint-plugin-import": "2.26.0",
24- "vue-template-compiler": "^2.6.14"32+ "eslint-plugin-node": "11.1.0",
25- },33+ "eslint-plugin-promise": "6.1.1",
26- "eslintConfig": {34+ "eslint-plugin-vue": "8.0.3",
27- "root": true,35+ "less": "4.1.3",
28- "env": {36+ "less-loader": "11.1.0",
29- "node": true37+ "svg-sprite-loader": "6.0.11"
30- },
31- "extends": [
32- "plugin:vue/essential",
33- "eslint:recommended"
34- ],
35- "parserOptions": {
36- "parser": "@babel/eslint-parser"
37- },
38- "rules": {}
39 },38 },
40 "browserslist": [39 "browserslist": [
41 "> 1%",40 "> 1%",
MopenGauss-visualtool-plugin/web-ui/src/App.vue+70-22
@@ -1,28 +1,76 @@
1<template>1<template>
2- <div id="app">2+ <a-config-provider :locale="locale">
3- <img alt="Vue logo" src="./assets/logo.png">3+ <router-view>
4- <HelloWorld msg="Welcome to Your Vue.js App"/>4+ </router-view>
5- </div>5+ </a-config-provider>
6</template>6</template>
7 7 
8-<script>8+<script setup>
9-import HelloWorld from './components/HelloWorld.vue'9+import { computed, onMounted } from 'vue'
10+import enUS from '@arco-design/web-vue/es/locale/lang/en-us'
11+import zhCN from '@arco-design/web-vue/es/locale/lang/zh-cn'
12+import useLocale from '@/hooks/locale'
13+import useTheme from '@/hooks/theme'
10 14 
11-export default {15+const { currentLocale, changeLocale } = useLocale()
12- name: 'App',16+const { changeTheme } = useTheme()
13- components: {17+ 
14- HelloWorld18+onMounted(() => {
19+ // theme change
20+ const theme = localStorage.getItem('opengauss-theme')
21+ if (theme === 'dark') {
22+ document.body.setAttribute('arco-theme', 'dark')
23+ changeTheme('dark')
24+ } else {
25+ document.body.removeAttribute('arco-theme')
26+ changeTheme('')
15 }27 }
16-}
17-</script>
18 28 
19-<style>29+ window.$wujie?.bus.$on('opengauss-theme-change', val => {
20-#app {30+ if (val === 'dark') {
21- font-family: Avenir, Helvetica, Arial, sans-serif;31+ document.body.setAttribute('arco-theme', 'dark')
22- -webkit-font-smoothing: antialiased;32+ changeTheme('dark')
23- -moz-osx-font-smoothing: grayscale;33+ } else {
24- text-align: center;34+ document.body.removeAttribute('arco-theme')
25- color: #2c3e50;35+ changeTheme('')
26- margin-top: 60px;36+ }
27-}37+ })
28-</style>38+ 
39+ // locale change
40+ const locale = localStorage.getItem('locale')
41+ if (locale === 'en-US') {
42+ changeLocale('en-US')
43+ } else {
44+ changeLocale('zh-CN')
45+ }
46+ 
47+ window.$wujie?.bus.$on('opengauss-locale-change', val => {
48+ if (val === 'en-US') {
49+ changeLocale('en-US')
50+ } else {
51+ changeLocale('zh-CN')
52+ }
53+ })
54+ 
55+ // menu collapse
56+ const htmlStyle = document.getElementsByTagName('html')[0].style
57+ window.$wujie?.bus.$on('opengauss-menu-collapse', val => {
58+ if (val === '1') {
59+ htmlStyle.setProperty('padding-left', '64px', 'important')
60+ } else {
61+ htmlStyle.setProperty('padding-left', '236px', 'important')
62+ }
63+ })
64+})
65+ 
66+const locale = computed(() => {
67+ switch (currentLocale.value) {
68+ case 'zh-CN':
69+ return zhCN
70+ case 'en-US':
71+ return enUS
72+ default:
73+ return zhCN
74+ }
75+})
76+</script>
AopenGauss-visualtool-plugin/web-ui/src/api/interceptor.js+65-0
@@ -0,0 +1,65 @@
1+import axios from 'axios'
2+import { Message } from '@arco-design/web-vue'
3+import { getToken } from '@/utils/auth'
4+import errorCode from '@/utils/errorCode'
5+ 
6+axios.defaults.baseURL = process.env.VUE_APP_BASE_API || ''
7+axios.defaults.timeout = 1200000
8+ 
9+axios.interceptors.request.use(
10+ (config) => {
11+ // let each request carry token
12+ // this example using the JWT token
13+ // Authorization is a custom headers key
14+ // please modify it according to the actual situation
15+ const token = getToken()
16+ if (token) {
17+ if (!config.headers) {
18+ config.headers = {}
19+ }
20+ config.headers.Authorization = `Bearer ${token}`
21+ }
22+ return config
23+ },
24+ (error) => {
25+ // do something
26+ return Promise.reject(error)
27+ }
28+)
29+// add response interceptors
30+axios.interceptors.response.use(
31+ (response) => {
32+ const res = response
33+ // If the status code is not set, the default status is success
34+ const code = res.data.code || 200
35+ // get error message
36+ const msg = errorCode[code] || res.data.msg || errorCode.default
37+ 
38+ if (code === 401) {
39+ window.$wujie?.bus.$emit('opengauss-login-expired')
40+ return Promise.reject('Please Log in')
41+ } else if (code === 500) {
42+ Message.error({
43+ content: msg,
44+ duration: 5 * 1000
45+ })
46+ return Promise.reject(new Error(msg))
47+ } else if (code !== 200) {
48+ Message.error({
49+ content: msg,
50+ duration: 5 * 1000
51+ })
52+ return Promise.reject('error')
53+ } else {
54+ return res.data
55+ }
56+ },
57+ (error) => {
58+ const { message } = error
59+ Message.error({
60+ content: message || 'Error',
61+ duration: 3 * 1000
62+ })
63+ return Promise.reject(error)
64+ }
65+)
AopenGauss-visualtool-plugin/web-ui/src/api/list.js+10-0
@@ -0,0 +1,10 @@
1+import axios from 'axios'
2+import { PLUGIN_ID } from '@/utils/const'
3+/* you can call restful api here!
4+export const clusterList = () => {
5+ return axios.get('/opsCluster/listCluster')
6+}
7+export const buildLicense = (data) => {
8+ return axios.post('/plugins/odd-test-plugin/license/build', data)
9+}
10+*/
AopenGauss-visualtool-plugin/web-ui/src/assets/icons/index.js+3-0
@@ -0,0 +1,3 @@
1+const svg = require.context('./svg', false, /\.svg$/)
2+const requireAll = (requireContext) => requireContext.keys().map(requireContext)
3+requireAll(svg)
AopenGauss-visualtool-plugin/web-ui/src/assets/icons/svg/cluster.svg+1-0
@@ -0,0 +1 @@
1+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1675754914055" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2768" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M879.7 687.1V516.2H540.8V390.3H645V124.4H379v265.9h104.2v125.9H144.3v170.9H66.8v212.5h212.6V687.1h-77.5V573.8h281.3v113.3h-77.5v212.5h212.6V687.1h-77.5V573.8h281.3v113.3h-77.5v212.5h212.6V687.1z" fill="#333333" p-id="2769"></path></svg>
AopenGauss-visualtool-plugin/web-ui/src/assets/icons/svg/database.svg+1-0
@@ -0,0 +1 @@
1+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1675755574508" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4585" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M973.50137 189.369863C973.50137 72.942466 739.243836 11.221918 507.791781 11.221918 288.964384 11.221918 68.734247 65.928767 43.484932 169.731507c-4.208219 5.610959-5.610959 12.624658-5.610959 19.638356v688.745205c0 8.416438 2.805479 16.832877 9.819178 23.846576 4.208219 4.208219 112.219178 115.024658 464.306849 115.024657 347.879452 0 441.863014-105.205479 451.682192-117.830137 5.610959-5.610959 7.013699-14.027397 7.013698-22.443835V213.216438c1.40274-8.416438 2.805479-15.430137 2.80548-23.846575zM897.753425 648.065753c-1.40274 0-1.40274 1.40274-2.80548 1.40274 0 0-1.40274 0-1.40274 1.40274-1.40274 1.40274-2.805479 1.40274-4.208219 2.805479l-1.402739 1.40274c-1.40274 0-1.40274 1.40274-2.80548 1.40274 0 0-1.40274 1.40274-2.805479 1.40274s-1.40274 1.40274-2.80548 1.402739-1.40274 1.40274-2.805479 1.40274-2.805479 1.40274-4.208219 1.40274c-1.40274 0-1.40274 1.40274-2.80548 1.402739-1.40274 1.40274-2.805479 1.40274-4.208219 2.80548-1.40274 0-1.40274 1.40274-2.805479 1.40274-2.805479 1.40274-4.208219 2.805479-7.013699 4.208219-1.40274 0-1.40274 1.40274-2.80548 1.402739-1.40274 1.40274-4.208219 1.40274-5.610958 2.80548-1.40274 0-2.805479 1.40274-4.20822 1.40274-1.40274 1.40274-4.208219 1.40274-5.610959 2.805479-1.40274 0-2.805479 1.40274-4.208219 1.40274-1.40274 1.40274-4.208219 1.40274-5.610959 2.805479-1.40274 0-2.805479 1.40274-4.208219 1.40274-2.805479 1.40274-5.610959 1.40274-8.416438 2.805479-1.40274 0-1.40274 0-2.80548 1.40274-4.208219 1.40274-7.013699 2.805479-11.221917 4.208219-1.40274 0-2.805479 1.40274-4.20822 1.40274-2.805479 1.40274-5.610959 1.40274-8.416438 2.80548-1.40274 0-2.805479 1.40274-5.610959 1.402739-2.805479 1.40274-5.610959 1.40274-8.416438 2.80548-1.40274 0-4.208219 1.40274-5.610959 1.402739-2.805479 1.40274-5.610959 1.40274-9.819178 2.80548-1.40274 0-2.805479 1.40274-5.610959 1.40274-4.208219 1.40274-8.416438 1.40274-12.624658 2.805479h-2.805479c-5.610959 1.40274-11.221918 2.805479-16.832877 2.80548-1.40274 0-4.208219 0-5.610959 1.402739-4.208219 1.40274-8.416438 1.40274-12.624657 2.80548-2.805479 0-4.208219 1.40274-7.013699 1.402739-4.208219 0-8.416438 1.40274-11.221918 1.40274-2.805479 0-4.208219 0-7.013698 1.40274-4.208219 0-8.416438 1.40274-12.624658 1.40274-2.805479 0-4.208219 0-7.013698 1.402739-5.610959 1.40274-12.624658 1.40274-18.235617 1.40274h-1.40274c-7.013699 0-14.027397 1.40274-21.041096 1.40274h-7.013698c-5.610959 0-11.221918 1.40274-15.430137 1.40274h-8.416439c-5.610959 0-9.819178 0-15.430137 1.402739H447.473973c-5.610959 0-11.221918 0-15.430137-1.402739h-8.416439c-5.610959 0-11.221918-1.40274-16.832876-1.40274h-7.013699c-7.013699 0-15.430137-1.40274-22.443836-1.40274h-2.805479c-5.610959 0-12.624658-1.40274-18.235617-1.40274-2.805479 0-4.208219 0-7.013698-1.402739-4.208219 0-9.819178-1.40274-14.027397-1.40274-2.805479 0-4.208219 0-7.013699-1.40274-4.208219 0-8.416438-1.40274-12.624658-1.40274-2.805479 0-4.208219 0-7.013698-1.402739-4.208219-1.40274-9.819178-1.40274-14.027398-2.80548-1.40274 0-2.805479 0-4.208219-1.402739-5.610959-1.40274-11.221918-2.805479-16.832876-2.80548-1.40274 0-2.805479 0-2.80548-1.40274-4.208219-1.40274-8.416438-1.40274-12.624657-2.805479-1.40274 0-2.805479-1.40274-5.610959-1.40274-2.805479-1.40274-7.013699-1.40274-9.819178-2.805479-1.40274 0-2.805479-1.40274-5.610959-1.40274-2.805479-1.40274-7.013699-1.40274-9.819178-2.805479-1.40274 0-2.805479-1.40274-4.20822-1.40274-4.208219-1.40274-7.013699-2.805479-11.221917-2.80548h-2.80548l-12.624657-4.208219c-1.40274 0-1.40274 0-2.80548-1.40274-2.805479-1.40274-5.610959-2.805479-8.416438-2.805479-1.40274 0-2.805479-1.40274-4.208219-1.40274-2.805479-1.40274-5.610959-1.40274-7.013699-2.805479-1.40274 0-2.805479-1.40274-2.805479-1.40274-2.805479-1.40274-4.208219-1.40274-7.013699-2.805479-1.40274 0-1.40274-1.40274-2.80548-1.40274l-8.416438-4.208219-8.416438-4.208219s-1.40274 0-1.40274-1.40274c-1.40274-1.40274-4.208219-1.40274-5.610959-2.80548-1.40274 0-1.40274-1.40274-2.805479-1.402739-1.40274-1.40274-2.805479-1.40274-4.208219-2.80548l-1.40274-1.402739c0 1.40274-1.40274 0-2.80548-1.40274 0 0-1.40274 0-1.402739-1.40274-4.208219-2.805479-7.013699-4.208219-9.819178-5.610959 0 0-1.40274 0-1.40274-1.40274-1.40274 0-1.40274-1.40274-2.80548-1.402739 0 0-1.40274 0-1.402739-1.40274 0 0-1.40274 0-1.40274-1.40274V504.986301s1.40274 1.40274 2.805479 1.40274l8.416439 4.208219c1.40274 0 2.805479 1.40274 4.208219 1.40274 2.805479 1.40274 7.013699 2.805479 9.819178 4.208219 1.40274 0 1.40274 1.40274 2.805479 1.40274 4.208219 1.40274 9.819178 4.208219 14.027398 5.610959 1.40274 0 2.805479 1.40274 4.208219 1.40274 4.208219 1.40274 7.013699 2.805479 11.221918 4.208219 1.40274 1.40274 4.208219 1.40274 7.013698 2.805479 4.208219 1.40274 7.013699 2.805479 11.221918 4.208219 2.805479 1.40274 4.208219 1.40274 7.013699 2.80548l12.624657 4.208219c2.805479 0 4.208219 1.40274 7.013699 1.40274 7.013699 1.40274 12.624658 4.208219 19.638356 5.610959h2.80548c5.610959 1.40274 12.624658 2.805479 18.235616 4.208219 2.805479 0 5.610959 1.40274 8.416438 1.40274 5.610959 1.40274 9.819178 2.805479 15.430137 2.805479 2.805479 0 5.610959 1.40274 9.819178 1.40274 5.610959 1.40274 11.221918 1.40274 16.832877 2.805479 2.805479 0 5.610959 1.40274 9.819178 1.40274 7.013699 1.40274 14.027397 1.40274 19.638356 2.805479 2.805479 0 4.208219 0 7.013699 1.40274 9.819178 1.40274 18.235616 2.805479 28.054794 2.805479 2.805479 0 5.610959 0 8.416439 1.40274 7.013699 1.40274 15.430137 1.40274 22.443835 1.40274 4.208219 0 7.013699 0 11.221918 1.40274 7.013699 0 14.027397 1.40274 21.041096 1.402739h12.624658c7.013699 0 15.430137 0 23.846575 1.40274h93.983562c7.013699 0 15.430137 0 22.443835-1.40274h12.624658c7.013699 0 14.027397-1.40274 21.041096-1.402739 4.208219 0 7.013699 0 11.221918-1.40274 7.013699 0 14.027397-1.40274 21.041095-1.40274 2.805479 0 5.610959 0 8.416439-1.40274 9.819178-1.40274 18.235616-1.40274 28.054794-2.805479h2.80548c8.416438-1.40274 15.430137-2.805479 23.846575-2.805479 2.805479 0 5.610959-1.40274 8.416438-1.40274 5.610959-1.40274 11.221918-1.40274 16.832877-2.80548 2.805479 0 5.610959-1.40274 8.416439-1.402739 5.610959-1.40274 9.819178-1.40274 14.027397-2.80548 2.805479 0 5.610959-1.40274 8.416438-1.402739 5.610959-1.40274 9.819178-2.805479 14.027397-2.80548 2.805479 0 4.208219-1.40274 7.013699-1.40274 7.013699-1.40274 12.624658-2.805479 19.638356-5.610959 1.40274 0 2.805479 0 2.80548-1.402739 5.610959-1.40274 9.819178-2.805479 15.430137-4.208219 1.40274 0 4.208219-1.40274 5.610959-1.40274 4.208219-1.40274 7.013699-2.805479 11.221917-4.208219 1.40274-1.40274 4.208219-1.40274 5.610959-2.80548 2.805479-1.40274 7.013699-2.805479 9.819178-4.208219 1.40274-1.40274 4.208219-1.40274 5.610959-2.805479 2.805479-1.40274 7.013699-2.805479 9.819178-4.20822 1.40274 0 2.805479-1.40274 4.208219-1.402739 4.208219-1.40274 8.416438-4.208219 12.624658-5.610959 1.40274 0 1.40274-1.40274 2.805479-1.40274 2.805479-1.40274 7.013699-2.805479 9.819179-4.208219h1.402739v138.871233c-4.208219 0-5.610959 1.40274-7.013698 1.402739 1.40274 0 0 0 0 0z m2.805479-224.438356c0 1.40274-1.40274 1.40274 0 0-1.40274 1.40274-1.40274 1.40274-2.805479 1.40274l-2.80548 2.805479c-1.40274 1.40274-2.805479 1.40274-4.208219 2.80548 0 0-1.40274 0-1.40274 1.40274-1.40274 1.40274-2.805479 1.40274-4.208219 2.805479l-1.40274 1.40274c-1.40274 0-2.805479 1.40274-2.805479 2.805479-1.40274 0-1.40274 1.40274-2.80548 1.40274-1.40274 1.40274-2.805479 1.40274-4.208219 2.805479-1.40274 0-1.40274 1.40274-2.805479 1.40274-1.40274 1.40274-2.805479 1.40274-5.610959 2.80548 0 0-1.40274 0-1.40274 1.402739-2.805479 1.40274-4.208219 2.805479-7.013698 4.20822-1.40274 0-1.40274 1.40274-2.80548 1.402739-1.40274 1.40274-4.208219 1.40274-5.610959 2.80548-1.40274 0-2.805479 1.40274-2.805479 1.402739-1.40274 1.40274-4.208219 1.40274-5.610959 2.80548-1.40274 0-2.805479 1.40274-4.208219 1.40274-1.40274 1.40274-4.208219 1.40274-7.013699 2.805479-1.40274 0-2.805479 1.40274-4.208219 1.40274-2.805479 1.40274-5.610959 1.40274-8.416438 2.805479-1.40274 0-1.40274 0-2.80548 1.40274-4.208219 1.40274-7.013699 2.805479-11.221918 4.208219-1.40274 0-2.805479 1.40274-4.208219 1.40274-2.805479 1.40274-5.610959 1.40274-8.416438 2.805479-1.40274 0-2.805479 1.40274-5.610959 1.40274-2.805479 1.40274-5.610959 1.40274-8.416439 2.805479-1.40274 0-4.208219 1.40274-5.610958 1.40274-2.805479 1.40274-5.610959 1.40274-9.819178 2.80548-1.40274 0-2.805479 1.40274-5.610959 1.402739-4.208219 1.40274-8.416438 1.40274-12.624658 2.80548h-2.805479c-5.610959 1.40274-11.221918 2.805479-16.832877 2.805479-1.40274 0-4.208219 0-5.610959 1.40274-4.208219 1.40274-8.416438 1.40274-12.624658 2.805479-2.805479 0-4.208219 1.40274-7.013698 1.40274-4.208219 0-8.416438 1.40274-11.221918 1.40274-2.805479 0-4.208219 0-7.013699 1.40274-4.208219 0-8.416438 1.40274-12.624657 1.402739-2.805479 0-4.208219 0-7.013699 1.40274-5.610959 1.40274-12.624658 1.40274-19.638356 1.40274h-1.40274c-7.013699 0-14.027397 1.40274-22.443835 1.40274h-7.013699c-5.610959 0-9.819178 1.40274-15.430137 1.402739h-8.416438c-5.610959 0-9.819178 0-15.430137 1.40274H446.071233c-5.610959 0-11.221918 0-15.430137-1.40274h-8.416438c-5.610959 0-11.221918-1.40274-16.832877-1.402739h-7.013699c-7.013699 0-15.430137-1.40274-22.443835-1.40274h-2.80548c-5.610959 0-12.624658-1.40274-18.235616-1.40274-2.805479 0-4.208219 0-7.013699-1.40274-4.208219 0-8.416438-1.40274-14.027397-1.402739-2.805479 0-4.208219 0-7.013699-1.40274-4.208219 0-8.416438-1.40274-12.624657-1.40274-2.805479 0-4.208219 0-7.013699-1.40274-4.208219-1.40274-8.416438-1.40274-14.027397-2.805479-1.40274 0-2.805479 0-4.208219-1.40274-5.610959-1.40274-11.221918-2.805479-16.832877-2.805479-1.40274 0-2.805479 0-4.208219-1.40274-4.208219-1.40274-8.416438-1.40274-12.624658-2.805479-1.40274 0-4.208219-1.40274-5.610959-1.40274-2.805479-1.40274-7.013699-1.40274-9.819178-2.80548-1.40274 0-4.208219-1.40274-5.610959-1.402739-2.805479-1.40274-7.013699-1.40274-9.819178-2.80548-1.40274 0-2.805479-1.40274-4.208219-1.402739-4.208219-1.40274-7.013699-1.40274-9.819178-2.80548-1.40274 0-1.40274 0-2.80548-1.40274l-12.624657-4.208219c-1.40274 0-2.805479-1.40274-2.80548-1.40274-2.805479-1.40274-5.610959-1.40274-8.416438-2.805479-1.40274 0-2.805479-1.40274-4.208219-1.40274-2.805479-1.40274-4.208219-1.40274-7.013699-2.805479-1.40274 0-2.805479-1.40274-4.208219-1.40274-2.805479-1.40274-4.208219-1.40274-7.013699-2.805479-1.40274 0-2.805479-1.40274-2.805479-1.40274-2.805479-1.40274-5.610959-2.805479-7.013699-2.805479h-1.402739l-8.416439-4.20822c-1.40274 0-1.40274-1.40274-2.805479-1.402739-1.40274-1.40274-2.805479-1.40274-5.610959-2.80548-1.40274 0-1.40274-1.40274-2.805479-1.40274-1.40274-1.40274-2.805479-1.40274-4.20822-2.805479-1.40274 0-1.40274-1.40274-2.805479-1.40274 5.610959-2.805479 4.208219-4.208219 2.805479-4.208219l-1.402739-1.40274c-1.40274-1.40274-2.805479-1.40274-4.20822-2.805479 0 0-1.40274 0-1.402739-1.40274-1.40274-1.40274-2.805479-1.40274-4.208219-2.805479l-1.40274-1.40274c-1.40274 0-1.40274-1.40274-2.80548-1.40274l-1.402739-1.402739h-1.40274v-137.468494c1.40274 0 1.40274 1.40274 2.805479 1.40274 4.208219 2.805479 7.013699 4.208219 11.221918 7.013699 1.40274 1.40274 2.805479 1.40274 4.208219 2.805479l16.832877 8.416439c1.40274 0 2.805479 1.40274 4.208219 1.402739 4.208219 1.40274 9.819178 4.208219 14.027397 5.610959 1.40274 1.40274 4.208219 1.40274 5.610959 2.80548 4.208219 1.40274 9.819178 4.208219 14.027398 5.610959 1.40274 0 2.805479 1.40274 4.208219 1.402739 7.013699 2.805479 12.624658 4.208219 19.638356 7.013699 1.40274 0 4.208219 1.40274 5.610959 1.40274 5.610959 1.40274 11.221918 2.805479 15.430137 4.208219 2.805479 0 4.208219 1.40274 7.013699 1.40274l16.832876 4.208219c1.40274 0 2.805479 1.40274 5.610959 1.402739 7.013699 1.40274 15.430137 2.805479 22.443836 4.20822 2.805479 0 4.208219 1.40274 7.013698 1.402739 5.610959 1.40274 11.221918 2.805479 16.832877 2.80548 2.805479 0 5.610959 1.40274 8.416438 1.40274 7.013699 1.40274 12.624658 1.40274 19.638357 2.805479 1.40274 0 4.208219 0 5.610959 1.40274 8.416438 1.40274 15.430137 2.805479 23.846575 2.805479 2.805479 0 5.610959 0 8.416438 1.40274 5.610959 0 11.221918 1.40274 18.235617 1.40274 2.805479 0 5.610959 0 8.416438 1.402739 7.013699 0 14.027397 1.40274 21.041096 1.40274h4.208219c8.416438 0 16.832877 1.40274 25.249315 1.40274H535.846575c141.676712-2.805479 280.547945-29.457534 361.90685-77.150685v136.065753z m-392.767123-342.268493c256.70137 0 395.572603 71.539726 395.572603 108.010959v5.610959c-2.805479 8.416438-9.819178 15.430137-21.041096 23.846575-1.40274 0-1.40274 1.40274-2.80548 1.40274-2.805479 1.40274-5.610959 4.208219-8.416438 5.610959-21.041096 12.624658-53.30411 26.652055-93.983562 37.873972-1.40274 0-2.805479 1.40274-4.208219 1.40274-7.013699 1.40274-14.027397 4.208219-21.041096 5.610959-4.208219 1.40274-9.819178 2.805479-15.430137 2.80548-2.805479 1.40274-7.013699 1.40274-9.819178 2.805479-8.416438 1.40274-15.430137 2.805479-23.846575 4.208219-1.40274 0-2.805479 0-4.208219 1.40274-9.819178 1.40274-19.638356 2.805479-30.860274 4.208219h-2.80548l-33.665753 4.208219h-2.80548c-11.221918 1.40274-22.443836 1.40274-35.068493 2.80548H589.150685c-12.624658 1.40274-23.846575 1.40274-36.471233 1.402739H509.194521h-1.40274c-216.021918 0-349.282192-50.49863-385.753425-88.372602-7.013699-7.013699-9.819178-14.027397-9.819178-19.638356 0-33.665753 138.871233-105.205479 395.572603-105.20548z m392.767123 781.326028c-26.652055 21.041096-129.052055 84.164384-388.558904 84.164383-260.909589 0-371.726027-63.123288-402.586301-85.567123v-134.663014s1.40274 0 1.402739 1.40274c1.40274 1.40274 4.208219 2.805479 7.013699 4.208219 1.40274 0 2.805479 1.40274 4.208219 1.40274 2.805479 1.40274 7.013699 2.805479 11.221918 4.208219 1.40274 0 1.40274 1.40274 2.805479 1.40274 4.208219 1.40274 9.819178 4.208219 14.027398 5.610959 1.40274 0 2.805479 1.40274 4.208219 1.402739 4.208219 1.40274 7.013699 2.805479 11.221918 4.208219 1.40274 1.40274 4.208219 1.40274 5.610959 1.40274 4.208219 1.40274 7.013699 2.805479 11.221917 4.208219 2.805479 1.40274 4.208219 1.40274 7.013699 2.80548l12.624658 4.208219c1.40274 0 4.208219 1.40274 5.610958 1.40274 7.013699 1.40274 12.624658 4.208219 21.041096 5.610959h2.80548c5.610959 1.40274 12.624658 2.805479 19.638356 4.208219 2.805479 0 5.610959 1.40274 7.013699 1.402739 5.610959 1.40274 9.819178 2.805479 15.430137 2.80548 2.805479 0 5.610959 1.40274 8.416438 1.40274 5.610959 1.40274 11.221918 1.40274 16.832877 2.805479 2.805479 0 5.610959 1.40274 8.416438 1.40274 7.013699 1.40274 14.027397 1.40274 21.041096 2.805479 2.805479 0 4.208219 0 7.013699 1.40274 9.819178 1.40274 18.235616 2.805479 28.054794 2.805479 2.805479 0 5.610959 0 8.416438 1.40274 7.013699 1.40274 15.430137 1.40274 22.443836 1.40274 4.208219 0 7.013699 0 11.221918 1.40274 7.013699 0 14.027397 1.40274 21.041096 1.402739h12.624657c7.013699 0 15.430137 0 23.846576 1.40274h93.983561c8.416438 0 15.430137 0 22.443836-1.40274h11.221918c7.013699 0 14.027397-1.40274 21.041096-1.402739 4.208219 0 7.013699 0 11.221917-1.40274 7.013699 0 14.027397-1.40274 21.041096-1.40274 2.805479 0 5.610959 0 8.416439-1.40274 9.819178-1.40274 18.235616-1.40274 28.054794-2.805479h2.80548c8.416438-1.40274 16.832877-2.805479 23.846575-2.805479 2.805479 0 5.610959-1.40274 8.416438-1.40274 5.610959-1.40274 11.221918-1.40274 16.832877-2.80548 2.805479 0 5.610959-1.40274 8.416438-1.402739 5.610959-1.40274 9.819178-1.40274 15.430137-2.80548 2.805479 0 5.610959-1.40274 8.416439-1.40274 5.610959-1.40274 9.819178-2.805479 15.430137-2.805479 1.40274 0 4.208219-1.40274 5.610959-1.40274 7.013699-1.40274 12.624658-2.805479 19.638356-5.610959 1.40274 0 1.40274 0 2.805479-1.402739 5.610959-1.40274 11.221918-2.805479 15.430137-4.208219 1.40274 0 4.208219-1.40274 5.610959-1.40274 4.208219-1.40274 7.013699-2.805479 11.221918-4.208219 1.40274 0 4.208219-1.40274 5.610959-2.80548 2.805479-1.40274 7.013699-2.805479 9.819178-4.208219 1.40274 0 2.805479-1.40274 5.610959-1.40274 4.208219-1.40274 7.013699-2.805479 9.819178-4.208219 1.40274 0 2.805479-1.40274 4.208219-1.40274 4.208219-1.40274 8.416438-4.208219 12.624658-5.610959 0 0 1.40274 0 1.402739-1.402739 4.208219-1.40274 7.013699-2.805479 9.819178-5.610959h1.40274v134.663014z" fill="#464646" p-id="4586"></path></svg>
AopenGauss-visualtool-plugin/web-ui/src/assets/icons/svg/mysql.svg+17-0
@@ -0,0 +1,17 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 388.12 264.29" width="388.12" height="264.29" preserveAspectRatio="xMinYMin meet">
3+ <g display="inline" transform="matrix(1.8189257,0,0,1.8237746,-82.14211,-64.843651)">
4+ <g transform="matrix(1.2699241,0,0,-1.2699241,3.3662307,208.12494)">
5+ <g transform="scale(0.1,0.1)">
6+ <path fill-rule="nonzero" fill="#00758F" d="m733.07,319.32-64.832,0c-2.28,109.43-8.6,212.33-18.93,308.72h-0.57104l-98.711-308.72h-49.363l-98.113,308.72h-0.578c-7.28-92.57-11.86-195.47-13.77-308.72h-59.113c3.82,137.73,13.38,266.84,28.68,387.36h80.356l93.535-284.62h0.57397l94.109,284.62h76.887c16.836-141.15,26.778-270.3,29.832-387.36"/>
7+ <path fill-rule="nonzero" fill="#00758F" d="m1014.3,605.11c-26.401-143.25-61.225-247.35-104.45-312.29-33.679-50.039-70.574-75.058-110.75-75.058-10.71,0-23.917,3.226-39.589,9.636v34.532c7.656-1.121,16.64-1.719,26.972-1.719,18.743,0,33.848,5.18,45.34,15.519,13.762,12.598,20.649,26.758,20.649,42.45,0,10.718-5.372,32.711-16.067,65.98l-71.152,220.95h63.691l51.067-165.25c11.472-37.519,16.257-63.711,14.343-78.64,27.93,74.601,47.442,155.9,58.543,243.89h61.401"/>
8+ <path fill-rule="nonzero" fill="#F29111" d="m1298.3,426.69c0-32.851-12.07-59.82-36.13-80.921-24.08-21.008-56.43-31.54-96.94-31.54-37.89,0-74.61,12.122-110.18,36.168l16.64,33.274c30.61-15.301,58.31-22.942,83.18-22.942,23.33,0,41.59,5.192,54.8,15.45,13.18,10.332,21.08,24.742,21.08,43.019,0,23-16.04,42.66-45.47,59.153-27.17,14.91-81.47,46.039-81.47,46.039-29.42,21.461-44.17,44.488-44.17,82.429,0,31.379,11,56.742,32.97,76.039,22.02,19.336,50.43,29.004,85.22,29.004,35.96,0,68.66-9.597,98.11-28.722l-14.96-33.243c-25.2,10.684-50.05,16.047-74.55,16.047-19.88,0-35.2-4.773-45.88-14.375-10.74-9.519-17.38-21.769-17.38-36.699,0-22.941,16.39-42.84,46.65-59.652,27.51-14.918,83.14-46.649,83.14-46.649,30.26-21.422,45.34-44.261,45.34-81.879"/>
9+ <path fill-rule="evenodd" fill="#F29111" d="m1414.2,396.81c-15.69,25.25-23.55,65.769-23.55,121.64,0,97.539,29.66,146.34,88.95,146.34,31,0,53.75-11.672,68.3-34.992,15.67-25.262,23.53-65.43,23.53-120.52,0-98.32-29.66-147.5-88.95-147.5-30.99,0-53.75,11.66-68.28,35.028m230.68-86.829-71.2,35.11c6.3401,5.199,12.36,10.808,17.81,17.301,30.23,35.539,45.36,88.14,45.36,157.78,0,128.15-50.31,192.26-150.92,192.26-49.35,0-87.81-16.25-115.35-48.797-30.24-35.582-45.34-87.985-45.34-157.23,0-68.089,13.38-118.04,40.16-149.77,24.4-28.68,61.3-43.04,110.7-43.04,18.43,0,35.34,2.269,50.71,6.808l92.72-53.957,25.28,43.539"/>
10+ <path fill-rule="nonzero" fill="#F29111" d="m1877.3,319.32-184.19,0,0,387.36,61.98,0,0-339.71,122.21,0,0-47.649"/>
11+ <path fill-rule="nonzero" fill="#F29111" d="m1921.5,319.36,10.27,0,0,39.411,13.44,0,0,8.05-37.67,0,0-8.05,13.96,0,0-39.411zm78.15,0,9.6801,0,0,47.461-14.56,0-11.85-32.351-12.9,32.351-14.03,0,0-47.461,9.1599,0,0,36.121,0.5201,0,13.51-36.121,6.9799,0,13.49,36.121,0-36.121"/>
12+ <path fill-rule="evenodd" fill="#00758F" d="m1955.1,836.43c-37.46,0.93695-66.47-2.801-90.8-13.106-7.02-2.805-18.24-2.805-19.2-11.699,3.77-3.738,4.2201-9.817,7.52-14.988,5.6-9.36,15.41-21.977,24.32-28.547,9.8299-7.492,19.66-14.953,29.97-21.504,18.24-11.281,38.84-17.805,56.6-29.043,10.33-6.543,20.59-14.961,30.92-22,5.13-3.742,8.38-9.836,14.96-12.152v1.417c-3.3001,4.2-4.22,10.286-7.48,14.993-4.67,4.644-9.36,8.883-14.05,13.543-13.58,18.25-30.45,34.148-48.66,47.254-14.99,10.324-47.77,24.367-53.83,41.632,0,0-0.49,0.49597-0.95,0.95697,10.3,0.95001,22.49,4.7,32.31,7.539,15.89,4.2,30.4,3.25,46.78,7.45,7.5,1.886,14.99,4.242,22.51,6.543v4.242c-8.47,8.4059-14.53,19.656-23.42,27.605-23.85,20.586-50.09,40.696-77.23,57.571-14.53,9.363-33.25,15.418-48.7,23.394-5.5899,2.813-14.94,4.199-18.23,8.906-8.4301,10.293-13.13,23.848-19.2,36.036-13.56,25.713-26.69,54.253-38.37,81.443-8.4199,18.24-13.57,36.48-23.87,53.34-48.23,79.58-100.63,127.76-181.13,175.04-17.32,9.84-37.91,14.05-59.89,19.2-11.72,0.49-23.41,1.4-35.11,1.86-7.5,3.29-15,12.19-21.54,16.4-26.69,16.84-95.46,53.34-115.13,5.14-12.64-30.44,18.72-60.38,29.49-75.83,7.9499-10.75,18.26-22.94,23.85-35.09,3.2801-7.96,4.22-16.4,7.51-24.81,7.48-20.59,14.49-43.53,24.34-62.73,5.13-9.8299,10.74-20.14,17.29-28.99,3.7799-5.1799,10.31-7.49,11.72-15.94-6.53-9.35-7.04-23.39-10.78-35.1-16.84-52.89-10.3-118.41,13.58-157.25,7.47-11.699,25.28-37.449,49.15-27.597,21.06,8.4098,16.38,35.089,22.46,58.476,1.3999,5.6562,0.4599,9.3668,3.26,13.106v-0.94592c6.5499-13.086,13.12-25.691,19.2-38.84,14.53-22.91,39.78-46.785,60.86-62.683,11.2-8.457,20.1-22.942,34.14-28.106v1.414h-0.92c-2.82,4.1998-7.0199,6.086-10.77,9.3478-8.4201,8.4299-17.76,18.731-24.34,28.086-19.65,26.199-36.99,55.234-52.4,85.184-7.5099,14.543-14.05,30.441-20.14,44.941-2.8001,5.5901-2.8001,14.039-7.4901,16.84-7.0399-10.285-17.31-19.191-22.45-31.789-8.9-20.149-9.8299-44.949-13.13-70.703-1.86-0.48895-0.92,0-1.86-0.92999-14.96,3.7419-20.11,19.184-25.74,32.246-14.04,33.274-16.4,86.627-4.2099,125.01,3.26,9.8101,17.34,40.7,11.7,50.06-2.8299,8.9299-12.18,14.03-17.32,21.08-6.0701,8.89-12.66,20.1-16.83,29.95-11.24,26.2-16.89,55.23-29.02,81.43-5.62,12.19-15.47,24.83-23.4,36.04-8.91,12.64-18.73,21.53-25.76,36.49-2.3201,5.16-5.6001,13.59-1.87,19.19,0.9199,3.75,2.8199,5.1601,6.5699,6.1001,6.0501,5.1499,23.39-1.39,29.46-4.2,17.33-7,31.84-13.59,46.33-23.4,6.5599-4.6899,13.58-13.58,21.99-15.94h9.8499c14.97-3.25,31.83-0.91,45.88-5.14,24.79-7.95,47.25-19.65,67.39-32.29,61.29-38.85,111.84-94.09,145.99-160.07,5.63-10.75,7.99-20.59,13.13-31.8,9.83-22.98,22.01-46.38,31.82-68.823,9.8201-22,19.2-44.446,33.26-62.727,7-9.812,35.09-14.961,47.73-20.113,9.3401-4.199,23.87-7.949,32.3-13.09,15.91-9.812,31.79-21.062,46.79-31.844,7.4699-5.617,30.88-17.304,32.29-26.679"/>
13+ <path fill-rule="evenodd" fill="#00758F" d="m1477.7,1243.2c-7.9399,0-13.54-0.96-19.19-2.3501v-0.9399h0.91c3.7799-7.47,10.34-12.66,14.98-19.2,3.77-7.4902,7.0499-14.95,10.79-22.45,0.4599,0.4599,0.9099,0.9501,0.9099,0.9501,6.5999,4.6599,9.87,12.14,9.87,23.39-2.83,3.3001-3.2701,6.5501-5.63,9.8401-2.8,4.6699-8.89,7.01-12.64,10.76"/>
14+ </g>
15+ </g>
16+ </g>
17+</svg>
AopenGauss-visualtool-plugin/web-ui/src/assets/icons/svg/opengaussdb.svg+9-0
@@ -0,0 +1,9 @@
1+<svg version="1.2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
2+ <title>favicon</title>
3+ <defs>
4+ <image width="32" height="32" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAj1QTFRF////KKbfKKbfKKbfKKbfKKbfKKbfKKbfKKbfKKbfKKbfKKbfKKbfJ6TeJ6TeJ6TeJ6TeJ6TeJ6TeJ6TeJqLcJqLcJqLcJqLcJqLcJqLcJqLcJqLcI5/ZI5/ZI5/ZI5/ZI5/ZI5/ZI5/ZIpzWIpzWIpzWIpzWIpzWIpzWIpzWIpzWIpzWIpzWIpzWIJrTIJrTIJrTIJrTIJrTIJrTIJrTIJrTIJrTIJrTHpfRHpfRHpfRHpfRHpfRHpfRHpfRHpfRHZXOHZXOHZXOHZXOHZXOHZXOHZXOHJLMHJLMHJLMHJLMHJLMHJLMHJLMHJDJHJDJHJDJHJDJHJDJHJDJG47HG47HG47HG47HG47HG4vFG4vFG4vFG4vFG4vFG4nCG4nCG4nCG4nCG4nCG4nCG4nCG4a/G4a/G4a/G4a/G4a/G4a/G4a/GoS9GoS9GoS9GoS9GoS9GoG6GoG6GoG6GoG6GoG6GoG6F3+4F3+4F3+4F3+4F3+4FH22FH22FH22FH22FH22FH22FH22FH22FH22EHqzEHqzEHqzEHqzEHqzEHqzDXexDXexDXexDXexDXexDXexDXexCXWuCXWuCXWuCXWuCXWuCXWuCHOsCHOsCHOsCHOsCHOsCHOsBHGqBHGqBHGqBHGqBHGqBHGqBHGqAG6oAG6oAG6oAG6oAG6oAG6oAG6oAGylAGylAGylAGylAGylAWqjAWqjAWqjAWqjAmihAmihAmihBGafBGafBGafBGafBWSdBWSdBWSdQ0uaBQAAAL90Uk5TACCg/0AQgPBQ4MAwYBCQ//BgQNBg8P+AECCg4EDA/yAQgPCQ/+BQ0KAggPDAMED/8IAQwDAgoFdA/7Ag4GDAcED/8KAQcPdA/7Ag4BBwEPD/gFAfEKD/4FAwQMD/IED/gBBg8JBA//BgEICgQP/AMCAQ0P+gUOAQgP/wcECAILD/0BBg4ED/0OCwIED/sCCA8HBA//CAEKCQ/+BQQMBA0P/AIGDwYPD/gBBAcBCQ//BgMMD/IFDg/xCA//AgoP9OjM/CAAACMklEQVR4nH3T918ScRgH8I+RlrbLbIntPWzXZUMqK60wS1O0NFwoIokLUlDTwAVi7l3OnGmWpqX9bX2fL9yJDd+/8Hmez73ujrvXAR68Vslkq/Ff3j5rZCsdsNZXJlvhAC8/Xsv81rFhva+P9/J6w8ZNZPMWGrZuk6LIf3sA2bGT5V27A1z2+It1oDyIyPeyvG//gSCJPJD3Bw+Rw0f4cJQPx46fOMnDqdPAmWDm7LnzrrPRcOEiC5cuB3NXcFUQhGsh4uUE4foNdwy5yRrhFkIVituh0u0q7txduvewewpFGO4/YMIj3LuHj6Q6Ipyax1BGPiFRSr59KtbKKL6PfAZExzwnsXGeTyYuli9jogFVPFQJL0iCSqxfSot4FRKTXqmRnJJEUtVUq1P5kJJMKRFp6emaDGRq04kmS6vN0vCozUQGS2nQZTP618jRZ3vQ50DHFzoYcvNIvgEFhXluhQUw5POUa4DRaHpDiooBUxFPJqDYnYxGmC0oKS0jb80or7BYKsphfscXpSWwmGG1VVphrbKR6hr6FzXVfKhi60qbFbV2u91RB2e9nTicTgcP9e9RR6kWDY1MUzNaWhs9tLaguYlCA9DWTjo60dXd7tbdhc4Ontromj0fPpLePvQPUBjoR1+va9XjfvaDQ5/I8AhGx8ZGMTLMx6HBpZc3PvGZTE7RMDXJh4nxZV/Gl+mv3LT4+w1/mpn9Lpmd+atm5uZ/uPycn/tXzyws/mIWFzx3vwHc/gmiiX8o3AAAAABJRU5ErkJggg=="/>
5+ </defs>
6+ <style>
7+ </style>
8+ <use id="Background" href="#img1" x="0" y="0"/>
9+</svg>
AopenGauss-visualtool-plugin/web-ui/src/assets/images/right-arrow.png+0-0
MopenGauss-visualtool-plugin/web-ui/src/assets/logo.png+0-0
AopenGauss-visualtool-plugin/web-ui/src/assets/style/global.less+47-0
@@ -0,0 +1,47 @@
1+* {
2+ box-sizing: border-box;
3+}
4+ 
5+html,
6+body {
7+ width: 100%;
8+ height: 100%;
9+ margin: 0;
10+ padding: 0;
11+ font-size: 14px;
12+ background-color: var(--color-bg-1);
13+ -moz-osx-font-smoothing: grayscale;
14+ -webkit-font-smoothing: antialiased;
15+}
16+ 
17+#app {
18+ background: var(--color-bg-2);
19+}
20+ 
21+.arco-message-list-top {
22+ left: 0;
23+}
24+ 
25+.arco-btn-primary[type='button'] {
26+ color: var(--color-bg-2);
27+ 
28+ &:hover {
29+ color: var(--color-bg-2);
30+ }
31+ 
32+ &.arco-btn-loading {
33+ color: var(--color-bg-2);
34+ }
35+}
36+ 
37+.arco-steps-item-process .arco-steps-icon {
38+ color: var(--color-bg-1);
39+}
40+ 
41+.arco-checkbox-icon-check {
42+ color: var(--color-bg-1);
43+}
44+ 
45+.arco-checkbox-icon::after {
46+ background: var(--color-bg-1);
47+}
AopenGauss-visualtool-plugin/web-ui/src/components/index.js+8-0
@@ -0,0 +1,8 @@
1+import SvgIcon from './svg-icon/index.vue'
2+import { VAceEditor } from 'vue3-ace-editor'
3+export default {
4+ install (Vue) {
5+ Vue.component('svg-icon', SvgIcon)
6+ Vue.component('v-ace-editor', VAceEditor)
7+ }
8+}
AopenGauss-visualtool-plugin/web-ui/src/components/svg-icon/index.vue+15-0
@@ -0,0 +1,15 @@
1+<template>
2+ <svg class="arco-icon" aria-hidden="true">
3+ <use :xlink:href="iconName" />
4+ </svg>
5+</template>
6+ 
7+<script setup>
8+import { computed } from 'vue'
9+ 
10+const props = defineProps({
11+ iconClass: String
12+})
13+ 
14+const iconName = computed(() => `#icon-${props.iconClass}`)
15+</script>
AopenGauss-visualtool-plugin/web-ui/src/hooks/locale.js+16-0
@@ -0,0 +1,16 @@
1+import { computed } from 'vue'
2+import { useI18n } from 'vue-i18n'
3+ 
4+export default function useLocale () {
5+ const i18 = useI18n()
6+ const currentLocale = computed(() => {
7+ return i18.locale.value
8+ })
9+ const changeLocale = (value) => {
10+ i18.locale.value = value
11+ }
12+ return {
13+ currentLocale,
14+ changeLocale
15+ }
16+}
AopenGauss-visualtool-plugin/web-ui/src/hooks/theme.js+16-0
@@ -0,0 +1,16 @@
1+import { computed, ref } from 'vue'
2+ 
3+const theme = ref('')
4+ 
5+export default function useTheme () {
6+ const currentTheme = computed(() => {
7+ return theme.value
8+ })
9+ const changeTheme = (value) => {
10+ theme.value = value
11+ }
12+ return {
13+ currentTheme,
14+ changeTheme
15+ }
16+}
AopenGauss-visualtool-plugin/web-ui/src/locale/en-US.js+6-0
@@ -0,0 +1,6 @@
1+ 
2+import en from './locale/en.json'
3+ 
4+export default {
5+ ...en
6+}
AopenGauss-visualtool-plugin/web-ui/src/locale/index.js+22-0
@@ -0,0 +1,22 @@
1+import { createI18n } from 'vue-i18n'
2+import en from './en-US'
3+import cn from './zh-CN'
4+ 
5+export const LOCALE_OPTIONS = [
6+ { label: '简体中文', value: 'zh-CN' },
7+ { label: 'English', value: 'en-US' }
8+]
9+const defaultLocale = localStorage.getItem('locale') || 'zh-CN'
10+ 
11+const i18n = createI18n({
12+ locale: defaultLocale,
13+ fallbackLocale: 'en-US',
14+ globalInjection: true,
15+ allowComposition: true,
16+ messages: {
17+ 'en-US': en,
18+ 'zh-CN': cn
19+ }
20+})
21+ 
22+export default i18n
AopenGauss-visualtool-plugin/web-ui/src/locale/locale/en.json+349-0
@@ -0,0 +1,349 @@
1+{
2+ "list": {
3+ "index": {
4+ "5q08sf2dez80": "Please enter a task name",
5+ "5q08sf2dgxo0": "Select creator",
6+ "5q08sf2dh5g0": "Select status",
7+ "5q08sf2dha80": "Unstart",
8+ "5q08sf2dhek0": "Migrating",
9+ "5q08sf2dhj00": "Completed",
10+ "5q08sf2dhng0": "Execute start",
11+ "5q08sf2dhrk0": "Execute end",
12+ "5q08sf2dhvs0": "Complete start",
13+ "5q08sf2di4w0": "Complete end",
14+ "5q08sf2dikw0": "Search",
15+ "5q08sf2diqs0": "Reset",
16+ "5q08sf2diwc0": "Create migration task",
17+ "5q08sf2dj240": "Refresh",
18+ "5q08sf2dj5g0": "Batch deletion",
19+ "5q08sf2dj8k0": "Task name",
20+ "5q08sf2djbk0": "Creator",
21+ "5q08sf2djew0": "Status",
22+ "5q08sf2djks0": "Progress",
23+ "5q08sf2djoo0": "Execution time",
24+ "5q08sf2djt00": "Task creation time",
25+ "5q08sf2djvk0": "Task completion time",
26+ "5q08sf2djyc0": "Operate",
27+ "5q08sf2dk0o0": "Detail",
28+ "5q08sf2dk3c0": "End migration",
29+ "5q08sf2dk5s0": "Start",
30+ "5q08sf2dk800": "Are you sure to delete this task?",
31+ "5q08sf2dka40": "Delete",
32+ "5q08sf2dkc80": " h",
33+ "5q08sf2dkek0": " min"
34+ }
35+ },
36+ "components": {
37+ "MacTerminal": {
38+ "5q08wsv861k0": "Execution Machine"
39+ },
40+ "BigDataList": {
41+ "5q09jzwfo340": "Status",
42+ "5q09jzwfppw0": "Only error data is displayed: ",
43+ "5q09jzwfq5g0": "Verification",
44+ "5q09jzwfqa80": "Error details",
45+ "5q09jzwfqf40": "Table",
46+ "5q09jzwfqiw0": "View",
47+ "5q09jzwfqm80": "Function",
48+ "5q09jzwfqp80": "Trigger",
49+ "5q09jzwfqs40": "Procedure",
50+ "5q09l2jkfp80": "Source: {sourceDb}",
51+ "5q09m4g78no0": "Destination: {targetDb}",
52+ "5q09nizckiw0": "Waiting: ",
53+ "5q09o79wsew0": "Execution: ",
54+ "5q09o79wvtw0": "Completion: ",
55+ "5q09o79ww2g0": "Failure: "
56+ },
57+ "SubTaskDetail": {
58+ "5q09prnzmfw0": "Log",
59+ "5q09prnzn6c0": "Status: ",
60+ "5q09prnznas0": "Loading",
61+ "5q09prnzne80": "Progress",
62+ "5q09prnzngw0": "Online Migration Process Record",
63+ "5q09prnznk00": "Fold",
64+ "5q09prnznms0": "UnFold",
65+ "5q09prnznpk0": "",
66+ "5q09prnzns40": "/s",
67+ "5q09prnznvg0": "Download log",
68+ "5q09prnznzg0": "Unstart",
69+ "5q09prnzo3s0": "Full migration start",
70+ "5q09prnzo6g0": "Full migration in progress",
71+ "5q09prnzoa00": "Full migration completed",
72+ "5q09prnzodo0": "Full verification start",
73+ "5q09prnzohc0": "Full verification in progress",
74+ "5q09prnzok00": "Full verification completed",
75+ "5q09prnzong0": "Incremental migration start",
76+ "5q09prnzoq80": "Incremental migration in progress",
77+ "5q09prnzotc0": "Incremental migration stopped",
78+ "5q09prnzoxc0": "Reverse migration started",
79+ "5q09prnzp000": "Reverse migration in progress",
80+ "5q09prnzp2k0": "Reverse migration stopped",
81+ "5q09prnzp540": "Migration complete",
82+ "5q09prnzp740": "Migration failed",
83+ "5q09prnzp980": "Waiting for resources",
84+ "5q09prnzpb80": "Start migration",
85+ "5q09prnzpd40": "Stop increment",
86+ "5q09prnzpfk0": "Start reverse",
87+ "5q09prnzphk0": "End migration",
88+ "5q09prnzpkg0": "Data verification sink log",
89+ "5q09prnzpmk0": "Data verification source end log",
90+ "5q09prnzpps0": "Data verification check terminal log",
91+ "5q09prnzprs0": "Full Migration Log",
92+ "5q09prnzpug0": "Incremental Migration Log",
93+ "5q09prnzpxc0": "Incrementally migrate source-side logs",
94+ "5q09prnzq080": "Incrementally migrate sink logs",
95+ "5q09prnzq2o0": "Reverse migration log",
96+ "5q09prnzq680": "Migrate source logs in reverse",
97+ "5q09prnzq880": "Migrate sink logs in reverse",
98+ "5q09prnzqac0": "Execution error log",
99+ "5q09prnzqck0": "Belongs to the task: ",
100+ "5q09prnzqew0": "Creation time: ",
101+ "5q09prnzqgw0": "Source library name: ",
102+ "5q09prnzqk00": "Destination library name: ",
103+ "5q09prnzqlw0": "Execution start time: ",
104+ "5q09prnzqnw0": "It has been executed:",
105+ "5q09prnzqpw0": " h",
106+ "5q09prnzqs00": " min",
107+ "5q09prnzqvk0": "Migration: ",
108+ "5q09prnzqxs0": "Full migration: ",
109+ "5q09prnzqzs0": "Execution time: ",
110+ "5q09prnzr2o0": "Incremental migration: ",
111+ "5q09prnzr4s0": "From source library to destination library: ",
112+ "5q09prnzux40": "Reverse migration: ",
113+ "5q09ruxan0s0": "Subtask Details (ID: {subTaskId}, ",
114+ "5q09t2cud100": "Offline mode",
115+ "5q09t2cudw80": "Online mode",
116+ "5q09tn4uzy40": "Cumulative number of incrementally migrated objects: ",
117+ "5q09urmrt580": "Incremental extraction speed: ",
118+ "5q09urmruc00": "Incremental write speed: ",
119+ "5q09urmruhc0": "Remaining data to be written: ",
120+ "5q09vm8iktw0": "zookeeper+kafka log",
121+ "5q09wjm47ow0": "schema-registry log",
122+ "5q09xhsvcq40": "Total migration objects: {total}, not started: {totalWaitCount}, migrating: {totalRunningCount}, successful: {totalFinishCount}, failed: {totalErrorCount}",
123+ "5q0a1jl7o9s0": "Total migration objects: {total}, not started: {totalWaitCount}, migrating: {totalRunningCount}, successful: {totalFinishCount}, failed: {totalErrorCount}",
124+ "5q0a5opxm3c0": "to"
125+ },
126+ "AddJdbc": {
127+ "5q0a7i439cg0": "To be detected",
128+ "5q0a7i43aeg0": "Available",
129+ "5q0a7i43ajk0": "Unavailable",
130+ "5q0a7i43amo0": "Cancel",
131+ "5q0a7i43ap40": "Test connectivity",
132+ "5q0a7i43as00": "Confirm",
133+ "5q0a7i43aw00": "Cluster name",
134+ "5q0a7i43bkk0": "Please enter an instance name",
135+ "5q0a7i43boo0": "The cluster name will be generated based on the instance information",
136+ "5q0a7i43br80": "Custom",
137+ "5q0a7i43bto0": "Database type",
138+ "5q0a7i43bwk0": "Please select a database type",
139+ "5q0a7i43bzk0": "Instance",
140+ "5q0a7i43c280": "Please enter a cluster name",
141+ "5q0a7i43c4s0": "Can not be a pure space",
142+ "5q0a7i43f3c0": "Add new data source"
143+ },
144+ "JdbcInstance": {
145+ "5q0a8km729o0": "Please select or enter IP",
146+ "5q0a8km736s0": "Port",
147+ "5q0a8km73bo0": "Please enter the port",
148+ "5q0a8km73f00": "Username",
149+ "5q0a8km73hs0": "Please enter user name",
150+ "5q0a8km73ko0": "Password",
151+ "5q0a8km73n80": "Please enter password",
152+ "5q0a8km73q00": "Extended Properties",
153+ "5q0a8km73uc0": "Add",
154+ "5q0a8km73xc0": "Delete",
155+ "5q0a8km74cw0": "Connection address",
156+ "5q0a8km74h00": "Extension name",
157+ "5q0a8km74kk0": "Extension value",
158+ "5q0a8km74n80": "Operate",
159+ "5q0a8km74po0": "Please select or enter an IP address",
160+ "5q0a8km74s40": "Please enter the correct IP address",
161+ "5q0a8km74uw0": "Please enter the correct port number",
162+ "5q0a8km74xk0": "Can not be a pure space",
163+ "5q0a8km75000": "Please enter user password",
164+ "5q0a9843uf40": "IP address"
165+ },
166+ "PortalInstall": {
167+ "5q0aajl75f00": "Migration Suite Installation",
168+ "5q0aajl76580": "Install user",
169+ "5q0aajl76io0": "Install user cannot be empty",
170+ "5q0aajl76ug0": "Please select an installer",
171+ "5q0aajl76xw0": "Install directory",
172+ "5q0aajl776k0": "The installation directory cannot be empty",
173+ "5q0aajl77f40": "Please enter the installation directory",
174+ "5q0aajl77ik0": "Cancel",
175+ "5q0aajl77lg0": "Confirm"
176+ },
177+ "ParamsConfig": {
178+ "5q0aazspots0": "Default parameter configuration",
179+ "5q0aazsppew0": "Subtask parameter configuration",
180+ "5q0aazsppjc0": "{num} subtasks use this configuration",
181+ "5q0aazsppm00": "Basic parameters",
182+ "5q0aazsppog0": "Parameter name",
183+ "5q0aazsppr80": "Value",
184+ "5q0aazspptw0": "Parameter Description",
185+ "5q0aazsppwg0": "Advanced parameters",
186+ "5q0aazsppz40": "Restore Defaults",
187+ "5q0aazspq200": "Use global configuration",
188+ "5q0aazspq4g0": "Save",
189+ "5q0aazspq7k0": "Source instance name: ",
190+ "5q0aazspqac0": "Destination instance name: ",
191+ "5q0aazspqd00": "Source library name: ",
192+ "5q0aazspqfs0": "Destination library name: "
193+ }
194+ },
195+ "task": {
196+ "index": {
197+ "5q08xss4gss0": "Create migration task",
198+ "5q08xss4j7o0": "Task name",
199+ "5q08xss4jkc0": "Please enter a task name",
200+ "5q08xss4k9w0": "Select source library and destination library",
201+ "5q08xss4khc0": "Configure migration process parameters",
202+ "5q08xss4kkw0": "Allocate Executor Resources",
203+ "5q08xss4kr40": "Prev",
204+ "5q08xss4kww0": "Next",
205+ "5q08xss4l2w0": "Confirm",
206+ "5q08zucvfwc0": "One subtask is from one source database to one destination database",
207+ "5q090g6io340": "Determine the execution parameters for each migration process",
208+ "5q090g6iouw0": "Choose the right machine to perform the migration process"
209+ }
210+ },
211+ "step1": {
212+ "index": {
213+ "5q091ixiemk0": "Source",
214+ "5q091ixig500": "Enter name",
215+ "5q091ixigdc0": "Add data source",
216+ "5q091ixiggs0": "Selected source database:",
217+ "5q091ixigjo0": "Destination",
218+ "5q091ixigog0": "Add subtask",
219+ "5q091ixigro0": "Source IP and port",
220+ "5q091ixigug0": "Source library name",
221+ "5q091ixigy80": "Destination IP and port",
222+ "5q091ixih280": "Target library name",
223+ "5q091ixih580": "Migration Mode",
224+ "5q091ixih8g0": "Offline mode: Automatically perform full migration and end automatically after completion to release resources.",
225+ "5q091ixihtg0": "Online mode: Full migration + incremental migration is automatically performed, and the reverse migration is manually started by the user. User operations are required to end the migration and release resources.",
226+ "5q091ixii200": "Select Mode",
227+ "5q091ixii5w0": "Offline mode",
228+ "5q091ixii8o0": "Online mode",
229+ "5q091ixiibk0": "Operate",
230+ "5q091ixiieo0": "Are you sure to delete this task?",
231+ "5q091ixiihc0": "Delete",
232+ "5q091ixiikk0": "Default"
233+ }
234+ },
235+ "step2": {
236+ "index": {
237+ "5q092waasqk0": "Tip: Each migration process requires parameter configuration, and DataKit has configured default parameters for each migration process (ie, subtask). You can also modify the parameter configuration of a certain migration process (subtask) in the table below to ensure the smooth execution of the migration process.",
238+ "5q092waatio0": "Default parameter configuration (global configuration)",
239+ "5q092waatnk0": "Source IP/port/name",
240+ "5q092waatqo0": "Destination IP/port/name",
241+ "5q092waau3o0": "Migration mode",
242+ "5q092waau8c0": "Offline mode",
243+ "5q092waaubo0": "Online mode",
244+ "5q092waaueg0": "Config type",
245+ "5q092waauhk0": "Default",
246+ "5q092waaukc0": "Personal",
247+ "5q092waaun40": "Search",
248+ "5q092waaw3w0": "Reset",
249+ "5q092waawag0": "Source IP and port",
250+ "5q092waawdo0": "Source library name",
251+ "5q092waawh80": "Destination IP and port",
252+ "5q092waawk00": "Target library name",
253+ "5q092wab7280": "Migration Mode",
254+ "5q092wab7fo0": "Operate",
255+ "5q092wab7k80": "Edit configuration"
256+ }
257+ },
258+ "step3": {
259+ "index": {
260+ "5q093f8y7g00": "Tip: DataKit tries to execute subtasks in parallel based on the principle of maximizing resource utilization, creates a data migration agent for each subtask (one machine can create multiple migration agents), and waits for resources to execute sequentially when resources are insufficient.",
261+ "5q093f8y8b40": "Machine IP",
262+ "5q093f8y8fs0": "Machine name",
263+ "5q093f8y8j40": "CPU cores",
264+ "5q093f8y8lw0": "Remaining memory",
265+ "5q093f8y8p40": "Remaining hard disk",
266+ "5q093f8y8ss0": "Search",
267+ "5q093f8y8vk0": "Reset",
268+ "5q093f8y8y80": "Migration subtasks: ",
269+ "5q093f8y91s0": "",
270+ "5q093f8y94c0": "Selected machine: ",
271+ "5q093f8y9740": "",
272+ "5q093f8y99s0": "Refresh",
273+ "5q093f8y9ck0": "Physical machine IP",
274+ "5q093f8y9fg0": "Physical machine name + OS",
275+ "5q093f8y9i40": "Configuration information",
276+ "5q093f8y9m80": "System:",
277+ "5q093f8y9p40": "Install the migration suite",
278+ "5q093f8y9rs0": "Start install",
279+ "5q093f8y9us0": "Log",
280+ "5q093f8y9zg0": "Re-install",
281+ "5q093f8ya2c0": "The Number executed",
282+ "5q093f8ya4w0": "Being executed",
283+ "5q093f8yabs0": "Maximum subtasks",
284+ "5q093f8yae80": "Uninstall",
285+ "5q093f8yagw0": "Installing",
286+ "5q093f8yajg0": "Installed",
287+ "5q093f8yals0": "Installation failed",
288+ "5q094h74md80": "User",
289+ "5q094raosqg0": "Directory",
290+ "5q096184bp80": ", CPU architecture: ",
291+ "5q097pi0m540": ", Number of CPU cores: {a}, remaining memory: {b}M, remaining hard disk capacity: {c}G"
292+ }
293+ },
294+ "detail": {
295+ "index": {
296+ "5q09asiwekc0": "Task status: ",
297+ "5q09asiwffw0": "Stop",
298+ "5q09asiwg0g0": "Total progress",
299+ "5q09asiwg4g0": "Refresh",
300+ "5q09asiwg7s0": "ID",
301+ "5q09asiwgb40": "Source IP and port",
302+ "5q09asiwifk0": "Source db name",
303+ "5q09asiwijw0": "Target IP and port",
304+ "5q09asiwing0": "Target db name",
305+ "5q09asiwiqk0": "Migration Process Pattern",
306+ "5q09asiwiyc0": "Offline mode",
307+ "5q09asiwj1o0": "Online mode",
308+ "5q09asiwj4g0": "Execution machine",
309+ "5q09asiwjvg0": "Status",
310+ "5q09asiwk6k0": "Migration failure details",
311+ "5q09asiwka80": "Operate",
312+ "5q09asiwkds0": "Detail",
313+ "5q09asiwkhg0": "Stop full amount",
314+ "5q09asiwkkw0": "Stop increment",
315+ "5q09asiwkq40": "Start reverse",
316+ "5q09asiwkuk0": "Stop reverse",
317+ "5q09asiwl5g0": "End migration",
318+ "5q09asiwlac0": "Log",
319+ "5q09asiwlcg0": "Unstart",
320+ "5q09asiwlew0": "Migrating",
321+ "5q09asiwltg0": "Completed",
322+ "5q09asiwlwc0": "Full migration start",
323+ "5q09asiwmi00": "Full migration in progress",
324+ "5q09asiwmow0": "Full migration completed",
325+ "5q09asiwmr40": "Full verification start",
326+ "5q09asiwmt80": "Full verification in progress",
327+ "5q09asiwmvg0": "Full verification completed",
328+ "5q09asiwmxg0": "Incremental migration start",
329+ "5q09asiwmzw0": "Incremental migration in progress",
330+ "5q09asiwn200": "Incremental migration stopped",
331+ "5q09asiwn4k0": "Reverse migration start",
332+ "5q09asiwna40": "Reverse migration in progress",
333+ "5q09asiwncc0": "Reverse migration stopped",
334+ "5q09asiwne80": "Migration complete",
335+ "5q09asiwngg0": "Migration failed",
336+ "5q09asiwnik0": "Waiting for resources",
337+ "5q09asiwnks0": "Creator: ",
338+ "5q09asiwnmw0": "Number of subtasks: ",
339+ "5q09asiwnow0": "Allocation execution machine: ",
340+ "5q09asiwnrs0": "Creation time: ",
341+ "5q09asiwnu40": "Number of subtasks (offline mode): ",
342+ "5q09asiwnw00": "Execution time: ",
343+ "5q09asiwny00": "Number of subtasks (online mode): ",
344+ "5q09cuenq100": "Data migration task details ({name})",
345+ "5q09efwo3nc0": "{num} units",
346+ "5q09frs8fh00": "Total: {total}, Not started: {notRunCount}, Running: {runningCount}, Migration completed: {finishCount}, Migration failed: {errorCount}"
347+ }
348+ }
349+}
AopenGauss-visualtool-plugin/web-ui/src/locale/locale/zh-cn.json+349-0
@@ -0,0 +1,349 @@
1+{
2+ "list": {
3+ "index": {
4+ "5q08sf2dez80": "请输入任务名称",
5+ "5q08sf2dgxo0": "请选择创建人",
6+ "5q08sf2dh5g0": "请选择状态",
7+ "5q08sf2dha80": "未启动",
8+ "5q08sf2dhek0": "迁移中",
9+ "5q08sf2dhj00": "已完成",
10+ "5q08sf2dhng0": "执行开始时间",
11+ "5q08sf2dhrk0": "执行结束时间",
12+ "5q08sf2dhvs0": "完成开始时间",
13+ "5q08sf2di4w0": "完成结束时间",
14+ "5q08sf2dikw0": "查询",
15+ "5q08sf2diqs0": "重置",
16+ "5q08sf2diwc0": "创建数据迁移任务",
17+ "5q08sf2dj240": "刷新",
18+ "5q08sf2dj5g0": "批量删除",
19+ "5q08sf2dj8k0": "任务名称",
20+ "5q08sf2djbk0": "创建人",
21+ "5q08sf2djew0": "执行状态",
22+ "5q08sf2djks0": "进度",
23+ "5q08sf2djoo0": "已执行时长",
24+ "5q08sf2djt00": "任务创建时间",
25+ "5q08sf2djvk0": "任务完成时间",
26+ "5q08sf2djyc0": "操作",
27+ "5q08sf2dk0o0": "详情",
28+ "5q08sf2dk3c0": "结束迁移",
29+ "5q08sf2dk5s0": "启动",
30+ "5q08sf2dk800": "你确认删除此任务吗?",
31+ "5q08sf2dka40": "删除",
32+ "5q08sf2dkc80": "小时",
33+ "5q08sf2dkek0": "分钟"
34+ }
35+ },
36+ "components": {
37+ "MacTerminal": {
38+ "5q08wsv861k0": "执行机器"
39+ },
40+ "BigDataList": {
41+ "5q09jzwfo340": "迁移状态",
42+ "5q09jzwfppw0": "仅显示错误数据:",
43+ "5q09jzwfq5g0": "迁移校验",
44+ "5q09jzwfqa80": "错误详情",
45+ "5q09jzwfqf40": "表",
46+ "5q09jzwfqiw0": "视图",
47+ "5q09jzwfqm80": "函数",
48+ "5q09jzwfqp80": "触发器",
49+ "5q09jzwfqs40": "存储过程",
50+ "5q09l2jkfp80": "源库:{sourceDb}",
51+ "5q09m4g78no0": "目的库:{targetDb}",
52+ "5q09nizckiw0": "等待数:",
53+ "5q09o79wsew0": "执行数:",
54+ "5q09o79wvtw0": "完成数:",
55+ "5q09o79ww2g0": "失败数:"
56+ },
57+ "SubTaskDetail": {
58+ "5q09prnzmfw0": "日志",
59+ "5q09prnzn6c0": "状态:",
60+ "5q09prnznas0": "数据加载中",
61+ "5q09prnzne80": "进度",
62+ "5q09prnzngw0": "在线迁移过程记录",
63+ "5q09prnznk00": "收起",
64+ "5q09prnznms0": "查看",
65+ "5q09prnznpk0": "条",
66+ "5q09prnzns40": "条/s",
67+ "5q09prnznvg0": "下载日志",
68+ "5q09prnznzg0": "未启动",
69+ "5q09prnzo3s0": "全量迁移开始",
70+ "5q09prnzo6g0": "全量迁移进行中",
71+ "5q09prnzoa00": "全量迁移完成",
72+ "5q09prnzodo0": "全量校验开始",
73+ "5q09prnzohc0": "全量校验中",
74+ "5q09prnzok00": "全量检验完成",
75+ "5q09prnzong0": "增量迁移开始",
76+ "5q09prnzoq80": "增量迁移进行中",
77+ "5q09prnzotc0": "增量迁移已停止",
78+ "5q09prnzoxc0": "反向迁移开始",
79+ "5q09prnzp000": "反向迁移进行中",
80+ "5q09prnzp2k0": "反向迁移已停止",
81+ "5q09prnzp540": "迁移完成",
82+ "5q09prnzp740": "迁移失败",
83+ "5q09prnzp980": "等待资源中",
84+ "5q09prnzpb80": "启动迁移",
85+ "5q09prnzpd40": "停止增量",
86+ "5q09prnzpfk0": "启动反向",
87+ "5q09prnzphk0": "结束迁移",
88+ "5q09prnzpkg0": "数据校验sink端日志",
89+ "5q09prnzpmk0": "数据校验source端日志",
90+ "5q09prnzpps0": "数据校验check端日志",
91+ "5q09prnzprs0": "全量迁移日志",
92+ "5q09prnzpug0": "增量迁移日志",
93+ "5q09prnzpxc0": "增量迁移source端日志",
94+ "5q09prnzq080": "增量迁移sink端日志",
95+ "5q09prnzq2o0": "反向迁移日志",
96+ "5q09prnzq680": "反向迁移source端日志",
97+ "5q09prnzq880": "反向迁移sink端日志",
98+ "5q09prnzqac0": "执行时错误日志",
99+ "5q09prnzqck0": "属于任务:",
100+ "5q09prnzqew0": "创建时间:",
101+ "5q09prnzqgw0": "源库名:",
102+ "5q09prnzqk00": "目的库名:",
103+ "5q09prnzqlw0": "执行开始时间:",
104+ "5q09prnzqnw0": "已执行:",
105+ "5q09prnzqpw0": "小时",
106+ "5q09prnzqs00": "分钟",
107+ "5q09prnzqvk0": "迁移情况:",
108+ "5q09prnzqxs0": "全量迁移:",
109+ "5q09prnzqzs0": "执行时间:",
110+ "5q09prnzr2o0": "增量迁移:",
111+ "5q09prnzr4s0": "源库至目的库:",
112+ "5q09prnzux40": "反向迁移:",
113+ "5q09ruxan0s0": "子任务详情(ID:{subTaskId},",
114+ "5q09t2cud100": "离线模式",
115+ "5q09t2cudw80": "在线模式",
116+ "5q09tn4uzy40": "累计增量迁移对象数:",
117+ "5q09urmrt580": "增量抽取速度:",
118+ "5q09urmruc00": "增量写入速度:",
119+ "5q09urmruhc0": "剩余待写入数据:",
120+ "5q09vm8iktw0": "zookeeper+kafka日志",
121+ "5q09wjm47ow0": "schema-registry日志",
122+ "5q09xhsvcq40": "总迁移对象数量:{total},未开始:{totalWaitCount},迁移中:{totalRunningCount},成功:{totalFinishCount},失败:{totalErrorCount}",
123+ "5q0a1jl7o9s0": "总迁移对象:{total},未开始:{totalWaitCount},迁移中:{totalRunningCount},成功:{totalFinishCount},失败:{totalErrorCount}",
124+ "5q0a5opxm3c0": "至"
125+ },
126+ "AddJdbc": {
127+ "5q0a7i439cg0": "待检测",
128+ "5q0a7i43aeg0": "可用",
129+ "5q0a7i43ajk0": "不可用",
130+ "5q0a7i43amo0": "取消",
131+ "5q0a7i43ap40": "测试连通性",
132+ "5q0a7i43as00": "确定",
133+ "5q0a7i43aw00": "集群名称",
134+ "5q0a7i43bkk0": "请输入实例名称",
135+ "5q0a7i43boo0": "集群名称将会根据实例信息生成",
136+ "5q0a7i43br80": "自定义名称",
137+ "5q0a7i43bto0": "数据库类型",
138+ "5q0a7i43bwk0": "请选择数据库类型",
139+ "5q0a7i43bzk0": "实例",
140+ "5q0a7i43c280": "请输入集群名称",
141+ "5q0a7i43c4s0": "不能为纯空格",
142+ "5q0a7i43f3c0": "新增数据源"
143+ },
144+ "JdbcInstance": {
145+ "5q0a8km729o0": "请选择或输入IP",
146+ "5q0a8km736s0": "端口",
147+ "5q0a8km73bo0": "请输入端口号",
148+ "5q0a8km73f00": "用户名",
149+ "5q0a8km73hs0": "请输入用户名",
150+ "5q0a8km73ko0": "密码",
151+ "5q0a8km73n80": "请输入密码",
152+ "5q0a8km73q00": "连接扩展属性",
153+ "5q0a8km73uc0": "新增",
154+ "5q0a8km73xc0": "删除",
155+ "5q0a8km74cw0": "连接地址",
156+ "5q0a8km74h00": "扩展名",
157+ "5q0a8km74kk0": "扩展值",
158+ "5q0a8km74n80": "操作",
159+ "5q0a8km74po0": "请选择或输入IP地址",
160+ "5q0a8km74s40": "请输入正确的IP地址",
161+ "5q0a8km74uw0": "请输入正确的端口号",
162+ "5q0a8km74xk0": "不能为纯空格",
163+ "5q0a8km75000": "请输入用户密码",
164+ "5q0a9843uf40": "IP地址"
165+ },
166+ "PortalInstall": {
167+ "5q0aajl75f00": "迁移套件安装",
168+ "5q0aajl76580": "安装用户",
169+ "5q0aajl76io0": "安装用户不能为空",
170+ "5q0aajl76ug0": "请选择安装用户",
171+ "5q0aajl76xw0": "安装目录",
172+ "5q0aajl776k0": "安装目录不能为空",
173+ "5q0aajl77f40": "请输入安装目录",
174+ "5q0aajl77ik0": "取消",
175+ "5q0aajl77lg0": "确定"
176+ },
177+ "ParamsConfig": {
178+ "5q0aazspots0": "默认参数配置(全局配置)",
179+ "5q0aazsppew0": "子任务参数配置",
180+ "5q0aazsppjc0": "{num}个子任务使用了此配置",
181+ "5q0aazsppm00": "基础参数",
182+ "5q0aazsppog0": "参数名称",
183+ "5q0aazsppr80": "值",
184+ "5q0aazspptw0": "参数说明",
185+ "5q0aazsppwg0": "高级参数",
186+ "5q0aazsppz40": "恢复默认值",
187+ "5q0aazspq200": "使用全局配置",
188+ "5q0aazspq4g0": "保存",
189+ "5q0aazspq7k0": "源实例名:",
190+ "5q0aazspqac0": "目的实例名:",
191+ "5q0aazspqd00": "源库名:",
192+ "5q0aazspqfs0": "目的库名:"
193+ }
194+ },
195+ "task": {
196+ "index": {
197+ "5q08xss4gss0": "创建数据迁移任务",
198+ "5q08xss4j7o0": "任务名称",
199+ "5q08xss4jkc0": "请输入任务名称",
200+ "5q08xss4k9w0": "选择迁移源库和目的库",
201+ "5q08xss4khc0": "配置迁移过程参数",
202+ "5q08xss4kkw0": "分配执行机资源",
203+ "5q08xss4kr40": "上一步",
204+ "5q08xss4kww0": "下一步",
205+ "5q08xss4l2w0": "完成",
206+ "5q08zucvfwc0": "1个子任务是1个源库到1个目的库的迁移过程",
207+ "5q090g6io340": "确定每一个迁移过程的执行参数",
208+ "5q090g6iouw0": "选择合适的机器执行迁移过程"
209+ }
210+ },
211+ "step1": {
212+ "index": {
213+ "5q091ixiemk0": "源端",
214+ "5q091ixig500": "输入名称搜索",
215+ "5q091ixigdc0": "新增数据源",
216+ "5q091ixiggs0": "已选源端数据库:",
217+ "5q091ixigjo0": "目的端",
218+ "5q091ixigog0": "添加子任务",
219+ "5q091ixigro0": "源IP和端口",
220+ "5q091ixigug0": "源库名",
221+ "5q091ixigy80": "目的IP和端口",
222+ "5q091ixih280": "目的库名",
223+ "5q091ixih580": "迁移过程模式",
224+ "5q091ixih8g0": "离线模式:自动执行全量迁移,完成后自动结束,释放资源。",
225+ "5q091ixihtg0": "在线模式:自动执行全量迁移+增量迁移,用户手动启动反向迁移,需要用户操作结束迁移,释放资源。",
226+ "5q091ixii200": "请选择",
227+ "5q091ixii5w0": "离线模式",
228+ "5q091ixii8o0": "在线模式",
229+ "5q091ixiibk0": "操作",
230+ "5q091ixiieo0": "你确认删除此任务吗?",
231+ "5q091ixiihc0": "删除",
232+ "5q091ixiikk0": "默认"
233+ }
234+ },
235+ "step2": {
236+ "index": {
237+ "5q092waasqk0": "提示:每个迁移过程都需要有参数配置,DataKit已经为每一个迁移过程(即子任务)配置了默认参数。您也可以在下表中修改某个迁移过程(即子任务)的参数配置,来确保迁移过程顺利执行。",
238+ "5q092waatio0": "默认参数配置(全局配置)",
239+ "5q092waatnk0": "请输入源IP/端口/库名",
240+ "5q092waatqo0": "请输入目的IP/端口/库名",
241+ "5q092waau3o0": "请选择迁移模式",
242+ "5q092waau8c0": "离线模式",
243+ "5q092waaubo0": "在线模式",
244+ "5q092waaueg0": "请选择配置类型",
245+ "5q092waauhk0": "默认配置",
246+ "5q092waaukc0": "个性化配置",
247+ "5q092waaun40": "查询",
248+ "5q092waaw3w0": "重置",
249+ "5q092waawag0": "源IP和端口",
250+ "5q092waawdo0": "源库名",
251+ "5q092waawh80": "目的IP和端口",
252+ "5q092waawk00": "目的库名",
253+ "5q092wab7280": "迁移过程模式",
254+ "5q092wab7fo0": "操作",
255+ "5q092wab7k80": "编辑配置参数"
256+ }
257+ },
258+ "step3": {
259+ "index": {
260+ "5q093f8y7g00": "提示:DataKit本着资源利用最大化原则尽量让子任务并行执行,为每个子任务创建一个数据迁移代理(一台机器可以创建多个迁移代理),在资源不足时则等待资源顺序执行。",
261+ "5q093f8y8b40": "请输入物理机IP",
262+ "5q093f8y8fs0": "请输入物理机名称",
263+ "5q093f8y8j40": "请输入CPU核数",
264+ "5q093f8y8lw0": "剩余内存大于多少M",
265+ "5q093f8y8p40": "剩余硬盘大于多少G",
266+ "5q093f8y8ss0": "查询",
267+ "5q093f8y8vk0": "重置",
268+ "5q093f8y8y80": "迁移子任务:",
269+ "5q093f8y91s0": "个",
270+ "5q093f8y94c0": "已选择机器:",
271+ "5q093f8y9740": "台",
272+ "5q093f8y99s0": "刷新",
273+ "5q093f8y9ck0": "物理机IP",
274+ "5q093f8y9fg0": "物理机名称+OS",
275+ "5q093f8y9i40": "配置信息",
276+ "5q093f8y9m80": "系统:",
277+ "5q093f8y9p40": "是否安装迁移套件",
278+ "5q093f8y9rs0": "开始安装",
279+ "5q093f8y9us0": "日志",
280+ "5q093f8y9zg0": "重新安装",
281+ "5q093f8ya2c0": "正在执行子任务数",
282+ "5q093f8ya4w0": "正在执行的子任务",
283+ "5q093f8yabs0": "最大子任务数",
284+ "5q093f8yae80": "未安装",
285+ "5q093f8yagw0": "安装中",
286+ "5q093f8yajg0": "已安装",
287+ "5q093f8yals0": "安装失败",
288+ "5q094h74md80": "安装用户",
289+ "5q094raosqg0": "安装目录",
290+ "5q096184bp80": ",CPU架构:",
291+ "5q097pi0m540": ",CPU核数:{a},剩余内存:{b}M,剩余硬盘容量:{c}G"
292+ }
293+ },
294+ "detail": {
295+ "index": {
296+ "5q09asiwekc0": "任务状态:",
297+ "5q09asiwffw0": "停止",
298+ "5q09asiwg0g0": "总进度",
299+ "5q09asiwg4g0": "刷新",
300+ "5q09asiwg7s0": "子任务ID",
301+ "5q09asiwgb40": "源IP和端口",
302+ "5q09asiwifk0": "源库名",
303+ "5q09asiwijw0": "目的IP和端口",
304+ "5q09asiwing0": "目的库名",
305+ "5q09asiwiqk0": "迁移过程模式",
306+ "5q09asiwiyc0": "离线模式",
307+ "5q09asiwj1o0": "在线模式",
308+ "5q09asiwj4g0": "执行机器",
309+ "5q09asiwjvg0": "当前状态",
310+ "5q09asiwk6k0": "迁移失败详情",
311+ "5q09asiwka80": "操作",
312+ "5q09asiwkds0": "详情",
313+ "5q09asiwkhg0": "停止全量",
314+ "5q09asiwkkw0": "停止增量",
315+ "5q09asiwkq40": "启动反向",
316+ "5q09asiwkuk0": "停止反向",
317+ "5q09asiwl5g0": "结束迁移",
318+ "5q09asiwlac0": "日志",
319+ "5q09asiwlcg0": "未启动",
320+ "5q09asiwlew0": "迁移中",
321+ "5q09asiwltg0": "已完成",
322+ "5q09asiwlwc0": "全量迁移开始",
323+ "5q09asiwmi00": "全量迁移进行中",
324+ "5q09asiwmow0": "全量迁移完成",
325+ "5q09asiwmr40": "全量校验开始",
326+ "5q09asiwmt80": "全量校验中",
327+ "5q09asiwmvg0": "全量检验完成",
328+ "5q09asiwmxg0": "增量迁移开始",
329+ "5q09asiwmzw0": "增量迁移进行中",
330+ "5q09asiwn200": "增量迁移已停止",
331+ "5q09asiwn4k0": "反向迁移开始",
332+ "5q09asiwna40": "反向迁移进行中",
333+ "5q09asiwncc0": "反向迁移已停止",
334+ "5q09asiwne80": "迁移完成",
335+ "5q09asiwngg0": "迁移失败",
336+ "5q09asiwnik0": "等待资源中",
337+ "5q09asiwnks0": "创建人:",
338+ "5q09asiwnmw0": "子任务数量:",
339+ "5q09asiwnow0": "分配执行机器:",
340+ "5q09asiwnrs0": "创建时间:",
341+ "5q09asiwnu40": "子任务数量(离线模式):",
342+ "5q09asiwnw00": "执行时间:",
343+ "5q09asiwny00": "子任务数量(在线模式):",
344+ "5q09cuenq100": "数据迁移任务详情({name})",
345+ "5q09efwo3nc0": "{num}台",
346+ "5q09frs8fh00": "总数:{total},未启动:{notRunCount},执行中:{runningCount},迁移完成:{finishCount},迁移失败:{errorCount}"
347+ }
348+ }
349+}
AopenGauss-visualtool-plugin/web-ui/src/locale/zh-CN.js+6-0
@@ -0,0 +1,6 @@
1+ 
2+import cn from './locale/zh-cn.json'
3+ 
4+export default {
5+ ...cn
6+}
MopenGauss-visualtool-plugin/web-ui/src/main.js+19-8
@@ -1,12 +1,23 @@
1-import Vue from 'vue'1+import { createApp } from 'vue'
2+import ArcoVue from '@arco-design/web-vue'
3+import ArcoVueIcon from '@arco-design/web-vue/es/icon'
4+import globalComponents from '@/components'
2import App from './App.vue'5import App from './App.vue'
3-import Element from 'element-ui'6+import router from './router'
4-import 'element-ui/lib/theme-chalk/index.css'7+import '@/api/interceptor'
8+import '@/assets/icons'
9+import i18n from './locale/index'
5 10 
6-Vue.config.productionTip = false11+import '@arco-design/web-vue/dist/arco.less'
12+import '@/assets/style/global.less'
7 13 
8-Vue.use(Element)14+const app = createApp(App)
9 15 
10-new Vue({16+app.use(ArcoVue, {})
11- render: h => h(App),17+app.use(ArcoVueIcon)
12-}).$mount('#app')18+ 
19+app.use(router)
20+app.use(globalComponents)
21+app.use(i18n)
22+ 
23+app.mount('#app')
AopenGauss-visualtool-plugin/web-ui/src/router/index.js+13-0
@@ -0,0 +1,13 @@
1+import { createRouter, createWebHistory } from 'vue-router'
2+import routes from './routes'
3+import { PLUGIN_ID } from '@/utils/const'
4+ 
5+const router = createRouter({
6+ history: createWebHistory('/static-plugin/' + PLUGIN_ID + '/'),
7+ routes,
8+ scrollBehavior () {
9+ return { top: 0 }
10+ }
11+})
12+ 
13+export default router
AopenGauss-visualtool-plugin/web-ui/src/router/routes.js+26-0
@@ -0,0 +1,26 @@
1+const routes = [
2+ {
3+ path: '/',
4+ redirect: '/index'
5+ },
6+ {
7+ path: '/index',
8+ name: 'HelloWorld',
9+ component: () => import('@/views/HelloWorld.vue'),
10+ meta: {
11+ title: 'Sql执行中心',
12+ keepAlive: false
13+ }
14+ },
15+ {
16+ path: '/license',
17+ name: 'License',
18+ component: () => import('@/views/License.vue'),
19+ meta: {
20+ title: 'license界面',
21+ keepAlive: false
22+ }
23+ }
24+]
25+ 
26+export default routes
AopenGauss-visualtool-plugin/web-ui/src/utils/auth.js+19-0
@@ -0,0 +1,19 @@
1+const TOKEN_KEY = 'opengauss-token'
2+ 
3+const isLogin = () => {
4+ return !!localStorage.getItem(TOKEN_KEY)
5+}
6+ 
7+const getToken = () => {
8+ return localStorage.getItem(TOKEN_KEY)
9+}
10+ 
11+const setToken = (token) => {
12+ localStorage.setItem(TOKEN_KEY, token)
13+}
14+ 
15+const clearToken = () => {
16+ localStorage.removeItem(TOKEN_KEY)
17+}
18+ 
19+export { isLogin, getToken, setToken, clearToken }
AopenGauss-visualtool-plugin/web-ui/src/utils/const.js+2-0
@@ -0,0 +1,2 @@
1+const PLUGIN_ID = 'test-plugin'
2+export { PLUGIN_ID }
AopenGauss-visualtool-plugin/web-ui/src/utils/errorCode.js+6-0
@@ -0,0 +1,6 @@
1+export default {
2+ 401: 'Authentication failed, unable to access system resource',
3+ 403: 'The current operation does not have permission',
4+ 404: 'Access resource does not exist',
5+ default: 'System unknown error, please feedback to administrator'
6+}
AopenGauss-visualtool-plugin/web-ui/src/utils/index.js+16-0
@@ -0,0 +1,16 @@
1+export function mergeObjectArray (arr1, arr2, idProp) {
2+ const arr1Temp = JSON.parse(JSON.stringify(arr1))
3+ const arr2Temp = JSON.parse(JSON.stringify(arr2))
4+ const mergedArr = arr1Temp.slice()
5+ 
6+ arr2Temp.forEach(obj => {
7+ const index = mergedArr.findIndex(item => item[idProp] === obj[idProp])
8+ if (index !== -1) {
9+ mergedArr[index] = obj
10+ } else {
11+ mergedArr.push(obj)
12+ }
13+ })
14+ 
15+ return mergedArr
16+}
AopenGauss-visualtool-plugin/web-ui/src/utils/jsencrypt.js+15-0
@@ -0,0 +1,15 @@
1+import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
2+import { getEntryKey } from '@/api/detail'
3+ 
4+// host password encryption
5+export async function encryptPassword (pwd) {
6+ let publicKey = ''
7+ const getPublicKey = await getEntryKey()
8+ if (Number(getPublicKey.code) === 200 && getPublicKey.key) {
9+ const newKey = getPublicKey.key
10+ publicKey = newKey
11+ }
12+ const encryptor = new JSEncrypt()
13+ encryptor.setPublicKey(publicKey)
14+ return encryptor.encrypt(pwd)
15+}
AopenGauss-visualtool-plugin/web-ui/src/utils/websocket.js+125-0
@@ -0,0 +1,125 @@
1+class Heart {
2+ heartTimeOut
3+ ServerHeartTimeOut
4+ timeout = 5000
5+ reset () {
6+ clearTimeout(this.heartTimeOut)
7+ clearTimeout(this.ServerHeartTimeOut)
8+ }
9+ start (cb) {
10+ this.heartTimeOut = setTimeout(() => {
11+ cb()
12+ this.ServerHeartTimeOut = setTimeout(() => {
13+ cb()
14+ this.reset()
15+ this.start(cb)
16+ }, this.timeout)
17+ }, this.timeout)
18+ }
19+}
20+ 
21+export default class SocketTool extends Heart {
22+ constructor (ops) {
23+ super()
24+ Object.assign(this.options, ops)
25+ this.create()
26+ }
27+ 
28+ ws
29+ reconnectTimer = 0
30+ reconnectCount = 10
31+ options = {
32+ url: null,
33+ heartTime: 5000,
34+ heartMsg: 'ping',
35+ isReconnect: true,
36+ isRestory: false,
37+ reconnectTime: 5000,
38+ reconnectCount: 5,
39+ openCb: (e) => {
40+ console.log('connect success callback::::', e)
41+ },
42+ closeCb: (e) => {
43+ console.log('close callback::::', e)
44+ },
45+ messageCb: (e) => {
46+ console.log('message callback::::', e)
47+ },
48+ errorCb: (e) => {
49+ console.log('error callback::::', e)
50+ }
51+ }
52+ 
53+ create () {
54+ if (!('WebSocket' in window)) {
55+ throw new Error('The current browser does not support it and cannot be used')
56+ }
57+ if (!this.options.url) {
58+ throw new Error('The address does not exist, and the channel cannot be established')
59+ }
60+ // this.ws = null
61+ console.log('get locaion host: ', window.location.host, window.location.protocol)
62+ let wsUrl
63+ if (process.env.NODE_ENV === 'development') {
64+ // change by yourself
65+ wsUrl = `wss://${process.env.VUE_APP_WS_BASE_URL}/websocket/${this.options.url}`
66+ } else {
67+ const wsPrefix = window.location.protocol.includes('https') ? 'wss' : 'ws'
68+ wsUrl = `${wsPrefix}://${window.location.host}/websocket/${this.options.url}`
69+ }
70+ this.ws = new WebSocket(wsUrl)
71+ this.onopen(this.options.openCb)
72+ this.onclose(this.options.closeCb)
73+ this.onmessage(this.options.messageCb)
74+ }
75+ 
76+ onopen (callback) {
77+ this.ws.onopen = event => {
78+ if (typeof callback === 'function') {
79+ callback(event)
80+ } else {
81+ typeof this.options.openCb === 'function' && this.options.openCb(event)
82+ }
83+ }
84+ }
85+ 
86+ onclose (callback) {
87+ this.ws.onclose = event => {
88+ if (typeof callback === 'function') {
89+ callback(event)
90+ } else {
91+ typeof this.options.closeCb === 'function' && this.options.closeCb(event)
92+ }
93+ }
94+ }
95+ 
96+ onerror (callback) {
97+ this.ws.onerror = event => {
98+ if (typeof callback === 'function') {
99+ callback(event)
100+ } else {
101+ typeof this.options.errorCb === 'function' && this.options.errorCb(event)
102+ }
103+ }
104+ }
105+ 
106+ onmessage (callback) {
107+ this.ws.onmessage = (event) => {
108+ const strMessage = event.data
109+ if (typeof callback === 'function') {
110+ callback(strMessage)
111+ }
112+ }
113+ }
114+ 
115+ send (data) {
116+ console.log('doNothing', data)
117+ }
118+ 
119+ destroy () {
120+ super.reset()
121+ clearTimeout(this.reconnectTimer)
122+ this.options.isRestory = true
123+ this.ws.close()
124+ }
125+}
RopenGauss-visualtool-plugin/web-ui/src/components/HelloWorld.vueopenGauss-visualtool-plugin/web-ui/src/views/HelloWorld.vue+23-21
@@ -1,43 +1,45 @@
1<template>1<template>
2 <div class="hello">2 <div class="hello">
3- <h1>{{ msg }}</h1>3+ <div class="title">
4- <p>plugin page demo</p>4+ <img :src="og_img1" class="default_img"/>
5- <h3>form plugin platform param</h3>5+ <h2>openGauss DataKit</h2>
6- <code>{{ queryData }}</code>6+ </div>
7+ <h1>{{ queryData }}</h1>
7 </div>8 </div>
8</template>9</template>
9 10 
10<script>11<script>
11export default {12export default {
12 name: 'HelloWorld',13 name: 'HelloWorld',
13- props: {
14- msg: String
15- },
16 data () {14 data () {
17 return {15 return {
18- queryData: ''16+ queryData: 'Hello, openGauss DataKit plugin.',
17+ og_img: require('@/assets/icons/svg/opengaussdb.svg'),
18+ og_img1: require('@/assets/logo.png')
19 }19 }
20- },
21- created () {
22- // Obtain the parameters of the main program through window.$wujie.props
23- this.queryData = JSON.stringify(window.$wujie.props)
24 }20 }
25}21}
26</script>22</script>
27 23 
28<!-- Add "scoped" attribute to limit CSS to this component only -->24<!-- Add "scoped" attribute to limit CSS to this component only -->
29<style scoped>25<style scoped>
30-h3 {26+h1 {
31- margin: 40px 0 0;27+ margin: 20px 0 0;
32-}28+ color: red;
33-ul {
34- list-style-type: none;
35- padding: 0;
36-}
37-li {
38 display: inline-block;29 display: inline-block;
39- margin: 0 10px;30+ align-items: center;
40}31}
32+ 
33+.title {
34+ display: grid;
35+ grid-template-columns: repeat(2, auto) 1fr;
36+ align-items: center;
37+}
38+ 
39+.default_img {
40+ background-color: #2d2d3d;
41+}
42+ 
41a {43a {
42 color: #42b983;44 color: #42b983;
43}45}
AopenGauss-visualtool-plugin/web-ui/src/views/License.vue+148-0
@@ -0,0 +1,148 @@
1+<template>
2+ <div class="login">
3+ <div class="container">
4+ <div class="main">
5+ <h3>二维识别码</h3>
6+ <!-- 放置二维码盒子 -->
7+ <canvas ref="canvas"></canvas>
8+ <div class="qrcode_text">
9+ 识别码: <a :href="url" target="_blank"> {{url}} </a>
10+ </div>
11+ <div>
12+ <template v-if="!is_register">
13+ <a-input v-model="qrcode_in" class="qrcode_in"></a-input>
14+ <a-button type="primary" @click="checkLicense">注册</a-button>
15+ </template>
16+ <template v-else>
17+ 已注册! <a> {{this.qrcode_out}} </a>
18+ </template>
19+ </div>
20+ </div>
21+ </div>
22+ </div>
23+</template>
24+ 
25+<script>
26+import QRCode from 'qrcode'
27+export default {
28+ name: 'qrLogin',
29+ data () {
30+ return {
31+ // 二维码地址
32+ url: 'http://opengauss.org',
33+ // 二维码的key
34+ key: '',
35+ qrcode_in: '',
36+ qrcode_out: '',
37+ is_register: false
38+ }
39+ },
40+ mounted() {
41+ this.makeQrCode()
42+ },
43+ methods: {
44+ makeQrCode () {
45+ let opts = {
46+ errorCorrectionLevel: 'H',
47+ type: 'image/png',
48+ quality: 0.3,
49+ width: 165,
50+ height: 165,
51+ text: '二维码测试',
52+ color: {
53+ dark: '#333333',
54+ light: '#fff'
55+ }
56+ }
57+ QRCode.toCanvas(this.$refs.canvas, this.url, opts)
58+ },
59+ checkLicense() {
60+ console.log('qrcode_in is ' + this.qrcode_in)
61+ buildLicense({srcKeyCode: this.url, inputKey: this.qrcode_in}).then(
62+ res => {
63+ this.is_register = true;
64+ this.qrcode_out = res.data.outputKey
65+ }
66+ ).catch(
67+ res => {
68+ 
69+ }
70+ )
71+ this.makeQrCode()
72+ }
73+ }
74+}
75+</script>
76+ 
77+<style>
78+* {
79+ margin: 0 auto;
80+ padding: 0;
81+}
82+.login {
83+ width: 100%;
84+ height: 100vh;
85+}
86+.container {
87+ width: 100%;
88+ height: 100%;
89+ display: flex;
90+ align-items: left;
91+ justify-content: left;
92+}
93+.main {
94+ position: relative;
95+ width: 280px;
96+ height: 250px;
97+ margin: 0 auto;
98+ border-radius: 5px;
99+ background-color: #fff;
100+ box-shadow: 2px 2px 2px #bbb;
101+}
102+ 
103+.qrcode_in {
104+ width: 70%;
105+ background-color: white;
106+ border: solid;
107+ border-color: red;
108+ border-width: 1px;
109+}
110+ 
111+h3 {
112+ padding: 10px;
113+ text-align: center;
114+}
115+.text_qrcode {
116+ width: 100%;
117+ height: 100vh;
118+}
119+canvas {
120+ display: flex;
121+ align-items: center;
122+ justify-content: center;
123+}
124+.invalid {
125+ position: absolute;
126+ top: 50%;
127+ left: 50%;
128+ margin-top: -68px;
129+ margin-left: -70px;
130+ width: 143px;
131+ height: 143px;
132+ background: rgba(255, 255, 255, 0.9);
133+ text-align: center;
134+}
135+p {
136+ font-size: 14px;
137+ margin-top: 40px;
138+ margin-bottom: 5px;
139+}
140+button {
141+ color: #fff;
142+ padding: 3px 10px;
143+ background: #71c771;
144+ border: 1px solid #5baf5b;
145+ border-radius: 5px;
146+ cursor: pointer;
147+}
148+</style>
MopenGauss-visualtool-plugin/web-ui/vue.config.js+75-6
@@ -1,13 +1,82 @@
1const { defineConfig } = require('@vue/cli-service')1const { defineConfig } = require('@vue/cli-service')
2+const path = require('path')
3+const PLUGIN_ID = 'test-plugin'
4+ 
5+const resolve = dir => path.join(__dirname, './', dir)
6+const port = process.env.port || process.env.npm_config_port || 80
7+ 
2module.exports = defineConfig({8module.exports = defineConfig({
3- transpileDependencies: true,9+ productionSourceMap: false,
4- publicPath: "/static-plugin/test-plugin/",10+ runtimeCompiler: true,
11+ transpileDependencies: false,
12+ lintOnSave: false,
13+ publicPath: '/static-plugin/' + PLUGIN_ID + "/",
14+ css: {
15+ loaderOptions: {
16+ less: {
17+ lessOptions: {
18+ modifyVars: {
19+ 'primary-6': '#E41D1D',
20+ 'primary-5': '#E94842',
21+ 'primary-7': '#BE1118',
22+ 'primary-4': '#FAC4BC',
23+ 'primary-3': '#F49C92',
24+ 'primary-2': '#F49C92',
25+ 'primary-1': '#FFECE8',
26+ 'warning-6': '#FF7D01',
27+ 'success-6': '#00B429',
28+ 'link-6': '#E41D1D',
29+ 'color-text-1': '#1D212A',
30+ 'color-text-2': '#4E5A6A',
31+ 'color-text-3': '#868F9C',
32+ 'dark-primary-7': '#FCEF92',
33+ 'dark-primary-6': '#FCEF92',
34+ 'dark-primary-5': '#F8EFAE',
35+ 'dark-warning-6': '#FF7D01',
36+ 'dark-success-6': '#00B429',
37+ 'dark-link-6': '#FCEF92'
38+ },
39+ javascriptEnabled: true
40+ }
41+ }
42+ }
43+ },
44+ chainWebpack (config) {
45+ config.module.rule('svg').exclude.add(resolve('src/assets/icons')).end()
46+ config.module
47+ .rule('icons')
48+ .test(/\.svg$/)
49+ .include.add(resolve('src/assets/icons'))
50+ .end()
51+ .use('svg-sprite-loader')
52+ .loader('svg-sprite-loader')
53+ .options({
54+ symbolId: 'icon-[name]'
55+ })
56+ .end()
57+ },
5 devServer: {58 devServer: {
6 headers: {59 headers: {
7- "Access-Control-Allow-Origin": "*",60+ 'Access-Control-Allow-Origin': '*',
8- "Access-Control-Allow-Headers": "*",61+ 'Access-Control-Allow-Headers': '*',
9- "Access-Control-Allow-Methods": "*",62+ 'Access-Control-Allow-Methods': '*'
10 },63 },
11- port: "8081",64+ port,
65+ proxy: {
66+ // detail: https://cli.vuejs.org/config/#devserver-proxy
67+ '/dev-api': {
68+ target: 'http://localhost:9494',
69+ changeOrigin: true,
70+ pathRewrite: {
71+ '^/dev-api': ''
72+ }
73+ }
74+ },
75+ historyApiFallback: {
76+ rewrites: [
77+ { from: /\/static-plugin\/test-plugin/, to: '/static-plugin/' + PLUGIN_ID +'/index.html' }
78+ ]
79+ },
80+ allowedHosts: 'all'
12 }81 }
13})82})
DopenGauss-visualtool-plugin/web-ui/yarn.lock+0-6063