diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/cluster/ClusterEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/cluster/ClusterEntity.java
new file mode 100644
index 0000000..f81237d
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/cluster/ClusterEntity.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.entity.cluster;
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ClusterEntity {
+
+    private Long id;
+
+    private String name;
+
+    private String registerNameList;
+
+    private String bootstrapServers;
+
+    private String eventmeshVersion;
+
+    private String clientProperties;
+
+    private String jmxProperties;
+
+    private String regProperties;
+
+    private String description;
+
+    private Integer authType;
+
+    private Integer runState;
+
+    private Timestamp createTime;
+
+    private Timestamp updateTime;
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/config/ConfigEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/config/ConfigEntity.java
new file mode 100644
index 0000000..dd726a8
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/config/ConfigEntity.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.entity.config;
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class ConfigEntity {
+
+    private Long id;
+
+    private Long clusterId;
+
+    private String businessType;
+
+    private Integer instanceType;
+
+    private Long instanceId;
+
+    private String configName;
+
+    private String configValue;
+
+    private String startVersion;
+
+    private String eventmeshVersion;
+
+    private Integer status;
+
+    private String endVersion;
+
+    private Integer diffType;
+
+    private String description;
+
+    private Integer edit;
+
+    private Timestamp createTime;
+
+    private Timestamp updateTime;
+
+    private Integer isDefault;
+
+    private Integer isModify;
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/runtime/RuntimeEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/runtime/RuntimeEntity.java
new file mode 100644
index 0000000..e070075
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/runtime/RuntimeEntity.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.entity.runtime;
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class RuntimeEntity {
+
+    private Long id;
+
+    private Long clusterId;
+
+    private String host;
+
+    private Long storageClusterId;
+
+    private Integer port;
+
+    private Integer jmxPort;
+
+    private Long startTimestamp;
+
+    private String rack;
+
+    private Integer status;
+
+    private Timestamp createTime;
+
+    private Timestamp updateTime;
+
+    private String endpointMap;
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/storage/StoreEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/storage/StoreEntity.java
new file mode 100644
index 0000000..dd7f4d2
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/storage/StoreEntity.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.entity.storage;
+
+
+import java.sql.Timestamp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class StoreEntity {
+
+    private Long id;
+
+    private Long clusterId;
+
+    private Integer storeId;
+
+    private String storeType;
+
+    private String host;
+
+    private Long runtimeId;
+
+    private String topicList;
+
+    private Short diffType;
+
+    private Integer port;
+
+    private Integer jmxPort;
+
+    private String rack;
+
+    private Short status;
+
+    private Timestamp createTime;
+
+    private Timestamp updateTime;
+
+    private String endpointMap;
+
+    private Long startTimestamp;
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/cluster/ClusterMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/cluster/ClusterMapper.java
new file mode 100644
index 0000000..eea050a
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/cluster/ClusterMapper.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.mapper.cluster;
+
+import org.apache.eventmesh.dashboard.console.entity.cluster.ClusterEntity;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * cluster table operation
+ */
+@Mapper
+public interface ClusterMapper {
+
+    @Select("SELECT * FROM cluster WHERE is_delete=0")
+    List<ClusterEntity> selectAllCluster();
+
+    @Select("SELECT * FROM cluster WHERE id=#{id} AND is_delete=0")
+    ClusterEntity selectClusterById(ClusterEntity cluster);
+
+    @Insert("INSERT INTO cluster (name, register_name_list, bootstrap_servers, eventmesh_version, client_properties, "
+        + "jmx_properties, reg_properties, description, auth_type, run_state) VALUES (#{name},#{registerNameList},"
+        + "#{bootstrapServers},#{eventmeshVersion},#{clientProperties},#{jmxProperties},#{regProperties},#{description},#{authType},#{runState})")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    void addCluster(ClusterEntity cluster);
+
+    @Update("UPDATE cluster SET name =#{name},reg_properties=#{regProperties},bootstrap_servers=#{bootstrapServers},"
+        + "eventmesh_version=#{eventmeshVersion},client_properties=#{clientProperties},jmx_properties=#{jmxProperties},"
+        + "reg_properties=#{regProperties},description=#{description},auth_type=#{authType},run_state=#{runState} ,"
+        + "register_name_list=#{registerNameList} WHERE id=#{id}")
+    void updateClusterById(ClusterEntity cluster);
+
+    @Delete("UPDATE cluster SET is_delete=1 WHERE id=#{id}")
+    void deleteClusterById(ClusterEntity clusterEntity);
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/config/ConfigMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/config/ConfigMapper.java
new file mode 100644
index 0000000..e7ee325
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/config/ConfigMapper.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.mapper.config;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * config table operation
+ */
+@Mapper
+public interface ConfigMapper {
+
+    @Insert("INSERT INTO config (cluster_id, business_type, instance_type, instance_id, config_name,"
+        + " config_value, start_version,eventmesh_version, description, edit,end_version,is_default,is_modify) VALUE "
+        + "(#{clusterId},#{businessType},#{instanceType},#{instanceId},#{configName},"
+        + "#{configValue},#{startVersion},#{eventmeshVersion},#{description},#{edit},#{endVersion},#{isDefault},#{isModify})")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    Integer addConfig(ConfigEntity configEntity);
+
+    @Update("UPDATE config SET status=2 WHERE id=#{id}")
+    Integer deleteConfig(ConfigEntity configEntity);
+
+    @Update("UPDATE config SET config_value=#{configValue} WHERE status=1 AND edit=2")
+    void updateConfig(ConfigEntity configEntity);
+
+    @Select("SELECT * FROM config WHERE business_type=#{businessType} AND instance_type=#{instanceType} "
+        + "AND instance_id=#{instanceId}")
+    List<ConfigEntity> selectByInstanceId(ConfigEntity configEntity);
+
+    @Select("SELECT * FROM config WHERE cluster_id=-1 AND business_type=#{businessType} AND instance_type=#{instanceType}")
+    List<ConfigEntity> selectDefaultConfig(ConfigEntity configEntity);
+
+
+    @Select("SELECT * FROM config WHERE cluster_id=#{clusterId} AND instance_type=#{instanceType} "
+        + "AND instance_id=#{instanceId} AND config_name=#{configName} AND status=1")
+    ConfigEntity selectByUnique(ConfigEntity configEntity);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
index fc6756a..82ebc5c 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapper.java
@@ -35,6 +35,9 @@
 @Mapper
 public interface ConnectionMapper {
 
+    @Select("SELECT COUNT(*) FROM connection WHERE cluster_id=#{clusterId}")
+    Integer selectConnectionNumByCluster(ConnectionEntity connectionEntity);
+
     @Select("SELECT * FROM connection")
     List<ConnectionEntity> selectAll();
 
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
index 7812861..321e76c 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/group/OprGroupMapper.java
@@ -36,36 +36,36 @@
 
     @Insert("INSERT INTO `group` (cluster_id, name, member_count, members, type, state)"
         + "VALUE (#{clusterId},#{name},#{memberCount},#{members},#{type},#{state}) "
-        + "on duplicate key update is_delete=0")
+        + "ON DUPLICATE KEY UPDATE is_delete=0")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     void addGroup(GroupEntity groupEntity);
 
-    @Update("update `group`set member_count=#{memberCount},"
-        + "members=#{members},type=#{type},state=#{state} where id=#{id}")
+    @Update("UPDATE `group` SET member_count=#{memberCount},"
+        + "members=#{members},type=#{type},state=#{state} WHERE id=#{id}")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     Integer updateGroup(GroupEntity groupEntity);
 
-    @Delete("update `group` set  is_delete=1 where id=#{id}")
+    @Delete("UPDATE `group` SET  is_delete=1 WHERE id=#{id}")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     Integer deleteGroup(GroupEntity groupEntity);
 
-    @Select("select * from `group` where cluster_id=#{clusterId} and name=#{name} and is_delete=0")
+    @Select("SELECT * FROM `group` WHERE cluster_id=#{clusterId} AND name=#{name} AND is_delete=0")
     GroupEntity selectGroupByUnique(GroupEntity groupEntity);
 
-    @Select("select * from `group` where id=#{id} and is_delete=0")
+    @Select("SELECT * FROM `group` WHERE id=#{id} AND is_delete=0")
     GroupEntity selectGroupById(GroupEntity groupEntity);
 
     @Select({
         "<script>",
-        "   select * from `group`",
+        "   SELECT * FROM `group`",
         "   <where>",
         "       <if test='clusterId != null'>",
         "           cluster_id=#{clusterId}",
         "       </if>",
         "       <if test='name != null'>",
-        "           and name like concat('%',#{name},'%')",
+        "           AND name LIKE concat('%',#{name},'%')",
         "       </if>",
-        "       and is_delete=0",
+        "       AND is_delete=0",
         "   </where>",
         "</script>"})
     List<GroupEntity> selectGroup(GroupEntity groupEntity);
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
index aac0a59..b3dab8a 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/groupmember/OprGroupMemberMapper.java
@@ -36,47 +36,47 @@
 @Mapper
 public interface OprGroupMemberMapper {
 
-    @Select("select * from group_member where cluster_id=#{clusterId} and is_delete=0")
+    @Select("SELECT * FROM group_member WHERE cluster_id=#{clusterId} AND is_delete=0")
     List<GroupMemberEntity> getGroupByClusterId(GroupMemberEntity groupMemberEntity);
 
-    @Insert("insert into group_member (cluster_id, topic_name, group_name, eventmesh_user,state)"
+    @Insert("INSERT INTO group_member (cluster_id, topic_name, group_name, eventmesh_user,state)"
         + " VALUE (#{clusterId},#{topicName},#{groupName},#{eventMeshUser},#{state})"
-        + "on duplicate key update is_delete=0")
+        + "ON DUPLICATE KEY UPDATE is_delete=0")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     void addGroupMember(GroupMemberEntity groupMemberEntity);
 
-    @Update("update group_member set state=#{state} where id=#{id}")
+    @Update("UPDATE group_member SET state=#{state} WHERE id=#{id}")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     void updateGroupMember(GroupMemberEntity groupMemberEntity);
 
-    @Delete("update group_member set is_delete=1 where id=#{id} ")
+    @Delete("UPDATE group_member SET is_delete=1 WHERE id=#{id} ")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     GroupMemberEntity deleteGroupMember(GroupMemberEntity groupMemberEntity);
 
-    @Select("select * from group_member where cluster_id=#{clusterId} and group_name=#{groupName} and topic_name=#{topicName} and is_delete=0")
+    @Select("SELECT * FROM group_member WHERE cluster_id=#{clusterId} AND group_name=#{groupName} AND topic_name=#{topicName} AND is_delete=0")
     GroupMemberEntity selectGroupMemberByUnique(GroupMemberEntity groupMemberEntity);
 
-    @Select("select * from group_member where id=#{id} and is_delete=0")
+    @Select("SELECT * FROM group_member WHERE id=#{id} AND is_delete=0")
     GroupMemberEntity selectGroupMemberById(GroupMemberEntity groupMemberEntity);
 
     @Select({
         "<script>",
-        "   select * from group_member",
+        "   SELECT * FROM group_member",
         "   <where>",
         "       <if test='clusterId != null'>",
         "           cluster_id=#{clusterId}",
         "       </if>",
         "       <if test='groupName != null'>",
-        "           and group_name=#{groupName}",
+        "           AND group_name=#{groupName}",
         "       </if>",
         "       <if test='topicName != null'>",
-        "           and topic_name=#{topicName}",
+        "           AND topic_name=#{topicName}",
         "       </if>",
         "    </where>",
-        "   and is_delete=0",
+        "   AND is_delete=0",
         "</script>"})
     List<GroupMemberEntity> selectMember(GroupMemberEntity groupMemberEntity);
 
-    @Update("update group_member set state=#{state} where topic_name=#{topicName}")
+    @Update("UPDATE group_member SET state=#{state} WHERE topic_name=#{topicName}")
     void updateMemberByTopic(GroupMemberEntity groupMemberEntity);
 }
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
index 8f2dbf4..fcc7dc9 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/log/OprLogMapper.java
@@ -21,8 +21,8 @@
 
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
 import org.apache.ibatis.annotations.Select;
-import org.apache.ibatis.annotations.SelectKey;
 import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
@@ -35,27 +35,27 @@
 
     @Select({
         "<script>",
-        "   select * from operation_log",
+        "   SELECT * FROM operation_log",
         "   <where>",
         "       <if test='targetType!=null'>",
-        "           target_type=#{targetType}",
+        "           target_type=#{operationType}",
         "       </if>",
         "       <if test='operationUser!=null'>",
-        "           and operation_user=#{operationUser}",
+        "           AND operation_user=#{operationUser}",
         "       </if>",
         "       <if test='clusterId!=null'>",
-        "           and cluster_id=#{clusterId} ",
+        "           AND cluster_id=#{clusterId} ",
         "       </if>",
-        "       and is_delete=0",
+        "       AND is_delete=0",
         "   </where>",
         "</script>"})
     List<LogEntity> getLogList(LogEntity logEntity);
 
-    @Insert("insert into operation_log ( cluster_id, operation_type,target_Type, description,operation_user,result_content)"
-        + "VALUE (#{clusterId},#{operationType},#{targetType},#{description},#{operationUser},#{resultContent})")
-    @SelectKey(keyColumn = "id", statement = {" select last_insert_id()"}, keyProperty = "id", before = false, resultType = Long.class)
+    @Insert("INSERT INTO operation_log ( cluster_id, operation_type,target_Type, content,operation_user,result)"
+        + "VALUE (#{clusterId},#{operationType},#{targetType},#{content},#{operationUser},#{result})")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     Long addLog(LogEntity logEntity);
 
-    @Update("update operation_log set status=#{status} ,result_content=#{resultContent} where id=#{id}")
+    @Update("UPDATE operation_log SET status=#{status} ,result=#{resultContent} WHERE id=#{id}")
     Integer updateLog(LogEntity logEntity);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/runtime/RuntimeMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/runtime/RuntimeMapper.java
new file mode 100644
index 0000000..a9db87f
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/runtime/RuntimeMapper.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.mapper.runtime;
+
+import org.apache.eventmesh.dashboard.console.entity.runtime.RuntimeEntity;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * runtime table operation
+ */
+@Mapper
+public interface RuntimeMapper {
+
+    @Insert("INSERT INTO runtime (cluster_id, host, storage_cluster_id, port, jmx_port, start_timestamp, rack, status, "
+        + "endpoint_map) VALUES(#{clusterId},#{host},#{storageClusterId},#{port},#{jmxPort},#{startTimestamp},#{rack},#{status},#{endpointMap})")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    void addRuntime(RuntimeEntity runtimeEntity);
+
+    @Select("SELECT * FROM runtime WHERE cluster_id=#{clusterId} AND is_delete=0")
+    List<RuntimeEntity> selectRuntimeByCluster(RuntimeEntity runtimeEntity);
+
+    @Update("UPDATE runtime SET port=#{port} ,jmx_port=#{jmxPort} ,status=#{status} WHERE cluster_id=#{clusterId} AND is_delete=0")
+    void updateRuntimeByCluster(RuntimeEntity runtimeEntity);
+
+    @Delete("UPDATE runtime SET is_delete=1 WHERE cluster_id=#{clusterId}")
+    void deleteRuntimeByCluster(RuntimeEntity runtimeEntity);
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/storage/StoreMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/storage/StoreMapper.java
new file mode 100644
index 0000000..0207903
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/storage/StoreMapper.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.mapper.storage;
+
+import org.apache.eventmesh.dashboard.console.entity.storage.StoreEntity;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+/**
+ * store table operation
+ */
+@Mapper
+public interface StoreMapper {
+
+    @Insert("INSERT INTO store (cluster_id, store_id, store_type, host, runtime_id, topic_list, diff_type"
+        + ", port, jmx_port, start_timestamp, rack, status, endpoint_map ) VALUES ("
+        + "#{clusterId},#{storeId},#{storeType},#{host},#{runtimeId},#{topicList},#{diffType},#{port},#{jmxPort}"
+        + ",#{startTimestamp},#{rack},#{status},#{endpointMap})")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    void addStore(StoreEntity storeEntity);
+
+    @Update("UPDATE store SET is_delete=1 WHERE cluster_id=#{clusterId} AND store_id=#{storeId}")
+    void deleteStoreByUnique(StoreEntity storeEntity);
+
+    @Select("SELECT * FROM store WHERE cluster_id=#{clusterId} AND is_delete=0")
+    List<StoreEntity> selectStoreByCluster(StoreEntity storeEntity);
+
+    @Update("UPDATE store SET status=#{status} WHERE cluster_id=#{clusterId} AND store_id=#{storeId}")
+    void updateStoreByUnique(StoreEntity storeEntity);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
index 42d68d0..0fe2cad 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/topic/TopicMapper.java
@@ -35,37 +35,43 @@
 @Mapper
 public interface TopicMapper {
 
+    @Select("SELECT count(*) FROM topic WHERE cluster_id=#{clusterId}")
+    Integer selectTopicNumByCluster(TopicEntity topicEntity);
+
     @Select({
         "<script>",
-        "   select * from topic",
+        "   SELECT * FROM topic",
         "   <where>",
         "       <if test='topicName!=null'>",
-        "           and topic_name=#{topicName}",
+        "           AND topic_name=#{topicName}",
         "       </if>",
         "       <if test='clusterId!=null'>",
-        "           and cluster_id=#{clusterId} ",
+        "           AND cluster_id=#{clusterId} ",
         "       </if>",
-        "       and is_delete=0",
+        "       AND is_delete=0",
         "   </where>",
         "</script>"})
     List<TopicEntity> getTopicList(TopicEntity topicEntity);
 
     @Insert("INSERT INTO topic (cluster_id, topic_name, runtime_id, storage_id, retention_ms, type, description) "
         + "VALUE (#{clusterId},#{topicName},#{runtimeId},#{storageId},#{retentionMs},#{type},#{description})"
-        + "on duplicate key update is_delete = 0")
+        + "ON DUPLICATE KEY UPDATE is_delete = 0")
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     void addTopic(TopicEntity topicEntity);
 
-    @Update("update topic set type=#{type},description=#{description} where id=#{id}")
+    @Update("UPDATE topic SET type=#{type},description=#{description} WHERE id=#{id}")
     void updateTopic(TopicEntity topicEntity);
 
-    @Delete("update `topic` set is_delete=1 where id=#{id}")
+    @Delete("UPDATE `topic` SET is_delete=1 WHERE id=#{id}")
     void deleteTopic(TopicEntity topicEntity);
 
-    @Select("select * from topic where cluster_id=#{clusterId} and topic_name=#{topicName}")
+    @Select("SELECT * FROM topic WHERE cluster_id=#{clusterId} AND topic_name=#{topicName}")
     TopicEntity selectTopicByUnique(TopicEntity topicEntity);
 
-    @Select("select * from topic where id=#{id}")
+    @Select("SELECT * FROM topic WHERE id=#{id}")
     TopicEntity selectTopicById(TopicEntity topicEntity);
 
+    @Select("SELECT * FROM topic WHERE cluster_id=#{clusterId}")
+    List<TopicEntity> selectTopicByCluster(TopicEntity topicEntity);
+
 }
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/ClusterService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/ClusterService.java
new file mode 100644
index 0000000..6f0d7cf
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/ClusterService.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.cluster;
+
+import org.apache.eventmesh.dashboard.console.entity.cluster.ClusterEntity;
+
+import java.util.List;
+
+/**
+ * cluster data service
+ */
+public interface ClusterService {
+
+    void addCluster(ClusterEntity cluster);
+
+    List<ClusterEntity> selectAllCluster();
+
+    ClusterEntity selectClusterById(ClusterEntity cluster);
+
+    void updateClusterById(ClusterEntity cluster);
+
+    void deleteClusterById(ClusterEntity cluster);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/impl/ClusterServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/impl/ClusterServiceImpl.java
new file mode 100644
index 0000000..b669c4e
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/cluster/impl/ClusterServiceImpl.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.cluster.impl;
+
+import org.apache.eventmesh.dashboard.console.entity.cluster.ClusterEntity;
+import org.apache.eventmesh.dashboard.console.mapper.cluster.ClusterMapper;
+import org.apache.eventmesh.dashboard.console.service.cluster.ClusterService;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class ClusterServiceImpl implements ClusterService {
+
+    @Autowired
+    private ClusterMapper clusterMapper;
+
+    @Override
+    public void addCluster(ClusterEntity cluster) {
+        clusterMapper.addCluster(cluster);
+    }
+
+    @Override
+    public List<ClusterEntity> selectAllCluster() {
+        return clusterMapper.selectAllCluster();
+    }
+
+    @Override
+    public ClusterEntity selectClusterById(ClusterEntity cluster) {
+        return clusterMapper.selectClusterById(cluster);
+    }
+
+    @Override
+    public void updateClusterById(ClusterEntity cluster) {
+        clusterMapper.updateClusterById(cluster);
+    }
+
+    @Override
+    public void deleteClusterById(ClusterEntity cluster) {
+        clusterMapper.deleteClusterById(cluster);
+    }
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/ConfigService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/ConfigService.java
new file mode 100644
index 0000000..d2dea9e
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/ConfigService.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config;
+
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * config data service
+ */
+public interface ConfigService {
+
+    String mapToYaml(Map<String, String> stringMap);
+
+    Integer addConfig(ConfigEntity configEntity);
+
+    Integer deleteConfig(ConfigEntity configEntity);
+
+    String mapToProperties(Map<String, String> stringMap);
+
+
+    List<ConfigEntity> selectByInstanceId(ConfigEntity configEntity);
+
+    List<ConfigEntity> selectDefaultConfig(ConfigEntity configEntity);
+
+    void updateConfig(ConfigEntity configEntity);
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/Impl/ConfigServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/Impl/ConfigServiceImpl.java
new file mode 100644
index 0000000..9bab90c
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/Impl/ConfigServiceImpl.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.Impl;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.mapper.config.ConfigMapper;
+import org.apache.eventmesh.dashboard.console.service.config.ConfigService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.yaml.snakeyaml.Yaml;
+
+@Service
+public class ConfigServiceImpl implements ConfigService {
+
+
+    @Autowired
+    ConfigMapper configMapper;
+
+    @Override
+    public String mapToYaml(Map<String, String> stringMap) {
+        Yaml yaml = new Yaml();
+        return yaml.dumpAsMap(stringMap);
+    }
+
+    @Override
+    public String mapToProperties(Map<String, String> stringMap) {
+        Properties properties = new Properties();
+        stringMap.forEach((key, value) -> {
+            properties.setProperty(key, value);
+        });
+        return properties.toString().replace(",", ",\n");
+    }
+
+    @Override
+    public Integer addConfig(ConfigEntity configEntity) {
+        return configMapper.addConfig(configEntity);
+    }
+
+    @Override
+    public Integer deleteConfig(ConfigEntity configEntity) {
+        return configMapper.deleteConfig(configEntity);
+    }
+
+    @Override
+    public List<ConfigEntity> selectByInstanceId(ConfigEntity configEntity) {
+        return configMapper.selectByInstanceId(configEntity);
+    }
+
+    @Override
+    public List<ConfigEntity> selectDefaultConfig(ConfigEntity configEntity) {
+        return configMapper.selectDefaultConfig(configEntity);
+    }
+
+    @Override
+    public void updateConfig(ConfigEntity configEntity) {
+        configMapper.updateConfig(configEntity);
+    }
+
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/ConnectorConfigService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/ConnectorConfigService.java
new file mode 100644
index 0000000..e54b3cc
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/ConnectorConfigService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.instanceoperation;
+
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+/**
+ * TODO Pending interfaces
+ */
+
+@Service
+public class ConnectorConfigService {
+
+    public List<ConfigEntity> getConnectorConfigFromInstance(Long clusterId, Long id) {
+        return null;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/RuntimeConfigService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/RuntimeConfigService.java
new file mode 100644
index 0000000..3e8645d
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/RuntimeConfigService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.instanceoperation;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+/**
+ * TODO Pending interfaces
+ */
+
+@Service
+public class RuntimeConfigService {
+
+    public List<ConfigEntity> getRuntimeConfigFromInstance(Long clusterId, String host) {
+        return null;
+    }
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/StoreConfigService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/StoreConfigService.java
new file mode 100644
index 0000000..7ad7c16
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/StoreConfigService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.instanceoperation;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+/**
+ * TODO Pending interfaces
+ */
+
+@Service
+public class StoreConfigService {
+
+    public List<ConfigEntity> getStorageConfigFromInstance(Long clusterId, String storeId) {
+        return null;
+    }
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/TopicConfigService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/TopicConfigService.java
new file mode 100644
index 0000000..c5564ff
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/instanceoperation/TopicConfigService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.instanceoperation;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+/**
+ * TODO Pending interfaces
+ */
+
+@Service
+public class TopicConfigService {
+
+    public List<ConfigEntity> getTopicConfigFromInstance(Long clusterId, String name) {
+        return null;
+    }
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncConnectorConfigTask.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncConnectorConfigTask.java
new file mode 100644
index 0000000..5935186
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncConnectorConfigTask.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.synchronous;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
+import org.apache.eventmesh.dashboard.console.service.config.ConfigService;
+import org.apache.eventmesh.dashboard.console.service.config.instanceoperation.ConnectorConfigService;
+import org.apache.eventmesh.dashboard.console.service.connector.ConnectorDataService;
+
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Synchronous DB To Instance
+ */
+@Service
+public class SyncConnectorConfigTask {
+
+    @Autowired
+    private ConnectorDataService connectorDataService;
+
+    @Autowired
+    private ConnectorConfigService connectorConfigService;
+    @Autowired
+    private ConfigService configService;
+
+    public void synchronousConnectorConfig(Long clusterId) {
+        List<ConnectorEntity> connectorEntities = connectorDataService.selectConnectorByCluster(clusterId);
+        for (ConnectorEntity connectorEntity : connectorEntities) {
+
+            ConcurrentHashMap<String, String> connectorConfigMapFromInstance = this.configListToMap(
+                connectorConfigService.getConnectorConfigFromInstance(clusterId, connectorEntity.getId()));
+
+            ConfigEntity configEntity = this.getConfigEntityBelongInstance(clusterId, connectorEntity.getId());
+
+            ConcurrentHashMap<String, String> connectorConfigMapFromDb = this.configListToMap(configService.selectByInstanceId(configEntity));
+
+            ConcurrentHashMap<String, String> updateConfigMap = new ConcurrentHashMap<>();
+
+            connectorConfigMapFromInstance.entrySet().forEach(n -> {
+                if (connectorConfigMapFromDb.remove(n.getKey(), n.getValue())) {
+                    connectorConfigMapFromInstance.remove(n.getKey());
+                }
+                if (connectorConfigMapFromDb.get(n.getKey()) != null) {
+                    updateConfigMap.put(n.getKey(), connectorConfigMapFromDb.get(n.getKey()));
+                    connectorConfigMapFromInstance.remove(n.getKey());
+                    connectorConfigMapFromDb.remove(n.getKey());
+                }
+            });
+            //add  connectorConfigMapFromDb
+
+            //update  updateConfigMap
+
+            //delete connectorConfigMapFromInstance
+        }
+    }
+
+    private ConcurrentHashMap<String, String> configListToMap(List<ConfigEntity> configEntityList) {
+        ConcurrentHashMap<String, String> connectorConfigMap = new ConcurrentHashMap<>();
+        configEntityList.forEach(n -> {
+                connectorConfigMap.put(n.getConfigName(), n.getConfigValue());
+            }
+        );
+        return connectorConfigMap;
+    }
+
+
+    private ConfigEntity getConfigEntityBelongInstance(Long clusterId, Long id) {
+        ConfigEntity configEntity = new ConfigEntity();
+        configEntity.setClusterId(clusterId);
+        configEntity.setInstanceId(id);
+        configEntity.setInstanceType(2);
+        return configEntity;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncRuntimeConfigTask.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncRuntimeConfigTask.java
new file mode 100644
index 0000000..51ee24f
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncRuntimeConfigTask.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.synchronous;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.entity.runtime.RuntimeEntity;
+import org.apache.eventmesh.dashboard.console.service.config.ConfigService;
+import org.apache.eventmesh.dashboard.console.service.config.instanceoperation.RuntimeConfigService;
+import org.apache.eventmesh.dashboard.console.service.runtime.RuntimeService;
+
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Synchronous DB To Instance
+ */
+
+@Service
+public class SyncRuntimeConfigTask {
+
+    @Autowired
+    private RuntimeService runtimeService;
+
+    @Autowired
+    private RuntimeConfigService runtimeConfigService;
+
+    @Autowired
+    private ConfigService configService;
+
+    public void synchronousRuntimeConfig(Long clusterId) {
+        List<RuntimeEntity> runtimeEntityList = runtimeService.getRuntimeByClusterId(clusterId);
+        for (RuntimeEntity runtimeEntity : runtimeEntityList) {
+
+            ConcurrentHashMap<String, String> runtimeConfigMapFromInstance = this.configListToMap(
+                runtimeConfigService.getRuntimeConfigFromInstance(clusterId, runtimeEntity.getHost()));
+
+            ConfigEntity configEntity = this.getConfigEntityBelongInstance(clusterId, runtimeEntity.getId());
+
+            ConcurrentHashMap<String, String> runtimeConfigMapFromDb = this.configListToMap(configService.selectByInstanceId(configEntity));
+
+            ConcurrentHashMap<String, String> updateConfigMap = new ConcurrentHashMap<>();
+
+            runtimeConfigMapFromInstance.entrySet().forEach(n -> {
+                if (runtimeConfigMapFromDb.remove(n.getKey(), n.getValue())) {
+                    runtimeConfigMapFromInstance.remove(n.getKey());
+                }
+                if (runtimeConfigMapFromDb.get(n.getKey()) != null) {
+                    updateConfigMap.put(n.getKey(), runtimeConfigMapFromDb.get(n.getKey()));
+                    runtimeConfigMapFromInstance.remove(n.getKey());
+                    runtimeConfigMapFromDb.remove(n.getKey());
+                }
+            });
+            //add  runtimeConfigMapFromDb
+
+            //update  updateConfigMap
+
+            //delete runtimeConfigMapFromInstance
+        }
+    }
+
+    private ConcurrentHashMap<String, String> configListToMap(List<ConfigEntity> configEntityList) {
+        ConcurrentHashMap<String, String> runtimeConfigMap = new ConcurrentHashMap<>();
+        configEntityList.forEach(n -> {
+                runtimeConfigMap.put(n.getConfigName(), n.getConfigValue());
+            }
+        );
+        return runtimeConfigMap;
+    }
+
+
+    private ConfigEntity getConfigEntityBelongInstance(Long clusterId, Long id) {
+        ConfigEntity configEntity = new ConfigEntity();
+        configEntity.setClusterId(clusterId);
+        configEntity.setInstanceId(id);
+        configEntity.setInstanceType(0);
+        return configEntity;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncStoreConfigTask.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncStoreConfigTask.java
new file mode 100644
index 0000000..f5235b0
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncStoreConfigTask.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.synchronous;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.entity.storage.StoreEntity;
+import org.apache.eventmesh.dashboard.console.service.config.ConfigService;
+import org.apache.eventmesh.dashboard.console.service.config.instanceoperation.StoreConfigService;
+import org.apache.eventmesh.dashboard.console.service.store.StoreService;
+
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Synchronous DB To Instance
+ */
+
+@Service
+public class SyncStoreConfigTask {
+
+    @Autowired
+    private StoreService storeService;
+
+    @Autowired
+    private StoreConfigService storeConfigService;
+
+    @Autowired
+    private ConfigService configService;
+
+    public void synchronousStoreConfig(Long clusterId) {
+        List<StoreEntity> storeEntityList = storeService.selectStoreByCluster(clusterId);
+        for (StoreEntity storeEntity : storeEntityList) {
+
+            ConcurrentHashMap<String, String> storeConfigMapFromInstance = this.configListToMap(
+                storeConfigService.getStorageConfigFromInstance(clusterId, storeEntity.getHost()));
+
+            ConfigEntity configEntity = this.getConfigEntityBelongInstance(clusterId, storeEntity.getId());
+
+            ConcurrentHashMap<String, String> storeConfigMapFromDb = this.configListToMap(configService.selectByInstanceId(configEntity));
+
+            ConcurrentHashMap<String, String> updateConfigMap = new ConcurrentHashMap<>();
+
+            storeConfigMapFromInstance.entrySet().forEach(n -> {
+                if (storeConfigMapFromDb.remove(n.getKey(), n.getValue())) {
+                    storeConfigMapFromInstance.remove(n.getKey());
+                }
+                if (storeConfigMapFromDb.get(n.getKey()) != null) {
+                    updateConfigMap.put(n.getKey(), storeConfigMapFromDb.get(n.getKey()));
+                    storeConfigMapFromInstance.remove(n.getKey());
+                    storeConfigMapFromDb.remove(n.getKey());
+                }
+            });
+            //add  storeConfigMapFromDb
+
+            //update  updateConfigMap
+
+            //delete storeConfigMapFromInstance
+        }
+    }
+
+    private ConcurrentHashMap<String, String> configListToMap(List<ConfigEntity> configEntityList) {
+        ConcurrentHashMap<String, String> storeConfigMap = new ConcurrentHashMap<>();
+        configEntityList.forEach(n -> {
+                storeConfigMap.put(n.getConfigName(), n.getConfigValue());
+            }
+        );
+        return storeConfigMap;
+    }
+
+
+    private ConfigEntity getConfigEntityBelongInstance(Long clusterId, Long id) {
+        ConfigEntity configEntity = new ConfigEntity();
+        configEntity.setClusterId(clusterId);
+        configEntity.setInstanceId(id);
+        configEntity.setInstanceType(1);
+        return configEntity;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncTopicConfigTask.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncTopicConfigTask.java
new file mode 100644
index 0000000..eada0b9
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/config/synchronous/SyncTopicConfigTask.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.config.synchronous;
+
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.entity.topic.TopicEntity;
+import org.apache.eventmesh.dashboard.console.service.config.ConfigService;
+import org.apache.eventmesh.dashboard.console.service.config.instanceoperation.TopicConfigService;
+import org.apache.eventmesh.dashboard.console.service.topic.TopicService;
+
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * Synchronous DB To Instance
+ */
+
+@Service
+public class SyncTopicConfigTask {
+
+    @Autowired
+    private TopicService topicService;
+
+    @Autowired
+    private TopicConfigService topicConfigService;
+
+    @Autowired
+    private ConfigService configService;
+
+    public void synchronousTopicConfig(Long clusterId) {
+        List<TopicEntity> topicEntityList = topicService.selectTopiByCluster(clusterId);
+        for (TopicEntity topicEntity : topicEntityList) {
+
+            ConcurrentHashMap<String, String> topicConfigMapFromInstance = this.configListToMap(
+                topicConfigService.getTopicConfigFromInstance(clusterId, topicEntity.getTopicName()));
+
+            ConfigEntity configEntity = this.getConfigEntityBelongInstance(clusterId, topicEntity.getId());
+
+            ConcurrentHashMap<String, String> topicConfigMapFromDb = this.configListToMap(configService.selectByInstanceId(configEntity));
+
+            ConcurrentHashMap<String, String> updateConfigMap = new ConcurrentHashMap<>();
+
+            topicConfigMapFromInstance.entrySet().forEach(n -> {
+                if (topicConfigMapFromDb.remove(n.getKey(), n.getValue())) {
+                    topicConfigMapFromInstance.remove(n.getKey());
+                }
+                if (topicConfigMapFromDb.get(n.getKey()) != null) {
+                    updateConfigMap.put(n.getKey(), topicConfigMapFromDb.get(n.getKey()));
+                    topicConfigMapFromInstance.remove(n.getKey());
+                    topicConfigMapFromDb.remove(n.getKey());
+                }
+            });
+            //add  topicConfigMapFromDb
+
+            //update  updateConfigMap
+
+            //delete topicConfigMapFromInstance
+        }
+    }
+
+    private ConcurrentHashMap<String, String> configListToMap(List<ConfigEntity> configEntityList) {
+        ConcurrentHashMap<String, String> topicConfigMap = new ConcurrentHashMap<>();
+        configEntityList.forEach(n -> {
+                topicConfigMap.put(n.getConfigName(), n.getConfigValue());
+            }
+        );
+        return topicConfigMap;
+    }
+
+
+    private ConfigEntity getConfigEntityBelongInstance(Long clusterId, Long id) {
+        ConfigEntity configEntity = new ConfigEntity();
+        configEntity.setClusterId(clusterId);
+        configEntity.setInstanceId(id);
+        configEntity.setInstanceType(1);
+        return configEntity;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/ConnectionDataService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/ConnectionDataService.java
index 05361eb..e4db317 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/ConnectionDataService.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/ConnectionDataService.java
@@ -22,10 +22,15 @@
 import java.util.List;
 
 /**
- * Service providing data of connections.
+ * Service providing ConnectionEntity data.
  */
 public interface ConnectionDataService {
+
+    Integer selectConnectionNumByCluster(Long clusterId);
+
     List<ConnectionEntity> getAllConnections();
 
+    List<ConnectionEntity> getAllConnectionsByClusterId(Long clusterId);
+
     void replaceAllConnections(List<ConnectionEntity> connectionEntityList);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
index cf22a83..b8c6634 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImpl.java
@@ -36,6 +36,8 @@
     @Autowired
     private ConnectionMapper connectionMapper;
 
+
+    @Override
     public List<ConnectionEntity> getAllConnectionsByClusterId(Long clusterId) {
         ConnectionEntity connectionEntity = new ConnectionEntity();
         connectionEntity.setClusterId(clusterId);
@@ -44,6 +46,13 @@
 
 
     @Override
+    public Integer selectConnectionNumByCluster(Long clusterId) {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(clusterId);
+        return connectionMapper.selectConnectionNumByCluster(connectionEntity);
+    }
+
+    @Override
     public List<ConnectionEntity> getAllConnections() {
         return connectionMapper.selectAll();
     }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/ConnectorDataService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/ConnectorDataService.java
index b0b9642..a32bbf9 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/ConnectorDataService.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/ConnectorDataService.java
@@ -17,9 +17,14 @@
 
 package org.apache.eventmesh.dashboard.console.service.connector;
 
+import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
+
+import java.util.List;
+
 /**
- * Service providing data of connectors.
+ * Service providing ConnectorEntity data.
  */
 public interface ConnectorDataService {
 
+    List<ConnectorEntity> selectConnectorByCluster(Long clusterId);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/Impl/ConnectorDataServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/Impl/ConnectorDataServiceImpl.java
new file mode 100644
index 0000000..7a9a706
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/connector/Impl/ConnectorDataServiceImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.connector.Impl;
+
+import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
+import org.apache.eventmesh.dashboard.console.mapper.connector.ConnectorMapper;
+import org.apache.eventmesh.dashboard.console.service.connector.ConnectorDataService;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ConnectorDataServiceImpl implements ConnectorDataService {
+
+    @Autowired
+    private ConnectorMapper connectorMapper;
+
+    @Override
+    public List<ConnectorEntity> selectConnectorByCluster(Long clusterId) {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setClusterId(clusterId);
+        return connectorMapper.selectByClusterId(connectorEntity);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/Impl/RuntimeServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/Impl/RuntimeServiceImpl.java
new file mode 100644
index 0000000..7b7ec07
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/Impl/RuntimeServiceImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.runtime.Impl;
+
+import org.apache.eventmesh.dashboard.console.entity.runtime.RuntimeEntity;
+import org.apache.eventmesh.dashboard.console.mapper.runtime.RuntimeMapper;
+import org.apache.eventmesh.dashboard.console.service.runtime.RuntimeService;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RuntimeServiceImpl implements RuntimeService {
+
+    @Autowired
+    private RuntimeMapper runtimeMapper;
+
+    @Override
+    public List<RuntimeEntity> getRuntimeByClusterId(Long clusterId) {
+        RuntimeEntity runtimeEntity = new RuntimeEntity();
+        runtimeEntity.setClusterId(clusterId);
+        return runtimeMapper.selectRuntimeByCluster(runtimeEntity);
+    }
+
+    @Override
+    public void addRuntime(RuntimeEntity runtimeEntity) {
+        runtimeMapper.addRuntime(runtimeEntity);
+    }
+
+    @Override
+    public void updateRuntimeByCluster(RuntimeEntity runtimeEntity) {
+        runtimeMapper.updateRuntimeByCluster(runtimeEntity);
+    }
+
+    @Override
+    public void deleteRuntimeByCluster(RuntimeEntity runtimeEntity) {
+        runtimeMapper.deleteRuntimeByCluster(runtimeEntity);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/RuntimeService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/RuntimeService.java
new file mode 100644
index 0000000..c4569ce
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/runtime/RuntimeService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.runtime;
+
+import org.apache.eventmesh.dashboard.console.entity.runtime.RuntimeEntity;
+
+import java.util.List;
+
+/**
+ * Runtime data service
+ */
+public interface RuntimeService {
+
+    List<RuntimeEntity> getRuntimeByClusterId(Long cluster);
+
+    void addRuntime(RuntimeEntity runtimeEntity);
+
+    void updateRuntimeByCluster(RuntimeEntity runtimeEntity);
+
+    void deleteRuntimeByCluster(RuntimeEntity runtimeEntity);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/Impl/StoreServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/Impl/StoreServiceImpl.java
new file mode 100644
index 0000000..4e4469b
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/Impl/StoreServiceImpl.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.store.Impl;
+
+import org.apache.eventmesh.dashboard.console.entity.storage.StoreEntity;
+import org.apache.eventmesh.dashboard.console.mapper.storage.StoreMapper;
+import org.apache.eventmesh.dashboard.console.service.store.StoreService;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StoreServiceImpl implements StoreService {
+
+    @Autowired
+    private StoreMapper storeMapper;
+
+    @Override
+    public void addStore(StoreEntity storeEntity) {
+        storeMapper.addStore(storeEntity);
+    }
+
+    @Override
+    public void deleteStoreByUnique(StoreEntity storeEntity) {
+        storeMapper.deleteStoreByUnique(storeEntity);
+    }
+
+    @Override
+    public List<StoreEntity> selectStoreByCluster(Long clusterId) {
+        StoreEntity storeEntity = new StoreEntity();
+        storeEntity.setClusterId(clusterId);
+        return storeMapper.selectStoreByCluster(storeEntity);
+    }
+
+    @Override
+    public void updateStoreByUnique(StoreEntity storeEntity) {
+        storeMapper.updateStoreByUnique(storeEntity);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/StoreService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/StoreService.java
new file mode 100644
index 0000000..9fdaf4f
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/store/StoreService.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.eventmesh.dashboard.console.service.store;
+
+import org.apache.eventmesh.dashboard.console.entity.storage.StoreEntity;
+
+import java.util.List;
+
+/**
+ * store data service
+ */
+public interface StoreService {
+
+    void addStore(StoreEntity storeEntity);
+
+    void deleteStoreByUnique(StoreEntity storeEntity);
+
+    List<StoreEntity> selectStoreByCluster(Long clusterId);
+
+    void updateStoreByUnique(StoreEntity storeEntity);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicService.java
index 95c8a32..2f8696d 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicService.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicService.java
@@ -25,9 +25,12 @@
  * Service about Topic
  */
 public interface TopicService {
+
+    Integer selectTopicNumByCluster(Long clusterId);
+
     List<TopicEntity> getTopicList(TopicEntity topicEntity);
 
-    void addTopic_plus(TopicEntity topicEntity);
+    void addTopic(TopicEntity topicEntity);
 
     void updateTopic(TopicEntity topicEntity);
 
@@ -38,4 +41,6 @@
     TopicEntity selectTopicByUnique(TopicEntity topicEntity);
 
     void deleteTopic(TopicEntity topicEntity);
+
+    List<TopicEntity> selectTopiByCluster(Long clusterId);
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicServiceImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicServiceImpl.java
index aa42e7b..444de27 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicServiceImpl.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/topic/TopicServiceImpl.java
@@ -38,12 +38,19 @@
 
 
     @Override
+    public Integer selectTopicNumByCluster(Long clusterId) {
+        TopicEntity topicEntity = new TopicEntity();
+        topicEntity.setClusterId(clusterId);
+        return topicMapper.selectTopicNumByCluster(topicEntity);
+    }
+
+    @Override
     public List<TopicEntity> getTopicList(TopicEntity topicEntity) {
         return topicMapper.getTopicList(topicEntity);
     }
 
     @Override
-    public void addTopic_plus(TopicEntity topicEntity) {
+    public void addTopic(TopicEntity topicEntity) {
         GroupMemberEntity groupMemberEntity = new GroupMemberEntity();
         groupMemberEntity.setTopicName(topicEntity.getTopicName());
         groupMemberEntity.setState("active");
@@ -79,4 +86,13 @@
         oprGroupMemberMapper.updateMemberByTopic(groupMemberEntity);
         topicMapper.deleteTopic(topicEntity);
     }
+
+    @Override
+    public List<TopicEntity> selectTopiByCluster(Long clusterId) {
+        TopicEntity topicEntity = new TopicEntity();
+        topicEntity.setClusterId(clusterId);
+        return topicMapper.selectTopicByCluster(topicEntity);
+    }
+
+
 }
diff --git a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
index 96d4a84..c24a554 100644
--- a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
+++ b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
@@ -14,6 +14,121 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+DROP TABLE IF EXISTS `cluster`;
+create table cluster
+(
+    id                 bigint unsigned auto_increment comment '集群id'
+        primary key,
+    name               varchar(128)  default ''                not null comment '集群名称',
+    register_name_list varchar(4096) default ''                not null comment '注册中心名字',
+    bootstrap_servers  varchar(2048) default ''                not null comment 'server地址',
+    eventmesh_version  varchar(32)   default ''                not null comment 'eventmesh版本',
+    client_properties  text                                    null comment 'EventMesh客户端配置',
+    jmx_properties     text                                    null comment 'JMX配置',
+    reg_properties     text                                    null comment '注册中心配置',
+    description        text                                    null comment '备注',
+    auth_type          int           default 0                 not null comment '认证类型，-1未知，0:无认证，',
+    run_state          tinyint       default 1                 not null comment '运行状态, 0表示未监控, 1监控中，有注册中心，2:监控中，无注册中心',
+    create_time        timestamp     default CURRENT_TIMESTAMP not null comment '接入时间',
+    update_time        timestamp     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
+    is_delete          int           default 0                 not null comment '0',
+    constraint uniq_name
+        unique (name)
+)
+    comment '物理集群信息表';
+
+create index idx_uniq_name
+    on cluster (name);
+
+
+DROP TABLE IF EXISTS `config`;
+create table config
+(
+    id                bigint unsigned auto_increment
+        primary key,
+    cluster_id        bigint        default -1                not null comment '集群ID',
+    business_type     varchar(64)   default ''                not null comment '业务类型',
+    instance_type     tinyint                                 not null comment '配置类型 0:runtime,1:storage,2:connector,3:topic',
+    instance_id       bigint        default -1                not null comment '实例ID，上面配置对应的(比如runtime)的id',
+    config_name       varchar(192)  default ''                not null comment '配置名称',
+    config_value      text                                    null comment '配置值',
+    start_version     varchar(64)   default ''                not null comment '配置开始使用的版本',
+    status            int           default 1                 not null comment '1 正常 2 禁用',
+    end_version       varchar(64)   default ''                not null comment '配置结束使用的版本',
+    diff_type         int           default -1                not null comment '差异类型',
+    description       varchar(1000) default ''                not null comment '备注',
+    edit              int           default 1                 not null comment '是否可以编辑 1 不可编辑（程序获取） 2 可编辑',
+    create_time       timestamp     default CURRENT_TIMESTAMP not null comment '创建时间',
+    update_time       timestamp     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
+    is_default        int                                     not null comment '是否是默认值，0默认，1自定义的',
+    is_modify         int           default 0                 not null,
+    eventmesh_version varchar(64)   default ' '               not null,
+    constraint uniq_instance_type_instance_id_config_name
+        unique (instance_id, config_name, instance_type)
+)
+    comment '配置信息表';
+
+create index idx_phy_id_instance_id
+    on config (cluster_id, instance_id);
+
+
+DROP TABLE IF EXISTS `runtime`;
+create table runtime
+(
+    id                 bigint auto_increment comment 'id'
+        primary key,
+    cluster_id         bigint        default -1                not null comment '物理集群ID',
+    host               varchar(128)  default ''                not null comment 'runtime主机名',
+    storage_cluster_id bigint        default -1                not null comment 'storageId',
+    port               int           default -1                not null comment 'runtime端口',
+    jmx_port           int           default -1                not null comment 'Jmx端口',
+    start_timestamp    bigint        default -1                not null comment '启动时间',
+    rack               varchar(128)  default ''                not null comment 'Rack信息',
+    status             int           default 0                 not null comment '状态: 1启用，0未启用',
+    create_time        timestamp     default CURRENT_TIMESTAMP not null comment '创建时间',
+    update_time        timestamp     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
+    endpoint_map       varchar(1024) default ''                not null comment '监听信息',
+    is_delete          int           default 0                 not null comment '0',
+    constraint uniq_cluster_phy_id__host_port
+        unique (cluster_id, host)
+)
+    comment 'Runtime信息表';
+
+create index idx_phy_id_host_storage_id
+    on runtime (cluster_id, storage_cluster_id);
+
+
+DROP TABLE IF EXISTS `store`;
+create table store
+(
+    id              bigint unsigned auto_increment comment 'id'
+        primary key,
+    cluster_id      bigint        default -1                not null comment '物理集群ID',
+    store_id        int           default -1                not null comment 'storeId',
+    store_type      varchar(32)   default ''                not null comment 'Store类型,如rocketmq,redis,...',
+    host            varchar(128)  default ''                not null comment 'store主机名',
+    runtime_id      bigint        default -1                not null comment 'runtimeId',
+    topic_list      varchar(4096) default ''                not null comment 'topicName列表',
+    diff_type       int           default -1                not null comment '差异类型',
+    port            int           default -1                not null comment 'store端口',
+    jmx_port        int           default -1                not null comment 'Jmx端口',
+    start_timestamp bigint        default -1                not null comment '启动时间',
+    rack            varchar(128)  default ''                not null comment 'Rack信息',
+    status          int           default 0                 not null comment '状态: 1启用，0未启用',
+    create_time     timestamp     default CURRENT_TIMESTAMP not null comment '创建时间',
+    update_time     timestamp     default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
+    endpoint_map    varchar(1024) default ''                not null comment '监听信息',
+    is_delete       int           default 0                 not null,
+    constraint uniq_cluster_phy_id__storage_id
+        unique (cluster_id, store_id)
+)
+    comment 'Store信息表';
+
+create index idx_store_id_runtime_id
+    on store (store_id, cluster_id, runtime_id);
+
+
+
 DROP TABLE IF EXISTS `group`;
 CREATE TABLE `group`
 (
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/cluster/TestClusterMapper.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/cluster/TestClusterMapper.java
new file mode 100644
index 0000000..192c4e0
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/cluster/TestClusterMapper.java
@@ -0,0 +1,88 @@
+package org.apache.eventmesh.dashboard.console.unit.cluster;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.cluster.ClusterEntity;
+import org.apache.eventmesh.dashboard.console.mapper.cluster.ClusterMapper;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+public class TestClusterMapper {
+
+    @Autowired
+    private ClusterMapper clusterMapper;
+
+    @Test
+    public void testAddCluster() {
+        ClusterEntity clusterEntity =
+            new ClusterEntity(null, "cl1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        clusterMapper.addCluster(clusterEntity);
+        ClusterEntity clusterEntity1 = clusterMapper.selectClusterById(clusterEntity);
+        clusterEntity1.setUpdateTime(null);
+        clusterEntity1.setCreateTime(null);
+        Assert.assertEquals(clusterEntity1, clusterEntity);
+    }
+
+    @Test
+    public void testSelectAllCluster() {
+        ClusterEntity clusterEntity =
+            new ClusterEntity(null, "cl1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        ClusterEntity clusterEntity1 =
+            new ClusterEntity(null, "c1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        clusterMapper.addCluster(clusterEntity);
+        clusterMapper.addCluster(clusterEntity1);
+        List<ClusterEntity> clusterEntities = clusterMapper.selectAllCluster();
+        Assert.assertEquals(clusterEntities.size(), 2);
+    }
+
+    @Test
+    public void testSelectClusterById() {
+        ClusterEntity clusterEntity =
+            new ClusterEntity(null, "cl1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        clusterMapper.addCluster(clusterEntity);
+        ClusterEntity clusterEntity1 = clusterMapper.selectClusterById(clusterEntity);
+        clusterEntity1.setCreateTime(null);
+        clusterEntity1.setUpdateTime(null);
+        Assert.assertEquals(clusterEntity1, clusterEntity);
+    }
+
+    @Test
+    public void testUpdateCluster() {
+        ClusterEntity clusterEntity =
+            new ClusterEntity(null, "cl1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        clusterMapper.addCluster(clusterEntity);
+        clusterEntity.setDescription("nothing");
+        clusterEntity.setName("cl2");
+        clusterEntity.setAuthType(1);
+        clusterEntity.setBootstrapServers("1999");
+        clusterEntity.setClientProperties("nothing");
+        clusterEntity.setEventmeshVersion("1.10.0");
+        clusterEntity.setJmxProperties("nothing");
+        clusterEntity.setRegisterNameList("1.23.18");
+        clusterEntity.setRunState(1);
+        clusterEntity.setRegProperties("nothing");
+        clusterMapper.updateClusterById(clusterEntity);
+        ClusterEntity clusterEntity1 = clusterMapper.selectClusterById(clusterEntity);
+        clusterEntity1.setCreateTime(null);
+        clusterEntity1.setUpdateTime(null);
+        Assert.assertEquals(clusterEntity1, clusterEntity);
+    }
+
+    @Test
+    public void testDeleteCluster() {
+        ClusterEntity clusterEntity =
+            new ClusterEntity(null, "cl1", "registerList", "server", "1.7.0", "null", "null", "null", "no", 0, 0, null, null);
+        clusterMapper.addCluster(clusterEntity);
+        clusterMapper.deleteClusterById(clusterEntity);
+        ClusterEntity clusterEntity1 = clusterMapper.selectClusterById(clusterEntity);
+        Assert.assertEquals(clusterEntity1, null);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/config/TestConfigMapper.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/config/TestConfigMapper.java
new file mode 100644
index 0000000..417d75e
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/config/TestConfigMapper.java
@@ -0,0 +1,92 @@
+package org.apache.eventmesh.dashboard.console.unit.config;
+
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.config.ConfigEntity;
+import org.apache.eventmesh.dashboard.console.mapper.config.ConfigMapper;
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+public class TestConfigMapper {
+
+    @Autowired
+    private ConfigMapper configMapper;
+
+    @Test
+    public void testAddConfig() throws IllegalAccessException {
+        ConfigEntity config = new ConfigEntity(null, 1L, "rocketmq", 2, 2L, "port",
+            "127.0.0.1", "1.7.0", "1.8.0", 1, "1.10.0", -1, "666", 0, null, null, 0, 0);
+        configMapper.addConfig(config);
+        ConfigEntity configEntity = configMapper.selectByUnique(config);
+        configEntity.setUpdateTime(null);
+        configEntity.setCreateTime(null);
+        Assert.assertEquals(config.getId(), configEntity.getId());
+        Assert.assertEquals(config, configEntity);
+    }
+
+    @Test
+    public void testDeleteConfig() {
+        ConfigEntity config = new ConfigEntity(null, 1L, "rocketmq", 2, 2L, "port",
+            "127.0.0.1", "1.7.0", "1.8.0", 1, "1.10.0", -1, "666", 0, null, null, 0, 0);
+        configMapper.addConfig(config);
+        configMapper.deleteConfig(config);
+        ConfigEntity config1 = configMapper.selectByUnique(config);
+        Assert.assertEquals(config1, null);
+    }
+
+    @Test
+    public void testSelectByInstanceId() {
+        ConfigEntity config = new ConfigEntity(null, 1L, "rocketmq", 2, 2L, "port",
+            "127.0.0.1", "1.7.0", "1.8.0", 1, "1.10.0", -1, "666", 0, null, null, 0, 0);
+        ConfigEntity config1 = new ConfigEntity(null, 1L, "rocketmq", 2, 2L, "name",
+            "127.0.0.1", "1.7.0", "1.8.0", 1, "1.10.0", -1, "666", 0, null, null, 0, 0);
+        configMapper.addConfig(config1);
+        configMapper.addConfig(config);
+        List<ConfigEntity> configEntityList = new ArrayList<>();
+        configEntityList.add(config1);
+        configEntityList.add(config);
+        List<ConfigEntity> configEntityList1 = configMapper.selectByInstanceId(config1);
+        configEntityList1.forEach(n -> {
+            n.setCreateTime(null);
+            n.setUpdateTime(null);
+        });
+        Assert.assertEquals(configEntityList, configEntityList1);
+    }
+
+    @Test
+    public void testSelectDefaultConfig() {
+        ConfigEntity config = new ConfigEntity();
+        config.setBusinessType("rocketmq");
+        config.setInstanceType(1);
+        List<ConfigEntity> configEntityList = configMapper.selectDefaultConfig(config);
+        Assert.assertNotEquals(configEntityList.size(), 0);
+    }
+
+    @Test
+    public void testUpdateConfig() {
+        ConfigEntity config = new ConfigEntity(null, 1L, "rocketmq", 2, 2L, "port",
+            "127.0.0.1", "1.7.0", "1.8.0", 1, "1.10.0", -1, "666", 2, null, null, 0, 0);
+        configMapper.addConfig(config);
+        config.setConfigValue("127.1.1.1");
+        configMapper.updateConfig(config);
+        ConfigEntity configEntity = configMapper.selectByUnique(config);
+        configEntity.setUpdateTime(null);
+        configEntity.setCreateTime(null);
+        Assert.assertEquals(configEntity, config);
+    }
+}
+
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/runtime/TestRuntimeMapper.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/runtime/TestRuntimeMapper.java
new file mode 100644
index 0000000..ad99e09
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/runtime/TestRuntimeMapper.java
@@ -0,0 +1,58 @@
+package org.apache.eventmesh.dashboard.console.unit.runtime;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.runtime.RuntimeEntity;
+import org.apache.eventmesh.dashboard.console.mapper.runtime.RuntimeMapper;
+
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+public class TestRuntimeMapper {
+
+    @Autowired
+    private RuntimeMapper runtimeMapper;
+
+    @Test
+    public void testAddRuntimeMapper() {
+        RuntimeEntity runtimeEntity = new RuntimeEntity(null, 1l, "runtime1", 2l, 1019, 1099, 1L, "null", 1, null, null, "null");
+        runtimeMapper.addRuntime(runtimeEntity);
+        List<RuntimeEntity> runtimeEntities = runtimeMapper.selectRuntimeByCluster(runtimeEntity);
+        RuntimeEntity runtimeEntity1 = runtimeEntities.get(0);
+        runtimeEntity1.setCreateTime(null);
+        runtimeEntity1.setUpdateTime(null);
+        Assert.assertEquals(runtimeEntity1, runtimeEntity);
+    }
+
+    @Test
+    public void testUpdateRuntimeByCluster() {
+        RuntimeEntity runtimeEntity = new RuntimeEntity(null, 1l, "runtime1", 2l, 1019, 1099, 1L, "null", 1, null, null, "null");
+        runtimeMapper.addRuntime(runtimeEntity);
+        runtimeEntity.setPort(1000);
+        runtimeEntity.setJmxPort(1099);
+        runtimeEntity.setStatus(0);
+        runtimeMapper.updateRuntimeByCluster(runtimeEntity);
+        List<RuntimeEntity> runtimeEntities = runtimeMapper.selectRuntimeByCluster(runtimeEntity);
+        RuntimeEntity runtimeEntity1 = runtimeEntities.get(0);
+        runtimeEntity1.setCreateTime(null);
+        runtimeEntity1.setUpdateTime(null);
+        Assert.assertEquals(runtimeEntity, runtimeEntity1);
+    }
+
+    @Test
+    public void testDeleteRuntime() {
+        RuntimeEntity runtimeEntity = new RuntimeEntity(null, 1l, "runtime1", 2l, 1019, 1099, 1L, "null", 1, null, null, "null");
+        runtimeMapper.addRuntime(runtimeEntity);
+        runtimeMapper.deleteRuntimeByCluster(runtimeEntity);
+        List<RuntimeEntity> runtimeEntities = runtimeMapper.selectRuntimeByCluster(runtimeEntity);
+        Assert.assertEquals(runtimeEntities.size(), 0);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/store/TestStoreMapper.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/store/TestStoreMapper.java
new file mode 100644
index 0000000..5876f82
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/unit/store/TestStoreMapper.java
@@ -0,0 +1,62 @@
+package org.apache.eventmesh.dashboard.console.unit.store;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.storage.StoreEntity;
+import org.apache.eventmesh.dashboard.console.mapper.storage.StoreMapper;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+public class TestStoreMapper {
+
+    @Autowired
+    private StoreMapper storeMapper;
+
+    @Test
+    public void testAddStore() {
+        StoreEntity storeEntity =
+            new StoreEntity(null, 1l, 2, "rocketmq", "run1", 1l, "n,j", (short) -1, 1098, 1099, "nothing", (short) 1, null, null, "nothing", 1l);
+        StoreEntity storeEntity1 =
+            new StoreEntity(null, 1l, 1, "rocketmq", "run1", 1l, "n,j", (short) -1, 1098, 1099, "nothing", (short) 1, null, null, "nothing", 1l);
+        storeMapper.addStore(storeEntity);
+        storeMapper.addStore(storeEntity1);
+        List<StoreEntity> storeEntities = storeMapper.selectStoreByCluster(storeEntity);
+        storeEntities.forEach(n -> {
+            n.setUpdateTime(null);
+            n.setCreateTime(null);
+        });
+        Assert.assertEquals(storeEntities.get(1), storeEntity);
+        Assert.assertEquals(storeEntities.get(0), storeEntity1);
+    }
+
+    @Test
+    public void testDeleteStoreByUnique() {
+        StoreEntity storeEntity =
+            new StoreEntity(null, 1l, 2, "rocketmq", "run1", 1l, "n,j", (short) -1, 1098, 1099, "nothing", (short) 1, null, null, "nothing", 1l);
+        storeMapper.addStore(storeEntity);
+        storeMapper.deleteStoreByUnique(storeEntity);
+        List<StoreEntity> storeEntities = storeMapper.selectStoreByCluster(storeEntity);
+        Assert.assertEquals(storeEntities.size(), 0);
+    }
+
+    @Test
+    public void testUpdateStoreByUnique() {
+        StoreEntity storeEntity =
+            new StoreEntity(null, 1l, 2, "rocketmq", "run1", 1l, "n,j", (short) -1, 1098, 1099, "nothing", (short) 1, null, null, "nothing", 1l);
+        storeMapper.addStore(storeEntity);
+        storeEntity.setStatus((short) 5);
+        storeMapper.updateStoreByUnique(storeEntity);
+        List<StoreEntity> storeEntities = storeMapper.selectStoreByCluster(storeEntity);
+        Assert.assertEquals(storeEntities.size(), 1);
+        Assert.assertEquals(storeEntities.get(0).getStatus(), storeEntity.getStatus());
+    }
+}
