You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by le...@apache.org on 2022/11/01 10:26:05 UTC

[inlong] branch master updated: [INLONG-6330][Dashboard] Other sinks support asynchronous loading of plugins (#6355)

This is an automated email from the ASF dual-hosted git repository.

leezng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 0dec6e278 [INLONG-6330][Dashboard] Other sinks support asynchronous loading of plugins (#6355)
0dec6e278 is described below

commit 0dec6e2785be4be873e544b5ebf43e3dd6787057
Author: Lizhen <88...@users.noreply.github.com>
AuthorDate: Tue Nov 1 18:25:59 2022 +0800

    [INLONG-6330][Dashboard] Other sinks support asynchronous loading of plugins (#6355)
---
 .../src/metas/sinks/defaults/Clickhouse.ts         |   2 +-
 .../src/metas/sinks/{es.tsx => defaults/Es.ts}     | 132 ++++++++++++---------
 .../sinks/{greenplum.tsx => defaults/Greenplum.ts} |  81 +++++++------
 .../metas/sinks/{hbase.tsx => defaults/HBase.ts}   | 120 ++++++++++---------
 .../sinks/{iceberg.tsx => defaults/Iceberg.ts}     | 108 ++++++++++-------
 inlong-dashboard/src/metas/sinks/defaults/Kafka.ts |   2 +-
 .../metas/sinks/{mysql.tsx => defaults/Mysql.ts}   |  78 ++++++------
 .../metas/sinks/{oracle.tsx => defaults/Oracle.ts} |  78 ++++++------
 .../{postgreSql.tsx => defaults/PostgreSql.ts}     |  89 ++++++++------
 .../sinks/{sqlServer.tsx => defaults/SQLServer.ts} | 110 +++++++++--------
 .../TDSQLPostgreSql.ts}                            |  88 ++++++++------
 inlong-dashboard/src/metas/sinks/defaults/index.ts |  45 +++++++
 12 files changed, 552 insertions(+), 381 deletions(-)

diff --git a/inlong-dashboard/src/metas/sinks/defaults/Clickhouse.ts b/inlong-dashboard/src/metas/sinks/defaults/Clickhouse.ts
index 277c27399..35994561e 100644
--- a/inlong-dashboard/src/metas/sinks/defaults/Clickhouse.ts
+++ b/inlong-dashboard/src/metas/sinks/defaults/Clickhouse.ts
@@ -40,7 +40,7 @@ const clickhouseTargetTypes = [
   value: item,
 }));
 
-export default class HiveSink extends SinkInfo implements DataWithBackend {
+export default class ClickhouseSink extends SinkInfo implements DataWithBackend {
   @FormField({
     type: 'input',
     rules: [{ required: true }],
diff --git a/inlong-dashboard/src/metas/sinks/es.tsx b/inlong-dashboard/src/metas/sinks/defaults/Es.ts
similarity index 81%
rename from inlong-dashboard/src/metas/sinks/es.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/Es.ts
index bb104a2d4..4367ac511 100644
--- a/inlong-dashboard/src/metas/sinks/es.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/Es.ts
@@ -18,9 +18,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { sourceFields } from '../common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const esTypes = [
   'text',
@@ -40,21 +43,20 @@ const esTypes = [
   value: item,
 }));
 
-export const es: FieldItemType[] = [
-  {
-    name: 'indexName',
+export default class EsSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Es.IndexName'),
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
-    name: 'enableCreateResource',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.IndexName')
+  indexName: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -71,93 +73,109 @@ export const es: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
-    name: 'username',
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
-    name: 'password',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    type: 'input',
-    label: i18n.t('meta.Sinks.Es.Host'),
-    name: 'host',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
+    type: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'port',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.Host')
+  host: string;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.Es.Port'),
     initialValue: 9200,
+    rules: [{ required: true }],
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
       max: 65535,
+      disabled: [110, 130].includes(values?.status),
     }),
-    rules: [{ required: true }],
-  },
-  {
-    name: 'flushInterval',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.Port')
+  port: number;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.Es.FlushInterval'),
     initialValue: 1,
+    rules: [{ required: true }],
+    suffix: i18n.t('meta.Sinks.Es.FlushIntervalUnit'),
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
+      disabled: [110, 130].includes(values?.status),
     }),
-    rules: [{ required: true }],
-    suffix: i18n.t('meta.Sinks.Es.FlushIntervalUnit'),
-  },
-  {
-    name: 'flushRecord',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.FlushInterval')
+  flushInterval: number;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.Es.FlushRecord'),
     initialValue: 1000,
+    rules: [{ required: true }],
+    suffix: i18n.t('meta.Sinks.Es.FlushRecordUnit'),
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
+      disabled: [110, 130].includes(values?.status),
     }),
-    rules: [{ required: true }],
-    suffix: i18n.t('meta.Sinks.Es.FlushRecordUnit'),
-  },
-  {
-    name: 'retryTime',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.FlushRecord')
+  flushRecord: number;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.Es.RetryTimes'),
     initialValue: 3,
+    rules: [{ required: true }],
+    suffix: i18n.t('meta.Sinks.Es.RetryTimesUnit'),
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
+      disabled: [110, 130].includes(values?.status),
     }),
-    rules: [{ required: true }],
-    suffix: i18n.t('meta.Sinks.Es.RetryTimesUnit'),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Es.RetryTimes')
+  retryTime: number;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/greenplum.tsx b/inlong-dashboard/src/metas/sinks/defaults/Greenplum.ts
similarity index 85%
rename from inlong-dashboard/src/metas/sinks/greenplum.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/Greenplum.ts
index 8af638901..6b3313cd2 100644
--- a/inlong-dashboard/src/metas/sinks/greenplum.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/Greenplum.ts
@@ -16,9 +16,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { sourceFields } from '../common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const fieldTypesConf = {
   SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'),
@@ -55,41 +58,43 @@ const greenplumFieldTypes = Object.keys(fieldTypesConf).reduce(
   [],
 );
 
-export const greenplum: FieldItemType[] = [
-  {
+export default class GreenplumSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'jdbc:postgresql://127.0.0.1:5432/write',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Greenplum.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Greenplum.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Greenplum.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Greenplum.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -106,36 +111,42 @@ export const greenplum: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
-      canDelete: ![110, 130].includes(values?.status),
+      editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/hbase.tsx b/inlong-dashboard/src/metas/sinks/defaults/HBase.ts
similarity index 76%
rename from inlong-dashboard/src/metas/sinks/hbase.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/HBase.ts
index e1c39d4c8..b9ff6c231 100644
--- a/inlong-dashboard/src/metas/sinks/hbase.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/HBase.ts
@@ -16,9 +16,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+import { SinkInfo } from '../common/SinkInfo';
+import { sourceFields } from '../common/sourceFields';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const hbaseFieldTypes = [
   'int',
@@ -35,103 +38,114 @@ const hbaseFieldTypes = [
   value: item,
 }));
 
-export const hbase: FieldItemType[] = [
-  {
+export default class HBaseSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.HBase.Namespace'),
-    name: 'namespace',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.Namespace')
+  namespace: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.HBase.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.HBase.RowKey'),
-    name: 'rowKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.RowKey')
+  rowKey: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.HBase.ZkQuorum'),
-    name: 'zkQuorum',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: '127.0.0.1:2181,127.0.0.2:2181',
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.ZkQuorum')
+  zkQuorum: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.HBase.ZkNodeParent'),
-    name: 'zkNodeParent',
-    initialValue: '/hbase',
     rules: [{ required: true }],
+    initialValue: '/hbase',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.ZkNodeParent')
+  zkNodeParent: string;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.HBase.BufferFlushMaxSize'),
-    name: 'bufferFlushMaxSize',
-    initialValue: 2,
     rules: [{ required: true }],
+    initialValue: 2,
+    suffix: 'mb',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
-      min: 1,
     }),
-    suffix: 'mb',
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.BufferFlushMaxSize')
+  bufferFlushMaxSize: number;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.HBase.BufferFlushMaxRows'),
-    name: 'bufferFlushMaxRows',
-    initialValue: 1000,
     rules: [{ required: true }],
+    initialValue: 1000,
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
+      disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.BufferFlushMaxRows')
+  bufferFlushMaxRows: number;
+
+  @FormField({
     type: 'inputnumber',
-    label: i18n.t('meta.Sinks.HBase.BufferFlushInterval'),
-    name: 'bufferFlushInterval',
-    initialValue: 1,
     rules: [{ required: true }],
+    initialValue: 1,
+    suffix: i18n.t('meta.Sinks.HBase.FlushIntervalUnit'),
     props: values => ({
-      disabled: [110, 130].includes(values?.status),
       min: 1,
+      disabled: [110, 130].includes(values?.status),
     }),
-    suffix: i18n.t('meta.Sinks.HBase.FlushIntervalUnit'),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.HBase.BufferFlushInterval')
+  bufferFlushInterval: number;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
-      canDelete: ![110, 130].includes(values?.status),
+      editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/iceberg.tsx b/inlong-dashboard/src/metas/sinks/defaults/Iceberg.ts
similarity index 85%
rename from inlong-dashboard/src/metas/sinks/iceberg.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/Iceberg.ts
index 458dcb644..7a944c705 100644
--- a/inlong-dashboard/src/metas/sinks/iceberg.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/Iceberg.ts
@@ -18,9 +18,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { sourceFields } from '../common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const icebergFieldTypes = [
   'string',
@@ -98,31 +101,31 @@ const matchPartitionStrategies = fieldType => {
   return data.filter(item => !item.disabled);
 };
 
-export const iceberg: FieldItemType[] = [
-  {
-    name: 'dbName',
+export default class IcebergSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Iceberg.DbName'),
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
-    name: 'tableName',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.DbName')
+  dbName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Iceberg.TableName'),
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -139,33 +142,38 @@ export const iceberg: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: 'Catalog URI',
-    name: 'catalogUri',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'thrift://127.0.0.1:9083',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('Catalog URI')
+  catalogUri: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Iceberg.Warehouse'),
-    name: 'warehouse',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'hdfs://127.0.0.1:9000/user/iceberg/warehouse',
     }),
-  },
-  {
-    name: 'fileFormat',
-    type: 'radio',
-    label: i18n.t('meta.Sinks.Iceberg.FileFormat'),
-    initialValue: 'Parquet',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.Warehouse')
+  warehouse: string;
+
+  @FormField({
+    type: 'select',
     rules: [{ required: true }],
+    initialValue: 'Parquet',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       options: [
@@ -183,11 +191,15 @@ export const iceberg: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
-    name: 'extList',
-    label: i18n.t('meta.Sinks.Iceberg.ExtList'),
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.FileFormat')
+  fileFormat: string;
+
+  @FormField({
     type: EditableTable,
+    rules: [{ required: true }],
+    initialValue: [],
     props: values => ({
       size: 'small',
       columns: [
@@ -207,13 +219,16 @@ export const iceberg: FieldItemType[] = [
         },
       ],
     }),
-    initialValue: [],
-  },
-  {
-    name: 'dataConsistency',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.ExtList')
+  extList: string;
+
+  @FormField({
     type: 'select',
-    label: i18n.t('meta.Sinks.Iceberg.DataConsistency'),
+    rules: [{ required: true }],
     initialValue: 'EXACTLY_ONCE',
+    isPro: true,
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       options: [
@@ -227,18 +242,21 @@ export const iceberg: FieldItemType[] = [
         },
       ],
     }),
-    isPro: true,
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Iceberg.DataConsistency')
+  dataConsistency: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/defaults/Kafka.ts b/inlong-dashboard/src/metas/sinks/defaults/Kafka.ts
index 8ccf526b8..2fe41b67c 100644
--- a/inlong-dashboard/src/metas/sinks/defaults/Kafka.ts
+++ b/inlong-dashboard/src/metas/sinks/defaults/Kafka.ts
@@ -22,7 +22,7 @@ import { SinkInfo } from '../common/SinkInfo';
 
 const { I18n, FormField, TableColumn } = DataWithBackend;
 
-export default class HiveSink extends SinkInfo implements DataWithBackend {
+export default class KafkaSink extends SinkInfo implements DataWithBackend {
   @FormField({
     type: 'input',
     rules: [{ required: true }],
diff --git a/inlong-dashboard/src/metas/sinks/mysql.tsx b/inlong-dashboard/src/metas/sinks/defaults/Mysql.ts
similarity index 86%
rename from inlong-dashboard/src/metas/sinks/mysql.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/Mysql.ts
index 28f8c48e2..898ade561 100644
--- a/inlong-dashboard/src/metas/sinks/mysql.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/Mysql.ts
@@ -16,9 +16,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { sourceFields } from '../common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const fieldTypesConf = {
   TINYINT: (m, d) => (1 <= m && m <= 4 ? '' : '1<=M<=4'),
@@ -55,41 +58,43 @@ const fieldTypes = Object.keys(fieldTypesConf).reduce(
   [],
 );
 
-export const mysql: FieldItemType[] = [
-  {
+export default class HiveSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'jdbc:mysql://127.0.0.1:3306/write',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.MySQL.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.MySQL.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Greenplum.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.MySQL.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -106,35 +111,42 @@ export const mysql: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/oracle.tsx b/inlong-dashboard/src/metas/sinks/defaults/Oracle.ts
similarity index 86%
rename from inlong-dashboard/src/metas/sinks/oracle.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/Oracle.ts
index 495ac91c8..f351c992c 100644
--- a/inlong-dashboard/src/metas/sinks/oracle.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/Oracle.ts
@@ -17,8 +17,12 @@
 
 import i18n from '@/i18n';
 import type { FieldItemType } from '@/metas/common';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+import { SinkInfo } from '../common/SinkInfo';
+import { sourceFields } from '../common/sourceFields';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const fieldTypesConf = {
   BINARY_FLOAT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'),
@@ -51,41 +55,43 @@ const oracleFieldTypes = Object.keys(fieldTypesConf).reduce(
   [],
 );
 
-export const oracle: FieldItemType[] = [
-  {
+export default class OracleSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'jdbc:oracle:thin://127.0.0.1:1521/db_name',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Oracle.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Oracle.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Oracle.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Oracle.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -102,36 +108,42 @@ export const oracle: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/postgreSql.tsx b/inlong-dashboard/src/metas/sinks/defaults/PostgreSql.ts
similarity index 86%
rename from inlong-dashboard/src/metas/sinks/postgreSql.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/PostgreSql.ts
index dcac339c3..59e68d4f5 100644
--- a/inlong-dashboard/src/metas/sinks/postgreSql.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/PostgreSql.ts
@@ -16,9 +16,12 @@
  */
 
 import i18n from '@/i18n';
-import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+import { SinkInfo } from '../common/SinkInfo';
+import { sourceFields } from '../common/sourceFields';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const fieldTypesConf = {
   SMALLINT: (m, d) => (1 <= m && m <= 6 ? '' : '1 <= M <= 6'),
@@ -55,51 +58,54 @@ const postgreSqlFieldTypes = Object.keys(fieldTypesConf).reduce(
   [],
 );
 
-export const postgreSql: FieldItemType[] = [
-  {
+export default class HiveSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'jdbc:postgresql://127.0.0.1:5432/db_name',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.PostgreSQL.DbName'),
-    name: 'dbName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.PostgreSQL.DbName')
+  dbName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.PostgreSQL.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.PostgreSQL.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.PostgreSQL.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.PostgreSQL.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -116,35 +122,42 @@ export const postgreSql: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/sqlServer.tsx b/inlong-dashboard/src/metas/sinks/defaults/SQLServer.ts
similarity index 85%
rename from inlong-dashboard/src/metas/sinks/sqlServer.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/SQLServer.ts
index 108f20ac6..41fbd37b5 100644
--- a/inlong-dashboard/src/metas/sinks/sqlServer.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/SQLServer.ts
@@ -18,7 +18,11 @@
 import i18n from '@/i18n';
 import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+import { sourceFields } from '../common/sourceFields';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const fieldTypesConf = {
   CHAR: (m, d) => (1 <= m && m <= 8000 ? '' : '1 <= M <= 8000'),
@@ -56,62 +60,68 @@ const sqlserverFieldTypes = Object.keys(fieldTypesConf).reduce(
   [],
 );
 
-export const sqlServer: FieldItemType[] = [
-  {
+export default class SqlServerSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
       placeholder: 'jdbc:sqlserver://127.0.0.1:1433;database=db_name',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.SQLServer.SchemaName'),
-    name: 'schemaName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.SQLServer.SchemaName')
+  schemaName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.SQLServer.ServerTimezone'),
-    name: 'serverTimezone',
-    initialValue: 'UTC',
     rules: [{ required: true }],
+    initialValue: 'UTC',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.SQLServer.ServerTimezone')
+  serverTimezone: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.SQLServer.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
+    initialValue: 'UTC',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.SQLServer.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.SQLServer.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
+    initialValue: 'UTC',
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.SQLServer.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -128,11 +138,12 @@ export const sqlServer: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.SQLServer.AllMigration'),
-    name: 'allMigration',
     rules: [{ required: true }],
     initialValue: true,
     props: values => ({
@@ -148,35 +159,40 @@ export const sqlServer: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.AllMigration')
+  allMigration: boolean;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/tdsqlPostgreSql.tsx b/inlong-dashboard/src/metas/sinks/defaults/TDSQLPostgreSql.ts
similarity index 81%
rename from inlong-dashboard/src/metas/sinks/tdsqlPostgreSql.tsx
rename to inlong-dashboard/src/metas/sinks/defaults/TDSQLPostgreSql.ts
index a790336f7..628a364fe 100644
--- a/inlong-dashboard/src/metas/sinks/tdsqlPostgreSql.tsx
+++ b/inlong-dashboard/src/metas/sinks/defaults/TDSQLPostgreSql.ts
@@ -18,7 +18,11 @@
 import i18n from '@/i18n';
 import type { FieldItemType } from '@/metas/common';
 import EditableTable from '@/components/EditableTable';
-import { sourceFields } from './common/sourceFields';
+import { DataWithBackend } from '@/metas/DataWithBackend';
+import { sourceFields } from '../common/sourceFields';
+import { SinkInfo } from '../common/SinkInfo';
+
+const { I18n, FormField, TableColumn } = DataWithBackend;
 
 const tdsqlPostgreSQLFieldTypes = [
   'SMALLINT',
@@ -49,51 +53,54 @@ const tdsqlPostgreSQLFieldTypes = [
   value: item,
 }));
 
-export const tdsqlPostgreSQL: FieldItemType[] = [
-  {
+export default class TDSQLPostgreSqlSink extends SinkInfo implements DataWithBackend {
+  @FormField({
     type: 'input',
-    label: 'JDBC URL',
-    name: 'jdbcUrl',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
-      placeholder: 'jdbc:postgresql://127.0.0.1:5432/db_name',
+      placeholder: 'jdbc:sqlserver://127.0.0.1:1433;database=db_name',
     }),
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('JDBC URL')
+  jdbcUrl: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.TDSQLPostgreSQL.SchemaName'),
-    name: 'schemaName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.TDSQLPostgreSQL.SchemaName')
+  schemaName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.TDSQLPostgreSQL.TableName'),
-    name: 'tableName',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.TDSQLPostgreSQL.TableName')
+  tableName: string;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.TDSQLPostgreSQL.PrimaryKey'),
-    name: 'primaryKey',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-    _renderTable: true,
-  },
-  {
+  })
+  @TableColumn()
+  @I18n('meta.Sinks.TDSQLPostgreSQL.PrimaryKey')
+  primaryKey: string;
+
+  @FormField({
     type: 'radio',
-    label: i18n.t('meta.Sinks.EnableCreateResource'),
-    name: 'enableCreateResource',
     rules: [{ required: true }],
     initialValue: 1,
     tooltip: i18n.t('meta.Sinks.EnableCreateResourceHelp'),
@@ -110,35 +117,40 @@ export const tdsqlPostgreSQL: FieldItemType[] = [
         },
       ],
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.EnableCreateResource')
+  enableCreateResource: number;
+
+  @FormField({
     type: 'input',
-    label: i18n.t('meta.Sinks.Username'),
-    name: 'username',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
+  })
+  @I18n('meta.Sinks.Username')
+  username: string;
+
+  @FormField({
     type: 'password',
-    label: i18n.t('meta.Sinks.Password'),
-    name: 'password',
     rules: [{ required: true }],
     props: values => ({
       disabled: [110, 130].includes(values?.status),
     }),
-  },
-  {
-    name: 'sinkFieldList',
+  })
+  @I18n('meta.Sinks.Password')
+  password: string;
+
+  @FormField({
     type: EditableTable,
     props: values => ({
       size: 'small',
       editing: ![110, 130].includes(values?.status),
       columns: getFieldListColumns(values),
     }),
-  },
-];
+  })
+  sinkFieldList: Record<string, unknown>[];
+}
 
 const getFieldListColumns = sinkValues => {
   return [
diff --git a/inlong-dashboard/src/metas/sinks/defaults/index.ts b/inlong-dashboard/src/metas/sinks/defaults/index.ts
index 0cda577da..c48571b27 100644
--- a/inlong-dashboard/src/metas/sinks/defaults/index.ts
+++ b/inlong-dashboard/src/metas/sinks/defaults/index.ts
@@ -35,14 +35,59 @@ export const allDefaultSinks: MetaExportWithBackendList = [
     value: 'DORIS',
     LoadEntity: () => import('./Doris'),
   },
+  {
+    label: 'Elasticsearch',
+    value: 'ELASTICSEARCH',
+    LoadEntity: () => import('./Es'),
+  },
+  {
+    label: 'Greenplum',
+    value: 'GREENPLUM',
+    LoadEntity: () => import('./Greenplum'),
+  },
   {
     label: 'Hive',
     value: 'HIVE',
     LoadEntity: () => import('./Hive'),
   },
+  {
+    label: 'HBase',
+    value: 'HBASE',
+    LoadEntity: () => import('./HBase'),
+  },
+  {
+    label: 'Iceberg',
+    value: 'ICEBERG',
+    LoadEntity: () => import('./Iceberg'),
+  },
   {
     label: 'Kafka',
     value: 'KAFKA',
     LoadEntity: () => import('./Kafka'),
   },
+  {
+    label: 'MySQL',
+    value: 'MYSQL',
+    LoadEntity: () => import('./Mysql'),
+  },
+  {
+    label: 'Oracle',
+    value: 'ORACLE',
+    LoadEntity: () => import('./Oracle'),
+  },
+  {
+    label: 'PostgreSQL',
+    value: 'POSTGRESQL',
+    LoadEntity: () => import('./PostgreSql'),
+  },
+  {
+    label: 'SQLServer',
+    value: 'SQLSERVER',
+    LoadEntity: () => import('./SQLServer'),
+  },
+  {
+    label: 'TDSQLPostgreSQL',
+    value: 'TDSQLPOSTGRESQL',
+    LoadEntity: () => import('./TDSQLPostgreSql'),
+  },
 ];