diff --git a/src/main/java/com/xuxd/kafka/console/beans/dto/AddPartitionDTO.java b/src/main/java/com/xuxd/kafka/console/beans/dto/AddPartitionDTO.java index 94cee6b..30ad5d4 100644 --- a/src/main/java/com/xuxd/kafka/console/beans/dto/AddPartitionDTO.java +++ b/src/main/java/com/xuxd/kafka/console/beans/dto/AddPartitionDTO.java @@ -1,7 +1,9 @@ package com.xuxd.kafka.console.beans.dto; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import lombok.Data; /** @@ -17,5 +19,5 @@ public class AddPartitionDTO { private int addNum; - private List> assignment = new ArrayList<>(); + private Map> assignment = new HashMap<>(); } diff --git a/src/main/java/com/xuxd/kafka/console/controller/TopicController.java b/src/main/java/com/xuxd/kafka/console/controller/TopicController.java index b027f82..60cde4a 100644 --- a/src/main/java/com/xuxd/kafka/console/controller/TopicController.java +++ b/src/main/java/com/xuxd/kafka/console/controller/TopicController.java @@ -4,6 +4,10 @@ import com.xuxd.kafka.console.beans.dto.AddPartitionDTO; import com.xuxd.kafka.console.beans.dto.NewTopicDTO; import com.xuxd.kafka.console.beans.enums.TopicType; import com.xuxd.kafka.console.service.TopicService; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -48,6 +52,18 @@ public class TopicController { @PostMapping("/partition/new") public Object addPartition(@RequestBody AddPartitionDTO partitionDTO) { - return topicService.addPartitions(partitionDTO.getTopic().trim(), partitionDTO.getAddNum(), partitionDTO.getAssignment()); + String topic = partitionDTO.getTopic().trim(); + int addNum = partitionDTO.getAddNum(); + Map> assignmentMap = partitionDTO.getAssignment(); + List> assignment = Collections.emptyList(); + + if (!assignmentMap.isEmpty()) { + assignment = new ArrayList<>(addNum); + for (int i = 1; i <= addNum; i++) { + assignment.add(assignmentMap.containsKey(i) ? assignmentMap.get(i) : Collections.emptyList()); + } + } + + return topicService.addPartitions(topic, addNum, assignment); } } diff --git a/src/main/java/com/xuxd/kafka/console/interceptor/GlobalExceptionHandler.java b/src/main/java/com/xuxd/kafka/console/interceptor/GlobalExceptionHandler.java new file mode 100644 index 0000000..7715f45 --- /dev/null +++ b/src/main/java/com/xuxd/kafka/console/interceptor/GlobalExceptionHandler.java @@ -0,0 +1,27 @@ +package com.xuxd.kafka.console.interceptor; + +import com.xuxd.kafka.console.beans.ResponseData; +import javax.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * kafka-console-ui. + * + * @author xuxd + * @date 2021-10-19 14:32:18 + **/ +@Slf4j +@ControllerAdvice(basePackages = "com.xuxd.kafka.console.controller") +public class GlobalExceptionHandler { + + @ExceptionHandler(value = Exception.class) + @ResponseBody + public Object exceptionHandler(HttpServletRequest req, Exception ex) throws Exception { + + log.error("exception handle: ", ex); + return ResponseData.create().failed(ex.getMessage()); + } +} diff --git a/ui/src/utils/api.js b/ui/src/utils/api.js index 77622a1..5a1ea79 100644 --- a/ui/src/utils/api.js +++ b/ui/src/utils/api.js @@ -73,6 +73,10 @@ export const KafkaTopicApi = { url: "/topic/new", method: "post", }, + addPartition: { + url: "/topic/partition/new", + method: "post", + }, }; export const KafkaConsumerApi = { diff --git a/ui/src/views/topic/AddPartition.vue b/ui/src/views/topic/AddPartition.vue index f123e62..e5370c9 100644 --- a/ui/src/views/topic/AddPartition.vue +++ b/ui/src/views/topic/AddPartition.vue @@ -18,20 +18,18 @@ @submit="handleSubmit" > - - + 个分区 - + @@ -99,24 +96,25 @@ export default { e.preventDefault(); this.form.validateFields((err, values) => { if (!err) { - if (values.configs) { - const config = {}; - values.configs.split("\n").forEach((e) => { + if (values.assignment) { + const assignment = {}; + values.assignment.split("\n").forEach((e) => { const c = e.split("="); if (c.length > 1) { - let k = c[0].trim(), - v = c[1].trim(); - if (k && v) { - config[k] = v; + let k = c[0]; + let v = c[1]; + let arr = v.split(","); + if (arr.length > 0) { + assignment[k] = arr; } } }); - values.configs = config; + values.assignment = assignment; } this.loading = true; request({ - url: KafkaTopicApi.creatTopic.url, - method: KafkaTopicApi.creatTopic.method, + url: KafkaTopicApi.addPartition.url, + method: KafkaTopicApi.addPartition.method, data: values, }).then((res) => { this.loading = false; diff --git a/ui/src/views/topic/Topic.vue b/ui/src/views/topic/Topic.vue index aa5c49a..a233aa4 100644 --- a/ui/src/views/topic/Topic.vue +++ b/ui/src/views/topic/Topic.vue @@ -74,7 +74,7 @@ size="small" href="javascript:;" class="operation-btn" - @click="openAddPartitionDialog" + @click="openAddPartitionDialog(record.name)" >增加分区 @@ -91,6 +91,7 @@ @@ -183,7 +184,8 @@ export default { this.getTopicList(); } }, - openAddPartitionDialog() { + openAddPartitionDialog(topic) { + this.selectDetail.resourceName = topic; this.showAddPartition = true; }, closeAddPartitionDialog(res) {