diff --git a/src/main/java/com/xuxd/kafka/console/beans/dto/ClusterInfoDTO.java b/src/main/java/com/xuxd/kafka/console/beans/dto/ClusterInfoDTO.java new file mode 100644 index 0000000..56ec78b --- /dev/null +++ b/src/main/java/com/xuxd/kafka/console/beans/dto/ClusterInfoDTO.java @@ -0,0 +1,38 @@ +package com.xuxd.kafka.console.beans.dto; + +import com.xuxd.kafka.console.beans.dos.ClusterInfoDO; +import com.xuxd.kafka.console.utils.ConvertUtil; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +/** + * kafka-console-ui. + * + * @author xuxd + * @date 2022-01-04 20:19:03 + **/ +@Data +public class ClusterInfoDTO { + private Long id; + + private String clusterName; + + private String address; + + private String properties; + + private String updateTime; + + public ClusterInfoDO to() { + ClusterInfoDO infoDO = new ClusterInfoDO(); + infoDO.setId(id); + infoDO.setClusterName(clusterName); + infoDO.setAddress(address); + + if (StringUtils.isNotBlank(properties)) { + infoDO.setProperties(ConvertUtil.propertiesStr2JsonStr(properties)); + } + + return infoDO; + } +} diff --git a/src/main/java/com/xuxd/kafka/console/beans/vo/ClusterInfoVO.java b/src/main/java/com/xuxd/kafka/console/beans/vo/ClusterInfoVO.java new file mode 100644 index 0000000..d010bda --- /dev/null +++ b/src/main/java/com/xuxd/kafka/console/beans/vo/ClusterInfoVO.java @@ -0,0 +1,40 @@ +package com.xuxd.kafka.console.beans.vo; + +import com.xuxd.kafka.console.beans.dos.ClusterInfoDO; +import com.xuxd.kafka.console.utils.ConvertUtil; +import java.util.List; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +/** + * kafka-console-ui. + * + * @author xuxd + * @date 2022-01-04 19:16:11 + **/ +@Data +public class ClusterInfoVO { + + private Long id; + + private String clusterName; + + private String address; + + private List properties; + + private String updateTime; + + public static ClusterInfoVO from(ClusterInfoDO infoDO) { + ClusterInfoVO vo = new ClusterInfoVO(); + vo.setId(infoDO.getId()); + vo.setClusterName(infoDO.getClusterName()); + vo.setAddress(infoDO.getAddress()); + vo.setUpdateTime(infoDO.getUpdateTime()); + if (StringUtils.isNotBlank(infoDO.getProperties())) { + vo.setProperties(ConvertUtil.jsonStr2List(infoDO.getProperties())); + } + return vo; + + } +} diff --git a/src/main/java/com/xuxd/kafka/console/boot/Bootstrap.java b/src/main/java/com/xuxd/kafka/console/boot/Bootstrap.java index d2e4084..d464bac 100644 --- a/src/main/java/com/xuxd/kafka/console/boot/Bootstrap.java +++ b/src/main/java/com/xuxd/kafka/console/boot/Bootstrap.java @@ -57,6 +57,7 @@ public class Bootstrap implements SmartInitializingSingleton { infoDO.setAddress(config.getBootstrapServer().trim()); infoDO.setProperties(ConvertUtil.toJsonString(config.getProperties())); clusterInfoMapper.insert(infoDO); + log.info("Insert default config: {}", infoDO); } @Override public void afterSingletonsInstantiated() { diff --git a/src/main/java/com/xuxd/kafka/console/controller/ClusterController.java b/src/main/java/com/xuxd/kafka/console/controller/ClusterController.java index e456f3e..c5e0a82 100644 --- a/src/main/java/com/xuxd/kafka/console/controller/ClusterController.java +++ b/src/main/java/com/xuxd/kafka/console/controller/ClusterController.java @@ -1,8 +1,11 @@ package com.xuxd.kafka.console.controller; +import com.xuxd.kafka.console.beans.dto.ClusterInfoDTO; import com.xuxd.kafka.console.service.ClusterService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -23,4 +26,14 @@ public class ClusterController { public Object getClusterInfo() { return clusterService.getClusterInfo(); } + + @GetMapping("/list") + public Object getClusterInfoList() { + return clusterService.getClusterInfoList(); + } + + @PostMapping + public Object addClusterInfo(@RequestBody ClusterInfoDTO dto) { + return clusterService.addClusterInfo(dto.to()); + } } diff --git a/src/main/java/com/xuxd/kafka/console/service/ClusterService.java b/src/main/java/com/xuxd/kafka/console/service/ClusterService.java index 141740c..8a1e024 100644 --- a/src/main/java/com/xuxd/kafka/console/service/ClusterService.java +++ b/src/main/java/com/xuxd/kafka/console/service/ClusterService.java @@ -1,6 +1,7 @@ package com.xuxd.kafka.console.service; import com.xuxd.kafka.console.beans.ResponseData; +import com.xuxd.kafka.console.beans.dos.ClusterInfoDO; /** * kafka-console-ui. @@ -10,4 +11,8 @@ import com.xuxd.kafka.console.beans.ResponseData; **/ public interface ClusterService { ResponseData getClusterInfo(); + + ResponseData getClusterInfoList(); + + ResponseData addClusterInfo(ClusterInfoDO infoDO); } diff --git a/src/main/java/com/xuxd/kafka/console/service/impl/ClusterServiceImpl.java b/src/main/java/com/xuxd/kafka/console/service/impl/ClusterServiceImpl.java index 51d556b..f339667 100644 --- a/src/main/java/com/xuxd/kafka/console/service/impl/ClusterServiceImpl.java +++ b/src/main/java/com/xuxd/kafka/console/service/impl/ClusterServiceImpl.java @@ -1,7 +1,11 @@ package com.xuxd.kafka.console.service.impl; import com.xuxd.kafka.console.beans.ResponseData; +import com.xuxd.kafka.console.beans.dos.ClusterInfoDO; +import com.xuxd.kafka.console.beans.vo.ClusterInfoVO; +import com.xuxd.kafka.console.dao.ClusterInfoMapper; import com.xuxd.kafka.console.service.ClusterService; +import java.util.stream.Collectors; import kafka.console.ClusterConsole; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,7 +22,21 @@ public class ClusterServiceImpl implements ClusterService { @Autowired private ClusterConsole clusterConsole; + @Autowired + private ClusterInfoMapper clusterInfoMapper; + @Override public ResponseData getClusterInfo() { return ResponseData.create().data(clusterConsole.clusterInfo()).success(); } + + @Override public ResponseData getClusterInfoList() { + return ResponseData.create().data(clusterInfoMapper.selectList(null) + .stream().map(ClusterInfoVO::from).collect(Collectors.toList())).success(); + } + + @Override public ResponseData addClusterInfo(ClusterInfoDO infoDO) { + clusterInfoMapper.insert(infoDO); + return ResponseData.create().success(); + } + } diff --git a/src/main/java/com/xuxd/kafka/console/utils/ConvertUtil.java b/src/main/java/com/xuxd/kafka/console/utils/ConvertUtil.java index 3fc7769..d8274de 100644 --- a/src/main/java/com/xuxd/kafka/console/utils/ConvertUtil.java +++ b/src/main/java/com/xuxd/kafka/console/utils/ConvertUtil.java @@ -1,9 +1,13 @@ package com.xuxd.kafka.console.utils; import com.google.common.base.Preconditions; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Properties; import lombok.extern.slf4j.Slf4j; @@ -53,4 +57,36 @@ public class ConvertUtil { public static Properties toProperties(String jsonStr) { return GsonUtil.INSTANCE.get().fromJson(jsonStr, Properties.class); } + + public static String jsonStr2PropertiesStr(String jsonStr) { + StringBuilder sb = new StringBuilder(); + Map map = GsonUtil.INSTANCE.get().fromJson(jsonStr, Map.class); + map.keySet().forEach(k -> { + sb.append(k).append("=").append(map.get(k).toString()).append(System.lineSeparator()); + }); + + return sb.toString(); + } + + public static List jsonStr2List(String jsonStr) { + List res = new LinkedList<>(); + Map map = GsonUtil.INSTANCE.get().fromJson(jsonStr, Map.class); + map.forEach((k, v) -> { + res.add(k + "=" + v); + }); + + return res; + } + + public static String propertiesStr2JsonStr(String propertiesStr) { + String res = "{}"; + try (ByteArrayInputStream baos = new ByteArrayInputStream(propertiesStr.getBytes())) { + Properties properties = new Properties(); + properties.load(baos); + res = toJsonString(properties); + } catch (IOException e) { + log.error("propertiesStr2JsonStr error.", e); + } + return res; + } } diff --git a/ui/src/utils/api.js b/ui/src/utils/api.js index 36a2f84..4a65075 100644 --- a/ui/src/utils/api.js +++ b/ui/src/utils/api.js @@ -183,6 +183,14 @@ export const KafkaClusterApi = { url: "/cluster", method: "get", }, + getClusterInfoList: { + url: "/cluster/list", + method: "get", + }, + addClusterInfo: { + url: "/cluster", + method: "post", + }, }; export const KafkaOpApi = { diff --git a/ui/src/views/op/AddClusterInfo.vue b/ui/src/views/op/AddClusterInfo.vue new file mode 100644 index 0000000..942180c --- /dev/null +++ b/ui/src/views/op/AddClusterInfo.vue @@ -0,0 +1,117 @@ + + + + + diff --git a/ui/src/views/op/ClusterInfo.vue b/ui/src/views/op/ClusterInfo.vue new file mode 100644 index 0000000..172a655 --- /dev/null +++ b/ui/src/views/op/ClusterInfo.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/ui/src/views/op/Operation.vue b/ui/src/views/op/Operation.vue index a34c223..23998cb 100644 --- a/ui/src/views/op/Operation.vue +++ b/ui/src/views/op/Operation.vue @@ -3,7 +3,9 @@

- 集群切换 + + 集群切换 + 多集群管理:增加、删除集群配置,切换集群

@@ -117,6 +119,10 @@ :visible="replicationManager.showCurrentReassignmentsDialog" @closeCurrentReassignmentsDialog="closeCurrentReassignmentsDialog" > +
@@ -129,6 +135,7 @@ import DataSyncScheme from "@/views/op/DataSyncScheme"; import ConfigThrottle from "@/views/op/ConfigThrottle"; import RemoveThrottle from "@/views/op/RemoveThrottle"; import CurrentReassignments from "@/views/op/CurrentReassignments"; +import ClusterInfo from "@/views/op/ClusterInfo"; export default { name: "Operation", components: { @@ -140,6 +147,7 @@ export default { ConfigThrottle, RemoveThrottle, CurrentReassignments, + ClusterInfo, }, data() { return { @@ -157,6 +165,9 @@ export default { showConfigThrottleDialog: false, showRemoveThrottleDialog: false, }, + clusterManager: { + showClusterInfoDialog: false, + }, }; }, methods: { @@ -208,6 +219,12 @@ export default { closeCurrentReassignmentsDialog() { this.replicationManager.showCurrentReassignmentsDialog = false; }, + openClusterInfoDialog() { + this.clusterManager.showClusterInfoDialog = true; + }, + closeClusterInfoDialog() { + this.clusterManager.showClusterInfoDialog = false; + }, }, };