[ISSUE #30] modify mappers and add test (#38)

* test: add mappers' tests.

improved connection, connector, client, meta, health mappers and add their unit tests.

* fix: rename database name

rename test database name to `eventmesh_dashboard_test`

* fix: modify text default value into an literal expression

* fix: remove endtime field from client mapper insert method

* style: unify mapper style

array format when using dynamic scripts (<script>)
`+` format when using simple statements
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f16cdb5..aac6fa1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,10 +38,10 @@
 
     services:
       mysql:
-        image: mysql:8
+        image: mysql:8.0
         env:
           # The MySQL docker container requires these environment variables to be set, so we can create and migrate the test database.
-          MYSQL_DATABASE: EVENTMESH_DASHBOARD
+          MYSQL_DATABASE: eventmesh_dashboard_test
           MYSQL_ROOT_PASSWORD: password
         ports:
           # https://docs.github.com/en/actions/using-containerized-services/about-service-containers
diff --git a/eventmesh-dashboard-console/pom.xml b/eventmesh-dashboard-console/pom.xml
index ddf6595..ac0bc7c 100644
--- a/eventmesh-dashboard-console/pom.xml
+++ b/eventmesh-dashboard-console/pom.xml
@@ -29,6 +29,12 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- ASP dependency -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aspects</artifactId>
+            <version>5.1.2.RELEASE</version>
+        </dependency>
 
         <!-- swagger -->
         <dependency>
@@ -70,19 +76,38 @@
             <scope>runtime</scope>
         </dependency>
 
+        <!-- health check client -->
+        <!-- Eventmesh SDK -->
         <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aspects</artifactId>
-            <version>5.1.2.RELEASE</version>
+            <groupId>org.apache.eventmesh</groupId>
+            <artifactId>eventmesh-sdk-java</artifactId>
+            <version>1.10.0-release</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>junit</groupId>
+                    <artifactId>junit-dep</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
+        <!-- storage redis client -->
+        <dependency>
+            <groupId>io.lettuce</groupId>
+            <artifactId>lettuce-core</artifactId>
+        </dependency>
+        <!-- health check client end -->
+
+
+        <!-- TODO: remove junit4 dependency -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>4.13.2</version>
             <scope>test</scope>
         </dependency>
-
-
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
index d4d21c5..0a451cf 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connection/ConnectionEntity.java
@@ -25,13 +25,17 @@
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
 /**
  * A Connection is a link from a source to a sink.
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class ConnectionEntity extends BaseEntity {
 
     private static final long serialVersionUID = 6565578252656944905L;
@@ -43,6 +47,12 @@
     private Long id;
 
     /**
+     * Runtime cluster id
+     */
+    @Schema(name = "clusterId", description = "runtime cluster id")
+    private Long clusterId;
+
+    /**
      * The type of source. Possible values are "connector" or "client".
      */
     @Schema(name = "sourceType", defaultValue = "connector", allowableValues = {"connector", "client"})
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
index 1e7cb07..1681ac2 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/connector/ConnectorEntity.java
@@ -37,6 +37,8 @@
     @Schema(name = "id", description = "primary key")
     private Long id;
 
+    private Long clusterId;
+
     private String name;
 
     private String className;
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java
new file mode 100644
index 0000000..e8578eb
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/entity/health/HealthCheckResultEntity.java
@@ -0,0 +1,52 @@
+/*
+ * 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.health;
+
+import org.apache.eventmesh.dashboard.console.entity.base.BaseEntity;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(name = "HealthCheckResultEntity", description = "Health check result entity")
+public class HealthCheckResultEntity extends BaseEntity {
+
+    private static final long serialVersionUID = -7350585209577598040L;
+    @Schema(name = "id", description = "primary key")
+    private Long id;
+
+    private Long clusterId;
+
+    @Schema(description = "Type of Health Check;0:Unknown, 1:Cluster, 2:Runtime, 3:Topic, 4:Storage", defaultValue = "0", allowableValues = {"0",
+        "1", "2", "3", "4"})
+    private Integer type;
+
+    @Schema(description = "Instance id(database schema) of the health check object")
+    private Long typeId;
+
+    private String resultDesc;
+
+    @Schema(description = "status of a health check, 0: failed, 1: passed, 2: doing check, 3: out of time")
+    private Integer status;
+
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
similarity index 69%
copy from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
copy to eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
index 7263f7c..fd5bc12 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckStatus.java
@@ -15,14 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
+package org.apache.eventmesh.dashboard.console.enums.health;
 
-import org.springframework.stereotype.Component;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
 
-import lombok.extern.slf4j.Slf4j;
+@Getter
+@AllArgsConstructor
+public enum HealthCheckStatus {
+    FAILED(0, "failed"),
+    PASSED(1, "passed"),
+    CHECKING(2, "checking"),
+    TIMEOUT(3, "timeout");
 
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
+    private final Integer number;
+    private final String name;
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java
new file mode 100644
index 0000000..3ee990b
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/enums/health/HealthCheckType.java
@@ -0,0 +1,57 @@
+/*
+ * 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.enums.health;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+public enum HealthCheckType {
+    UNKNOWN(0, "unknown"),
+
+    CLUSTER(1, "cluster"),
+
+    RUNTIME(2, "runtime"),
+
+    TOPIC(3, "topic"),
+
+    STORAGE(4, "storage");
+
+    @Getter
+    private final Integer number;
+    @Getter
+    private final String name;
+
+    public static Integer toNumber(String name) {
+        for (HealthCheckType healthCheckTypeEnum : HealthCheckType.values()) {
+            if (healthCheckTypeEnum.name.equals(name)) {
+                return healthCheckTypeEnum.number;
+            }
+        }
+        return UNKNOWN.number;
+    }
+
+    public static String toName(Integer number) {
+        for (HealthCheckType healthCheckTypeEnum : HealthCheckType.values()) {
+            if (healthCheckTypeEnum.number.equals(number)) {
+                return healthCheckTypeEnum.name;
+            }
+        }
+        return UNKNOWN.name;
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
index 671bd81..3adab3b 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapper.java
@@ -19,13 +19,14 @@
 
 import org.apache.eventmesh.dashboard.console.entity.client.ClientEntity;
 
-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;
+
 /**
  * Mybatis Mapper for the table of client.
  */
@@ -33,27 +34,22 @@
 public interface ClientMapper {
 
     @Select("SELECT * FROM `client` WHERE `id` = #{id}")
-    ClientEntity selectById(Long id);
+    ClientEntity selectById(ClientEntity clientEntity);
 
     @Select("SELECT * FROM `client` WHERE `cluster_id` = #{clusterId}")
-    ClientEntity selectByClusterId(Long clusterId);
+    List<ClientEntity> selectByClusterId(ClientEntity clientEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     @Insert(
         "INSERT INTO `client` (`cluster_id`, `name`, `platform`,"
-            + " `language`, `pid`, `host`, `port`, `protocol`,"
-            + " `status`, `config_ids`, `description`, `end_time`) "
+            + "`language`, `pid`, `host`, `port`, `protocol`,"
+            + "`status`, `config_ids`, `description`) "
             + "VALUES (#{clusterId}, #{name}, #{platform},"
-            + " #{language}, #{pid}, #{host}, #{port}, #{protocol},"
-            + " #{status}, #{configIds}, #{description}, #{endTime})")
+            + "#{language}, #{pid}, #{host}, #{port}, #{protocol},"
+            + "#{status}, #{configIds}, #{description})")
     void insert(ClientEntity clientEntity);
 
-    @Update("UPDATE `client` SET status = #{status}, end_time = NOW() WHERE id = #{id}")
+    @Update("UPDATE `client` SET status = 0, end_time = NOW() WHERE id = #{id}")
     void deActive(ClientEntity clientEntity);
 
-    @Update("UPDATE `client` SET status = #{status} WHERE id = #{id}")
-    void updateStatus(ClientEntity clientEntity);
-
-    @Delete("DELETE FROM `client` WHERE id = #{id}")
-    void deleteById(Long id);
 }
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 af0a2ac..fc6756a 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
@@ -19,13 +19,14 @@
 
 import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
 
-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.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 
+import java.sql.Timestamp;
 import java.util.List;
 
 /**
@@ -34,51 +35,57 @@
 @Mapper
 public interface ConnectionMapper {
 
-    @Select("SELECT * FROM connection WHERE id = #{id}")
-    ConnectionEntity selectById(ConnectionEntity connectionEntity);
-
     @Select("SELECT * FROM connection")
     List<ConnectionEntity> selectAll();
 
     @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId}")
     List<ConnectionEntity> selectByClusterId(ConnectionEntity connectionEntity);
 
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND source_id = #{sourceId} AND source_type = #{sourceType}")
+    public List<ConnectionEntity> selectByClusterIdSourceTypeAndSourceId(ConnectionEntity connectionEntity);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND sink_id = #{sinkId} AND sink_type = #{sinkType}")
+    public List<ConnectionEntity> selectByClusterIdSinkTypeAndSinkId(ConnectionEntity connectionEntity);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND source_id = #{sourceId} AND source_type = #{sourceType} "
+        + "AND create_time > #{startTime} AND create_time < #{endTime}")
+    public List<ConnectionEntity> selectByClusterIdSourceTypeAndSourceIdAndCreateTimeRange(ConnectionEntity connectionEntity,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
+    @Select("SELECT * FROM connection WHERE cluster_id = #{clusterId} AND sink_id = #{sinkId} AND sink_type = #{sinkType} "
+        + "AND create_time > #{startTime} AND create_time < #{endTime}")
+    public List<ConnectionEntity> selectByClusterIdSinkTypeAndSinkIdAndCreateTimeRange(ConnectionEntity connectionEntity,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("INSERT INTO connection (cluster_id, source_type, source_id,"
-        + " sink_type, sink_id, runtime_id, status, topic, group_id, description)"
+    @Insert("INSERT INTO connection (cluster_id, source_type, source_id," + " sink_type, sink_id, runtime_id, status, topic, group_id, description)"
         + " VALUES ( #{clusterId}, #{sourceType}, #{sourceId}, "
         + " #{sinkType}, #{sinkId},  #{runtimeId}, #{status}, #{topic}, #{groupId}, #{description})")
     void insert(ConnectionEntity connectionEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("<script>"
-        + "INSERT INTO connection (cluster_id, source_type, source_id,"
-        + " sink_type, sink_id, runtime_id, status,"
-        + " topic, group_id, description) VALUES "
-        +
-        "<foreach collection='list' item='connectionEntity' index='index' separator=','>"
-        + "(#{connectionEntity.clusterId}, #{connectionEntity.sourceType}, #{connectionEntity.sourceId},"
-        + " #{connectionEntity.sinkType}, #{connectionEntity.sinkId}, #{connectionEntity.runtimeId}, #{connectionEntity.status},"
-        + " #{connectionEntity.topic}, #{connectionEntity.groupId}, #{connectionEntity.description})"
-        + "</foreach>"
-        + "</script>")
+    @Insert({
+        "<script>",
+        "   INSERT INTO connection (cluster_id, source_type, source_id," + " sink_type, sink_id, runtime_id, status,",
+        "   topic, group_id, description) VALUES ",
+        "   <foreach collection='list' item='connectionEntity' index='index' separator=','>",
+        "       (#{connectionEntity.clusterId}, #{connectionEntity.sourceType}, #{connectionEntity.sourceId},",
+        "       #{connectionEntity.sinkType}, #{connectionEntity.sinkId}, #{connectionEntity.runtimeId}, #{connectionEntity.status},",
+        "       #{connectionEntity.topic}, #{connectionEntity.groupId}, #{connectionEntity.description})",
+        "   </foreach>",
+        "</script>"})
     void batchInsert(List<ConnectionEntity> connectionEntityList);
 
-    @Update("UPDATE connection SET status = #{status}, end_time = NOW() WHERE id = #{id}")
+    @Update("UPDATE connection SET status = 1, end_time = NOW() WHERE id = #{id}")
     void endConnectionById(ConnectionEntity connectionEntity);
 
-    @Delete("DELETE FROM connection WHERE cluster_id = #{clusterId}")
-    void deleteAllByClusterId(ConnectionEntity connectionEntity);
-
-    @Delete("DELETE FROM connection WHERE id = #{id}")
-    void deleteById(ConnectionEntity connectionEntity);
-
-    @Delete("<script>"
-        + "DELETE FROM connection WHERE id IN "
-        + "<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>"
-        + "#{item.id}"
-        + "</foreach>"
-        + "</script>")
-    void batchDelete(List<ConnectionEntity> connectionEntityList);
+    //batch end
+    @Update({
+        "<script>",
+        "   <foreach collection='list' item='connectionEntity' index='index' separator=';'>",
+        "       UPDATE connection SET status = 1, end_time = NOW() WHERE id = #{connectionEntity.id}",
+        "   </foreach>",
+        "</script>"})
+    void batchEndConnectionById(List<ConnectionEntity> connectionEntityList);
 
 }
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
index 0791327..2f5101a 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapper.java
@@ -19,7 +19,6 @@
 
 import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
 
-import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
@@ -38,22 +37,22 @@
     ConnectorEntity selectById(ConnectorEntity connectorEntity);
 
     @Select("SELECT * FROM connector WHERE cluster_id = #{clusterId}")
-    ConnectorEntity selectByClusterId(ConnectorEntity connectorEntity);
+    List<ConnectorEntity> selectByClusterId(ConnectorEntity connectorEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) "
-        + "VALUES (#{connectClusterId}, #{name}, #{className}, #{type}, #{status}, #{podState}, #{configIds})")
+    @Insert("INSERT INTO connector (cluster_id,name, class_name, type, status, pod_state, config_ids) "
+        + "VALUES (#{clusterId}, #{name}, #{className}, #{type}, #{status}, #{podState}, #{configIds})")
     void insert(ConnectorEntity connectorEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
-    @Insert("<script>"
-        + "INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) VALUES "
-        +
-        "<foreach collection='list' item='connectorEntity' index='index' separator=','>"
-        + "(#{connectorEntity.connectClusterId}, #{connectorEntity.name}, #{connectorEntity.className},"
-        + " #{connectorEntity.type}, #{connectorEntity.status}, #{connectorEntity.podState}, #{connectorEntity.configIds})"
-        + "</foreach>"
-        + "</script>")
+    @Insert({
+        "<script>",
+        "   INSERT INTO connector (cluster_id, name, class_name, type, status, pod_state, config_ids) VALUES ",
+        "   <foreach collection='list' item='connectorEntity' index='index' separator=','>",
+        "       (#{connectorEntity.clusterId}, #{connectorEntity.name}, #{connectorEntity.className},",
+        "       #{connectorEntity.type}, #{connectorEntity.status}, #{connectorEntity.podState}, #{connectorEntity.configIds})",
+        "   </foreach>",
+        "</script>"})
     void batchInsert(List<ConnectorEntity> connectorEntityList);
 
     @Update("UPDATE connector SET status = #{status} WHERE id = #{id}")
@@ -65,18 +64,17 @@
     @Update("UPDATE connector SET config_ids = #{configIds} WHERE id = #{id}")
     void updateConfigIds(ConnectorEntity connectorEntity);
 
-    @Delete("DELETE FROM connector WHERE id = #{id}")
-    void deleteById(ConnectorEntity connectorEntity);
+    @Update("UPDATE connector SET status = 0 WHERE cluster_id = #{clusterId}")
+    void deActiveById(ConnectorEntity connectorEntity);
 
-    @Delete("DELETE FROM connector WHERE cluster_id = #{clusterId}")
-    void deleteByClusterId(ConnectorEntity connectorEntity);
-
-    @Delete("<script>"
-        + "DELETE FROM connector WHERE id IN "
-        +
-        "<foreach collection='list' item='connectorEntity' index='index' open='(' separator=',' close=')'>"
-        + "#{connectorEntity.id}"
-        + "</foreach>"
-        + "</script>")
-    void batchDelete(List<ConnectorEntity> connectorEntities);
+    @Update({
+        "<script>",
+        "   update connector set status = 0 ",
+        "   where id in ",
+        "   <foreach collection='list' item='item' index='index' open='(' separator=',' close=')'>",
+        "       #{item.id}",
+        "   </foreach>",
+        "</script>"
+    })
+    void batchDeActive(List<ConnectorEntity> connectorEntities);
 }
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 f1a91ed..7812861 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
@@ -55,19 +55,19 @@
     @Select("select * from `group` where id=#{id} and is_delete=0")
     GroupEntity selectGroupById(GroupEntity groupEntity);
 
-    @Select("<script>"
-        + "select * from `group`"
-        + "<where>"
-        + "<if test='clusterId != null'>"
-        + "cluster_id=#{clusterId}"
-        + "</if>"
-        + "<if test='name != null'>"
-        + "and name like concat('%',#{name},'%')"
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from `group`",
+        "   <where>",
+        "       <if test='clusterId != null'>",
+        "           cluster_id=#{clusterId}",
+        "       </if>",
+        "       <if test='name != null'>",
+        "           and name like concat('%',#{name},'%')",
+        "       </if>",
+        "       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 3179eff..aac0a59 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
@@ -59,21 +59,22 @@
     @Select("select * from group_member where id=#{id} and is_delete=0")
     GroupMemberEntity selectGroupMemberById(GroupMemberEntity groupMemberEntity);
 
-    @Select("<script>"
-        + "select * from group_member"
-        + "<where>"
-        + "<if test='clusterId != null'>"
-        + "cluster_id=#{clusterId}"
-        + "</if>"
-        + "<if test='groupName != null'>"
-        + "and group_name=#{groupName}"
-        + "</if>"
-        + "<if test='topicName != null'>"
-        + "and topic_name=#{topicName}"
-        + "</if>"
-        + "</where>"
-        + "and is_delete=0"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from group_member",
+        "   <where>",
+        "       <if test='clusterId != null'>",
+        "           cluster_id=#{clusterId}",
+        "       </if>",
+        "       <if test='groupName != null'>",
+        "           and group_name=#{groupName}",
+        "       </if>",
+        "       <if test='topicName != null'>",
+        "           and topic_name=#{topicName}",
+        "       </if>",
+        "    </where>",
+        "   and is_delete=0",
+        "</script>"})
     List<GroupMemberEntity> selectMember(GroupMemberEntity groupMemberEntity);
 
     @Update("update group_member set state=#{state} where topic_name=#{topicName}")
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java
new file mode 100644
index 0000000..d5d5aab
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapper.java
@@ -0,0 +1,91 @@
+/*
+ * 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.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Options;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * Mapper for health check result
+ */
+@Mapper
+public interface HealthCheckResultMapper {
+
+    @Select("SELECT * FROM health_check_result WHERE id = #{id}")
+    HealthCheckResultEntity selectById(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND type = #{type} AND type_id = #{typeId}")
+    List<HealthCheckResultEntity> selectByClusterIdAndTypeAndTypeId(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND type = #{type}")
+    List<HealthCheckResultEntity> selectByClusterIdAndType(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Select("SELECT * FROM health_check_result WHERE cluster_id = #{clusterId} AND create_time > #{startTime} AND create_time < #{endTime}")
+    List<HealthCheckResultEntity> selectByClusterIdAndCreateTimeRange(@Param("clusterId") Long clusterId,
+        @Param("startTime") Timestamp startTime, @Param("endTime") Timestamp endTime);
+
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    @Insert("INSERT INTO health_check_result(type,type_id, cluster_id, status,result_desc)"
+        + " VALUES( #{type}, #{typeId}, #{clusterId}, #{status}, #{resultDesc})")
+    void insert(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Insert({
+        "<script>",
+        "   INSERT INTO health_check_result(type, type_id, cluster_id, status, result_desc) VALUES ",
+        "   <foreach collection='list' item='healthCheckResultEntity' index='index' separator=','>",
+        "       (#{healthCheckResultEntity.type}, #{healthCheckResultEntity.typeId}, #{healthCheckResultEntity.clusterId},",
+        "       #{healthCheckResultEntity.status}, #{healthCheckResultEntity.resultDesc})",
+        "   </foreach>",
+        "</script>"
+    })
+    void batchInsert(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    @Update("UPDATE health_check_result SET status = #{status}, result_desc = #{resultDesc} WHERE id = #{id}")
+    void update(HealthCheckResultEntity healthCheckResultEntity);
+
+    @Update({
+        "<script>",
+        "   <foreach collection='list' item='healthCheckResultEntity' index='index' separator=';'>",
+        "       UPDATE health_check_result SET status = #{healthCheckResultEntity.status},",
+        "       result_desc = #{healthCheckResultEntity.resultDesc} WHERE id = #{healthCheckResultEntity.id}",
+        "   </foreach>",
+        "</script>"})
+    void batchUpdate(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    @Select({
+        "<script>",
+        "   SELECT * FROM health_check_result",
+        "   WHERE (cluster_id, type, type_id, status) IN",
+        "   <foreach collection='list' item='item' open='(' separator=',' close=')'>",
+        "       (#{item.clusterId}, #{item.type}, #{item.typeId}, 2)",
+        "   </foreach>",
+        "   ORDER BY create_time DESC",
+        "</script>"
+    })
+    List<HealthCheckResultEntity> getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+}
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 d6c96f7..8f2dbf4 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
@@ -33,21 +33,22 @@
 @Mapper
 public interface OprLogMapper {
 
-    @Select("<script>"
-        + "select * from operation_log"
-        + "<where>"
-        + "<if test='targetType!=null'>"
-        + "target_type=#{targetType}"
-        + "</if>"
-        + "<if test='operationUser!=null'>"
-        + "and operation_user=#{operationUser}"
-        + "</if>"
-        + "<if test='clusterId!=null'>"
-        + "and cluster_id=#{clusterId} "
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from operation_log",
+        "   <where>",
+        "       <if test='targetType!=null'>",
+        "           target_type=#{targetType}",
+        "       </if>",
+        "       <if test='operationUser!=null'>",
+        "           and operation_user=#{operationUser}",
+        "       </if>",
+        "       <if test='clusterId!=null'>",
+        "           and cluster_id=#{clusterId} ",
+        "       </if>",
+        "       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)"
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
index f22bf74..ab57fc1 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapper.java
@@ -34,7 +34,7 @@
     @Select("SELECT * FROM meta WHERE id = #{id}")
     MetaEntity selectById(MetaEntity metaEntity);
 
-    @Select("SELECT * FROM meta WHERE cluster_id = #{clusterId}")
+    @Select("SELECT * FROM meta WHERE cluster_id = #{clusterId} LIMIT 1")
     MetaEntity selectByClusterId(MetaEntity metaEntity);
 
     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
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 8a396be..42d68d0 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,18 +35,19 @@
 @Mapper
 public interface TopicMapper {
 
-    @Select("<script>"
-        + "select * from topic"
-        + "<where>"
-        + "<if test='topicName!=null'>"
-        + "and topic_name=#{topicName}"
-        + "</if>"
-        + "<if test='clusterId!=null'>"
-        + "and cluster_id=#{clusterId} "
-        + "</if>"
-        + "and is_delete=0"
-        + "</where>"
-        + "</script>")
+    @Select({
+        "<script>",
+        "   select * from topic",
+        "   <where>",
+        "       <if test='topicName!=null'>",
+        "           and topic_name=#{topicName}",
+        "       </if>",
+        "       <if test='clusterId!=null'>",
+        "           and cluster_id=#{clusterId} ",
+        "       </if>",
+        "       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) "
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 780ee99..cf22a83 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
@@ -61,7 +61,7 @@
             List<ConnectionEntity> existingConnections = connectionMapper.selectByClusterId(connectionEntity);
 
             // Collect connections that are not in the new list
-            List<ConnectionEntity> connectionsToDelete = existingConnections.stream()
+            List<ConnectionEntity> connectionsToInactive = existingConnections.stream()
                 .filter(existingConnection -> !newConnections.contains(existingConnection))
                 .collect(Collectors.toList());
 
@@ -71,8 +71,8 @@
                 .collect(Collectors.toList());
 
             // Delete connections in batch
-            if (!connectionsToDelete.isEmpty()) {
-                connectionMapper.batchDelete(connectionsToDelete);
+            if (!connectionsToInactive.isEmpty()) {
+                connectionMapper.batchEndConnectionById(connectionsToInactive);
             }
 
             // Insert new connections in batch
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java
new file mode 100644
index 0000000..19e3715
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataService.java
@@ -0,0 +1,40 @@
+/*
+ * 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.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+/**
+ * Service providing data of HealthCheckResult.
+ */
+public interface HealthDataService {
+    HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity);
+
+    void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTypeAndTypeId(HealthCheckResultEntity entity);
+
+    void batchUpdateCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    void batchUpdateCheckResultByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList);
+
+    List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime);
+}
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java
new file mode 100644
index 0000000..85a2667
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/HealthDataServiceMemoryStorage.java
@@ -0,0 +1,86 @@
+/*
+ * 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.health;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class HealthDataServiceMemoryStorage {
+
+    private static final List<HealthCheckResultEntity> cache = new ArrayList<>();
+    private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+
+
+    public HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity) {
+        lock.writeLock().lock();
+        try {
+            healthCheckResultEntity.setCreateTime(new Timestamp(System.currentTimeMillis()));
+            cache.add(healthCheckResultEntity);
+            return healthCheckResultEntity;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+
+    public void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        lock.writeLock().lock();
+        try {
+            for (HealthCheckResultEntity entity : healthCheckResultEntityList) {
+                entity.setCreateTime(new Timestamp(System.currentTimeMillis()));
+                cache.add(entity);
+            }
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+
+
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime) {
+        lock.readLock().lock();
+        try {
+            List<HealthCheckResultEntity> result = new ArrayList<>();
+            for (HealthCheckResultEntity entity : cache) {
+                if (entity.getClusterId().equals(clusterId) && entity.getCreateTime().after(startTime) && entity.getCreateTime().before(endTime)) {
+                    result.add(entity);
+                }
+            }
+            return result;
+        } finally {
+            lock.readLock().unlock();
+        }
+    }
+
+    public List<HealthCheckResultEntity> popAll() {
+        lock.writeLock().lock();
+        try {
+            List<HealthCheckResultEntity> result = new ArrayList<>(cache);
+            cache.clear();
+            return result;
+        } finally {
+            lock.writeLock().unlock();
+        }
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java
new file mode 100644
index 0000000..f1593cc
--- /dev/null
+++ b/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/service/health/impl/HealthDataServiceDatabaseImpl.java
@@ -0,0 +1,77 @@
+/*
+ * 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.health.impl;
+
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+import org.apache.eventmesh.dashboard.console.mapper.health.HealthCheckResultMapper;
+import org.apache.eventmesh.dashboard.console.service.health.HealthDataService;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HealthDataServiceDatabaseImpl implements HealthDataService {
+
+    @Autowired
+    private HealthCheckResultMapper healthCheckResultMapper;
+
+    @Override
+    public HealthCheckResultEntity insertHealthCheckResult(HealthCheckResultEntity healthCheckResultEntity) {
+        healthCheckResultMapper.insert(healthCheckResultEntity);
+        return healthCheckResultEntity;
+    }
+
+    @Override
+    public void batchInsertHealthCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        healthCheckResultMapper.batchInsert(healthCheckResultEntityList);
+    }
+
+    @Override
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTypeAndTypeId(HealthCheckResultEntity entity) {
+        return healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(entity);
+    }
+
+    @Override
+    public void batchUpdateCheckResult(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        healthCheckResultMapper.batchUpdate(healthCheckResultEntityList);
+    }
+
+    @Override
+    public void batchUpdateCheckResultByClusterIdAndTypeAndTypeId(List<HealthCheckResultEntity> healthCheckResultEntityList) {
+        List<HealthCheckResultEntity> idsNeedToBeUpdate = healthCheckResultMapper.getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(
+            healthCheckResultEntityList);
+        idsNeedToBeUpdate.forEach(entity -> {
+            healthCheckResultEntityList.forEach(updateEntity -> {
+                if (entity.getClusterId().equals(updateEntity.getClusterId()) && entity.getType().equals(updateEntity.getType())
+                    && entity.getTypeId().equals(updateEntity.getTypeId())) {
+                    updateEntity.setId(entity.getId());
+                }
+            });
+        });
+        healthCheckResultMapper.batchUpdate(healthCheckResultEntityList);
+    }
+
+
+    @Override
+    public List<HealthCheckResultEntity> queryHealthCheckResultByClusterIdAndTimeRange(Long clusterId, Timestamp startTime, Timestamp endTime) {
+        return healthCheckResultMapper.selectByClusterIdAndCreateTimeRange(clusterId, startTime, endTime);
+    }
+}
diff --git a/eventmesh-dashboard-console/src/main/resources/application-dev.yml b/eventmesh-dashboard-console/src/main/resources/application-dev.yml
index 0ff18a1..d411315 100644
--- a/eventmesh-dashboard-console/src/main/resources/application-dev.yml
+++ b/eventmesh-dashboard-console/src/main/resources/application-dev.yml
@@ -30,9 +30,9 @@
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://localhost:3306/eventmesh-dashboard?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      username: root
-      password: 123456
+      url: jdbc:mysql://localhost:3306/eventmesh_dashboard?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+      username: ${DB_USERNAME}
+      password: ${DB_PASSWORD}
 
       initial-size: 1
       max-active: 50
diff --git a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
index 96cf1e3..96d4a84 100644
--- a/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
+++ b/eventmesh-dashboard-console/src/main/resources/eventmesh-dashboard.sql
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+DROP TABLE IF EXISTS `group`;
 CREATE TABLE `group`
 (
     `id`           bigint unsigned                                  NOT NULL AUTO_INCREMENT COMMENT 'id',
     `cluster_id`   bigint                                           NOT NULL DEFAULT '-1' COMMENT '集群id',
     `name`         varchar(192) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'Group名称',
     `member_count` int unsigned                                     NOT NULL DEFAULT '0' COMMENT '成员数',
-    `members`      text COMMENT 'group的member列表',
+    `members`      varchar(1024) COMMENT 'group的member列表',
     `type`         tinyint                                          NOT NULL COMMENT 'group类型 0:consumer 1:producer',
     `state`        varchar(64)                                      NOT NULL DEFAULT '' COMMENT '状态',
     `create_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
@@ -31,10 +32,10 @@
     KEY `cluster_id` (`cluster_id`, `name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 322
-  DEFAULT CHARSET = utf8mb3 COMMENT ='Group信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='Group信息表';
 
 
-
+DROP TABLE IF EXISTS `group_member`;
 CREATE TABLE `group_member`
 (
     `id`             bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
@@ -51,21 +52,21 @@
     KEY `cluster_id` (`cluster_id`, `topic_name`, `group_name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 257
-  DEFAULT CHARSET = utf8mb3 COMMENT ='GroupMember信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='GroupMember信息表';
 
 
-
+DROP TABLE IF EXISTS `operation_log`;
 CREATE TABLE `operation_log`
 (
     `id`             bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
     `cluster_id`     bigint          NOT NULL DEFAULT '-1' COMMENT '物理集群ID',
     `operation_type` varchar(192)    NOT NULL DEFAULT '' COMMENT '操作类型,如:启动,停止,重启,添加,删除,修改',
     `status`         int             NOT NULL DEFAULT '0' COMMENT '操作状态 0:未知,1:执行中,2:成功,3:失败',
-    `content`    text COMMENT '备注信息',
+    `content`        varchar(1024) COMMENT '备注信息',
     `create_time`    timestamp       NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`       timestamp       NULL     DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `operation_user` varchar(192)             DEFAULT NULL,
-    `result` text,
+    `result`         varchar(1024),
     `target_type`    varchar(192)    NOT NULL,
     `is_delete`      int             NOT NULL DEFAULT '0',
     PRIMARY KEY (`id`),
@@ -73,10 +74,10 @@
     KEY `idx_status` (`status`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 68
-  DEFAULT CHARSET = utf8mb3 COMMENT ='操作记录信息表'
+  DEFAULT CHARSET = utf8mb3 COMMENT ='操作记录信息表';
 
 
-
+DROP TABLE IF EXISTS `topic`;
 CREATE TABLE `topic`
 (
     `id`           bigint unsigned                                  NOT NULL AUTO_INCREMENT COMMENT 'id',
@@ -86,7 +87,7 @@
     `storage_id`   varchar(2048)                                    NOT NULL DEFAULT '' COMMENT 'StorageId',
     `retention_ms` bigint                                           NOT NULL DEFAULT '-2' COMMENT '保存时间,-2:未知,-1:无限制,>=0对应时间,单位ms',
     `type`         tinyint                                          NOT NULL DEFAULT '0' COMMENT 'Topic类型,默认0,0:普通,1:EventMesh内部',
-    `description`  text COMMENT '备注信息',
+    `description`  varchar(1024)                                             DEFAULT '' COMMENT '备注信息',
     `create_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(尽量与Topic实际创建时间一致)',
     `update_time`  timestamp                                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间(尽量与Topic实际创建时间一致)',
     `is_delete`    int                                              NOT NULL DEFAULT '0',
@@ -95,8 +96,7 @@
     KEY `cluster_id` (`cluster_id`, `topic_name`)
 ) ENGINE = InnoDB
   AUTO_INCREMENT = 562
-  DEFAULT CHARSET = utf8mb3 COMMENT ='Topic信息表'
-
+  DEFAULT CHARSET = utf8mb3 COMMENT ='Topic信息表';
 
 
 DROP TABLE IF EXISTS `client`;
@@ -112,8 +112,8 @@
     `port`        int(16)             NOT NULL DEFAULT '-1' COMMENT '客户端端口',
     `protocol`    varchar(192)        NOT NULL DEFAULT '' COMMENT '协议类型',
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用,0未启用',
-    `config_ids`  text                NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
-    `description` text                NOT NULL DEFAULT '' COMMENT '客户端描述',
+    `config_ids`  varchar(1024)       NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
+    `description` varchar(1024)       NOT NULL DEFAULT '' COMMENT '客户端描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`    timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
@@ -121,7 +121,7 @@
     PRIMARY KEY (`id`),
     INDEX `idx_cluster_id` (`cluster_id`)
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8 COMMENT ='客户端信息表';
+  DEFAULT CHARSET = utf8 COMMENT ='client is an SDK application that can produce or consume events.';
 
 
 
@@ -135,7 +135,7 @@
     `type`        varchar(32)         NOT NULL DEFAULT '' COMMENT 'Connector类型',
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用,0未启用',
     `pod_state`   tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'k8s pod状态。0: pending;1: running;2: success;3: failed;4: unknown',
-    `config_ids`  text                NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
+    `config_ids`  varchar(1024)       NOT NULL DEFAULT '' COMMENT 'csv config id list, like:1,3,7',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
     PRIMARY KEY (`id`),
@@ -156,7 +156,7 @@
     `status`      tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态: 1启用,0未启用',
     `topic`       varchar(192)        NOT NULL DEFAULT '' COMMENT 'topic name',
     `group_id`    bigint(20)          NOT NULL DEFAULT '-1' COMMENT 'GroupID',
-    `description` text                NOT NULL DEFAULT '' COMMENT '客户端描述',
+    `description` varchar(1024)       NOT NULL DEFAULT '' COMMENT '客户端描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `end_time`    timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
@@ -168,22 +168,22 @@
     INDEX `idx_source_id` (`source_id`),
     INDEX `idx_sink_id` (`sink_id`)
 ) ENGINE = InnoDB
-  DEFAULT CHARSET = utf8 COMMENT ='client和connector连接关系,这里的client包括runtime';
+  DEFAULT CHARSET = utf8 COMMENT ='connection from event source to event sink. event source can be a source connector or a producer client.';
 
 DROP TABLE IF EXISTS `health_check_result`;
 CREATE TABLE `health_check_result`
 (
     `id`          bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
-    `dimension`   int(11)             NOT NULL DEFAULT '0' COMMENT '检查维度(0:未知,1:Cluster,2:Runtime,3:Topic,4:Group)',
-    `config_name` varchar(192)        NOT NULL DEFAULT '' COMMENT '配置名',
+    `type`        tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查维度(0:未知, 1:Cluster, 2:Runtime, 3:Topic, 4:Storage)',
+    `type_id`     bigint(20) unsigned NOT NULL COMMENT '对应检查维度的实例id',
     `cluster_id`  bigint(20)          NOT NULL DEFAULT '0' COMMENT '集群ID',
-    `res_name`    varchar(192)        NOT NULL DEFAULT '' COMMENT '资源名称',
-    `passed`      tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查通过(0:未通过,1:通过)',
+    `status`      tinyint(4)          NOT NULL DEFAULT '0' COMMENT '检查状态(0:未通过,1:通过,2:正在检查,3:超时)',
+    `result_desc` varchar(1024)       NOT NULL DEFAULT '' COMMENT '检查结果描述',
     `create_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` timestamp           NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     PRIMARY KEY (`id`),
     INDEX `idx_cluster_id` (`cluster_id`),
-    UNIQUE KEY `uniq_dimension_config_cluster_res` (`dimension`, `config_name`, `cluster_id`, `res_name`)
+    INDEX `idx_type` (`type`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8 COMMENT ='健康检查结果';
 
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java
new file mode 100644
index 0000000..8388de6
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/client/ClientMapperTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.client;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.client.ClientEntity;
+import org.apache.eventmesh.dashboard.console.enums.StatusEnum;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:client-test.sql")
+class ClientMapperTest {
+
+    @Autowired
+    private ClientMapper clientMapper;
+
+    @Test
+    public void testSelectById() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setId(1L);
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals("java", result.getLanguage());
+        Assertions.assertEquals(3, result.getClusterId());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setClusterId(3L);
+        List<ClientEntity> results = clientMapper.selectByClusterId(clientEntity);
+        Assertions.assertEquals(3, results.size());
+        Assertions.assertEquals("java", results.get(0).getLanguage());
+        Assertions.assertEquals("go", results.get(2).getLanguage());
+    }
+
+    @Test
+    public void testInsert() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setHost("127.0.0.1");
+        clientEntity.setClusterId(4L);
+        clientEntity.setName("clientName");
+        clientEntity.setDescription("");
+        clientEntity.setPid(1L);
+        clientEntity.setPort(8080);
+        clientEntity.setStatusEntity(StatusEnum.ACTIVE);
+        clientEntity.setConfigIds("");
+        clientEntity.setLanguage("rust");
+        clientEntity.setPlatform("");
+        clientEntity.setProtocol("http");
+        clientMapper.insert(clientEntity);
+
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals("127.0.0.1", result.getHost());
+
+        Assertions.assertEquals(2, clientMapper.selectByClusterId(clientEntity).size());
+    }
+
+    @Test
+    public void testDeactivate() {
+        ClientEntity clientEntity = new ClientEntity();
+        clientEntity.setId(1L);
+        clientMapper.deActive(clientEntity);
+        ClientEntity result = clientMapper.selectById(clientEntity);
+        Assertions.assertEquals(0, result.getStatus());
+        Assertions.assertNotEquals(result.getCreateTime(), result.getEndTime());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java
new file mode 100644
index 0000000..7087e00
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connection/ConnectionMapperTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.connection;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
+
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connection-test.sql")
+class ConnectionMapperTest {
+
+    @Autowired
+    private ConnectionMapper connectionMapper;
+
+    @Test
+    public void testSelectAll() {
+        assertEquals(6, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        assertEquals(3, connectionMapper.selectByClusterId(connectionEntity).size());
+    }
+
+    @Test
+    public void testSelectByClusterIdSourceTypeAndSourceId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        connectionEntity.setSourceId(1L);
+        connectionEntity.setSourceType("connector");
+        List<ConnectionEntity> results = connectionMapper.selectByClusterIdSourceTypeAndSourceId(connectionEntity);
+        assertEquals(1, results.size());
+        assertEquals("connector", results.get(0).getSinkType());
+        assertEquals(1, results.get(0).getSinkId());
+    }
+
+    @Test
+    public void testSelectByClusterIdSinkTypeAndSinkId() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setClusterId(1L);
+        connectionEntity.setSinkId(2L);
+        connectionEntity.setSinkType("connector");
+        List<ConnectionEntity> results = connectionMapper.selectByClusterIdSinkTypeAndSinkId(connectionEntity);
+        assertEquals(1, results.size());
+        assertEquals("connector", results.get(0).getSourceType());
+        assertEquals(2, results.get(0).getSourceId());
+    }
+
+    @Test
+    public void testInsert() {
+        ConnectionEntity connectionEntity = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        connectionMapper.insert(connectionEntity);
+        assertEquals(7, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        ConnectionEntity connectionEntity1 = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        ConnectionEntity connectionEntity2 = new ConnectionEntity(1L, 1L, "connector", 1L, "connector", 2L, 1L, 0, "topic", 3L, null, "description");
+        connectionMapper.batchInsert(Arrays.asList(connectionEntity1, connectionEntity2));
+        assertEquals(8, connectionMapper.selectAll().size());
+    }
+
+    @Test
+    public void testEndConnectionById() {
+        ConnectionEntity connectionEntity = new ConnectionEntity();
+        connectionEntity.setId(1L);
+        connectionMapper.endConnectionById(connectionEntity);
+        List<ConnectionEntity> results = connectionMapper.selectAll();
+        ConnectionEntity result = results.get(0);
+        assertEquals(1, result.getStatus());
+        assertNotNull(result.getEndTime());
+    }
+
+    @Test
+    public void testBatchEndConnection() {
+        ConnectionEntity connectionEntity1 = new ConnectionEntity();
+        connectionEntity1.setId(1L);
+        ConnectionEntity connectionEntity2 = new ConnectionEntity();
+        connectionEntity2.setId(2L);
+        connectionMapper.batchEndConnectionById(Arrays.asList(connectionEntity1, connectionEntity2));
+
+        List<ConnectionEntity> all = connectionMapper.selectAll();
+        assertEquals(1, all.get(0).getStatus());
+        assertEquals(1, all.get(1).getStatus());
+        assertNotEquals(all.get(0).getCreateTime(), all.get(0).getEndTime());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java
new file mode 100644
index 0000000..0bb360b
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/connector/ConnectorMapperTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.connector;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.connector.ConnectorEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connector-test.sql")
+class ConnectorMapperTest {
+
+    @Autowired
+    private ConnectorMapper connectorMapper;
+
+    @Test
+    public void testSelectById() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+
+        assertNotNull(connectorEntity);
+        assertEquals(1L, connectorEntity.getClusterId());
+        assertEquals("the", connectorEntity.getClassName());
+    }
+
+    @Test
+    public void testSelectByClusterId() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setClusterId(1L);
+
+        List<ConnectorEntity> results = connectorMapper.selectByClusterId(connectorEntity);
+
+        assertEquals(3, results.size());
+        assertEquals("quick", results.get(1).getClassName());
+    }
+
+    @Test
+    public void testInsert() {
+        ConnectorEntity connectorEntity = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        connectorMapper.insert(connectorEntity);
+
+        assertNotNull(connectorEntity);
+        assertEquals(6, connectorEntity.getId());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        ConnectorEntity connectorEntity1 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        ConnectorEntity connectorEntity2 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        ConnectorEntity connectorEntity3 = new ConnectorEntity(1L, 1L, "test", "test", "test", 0, 2, "test");
+        List<ConnectorEntity> connectorEntityList = new ArrayList<>();
+        connectorEntityList.add(connectorEntity1);
+        connectorEntityList.add(connectorEntity2);
+        connectorEntityList.add(connectorEntity3);
+
+        connectorMapper.batchInsert(connectorEntityList);
+
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setClusterId(1L);
+        List<ConnectorEntity> results = connectorMapper.selectByClusterId(connectorEntity);
+        assertEquals(6, results.size());
+    }
+
+    @Test
+    public void testUpdateK8sStatus() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorEntity.setPodState(3);
+        connectorMapper.updatePodState(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals(3, connectorEntity.getPodState());
+    }
+
+    @Test
+    public void testUpdateConfigIds() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorEntity.setConfigIds("1,3,4,5,6,7");
+        connectorMapper.updateConfigIds(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals("1,3,4,5,6,7", connectorEntity.getConfigIds());
+    }
+
+    @Test
+    public void testDeActiveById() {
+        ConnectorEntity connectorEntity = new ConnectorEntity();
+        connectorEntity.setId(1L);
+        connectorMapper.deActiveById(connectorEntity);
+
+        connectorEntity = connectorMapper.selectById(connectorEntity);
+        assertEquals(1, connectorEntity.getStatus());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java
new file mode 100644
index 0000000..d91cd22
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/health/HealthCheckResultMapperTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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.health;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.health.HealthCheckResultEntity;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:health-test.sql")
+class HealthCheckResultMapperTest {
+
+    @Autowired
+    private HealthCheckResultMapper healthCheckResultMapper;
+
+    @Test
+    public void testSelectById() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity();
+        healthCheckResultEntity.setId(1L);
+        healthCheckResultEntity = healthCheckResultMapper.selectById(healthCheckResultEntity);
+        assertEquals(1, healthCheckResultEntity.getId());
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndTypeAndTypeId() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "", 1);
+        healthCheckResultEntity = healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(healthCheckResultEntity).get(0);
+        assertEquals(1, healthCheckResultEntity.getId());
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndType() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "", 1);
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndType(healthCheckResultEntity);
+        assertEquals(2, results.size());
+    }
+
+    @Test
+    public void testSelectByClusterIdAndTimeRange() throws ParseException {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+        Date startDate = dateFormat.parse("2024-02-02 10:56:50");
+        Timestamp startTimestamp = new Timestamp(startDate.getTime());
+        Date endDate = dateFormat.parse("2024-02-03 10:56:52");
+        Timestamp endTimestamp = new Timestamp(endDate.getTime());
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndCreateTimeRange(1L, startTimestamp, endTimestamp);
+        assertEquals(4, results.size());
+    }
+
+    @Test
+    public void testInsert() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 5L, 1, 5L, "", 1);
+        healthCheckResultMapper.insert(healthCheckResultEntity);
+        healthCheckResultEntity = healthCheckResultMapper.selectById(healthCheckResultEntity);
+        assertEquals(7, healthCheckResultEntity.getId());
+    }
+
+    @Test
+    public void testBatchInsert() {
+        HealthCheckResultEntity healthCheckResultEntity1 = new HealthCheckResultEntity(1L, 1L, 1, 5L, "", 1);
+        HealthCheckResultEntity healthCheckResultEntity2 = new HealthCheckResultEntity(1L, 1L, 1, 6L, "", 1);
+        healthCheckResultMapper.batchInsert(Arrays.asList(healthCheckResultEntity1, healthCheckResultEntity2));
+        List<HealthCheckResultEntity> results = healthCheckResultMapper.selectByClusterIdAndType(healthCheckResultEntity1);
+        assertEquals(4, results.size());
+    }
+
+    @Test
+    public void testUpdate() {
+        HealthCheckResultEntity healthCheckResultEntity = new HealthCheckResultEntity(1L, 1L, 1, 1L, "reason", 0);
+        healthCheckResultMapper.update(healthCheckResultEntity);
+        healthCheckResultEntity = healthCheckResultMapper.selectByClusterIdAndTypeAndTypeId(healthCheckResultEntity).get(0);
+        assertEquals(0, healthCheckResultEntity.getStatus());
+    }
+
+    @Test
+    public void testBatchUpdate() {
+        HealthCheckResultEntity healthCheckResultEntity1 = new HealthCheckResultEntity(1L, 1L, 1, 1L, "reason", 0);
+        HealthCheckResultEntity healthCheckResultEntity2 = new HealthCheckResultEntity(2L, 1L, 1, 1L, "reason", 0);
+        healthCheckResultMapper.batchUpdate(Arrays.asList(healthCheckResultEntity1, healthCheckResultEntity2));
+        healthCheckResultEntity1 = healthCheckResultMapper.selectById(healthCheckResultEntity1);
+        healthCheckResultEntity2 = healthCheckResultMapper.selectById(healthCheckResultEntity2);
+
+        assertEquals(0, healthCheckResultEntity1.getStatus());
+        assertEquals(0, healthCheckResultEntity2.getStatus());
+    }
+
+    @Test
+    public void testUpdateByClusterIdAndTypeAndTypeId() {
+        HealthCheckResultEntity entity1 = new HealthCheckResultEntity(null, 1L, 1, 1L, "reason", 2);
+        HealthCheckResultEntity entity2 = new HealthCheckResultEntity(null, 1L, 1, 1L, "reason", 2);
+        healthCheckResultMapper.batchInsert(Arrays.asList(entity1, entity2));
+
+        List<HealthCheckResultEntity> toBeUpdate = healthCheckResultMapper.getIdsNeedToBeUpdateByClusterIdAndTypeAndTypeId(
+            Arrays.asList(entity1, entity2));
+
+        toBeUpdate.forEach(entity -> entity.setStatus(2));
+
+        healthCheckResultMapper.batchUpdate(toBeUpdate);
+        entity1.setId(7L);
+        assertEquals(2, healthCheckResultMapper.selectById(entity1).getStatus());
+        entity2.setId(1L);
+        assertEquals(0, healthCheckResultMapper.selectById(entity2).getStatus());
+    }
+
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java
new file mode 100644
index 0000000..42e58f4
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/mapper/meta/MetaMapperTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.meta;
+
+import org.apache.eventmesh.dashboard.console.EventMeshDashboardApplication;
+import org.apache.eventmesh.dashboard.console.entity.meta.MetaEntity;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = EventMeshDashboardApplication.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:use-test-schema.sql", "classpath:eventmesh-dashboard.sql"})
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:meta-test.sql")
+class MetaMapperTest {
+
+    @Autowired
+    private MetaMapper metaMapper;
+
+    @Test
+    public void testSelectByClusterId() {
+        MetaEntity metaEntity = new MetaEntity();
+        metaEntity.setClusterId(1L);
+        metaEntity = metaMapper.selectByClusterId(metaEntity);
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java
new file mode 100644
index 0000000..78cee9d
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/java/org/apache/eventmesh/dashboard/console/service/connection/impl/ConnectionDataServiceDatabaseImplTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.connection.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.eventmesh.dashboard.console.entity.connection.ConnectionEntity;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.jdbc.Sql;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+
+
+@ExtendWith(SpringExtension.class)
+@ActiveProfiles("test")
+@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:connection-test.sql")
+@SpringBootTest
+public class ConnectionDataServiceDatabaseImplTest {
+
+    @Autowired
+    private ConnectionDataServiceDatabaseImpl connectionServiceDatabaseImpl;
+
+    @Test
+    public void testGetAllConnectionsByClusterId() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnectionsByClusterId(1L);
+        assertEquals(3, connectionEntityList.size());
+    }
+
+    @Test
+    public void testGetAllConnections() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnections();
+        assertEquals(6, connectionEntityList.size());
+    }
+
+    @Test
+    public void testReplaceAllConnections() {
+        List<ConnectionEntity> connectionEntityList = connectionServiceDatabaseImpl.getAllConnectionsByClusterId(1L);
+        //change ClusterId into 2
+        connectionEntityList.forEach(connectionEntity -> connectionEntity.setClusterId(2L));
+        connectionServiceDatabaseImpl.replaceAllConnections(connectionEntityList);
+        assertEquals(8, connectionServiceDatabaseImpl.getAllConnections().size());
+    }
+}
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/application-test.yml b/eventmesh-dashboard-console/src/test/resources/application-test.yml
index 1a903d3..b70a657 100644
--- a/eventmesh-dashboard-console/src/test/resources/application-test.yml
+++ b/eventmesh-dashboard-console/src/test/resources/application-test.yml
@@ -21,9 +21,9 @@
     type: com.alibaba.druid.pool.DruidDataSource
     druid:
       driver-class-name: com.mysql.cj.jdbc.Driver
-      url: jdbc:mysql://localhost:3306/eventmesh-dashboard-test?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+      url: jdbc:mysql://localhost:3306/eventmesh_dashboard_test?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
       username: root
-      password: root
+      password: password
 
       initial-size: 1
       max-active: 50
diff --git a/eventmesh-dashboard-console/src/test/resources/client-test.sql b/eventmesh-dashboard-console/src/test/resources/client-test.sql
new file mode 100644
index 0000000..4a652f8
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/client-test.sql
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+DELETE
+FROM `eventmesh_dashboard_test`.client
+WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.client
+    AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.client (id, cluster_id, name, platform, language, pid, host, port, protocol, status, config_ids, description,
+                                               create_time, end_time, update_time)
+values (1, 3, '', '', 'java', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (2, 3, '', '', 'java', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (3, 3, '', '', 'go', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15'),
+       (4, 4, '', '', 'go', -1, '', -1, '', 1, '', '', '2024-02-02 15:15:15', '2024-02-02 15:15:15', '2024-02-02 15:15:15');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/connectiontest.sql b/eventmesh-dashboard-console/src/test/resources/connection-test.sql
similarity index 90%
rename from eventmesh-dashboard-console/src/test/resources/connectiontest.sql
rename to eventmesh-dashboard-console/src/test/resources/connection-test.sql
index 641ea5f..361700a 100644
--- a/eventmesh-dashboard-console/src/test/resources/connectiontest.sql
+++ b/eventmesh-dashboard-console/src/test/resources/connection-test.sql
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-DELETE FROM `eventmesh-dashboard-test`.connection WHERE TRUE;
-ALTER TABLE `eventmesh-dashboard-test`.connection AUTO_INCREMENT = 1;
+DELETE FROM `eventmesh_dashboard_test`.connection WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.connection AUTO_INCREMENT = 1;
 
-insert into `eventmesh-dashboard-test`.connection (id, cluster_id, source_type, source_id, sink_type, sink_id, runtime_id, status, topic, group_id, description, create_time, end_time, update_time)
+insert into `eventmesh_dashboard_test`.connection (id, cluster_id, source_type, source_id, sink_type, sink_id, runtime_id, status, topic, group_id, description, create_time, end_time, update_time)
 values  (1, 1, 'connector', 1, 'connector', 1, 1, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
     (2, 1, 'connector', 2, 'connector', 2, 2, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
     (3, 1, 'connector', 3, 'connector', 3, 3, 0, 'test-topic', -1, '', '2024-01-27 11:55:11', '2024-01-27 11:55:11', '2024-01-27 11:55:11'),
diff --git a/eventmesh-dashboard-console/src/test/resources/connector-test.sql b/eventmesh-dashboard-console/src/test/resources/connector-test.sql
new file mode 100644
index 0000000..2ebdc5f
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/connector-test.sql
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+DELETE FROM `eventmesh_dashboard_test`.connection WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.connection AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.connector (id, cluster_id, name, class_name, type, status, pod_state, config_ids, create_time, update_time)
+values  (1, 1, '', 'the', '', 1, 1, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (2, 1, '', 'quick', '', 1, 1, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (3, 1, '', 'brown', '', 1, 2, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (4, 2, '', 'fox', '', 1, 2, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02'),
+    (5, 3, '', 'jumps', '', 1, 3, '', '2024-02-02 16:43:45', '2024-02-02 16:53:02');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/test/resources/health-test.sql b/eventmesh-dashboard-console/src/test/resources/health-test.sql
new file mode 100644
index 0000000..45c3aeb
--- /dev/null
+++ b/eventmesh-dashboard-console/src/test/resources/health-test.sql
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+DELETE FROM `eventmesh_dashboard_test`.health_check_result WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.health_check_result AUTO_INCREMENT = 1;
+
+insert into `eventmesh_dashboard_test`.health_check_result (id, type, type_id, cluster_id, status, result_desc, create_time, update_time)
+values  (1, 1, 1, 1, 0, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (2, 2, 2, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (3, 3, 3, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (4, 4, 4, 1, 1, '', '2024-02-02 18:56:50', '2024-02-02 18:56:50'),
+    (5, 1, 2, 1, 1, '', '2024-02-04 18:56:50', '2024-02-02 19:33:13'),
+    (6, 4, 2, 2, 0, '', '2024-02-04 18:56:50', '2024-02-02 19:33:13');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/test/resources/meta-test.sql
similarity index 61%
copy from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
copy to eventmesh-dashboard-console/src/test/resources/meta-test.sql
index 7263f7c..66a6354 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/test/resources/meta-test.sql
@@ -15,14 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
+DELETE FROM `eventmesh_dashboard_test`.meta WHERE TRUE;
+ALTER TABLE `eventmesh_dashboard_test`.meta AUTO_INCREMENT = 1;
 
-import org.springframework.stereotype.Component;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
-}
+insert into `eventmesh_dashboard_test`.meta (id, name, type, version, cluster_id, host, port, role, username, params, status, create_time, update_time)
+values  (1, '1', 'nacos', '1.0', 1, '', -1, '-1', '', '', 0, '2024-02-03 10:30:02', '2024-02-03 10:30:02'),
+    (2, '2', 'zookeeper', '1.0', 1, '', -1, '-1', '', '', 0, '2024-02-03 10:30:02', '2024-02-03 10:30:02');
\ No newline at end of file
diff --git a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java b/eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
similarity index 78%
rename from eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
rename to eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
index 7263f7c..db0c0a2 100644
--- a/eventmesh-dashboard-console/src/main/java/org/apache/eventmesh/dashboard/console/scheduler/health/HealthCheckScheduler.java
+++ b/eventmesh-dashboard-console/src/test/resources/use-test-schema.sql
@@ -15,14 +15,4 @@
  * limitations under the License.
  */
 
-package org.apache.eventmesh.dashboard.console.scheduler.health;
-
-import org.springframework.stereotype.Component;
-
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@Component
-public class HealthCheckScheduler {
-
-}
+USE `eventmesh_dashboard_test`;