From 8d24c2a4fa437cdb48a3624fd18f28c598c07d28 Mon Sep 17 00:00:00 2001
From: "meilin.huang" <954537473@qq.com>
Date: Fri, 10 Jan 2025 12:05:00 +0800
Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=95=B0=E6=8D=AE=E5=90=8C?=
=?UTF-8?q?=E6=AD=A5=E4=BC=98=E5=8C=96=20&=20=E6=A0=87=E7=AD=BE=E6=A0=91?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=8C=E5=87=BB=E5=B1=95=E5=BC=80=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=20&=20mysql=E6=94=AF=E6=8C=81with=E8=AF=AD=E5=8F=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/assets/icon/db/sql.svg | 1 +
.../src/components/monaco/MonacoEditorBox.ts | 19 ++-
.../components/monaco/MonacoEditorDialog.vue | 4 +-
frontend/src/views/ops/component/TagTree.vue | 22 ++-
frontend/src/views/ops/db/SqlExec.vue | 10 +-
frontend/src/views/ops/db/SyncTaskEdit.vue | 157 ++++++++----------
frontend/src/views/ops/db/SyncTaskList.vue | 5 +-
server/internal/db/api/db_data_sync.go | 6 +-
server/internal/db/api/vo/db_data_sync.go | 1 +
.../internal/db/application/db_data_sync.go | 153 +++++++++--------
server/internal/db/application/db_sql_exec.go | 15 +-
.../db/dbm/sqlparser/mysql/visitor.go | 9 +
.../internal/db/dbm/sqlparser/sqlstmt/stmt.go | 4 +
.../internal/db/domain/entity/db_data_sync.go | 2 +-
server/pkg/cache/str_cache.go | 10 +-
15 files changed, 231 insertions(+), 187 deletions(-)
create mode 100644 frontend/src/assets/icon/db/sql.svg
diff --git a/frontend/src/assets/icon/db/sql.svg b/frontend/src/assets/icon/db/sql.svg
new file mode 100644
index 00000000..2226c807
--- /dev/null
+++ b/frontend/src/assets/icon/db/sql.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/components/monaco/MonacoEditorBox.ts b/frontend/src/components/monaco/MonacoEditorBox.ts
index 7cfa3a7f..295cf192 100644
--- a/frontend/src/components/monaco/MonacoEditorBox.ts
+++ b/frontend/src/components/monaco/MonacoEditorBox.ts
@@ -1,6 +1,7 @@
import { VNode, h, render } from 'vue';
import MonacoEditorDialog from './MonacoEditorDialog.vue';
import * as monaco from 'monaco-editor';
+import { ElMessage } from 'element-plus';
export type MonacoEditorDialogProps = {
content: string;
@@ -53,7 +54,23 @@ const MonacoEditorBox = (props: MonacoEditorDialogProps): void => {
console.log('close editor');
},
onConfirm: () => {
- props.confirmFn && props.confirmFn(props.content);
+ let value = props.content;
+ if (props.language === 'json') {
+ let val;
+ try {
+ val = JSON.parse(value);
+ if (typeof val !== 'object') {
+ ElMessage.error('Invalid json');
+ return;
+ }
+ } catch (e) {
+ ElMessage.error('Invalid json');
+ return;
+ }
+ // 压缩json字符串
+ value = JSON.stringify(val);
+ }
+ props.confirmFn && props.confirmFn(value);
},
});
// 将虚拟dom渲染到 container dom 上
diff --git a/frontend/src/components/monaco/MonacoEditorDialog.vue b/frontend/src/components/monaco/MonacoEditorDialog.vue
index 936b515b..9ce7fed6 100644
--- a/frontend/src/components/monaco/MonacoEditorDialog.vue
+++ b/frontend/src/components/monaco/MonacoEditorDialog.vue
@@ -76,11 +76,11 @@ const confirm = async () => {
try {
val = JSON.parse(value);
if (typeof val !== 'object') {
- ElMessage.error('请输入正确的json');
+ ElMessage.error('Invalid json');
return;
}
} catch (e) {
- ElMessage.error('请输入正确的json');
+ ElMessage.error('Invalid json');
return;
}
diff --git a/frontend/src/views/ops/component/TagTree.vue b/frontend/src/views/ops/component/TagTree.vue
index bae39738..0cd2ddd8 100644
--- a/frontend/src/views/ops/component/TagTree.vue
+++ b/frontend/src/views/ops/component/TagTree.vue
@@ -18,7 +18,12 @@
:default-expanded-keys="props.defaultExpandedKeys"
>
-
+
@@ -157,7 +162,13 @@ const treeNodeClick = async (data: any) => {
};
// 树节点双击事件
-const treeNodeDblclick = (data: any) => {
+const treeNodeDblclick = (data: any, node: any) => {
+ if (node.expanded) {
+ node.collapse();
+ } else {
+ node.expand();
+ }
+
// emit('nodeDblick', data);
if (!data.disabled && data.type.nodeDblclickFunc) {
data.type.nodeDblclickFunc(data);
@@ -245,5 +256,12 @@ defineExpose({
font-size: 10px;
margin-top: 2px;
}
+
+ .node-container {
+ display: flex;
+ align-items: center;
+ width: 100%; // 确保容器宽度占满整个节点区域
+ cursor: pointer; // 添加鼠标指针样式
+ }
}
diff --git a/frontend/src/views/ops/db/SqlExec.vue b/frontend/src/views/ops/db/SqlExec.vue
index 9afe77b9..78e8b266 100644
--- a/frontend/src/views/ops/db/SqlExec.vue
+++ b/frontend/src/views/ops/db/SqlExec.vue
@@ -295,7 +295,7 @@ const TableIcon = {
};
const SqlIcon = {
- name: 'Files',
+ name: 'icon db/sql',
color: '#f56c6c',
};
@@ -450,11 +450,11 @@ const NodeTypeTableMenu = new NodeType(SqlExecNodeType.TableMenu)
// 设置父节点参数的表大小
parentNode.params.dbTableSize = dbTableSize == 0 ? '' : formatByteSize(dbTableSize);
return tablesNode;
- })
- .withNodeDblclickFunc((node: TagTreeNode) => {
- const params = node.params;
- addTablesOpTab({ id: params.id, db: params.db, type: params.type, version: params.version, nodeKey: node.key });
});
+// .withNodeDblclickFunc((node: TagTreeNode) => {
+// const params = node.params;
+// addTablesOpTab({ id: params.id, db: params.db, type: params.type, version: params.version, nodeKey: node.key });
+// });
// 数据库sql模板菜单节点
const NodeTypeSqlMenu = new NodeType(SqlExecNodeType.SqlMenu)
diff --git a/frontend/src/views/ops/db/SyncTaskEdit.vue b/frontend/src/views/ops/db/SyncTaskEdit.vue
index 0034e92e..e1c0602a 100644
--- a/frontend/src/views/ops/db/SyncTaskEdit.vue
+++ b/frontend/src/views/ops/db/SyncTaskEdit.vue
@@ -8,21 +8,19 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
-
-
-
-
-
- {{ $t('db.updateField') }}
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
- {{ $t('db.updateFieldValue') }}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{ $t('db.updateField') }}
+
+
+
+
+
+
+
-
-
-
-
-
- {{ $t('db.fieldValueSrc') }}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ {{ $t('db.updateFieldValue') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('db.fieldValueSrc') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/ops/db/SyncTaskList.vue b/frontend/src/views/ops/db/SyncTaskList.vue
index 07bbf734..bbb7c56a 100644
--- a/frontend/src/views/ops/db/SyncTaskList.vue
+++ b/frontend/src/views/ops/db/SyncTaskList.vue
@@ -50,7 +50,6 @@