diff --git a/docs/install_guide/install_guide_cn.md b/docs/install_guide/install_guide_cn.md index 4142bc81..dbfa5e2c 100644 --- a/docs/install_guide/install_guide_cn.md +++ b/docs/install_guide/install_guide_cn.md @@ -13,7 +13,7 @@ ## 环境依赖 - `Maven 3.5+`(后端打包依赖) -- `node 10+`(前端打包依赖) +- `node v12+`(前端打包依赖) - `Java 8+`(运行环境需要) - `MySQL 5.7`(数据存储) diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java index 423c6d1d..f2f1922c 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/constant/TopicCreationConstant.java @@ -46,4 +46,15 @@ public class TopicCreationConstant { public static final String TOPIC_NAME_PREFIX_RU = "ru01_"; public static final Integer TOPIC_NAME_MAX_LENGTH = 255; + + + /** + * 单次自动化审批, 默认允许的通过单子 + */ + public static final Integer DEFAULT_MAX_PASSED_ORDER_NUM_PER_TASK = 1; + + /** + * 单次自动化审批, 最多允许的通过单子 + */ + public static final Integer MAX_PASSED_ORDER_NUM_PER_TASK = 200; } \ No newline at end of file diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java index ce044a13..d59ade76 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ResultStatus.java @@ -86,6 +86,8 @@ public enum ResultStatus { APP_ID_OR_PASSWORD_ILLEGAL(1000, "app or password illegal"), SYSTEM_CODE_ILLEGAL(1000, "system code illegal"), + CLUSTER_TASK_HOST_LIST_ILLEGAL(1000, "主机列表错误,请检查主机列表"), + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/RdTopicBasic.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/RdTopicBasic.java index 3cecd3cf..bf57a800 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/RdTopicBasic.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/RdTopicBasic.java @@ -1,5 +1,6 @@ package com.xiaojukeji.kafka.manager.common.entity.ao; +import java.util.List; import java.util.Properties; /** @@ -23,6 +24,8 @@ public class RdTopicBasic { private String description; + private List regionNameList; + public Long getClusterId() { return clusterId; } @@ -87,6 +90,14 @@ public class RdTopicBasic { this.description = description; } + public List getRegionNameList() { + return regionNameList; + } + + public void setRegionNameList(List regionNameList) { + this.regionNameList = regionNameList; + } + @Override public String toString() { return "RdTopicBasic{" + @@ -98,6 +109,7 @@ public class RdTopicBasic { ", appName='" + appName + '\'' + ", properties=" + properties + ", description='" + description + '\'' + + ", regionNameList='" + regionNameList + '\'' + '}'; } } \ No newline at end of file diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/CreateTopicConfig.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/CreateTopicConfig.java index 35f694f8..897222a3 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/CreateTopicConfig.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/config/CreateTopicConfig.java @@ -1,5 +1,8 @@ package com.xiaojukeji.kafka.manager.common.entity.ao.config; +import com.xiaojukeji.kafka.manager.common.constant.TopicCreationConstant; +import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; + import java.util.List; /** @@ -7,8 +10,27 @@ import java.util.List; * @date 20/7/24 */ public class CreateTopicConfig { + /** + * 单次自动化审批, 允许的通过单子 + */ + private Integer maxPassedOrderNumPerTask; + private List configList; + public Integer getMaxPassedOrderNumPerTask() { + if (ValidateUtils.isNull(maxPassedOrderNumPerTask)) { + return TopicCreationConstant.DEFAULT_MAX_PASSED_ORDER_NUM_PER_TASK; + } + if (maxPassedOrderNumPerTask > TopicCreationConstant.MAX_PASSED_ORDER_NUM_PER_TASK) { + return TopicCreationConstant.MAX_PASSED_ORDER_NUM_PER_TASK; + } + return maxPassedOrderNumPerTask; + } + + public void setMaxPassedOrderNumPerTask(Integer maxPassedOrderNumPerTask) { + this.maxPassedOrderNumPerTask = maxPassedOrderNumPerTask; + } + public List getConfigList() { return configList; } @@ -20,7 +42,8 @@ public class CreateTopicConfig { @Override public String toString() { return "CreateTopicConfig{" + - "configList=" + configList + + "maxPassedOrderNumPerTask=" + maxPassedOrderNumPerTask + + ", configList=" + configList + '}'; } } \ No newline at end of file diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java index 9522feee..e3ea08ed 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicBasicDTO.java @@ -1,5 +1,7 @@ package com.xiaojukeji.kafka.manager.common.entity.ao.topic; +import java.util.List; + /** * @author arthur * @date 2018/09/03 @@ -17,7 +19,7 @@ public class TopicBasicDTO { private String description; - private String region; + private List regionNameList; private Integer score; @@ -83,12 +85,12 @@ public class TopicBasicDTO { this.description = description; } - public String getRegion() { - return region; + public List getRegionNameList() { + return regionNameList; } - public void setRegion(String region) { - this.region = region; + public void setRegionNameList(List regionNameList) { + this.regionNameList = regionNameList; } public Integer getScore() { @@ -164,7 +166,7 @@ public class TopicBasicDTO { ", principals='" + principals + '\'' + ", topicName='" + topicName + '\'' + ", description='" + description + '\'' + - ", region='" + region + '\'' + + ", regionNameList='" + regionNameList + '\'' + ", score=" + score + ", topicCodeC='" + topicCodeC + '\'' + ", partitionNum=" + partitionNum + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicOverview.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicOverview.java index 03dd9e37..fe02fe94 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicOverview.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/ao/topic/TopicOverview.java @@ -18,6 +18,8 @@ public class TopicOverview { private Object byteIn; + private Object byteOut; + private Object produceRequest; private String appName; @@ -78,6 +80,14 @@ public class TopicOverview { this.byteIn = byteIn; } + public Object getByteOut() { + return byteOut; + } + + public void setByteOut(Object byteOut) { + this.byteOut = byteOut; + } + public Object getProduceRequest() { return produceRequest; } @@ -135,6 +145,7 @@ public class TopicOverview { ", partitionNum=" + partitionNum + ", retentionTime=" + retentionTime + ", byteIn=" + byteIn + + ", byteOut=" + byteOut + ", produceRequest=" + produceRequest + ", appName='" + appName + '\'' + ", appId='" + appId + '\'' + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/LogicalClusterDTO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/LogicalClusterDTO.java index c3569774..790f9758 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/LogicalClusterDTO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/dto/rd/LogicalClusterDTO.java @@ -1,6 +1,7 @@ package com.xiaojukeji.kafka.manager.common.entity.dto.rd; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.xiaojukeji.kafka.manager.common.bizenum.ClusterModeEnum; import com.xiaojukeji.kafka.manager.common.utils.ValidateUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -108,10 +109,13 @@ public class LogicalClusterDTO { if (ValidateUtils.isNull(clusterId) || ValidateUtils.isNull(clusterId) || ValidateUtils.isEmptyList(regionIdList) - || ValidateUtils.isNull(appId) || ValidateUtils.isNull(mode)) { return false; } + if (!ClusterModeEnum.SHARED_MODE.getCode().equals(mode) && ValidateUtils.isNull(appId)) { + return false; + } + appId = ValidateUtils.isNull(appId)? "": appId; description = ValidateUtils.isNull(description)? "": description; return true; } diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/metrics/TopicMetrics.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/metrics/TopicMetrics.java index 768d7d84..33c8aaeb 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/metrics/TopicMetrics.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/metrics/TopicMetrics.java @@ -1,5 +1,7 @@ package com.xiaojukeji.kafka.manager.common.entity.metrics; +import java.util.List; + /** * @author zengqiao * @date 20/6/17 @@ -11,6 +13,8 @@ public class TopicMetrics extends BaseMetrics { private String topicName; + private List brokerMetricsList; + public TopicMetrics(Long clusterId, String topicName) { super(); this.clusterId = clusterId; @@ -24,6 +28,14 @@ public class TopicMetrics extends BaseMetrics { this.topicName = topicName; } + public TopicMetrics(String appId, Long clusterId, String topicName, List brokerMetricsList) { + super(); + this.appId = appId; + this.clusterId = clusterId; + this.topicName = topicName; + this.brokerMetricsList = brokerMetricsList; + } + public String getAppId() { return appId; } @@ -36,6 +48,14 @@ public class TopicMetrics extends BaseMetrics { return topicName; } + public void setBrokerMetricsList(List brokerMetricsList) { + this.brokerMetricsList = brokerMetricsList; + } + + public List getBrokerMetricsList() { + return brokerMetricsList; + } + @Override public String toString() { return "TopicMetrics{" + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/common/TopicOverviewVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/common/TopicOverviewVO.java index bf462ffc..724e31b2 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/common/TopicOverviewVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/common/TopicOverviewVO.java @@ -28,6 +28,9 @@ public class TopicOverviewVO { @ApiModelProperty(value = "每秒流入流量(B)") private Object byteIn; + @ApiModelProperty(value = "每秒流出流量(B)") + private Object byteOut; + @ApiModelProperty(value = "发送请求数(个/秒)") private Object produceRequest; @@ -94,6 +97,14 @@ public class TopicOverviewVO { this.byteIn = byteIn; } + public Object getByteOut() { + return byteOut; + } + + public void setByteOut(Object byteOut) { + this.byteOut = byteOut; + } + public Object getProduceRequest() { return produceRequest; } @@ -151,6 +162,7 @@ public class TopicOverviewVO { ", partitionNum=" + partitionNum + ", retentionTime=" + retentionTime + ", byteIn=" + byteIn + + ", byteOut=" + byteOut + ", produceRequest=" + produceRequest + ", appName='" + appName + '\'' + ", appId='" + appId + '\'' + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java index f3fcb952..946a9997 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBasicVO.java @@ -3,6 +3,8 @@ package com.xiaojukeji.kafka.manager.common.entity.vo.normal.topic; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.util.List; + /** * Topic的基本信息 * @author zengqiao @@ -49,6 +51,9 @@ public class TopicBasicVO { @ApiModelProperty(value = "集群地址") private String bootstrapServers; + @ApiModelProperty(value = "所属region") + private List regionNameList; + public Long getClusterId() { return clusterId; } @@ -153,6 +158,14 @@ public class TopicBasicVO { this.score = score; } + public List getRegionNameList() { + return regionNameList; + } + + public void setRegionNameList(List regionNameList) { + this.regionNameList = regionNameList; + } + @Override public String toString() { return "TopicBasicVO{" + @@ -169,6 +182,7 @@ public class TopicBasicVO { ", topicCodeC='" + topicCodeC + '\'' + ", description='" + description + '\'' + ", bootstrapServers='" + bootstrapServers + '\'' + + ", regionNameList=" + regionNameList + '}'; } } diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBrokerRequestTimeVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBrokerRequestTimeVO.java new file mode 100644 index 00000000..486dcc61 --- /dev/null +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicBrokerRequestTimeVO.java @@ -0,0 +1,39 @@ +package com.xiaojukeji.kafka.manager.common.entity.vo.normal.topic; + +/** + * author: mrazkonglingxu + * Date: 2020/12/7 + * Time: 7:40 下午 + */ +public class TopicBrokerRequestTimeVO { + + private Long clusterId; + + private Integer brokerId; + + private TopicRequestTimeDetailVO brokerRequestTime; + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public Integer getBrokerId() { + return brokerId; + } + + public void setBrokerId(Integer brokerId) { + this.brokerId = brokerId; + } + + public TopicRequestTimeDetailVO getBrokerRequestTime() { + return brokerRequestTime; + } + + public void setBrokerRequestTime(TopicRequestTimeDetailVO brokerRequestTime) { + this.brokerRequestTime = brokerRequestTime; + } +} diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicRequestTimeDetailVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicRequestTimeDetailVO.java index c89c7cb2..346e2383 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicRequestTimeDetailVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/normal/topic/TopicRequestTimeDetailVO.java @@ -3,6 +3,8 @@ package com.xiaojukeji.kafka.manager.common.entity.vo.normal.topic; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.util.List; + /** * @author zengqiao * @date 20/4/8 @@ -33,6 +35,8 @@ public class TopicRequestTimeDetailVO { @ApiModelProperty(value = "totalTimeMs") private Object totalTimeMs; + private List brokerRequestTimeList; + public String getRequestTimeType() { return requestTimeType; } @@ -97,6 +101,14 @@ public class TopicRequestTimeDetailVO { this.totalTimeMs = totalTimeMs; } + public List getBrokerRequestTimeList() { + return brokerRequestTimeList; + } + + public void setBrokerRequestTimeList(List brokerRequestTimeList) { + this.brokerRequestTimeList = brokerRequestTimeList; + } + @Override public String toString() { return "TopicRequestTimeDetailVO{" + diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/RdTopicBasicVO.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/RdTopicBasicVO.java index 55682938..75d50f05 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/RdTopicBasicVO.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/entity/vo/rd/RdTopicBasicVO.java @@ -3,6 +3,7 @@ package com.xiaojukeji.kafka.manager.common.entity.vo.rd; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.util.List; import java.util.Properties; /** @@ -35,6 +36,9 @@ public class RdTopicBasicVO { @ApiModelProperty(value = "备注") private String description; + @ApiModelProperty(value = "所属region") + private List regionNameList; + public Long getClusterId() { return clusterId; } @@ -99,6 +103,14 @@ public class RdTopicBasicVO { this.description = description; } + public List getRegionNameList() { + return regionNameList; + } + + public void setRegionNameList(List regionNameList) { + this.regionNameList = regionNameList; + } + @Override public String toString() { return "RdTopicBasicVO{" + @@ -110,6 +122,7 @@ public class RdTopicBasicVO { ", appName='" + appName + '\'' + ", properties=" + properties + ", description='" + description + '\'' + + ", regionNameList='" + regionNameList + '\'' + '}'; } } \ No newline at end of file diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java index a8c4997e..1d4bce26 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/JsonUtils.java @@ -64,7 +64,7 @@ public class JsonUtils { TopicConnectionDO connectionDO = new TopicConnectionDO(); String[] appIdDetailArray = appIdDetail.toString().split("#"); - if (appIdDetailArray.length == 3) { + if (appIdDetailArray.length >= 3) { connectionDO.setAppId(appIdDetailArray[0]); connectionDO.setIp(appIdDetailArray[1]); connectionDO.setClientVersion(appIdDetailArray[2]); diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/MbeanNameUtilV2.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/MbeanNameUtilV2.java index d7d4ffe9..eb43e989 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/MbeanNameUtilV2.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/utils/jmx/MbeanNameUtilV2.java @@ -170,7 +170,10 @@ public class MbeanNameUtilV2 { new MbeanV2( "TopicCodeC", JmxAttributeEnum.VALUE_ATTRIBUTE, - "kafka.server:type=ReplicaManager,name=TopicCodeC" + Arrays.asList( + new AbstractMap.SimpleEntry<>(KafkaVersion.VERSION_0_10_3, "kafka.server:type=ReplicaManager,name=TopicCodeC"), + new AbstractMap.SimpleEntry<>(KafkaVersion.VERSION_MAX, "kafka.server:type=AppIdTopicMetrics,name=RecordCompression,appId=") + ) ), Arrays.asList( KafkaMetricsCollections.TOPIC_BASIC_PAGE_METRICS diff --git a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java index b1758205..464dba7b 100644 --- a/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java +++ b/kafka-manager-common/src/main/java/com/xiaojukeji/kafka/manager/common/zookeeper/ZkPathUtil.java @@ -8,7 +8,7 @@ package com.xiaojukeji.kafka.manager.common.zookeeper; public class ZkPathUtil { private static final String ZOOKEEPER_SEPARATOR = "/"; - private static final String BROKER_ROOT_NODE = ZOOKEEPER_SEPARATOR + "brokers"; + public static final String BROKER_ROOT_NODE = ZOOKEEPER_SEPARATOR + "brokers"; public static final String CONTROLLER_ROOT_NODE = ZOOKEEPER_SEPARATOR + "controller"; diff --git a/kafka-manager-console/package.json b/kafka-manager-console/package.json index b823bf3d..f06c4120 100644 --- a/kafka-manager-console/package.json +++ b/kafka-manager-console/package.json @@ -33,6 +33,8 @@ "mobx": "^5.9.4", "mobx-react": "^5.4.3", "moment": "^2.24.0", + "monaco-editor": "^0.20.0", + "monaco-editor-webpack-plugin": "^1.9.0", "optimize-css-assets-webpack-plugin": "^5.0.1", "react": "^16.8.4", "react-hot-loader": "^4.8.4", @@ -45,9 +47,13 @@ "tslint": "^5.13.1", "tslint-react": "^3.6.0", "typescript": "^3.3.3333", + "url-loader": "^4.1.1", "webpack": "^4.29.6", "webpack-cli": "^3.2.3", "webpack-dev-server": "^3.2.1", "xlsx": "^0.16.1" + }, + "dependencies": { + "format-to-json": "^1.0.4" } } diff --git a/kafka-manager-console/pom.xml b/kafka-manager-console/pom.xml index 81b4e933..e8f6295b 100644 --- a/kafka-manager-console/pom.xml +++ b/kafka-manager-console/pom.xml @@ -28,9 +28,10 @@ install-node-and-npm - v8.12.0 - 6.4.1 + v12.20.0 + 6.14.8 http://npm.taobao.org/mirrors/node/ + https://registry.npm.taobao.org/npm/-/ diff --git a/kafka-manager-console/src/component/antd/index.tsx b/kafka-manager-console/src/component/antd/index.tsx index 41efdea5..2d771efe 100644 --- a/kafka-manager-console/src/component/antd/index.tsx +++ b/kafka-manager-console/src/component/antd/index.tsx @@ -48,6 +48,9 @@ import 'antd/es/notification/style'; import Tooltip from 'antd/es/tooltip'; import 'antd/es/tooltip/style'; +import Popover from 'antd/es/popover'; +import 'antd/es/popover/style'; + import Radio from 'antd/es/radio'; import 'antd/es/radio'; import { RadioChangeEvent } from 'antd/es/radio'; @@ -97,6 +100,9 @@ import 'antd/es/time-picker/style'; import Badge from 'antd/es/badge'; import 'antd/es/badge/style'; +import Progress from 'antd/es/progress'; +import 'antd/es/progress/style'; + import { RangePickerValue } from 'antd/es/date-picker/interface'; export { @@ -136,4 +142,5 @@ export { TimePicker, RangePickerValue, Badge, + Popover }; diff --git a/kafka-manager-console/src/component/editor/editor.tsx b/kafka-manager-console/src/component/editor/editor.tsx new file mode 100644 index 00000000..cf86f2c7 --- /dev/null +++ b/kafka-manager-console/src/component/editor/editor.tsx @@ -0,0 +1,68 @@ +// import * as React from 'react'; +// import CodeMirror from 'codemirror/lib/codemirror'; +// import 'codemirror/lib/codemirror.css'; +// import 'codemirror/mode/sql/sql'; +// import 'codemirror/mode/javascript/javascript'; +// import 'codemirror/addon/hint/show-hint.js'; +// import 'codemirror/addon/hint/sql-hint.js'; +// import 'codemirror/addon/hint/show-hint.css'; +// import './index.less'; +// import { indexStore } from 'store/my-index'; + +// interface IProps { +// value?: string; +// placeholder?: string; +// readOnly?: boolean; +// } +// export class CodeMirrorEditor extends React.Component { + +// public editor = null as any; + +// public handleCodeFocus = () => { +// // tslint:disable-next-line:no-unused-expression +// this.editor && this.editor.focus(); +// } + +// public componentDidMount() { +// const { value, placeholder, readOnly } = this.props; +// const code = document.querySelector('.codemirror'); +// code.innerHTML = ''; +// const editor = CodeMirror(document.querySelector('.codemirror'), { +// mode: 'application/json', +// indentWithTabs: true, +// smartIndent: true, +// lineNumbers: true, +// matchBrackets: true, +// autoCloseBrackets: true, +// styleSelectedText: true, +// foldGutter: true, +// readOnly, +// extraKeys: readOnly ? {} : { +// 'Ctrl-Enter': 'autocomplete', +// 'Tab': (cm) => { +// const spaces = Array(cm.getOption('indentUnit') + 1).join(' '); +// cm.replaceSelection(spaces); +// }, +// }, +// placeholder, +// }); +// editor.setValue(value || ''); +// indexStore.setCodeEditorValue(value || ''); +// editor.on('changes', (a: any) => { +// const data = a.getValue(); +// indexStore.setCodeEditorValue(data); +// }); +// this.editor = editor; +// } + +// public render() { +// return ( +//
+//
+//
+// ); +// } +// } diff --git a/kafka-manager-console/src/component/editor/index.less b/kafka-manager-console/src/component/editor/index.less new file mode 100644 index 00000000..4ff05854 --- /dev/null +++ b/kafka-manager-console/src/component/editor/index.less @@ -0,0 +1,31 @@ +.editor { + height: 100%; +} + +.CodeMirror-placeholder { + color:#999; + font-size: 12px; + line-height: 14px; + font-family: -apple-system,BlinkMacSystemFont,Neue Haas Grotesk Text Pro,Arial Nova,Segoe UI,Helvetica Neue,\.PingFang SC,PingFang SC,Microsoft YaHei,Microsoft JhengHei,Source Han Sans SC,Noto Sans CJK SC,Source Han Sans CN,Noto Sans SC,Source Han Sans TC,Noto Sans CJK TC,Hiragino Sans GB,sans-serif; +} +.editor-wrap { + max-height: 100%; +} + +.CodeMirror { + height: 100vh; +} + +.monacoEditor{ + height: 150px; + position: relative; + overflow: hidden; + border: 1px solid #cccccc; + border-radius: 4px; + .editor{ + height: 100%; + position: absolute; + left: -14%; + width: 120%; + } +} diff --git a/kafka-manager-console/src/component/editor/index.tsx b/kafka-manager-console/src/component/editor/index.tsx new file mode 100644 index 00000000..6f605b9c --- /dev/null +++ b/kafka-manager-console/src/component/editor/index.tsx @@ -0,0 +1,50 @@ +import * as React from 'react'; +import * as monaco from 'monaco-editor'; + +import './index.less'; + +export interface IEditorProps { + style?: React.CSSProperties; + options: monaco.editor.IStandaloneEditorConstructionOptions; + uri?: monaco.Uri; + autoUnmount?: boolean; + customMount?: (editor: monaco.editor.IStandaloneCodeEditor, monaco: any) => any; + placeholder?: string; +} + +export class EditorCom extends React.Component { + public ref: HTMLElement = null; + public editor: monaco.editor.IStandaloneCodeEditor; + public state = { + placeholder: this.props.placeholder ?? '', + }; + + public componentWillUnmount() { + if (this.props.autoUnmount === false) return; + const model = this.editor.getModel(); + model.dispose(); + this.editor.dispose(); + } + + public componentDidMount() { + const { customMount, options, uri } = this.props; + const { value, language } = options; + if (uri) { + options.model = monaco.editor.createModel(value, language, uri); + } + + this.editor = monaco.editor.create(this.ref, + options, + ); + if (customMount) customMount(this.editor, monaco); + } + + public render() { + const { style } = this.props; + return ( + <> +
{ this.ref = id; }} /> + + ); + } +} diff --git a/kafka-manager-console/src/component/editor/monacoEditor.tsx b/kafka-manager-console/src/component/editor/monacoEditor.tsx new file mode 100644 index 00000000..7a0dd44c --- /dev/null +++ b/kafka-manager-console/src/component/editor/monacoEditor.tsx @@ -0,0 +1,77 @@ +import * as React from 'react'; +import * as monaco from 'monaco-editor'; +import format2json from 'format-to-json'; +import { Input } from 'component/antd'; +import './index.less'; + +export interface IEditorProps { + style?: React.CSSProperties; + options: monaco.editor.IStandaloneEditorConstructionOptions; + uri?: monaco.Uri; + autoUnmount?: boolean; + customMount?: (editor: monaco.editor.IStandaloneCodeEditor, monaco: any) => any; + placeholder?: string; + value: ''; + onChange?: any; +} + +class Monacoeditor extends React.Component { + public ref: HTMLElement = null; + public editor: monaco.editor.IStandaloneCodeEditor; + public state = { + placeholder: '', + }; + // public arr = '{"clusterId":95,"startId":37397856,"step":100,"topicName":"kmo_topic_metrics_tempory_zq"}'; + // public Ars(a: string) { + // const obj = JSON.parse(a); + // const newobj: any = {}; + // for (const item in obj) { + // if (typeof obj[item] === 'object') { + // this.Ars(obj[item]); + // } else { + // newobj[item] = obj[item]; + // } + // } + // return JSON.stringify(newobj); + // } + public async componentDidMount() { + const { value, onChange } = this.props; + const format: any = await format2json(value); + this.editor = monaco.editor.create(this.ref, { + value: format.result, + language: 'json', + lineNumbers: 'off', + scrollBeyondLastLine: false, + // selectOnLineNumbers: true, + // roundedSelection: false, + // readOnly: true, + minimap: { + enabled: false, + }, + // automaticLayout: true, // 自动布局 + glyphMargin: true, // 字形边缘 {},[] + // useTabStops: false, + // formatOnPaste: true, + // mode: 'application/json', + // indentWithTabs: true, + // smartIndent: true, + // matchBrackets: 'always', + // autoCloseBrackets: true, + // styleSelectedText: true, + // foldGutter: true, + }); + this.editor.onDidChangeModelContent((e) => { + const newValue = this.editor.getValue(); + onChange(newValue); + }); + } + public render() { + return ( +
+ +
{ this.ref = id; }} /> +
+ ); + } +} +export default Monacoeditor; diff --git a/kafka-manager-console/src/component/x-form-wrapper/index.tsx b/kafka-manager-console/src/component/x-form-wrapper/index.tsx index 3fbaee5e..e39f3ef4 100755 --- a/kafka-manager-console/src/component/x-form-wrapper/index.tsx +++ b/kafka-manager-console/src/component/x-form-wrapper/index.tsx @@ -2,13 +2,13 @@ import * as React from 'react'; import { Drawer, Modal, Button, message } from 'component/antd'; import { XFormComponent } from 'component/x-form'; import { IXFormWrapper } from 'types/base-type'; +import { wrapper } from 'store'; export class XFormWrapper extends React.Component { - public state = { confirmLoading: false, formMap: this.props.formMap || [] as any, - formData: this.props.formData || {}, + formData: this.props.formData || {} }; private $formRef: any; @@ -108,7 +108,7 @@ export class XFormWrapper extends React.Component { if (error) { return; } - const { onSubmit, isWaitting } = this.props; + const { onSubmit, isWaitting, onSubmitFaild } = this.props; if (typeof onSubmit === 'function') { if (isWaitting) { @@ -116,12 +116,16 @@ export class XFormWrapper extends React.Component { confirmLoading: true, }); onSubmit(result).then(() => { - this.setState({ - confirmLoading: false, - }); message.success('操作成功'); this.resetForm(); this.closeModalWrapper(); + }).catch((err: any) => { + const { formMap, formData } = wrapper.xFormWrapper; + onSubmitFaild(err, this.$formRef, formData, formMap); + }).finally(() => { + this.setState({ + confirmLoading: false, + }); }); return; } diff --git a/kafka-manager-console/src/component/x-form/index.tsx b/kafka-manager-console/src/component/x-form/index.tsx index 0e4047f4..20b7c421 100755 --- a/kafka-manager-console/src/component/x-form/index.tsx +++ b/kafka-manager-console/src/component/x-form/index.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; import { Select, Input, InputNumber, Form, Switch, Checkbox, DatePicker, Radio, Upload, Button, Icon, Tooltip } from 'component/antd'; +import Monacoeditor from 'component/editor/monacoEditor'; import { searchProps } from 'constants/table'; import './index.less'; @@ -19,6 +20,7 @@ export enum FormItemType { rangePicker = 'range_picker', radioGroup = 'radio_group', upload = 'upload', + monacoEditor = 'monaco_editor', } export interface IFormItem { @@ -105,13 +107,11 @@ class XForm extends React.Component {
({})}> {formMap.map(formItem => { const { initialValue, valuePropName } = this.handleFormItem(formItem, formData); - const getFieldValue = { initialValue, rules: formItem.rules || [{ required: false, message: '' }], valuePropName, }; - if (formItem.type === FormItemType.upload) { Object.assign(getFieldValue, { getValueFromEvent: this.onUploadFileChange, @@ -137,7 +137,6 @@ class XForm extends React.Component { } public renderFormItem(item: IFormItem) { - switch (item.type) { default: case FormItemType.input: @@ -148,6 +147,9 @@ class XForm extends React.Component { return ; case FormItemType.textArea: return