Unverified Commit d4d49b58 authored by aiwenmo's avatar aiwenmo Committed by GitHub

[Feature-989][metadata] Add StarRocks datasource (#990)

Co-authored-by: 's avatarwenmo <32723967+wenmo@users.noreply.github.com>
parent 6985b446
......@@ -216,6 +216,14 @@
<include>dlink-metadata-sqlserver-${project.version}.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.parent.basedir}/dlink-metadata/dlink-metadata-starrocks/target
</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>dlink-metadata-starrocks-${project.version}.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.parent.basedir}/dlink-alert/dlink-alert-dingtalk/target
</directory>
......
......@@ -162,17 +162,19 @@
<artifactId>dlink-metadata-phoenix</artifactId>
<scope>${scope.runtime}</scope>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-starrocks</artifactId>
<scope>${scope.runtime}</scope>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-connector-phoenix-1.13</artifactId>
<scope>${scope.runtime}</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
......@@ -30,8 +30,8 @@ import com.dlink.assertion.Asserts;
public enum Dialect {
FLINKSQL("FlinkSql"), FLINKJAR("FlinkJar"), FLINKSQLENV("FlinkSqlEnv"), SQL("Sql"), JAVA("Java"),
MYSQL("Mysql"), ORACLE("Oracle"), SQLSERVER("SqlServer"), POSTGRESQL("PostGreSql"), CLICKHOUSE("ClickHouse"),
DORIS("Doris"), PHOENIX("Phoenix"), HIVE("Hive");
MYSQL("Mysql"), ORACLE("Oracle"), SQLSERVER("SqlServer"), POSTGRESQL("PostgreSql"), CLICKHOUSE("ClickHouse"),
DORIS("Doris"), PHOENIX("Phoenix"), HIVE("Hive"), STARROCKS("StarRocks");
private String value;
......@@ -76,6 +76,7 @@ public enum Dialect {
case DORIS:
case PHOENIX:
case HIVE:
case STARROCKS:
return true;
default:
return false;
......
......@@ -103,7 +103,6 @@ public class DorisDriver extends AbstractJdbcDriver {
map.put("INT", "INT");
map.put("VARCHAR", "STRING");
map.put("TEXY", "STRING");
map.put("INT", "INT");
map.put("DATETIME", "TIMESTAMP");
return map;
}
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dlink-metadata</artifactId>
<groupId>com.dlink</groupId>
<version>0.6.7-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dlink-metadata-starrocks</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-base</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- <scope>test</scope>-->
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
*
* 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 com.dlink.metadata.constant;
/**
* StarRocksConstant
**/
public interface StarRocksConstant {
/**
* 查询所有database
*/
String QUERY_ALL_DATABASE = " show databases ";
/**
* 查询所有schema下的所有表
*/
String QUERY_TABLE_BY_SCHEMA = " select TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `SCHEMA`,TABLE_COMMENT AS COMMENT, '' as TYPE, '' as CATALOG, "
+ "'' as ENGINE , '' as OPTIONS , 0 as `ROWS`, null as CREATE_TIME, null as UPDATE_TIME from information_schema.tables where TABLE_SCHEMA = '%s' ";
/**
* 查询指定schema.table下的所有列信息
*/
String QUERY_COLUMNS_BY_TABLE_AND_SCHEMA = " show full columns from `%s`.`%s` ";
}
/*
*
* 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 com.dlink.metadata.convert;
import com.dlink.assertion.Asserts;
import com.dlink.model.Column;
import com.dlink.model.ColumnType;
public class StarRocksTypeConvert implements ITypeConvert {
@Override
public ColumnType convert(Column column) {
ColumnType columnType = ColumnType.STRING;
if (Asserts.isNull(column)) {
return columnType;
}
String t = column.getType().toLowerCase();
boolean isNullable = !column.isKeyFlag() && column.isNullable();
if (t.contains("char")) {
columnType = ColumnType.STRING;
} else if (t.contains("boolean")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_BOOLEAN;
} else {
columnType = ColumnType.BOOLEAN;
}
} else if (t.contains("tinyint")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_BYTE;
} else {
columnType = ColumnType.BYTE;
}
} else if (t.contains("smallint")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_SHORT;
} else {
columnType = ColumnType.SHORT;
}
} else if (t.contains("bigint")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_LONG;
} else {
columnType = ColumnType.LONG;
}
} else if (t.contains("largeint")) {
columnType = ColumnType.STRING;
} else if (t.contains("int")) {
if (isNullable) {
columnType = ColumnType.INTEGER;
} else {
columnType = ColumnType.INT;
}
} else if (t.contains("float")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_FLOAT;
} else {
columnType = ColumnType.FLOAT;
}
} else if (t.contains("double")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_DOUBLE;
} else {
columnType = ColumnType.DOUBLE;
}
} else if (t.contains("date")) {
columnType = ColumnType.STRING;
} else if (t.contains("datetime")) {
columnType = ColumnType.STRING;
} else if (t.contains("decimal")) {
columnType = ColumnType.DECIMAL;
} else if (t.contains("time")) {
if (isNullable) {
columnType = ColumnType.JAVA_LANG_DOUBLE;
} else {
columnType = ColumnType.DOUBLE;
}
}
return columnType;
}
@Override
public String convertToDB(ColumnType columnType) {
switch (columnType) {
case STRING:
return "varchar";
case BOOLEAN:
case JAVA_LANG_BOOLEAN:
return "boolean";
case BYTE:
case JAVA_LANG_BYTE:
return "tinyint";
case SHORT:
case JAVA_LANG_SHORT:
return "smallint";
case LONG:
case JAVA_LANG_LONG:
return "bigint";
case FLOAT:
case JAVA_LANG_FLOAT:
return "float";
case DOUBLE:
case JAVA_LANG_DOUBLE:
return "double";
case DECIMAL:
return "decimal";
case INT:
case INTEGER:
return "int";
default:
return "varchar";
}
}
}
/*
*
* 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 com.dlink.metadata.driver;
import com.dlink.metadata.convert.ITypeConvert;
import com.dlink.metadata.convert.StarRocksTypeConvert;
import com.dlink.metadata.query.IDBQuery;
import com.dlink.metadata.query.StarRocksQuery;
import com.dlink.metadata.result.JdbcSelectResult;
import com.dlink.utils.LogUtil;
import com.dlink.utils.SqlUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class StarRocksDriver extends AbstractJdbcDriver {
@Override
public IDBQuery getDBQuery() {
return new StarRocksQuery();
}
@Override
public ITypeConvert getTypeConvert() {
return new StarRocksTypeConvert();
}
@Override
String getDriverClass() {
return "com.mysql.cj.jdbc.Driver";
}
@Override
public String getType() {
return "StarRocks";
}
@Override
public String getName() {
return "StarRocks";
}
@Override
public JdbcSelectResult executeSql(String sql, Integer limit) {
String[] statements = SqlUtil.getStatements(SqlUtil.removeNote(sql));
List<Object> resList = new ArrayList<>();
JdbcSelectResult result = JdbcSelectResult.buildResult();
for (String item : statements) {
String type = item.toUpperCase();
if (type.startsWith("SELECT") || type.startsWith("SHOW") || type.startsWith("DESC")) {
result = query(item, limit);
} else if (type.startsWith("INSERT") || type.startsWith("UPDATE") || type.startsWith("DELETE")) {
try {
resList.add(executeUpdate(item));
result.setStatusList(resList);
} catch (Exception e) {
resList.add(0);
result.setStatusList(resList);
result.error(LogUtil.getError(e));
return result;
}
} else {
try {
execute(item);
resList.add(1);
result.setStatusList(resList);
} catch (Exception e) {
resList.add(0);
result.setStatusList(resList);
result.error(LogUtil.getError(e));
return result;
}
}
}
result.success();
return result;
}
@Override
public Map<String, String> getFlinkColumnTypeConversion() {
HashMap<String, String> map = new HashMap<>();
map.put("BOOLEAN", "BOOLEAN");
map.put("TINYINT", "TINYINT");
map.put("SMALLINT", "SMALLINT");
map.put("INT", "INT");
map.put("VARCHAR", "STRING");
map.put("TEXY", "STRING");
map.put("DATETIME", "TIMESTAMP");
return map;
}
}
/*
*
* 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 com.dlink.metadata.query;
import com.dlink.metadata.constant.StarRocksConstant;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* StarRocksQuery
**/
public class StarRocksQuery extends AbstractDBQuery {
@Override
public String schemaAllSql() {
return StarRocksConstant.QUERY_ALL_DATABASE;
}
@Override
public String tablesSql(String schemaName) {
return String.format(StarRocksConstant.QUERY_TABLE_BY_SCHEMA, schemaName);
}
@Override
public String columnsSql(String schemaName, String tableName) {
return String.format(StarRocksConstant.QUERY_COLUMNS_BY_TABLE_AND_SCHEMA, schemaName, tableName);
}
@Override
public String schemaName() {
return "Database";
}
@Override
public String tableName() {
return "NAME";
}
@Override
public String tableComment() {
return "COMMENT";
}
@Override
public String columnName() {
return "Field";
}
@Override
public String columnType() {
return "Type";
}
@Override
public String columnComment() {
return "Comment";
}
@Override
public String columnKey() {
return "Key";
}
public boolean isKeyIdentity(ResultSet results) throws SQLException {
return "auto_increment".equals(results.getString("Extra"));
}
@Override
public String isNullable() {
return "Null";
}
@Override
public String characterSet() {
return "Default";
}
@Override
public String collation() {
return "Default";
}
@Override
public String columnPosition() {
return "Default";
}
@Override
public String precision() {
return "Default";
}
@Override
public String scale() {
return "Default";
}
@Override
public String autoIncrement() {
return "Default";
}
@Override
public String isPK() {
return "YES";
}
}
......@@ -38,6 +38,7 @@
<module>dlink-metadata-doris</module>
<module>dlink-metadata-phoenix</module>
<module>dlink-metadata-hive</module>
<module>dlink-metadata-starrocks</module>
</modules>
......
......@@ -82,6 +82,7 @@ const SimpleTaskForm: React.FC<UpdateFormProps> = (props) => {
<Option value={DIALECT.DORIS}>{DIALECT.DORIS}</Option>
<Option value={DIALECT.HIVE}>{DIALECT.HIVE}</Option>
<Option value={DIALECT.PHOENIX}>{DIALECT.PHOENIX}</Option>
<Option value={DIALECT.STARROCKS}>{DIALECT.STARROCKS}</Option>
<Option value={DIALECT.JAVA}>{DIALECT.JAVA}</Option>
<Option value={DIALECT.SQL}>{DIALECT.SQL}</Option>
</Select>
......
......@@ -36,11 +36,12 @@ export const DIALECT = {
MYSQL: 'Mysql',
ORACLE: 'Oracle',
SQLSERVER: 'SqlServer',
POSTGRESQL: 'PostGreSql',
POSTGRESQL: 'PostgreSql',
CLICKHOUSE: 'ClickHouse',
DORIS: 'Doris',
HIVE: 'Hive',
PHOENIX: 'Phoenix',
STARROCKS: 'StarRocks',
JAVA: 'Java',
};
......@@ -61,6 +62,7 @@ export const isSql = (dialect: string) => {
case DIALECT.PHOENIX:
case DIALECT.DORIS:
case DIALECT.HIVE:
case DIALECT.STARROCKS:
return true;
default:
return false;
......@@ -82,6 +84,7 @@ export const isExecuteSql = (dialect: string) => {
case DIALECT.PHOENIX:
case DIALECT.FLINKSQL:
case DIALECT.HIVE:
case DIALECT.STARROCKS:
return true;
default:
return false;
......@@ -104,6 +107,7 @@ export const isTask = (dialect: string) => {
case DIALECT.FLINKSQL:
case DIALECT.FLINKJAR:
case DIALECT.HIVE:
case DIALECT.STARROCKS:
return true;
default:
return false;
......
......@@ -23,32 +23,34 @@ import {DIALECT} from "@/components/Studio/conf";
const svgSize = '20px';
export const getIcon = (type: string)=>{
switch (type){
export const getIcon = (type: string) => {
switch (type) {
case DIALECT.SQL:
return (<Icon component={SqlSvg} />);
return (<Icon component={SqlSvg}/>);
case DIALECT.FLINKJAR:
return (<Icon component={FlinkJarSvg} />);
return (<Icon component={FlinkJarSvg}/>);
case DIALECT.MYSQL:
return (<Icon component={MysqlSvg} />);
return (<Icon component={MysqlSvg}/>);
case DIALECT.ORACLE:
return (<Icon component={OracleSvg} />);
return (<Icon component={OracleSvg}/>);
case DIALECT.SQLSERVER:
return (<Icon component={SqlServerSvg} />);
return (<Icon component={SqlServerSvg}/>);
case DIALECT.POSTGRESQL:
return (<Icon component={PostGreSqlSvg} />);
return (<Icon component={PostGreSqlSvg}/>);
case DIALECT.CLICKHOUSE:
return (<Icon component={ClickHouseSvg} />);
return (<Icon component={ClickHouseSvg}/>);
case DIALECT.DORIS:
return (<Icon component={DorisSvg} />);
return (<Icon component={DorisSvg}/>);
case DIALECT.HIVE:
return (<Icon component={HiveSvg} />);
return (<Icon component={HiveSvg}/>);
case DIALECT.PHOENIX:
return (<Icon component={PhoenixSvg} />);
return (<Icon component={PhoenixSvg}/>);
case DIALECT.STARROCKS:
return (<Icon component={StarRocksSvg}/>);
case DIALECT.JAVA:
return (<Icon component={JavaSvg} />);
return (<Icon component={JavaSvg}/>);
default:
return (<Icon component={FlinkSQLSvg} />);
return (<Icon component={FlinkSQLSvg}/>);
}
};
......@@ -287,8 +289,15 @@ export const ClickHouseSvg = () => (
</svg>
);
export const PhoenixSvg = () => (
<svg t="987654321" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9314" width={svgSize} height={svgSize}><path d="M896 1024H128C57.6 1024 0 966.4 0 896V128C0 57.6 57.6 0 128 0h768c70.4 0 128 57.6 128 128v768c0 70.4-57.6 128-128 128z" fill="#FFFFFF" p-id="1695"></path><path d="M726.4 216.533c39.467-129.066 55.467-141.866 55.467-141.866s-107.734 38.4-141.867 147.2C605.867 331.733 663.467 464 675.2 508.8c10.667 44.8 76.8 304-145.067 318.933C369.067 838.4 323.2 670.933 339.2 596.267c4.267-19.2 21.333-90.667 52.267-141.867C422.4 403.2 435.2 324.267 435.2 324.267s25.6 5.333 37.333-14.934c0 0-23.466 0-8.533-11.733 13.867-11.733 8.533-25.6 8.533-25.6s-25.6 17.067-52.266 3.2c-25.6-13.867-84.267-52.267-124.8 8.533 0 0-43.734 7.467-64 35.2 0 0 43.733-17.066 64-5.333 21.333 11.733 54.4 37.333 20.266 118.4C281.6 513.067 190.933 577.067 240 724.267c49.067 147.2 160 205.866 304 205.866S792.533 784 792.533 641.067c0-142.934-105.6-295.467-66.133-424.534zM487.467 541.867c-51.2-43.734-52.267-150.4-52.267-150.4-17.067 120.533-8.533 194.133 72.533 240C588.8 678.4 612.267 736 612.267 736c3.2-32-72.534-150.4-124.8-194.133z m145.066 179.2s32-109.867 0-208c-28.8-87.467-53.333-117.334-52.266-179.2 1.066-61.867 29.866-182.4 45.866-197.334 0 0-100.266 89.6-101.333 185.6-1.067 96 39.467 141.867 64 182.4 24.533 40.534 57.6 110.934 43.733 216.534zM522.667 214.4s-80 118.4-60.8 228.267C464 461.867 476.8 498.133 528 552.533c51.2 54.4 92.8 148.267 96 167.467 0 0-2.133-104.533-40.533-173.867C545.067 476.8 478.933 388.267 502.4 294.4c4.267-23.467 20.267-80 20.267-80z" fill="#EC4C2E" p-id="1696"></path></svg>
<svg t="987654321" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
p-id="9314" width={svgSize} height={svgSize}>
<path
d="M896 1024H128C57.6 1024 0 966.4 0 896V128C0 57.6 57.6 0 128 0h768c70.4 0 128 57.6 128 128v768c0 70.4-57.6 128-128 128z"
fill="#FFFFFF" p-id="1695"></path>
<path
d="M726.4 216.533c39.467-129.066 55.467-141.866 55.467-141.866s-107.734 38.4-141.867 147.2C605.867 331.733 663.467 464 675.2 508.8c10.667 44.8 76.8 304-145.067 318.933C369.067 838.4 323.2 670.933 339.2 596.267c4.267-19.2 21.333-90.667 52.267-141.867C422.4 403.2 435.2 324.267 435.2 324.267s25.6 5.333 37.333-14.934c0 0-23.466 0-8.533-11.733 13.867-11.733 8.533-25.6 8.533-25.6s-25.6 17.067-52.266 3.2c-25.6-13.867-84.267-52.267-124.8 8.533 0 0-43.734 7.467-64 35.2 0 0 43.733-17.066 64-5.333 21.333 11.733 54.4 37.333 20.266 118.4C281.6 513.067 190.933 577.067 240 724.267c49.067 147.2 160 205.866 304 205.866S792.533 784 792.533 641.067c0-142.934-105.6-295.467-66.133-424.534zM487.467 541.867c-51.2-43.734-52.267-150.4-52.267-150.4-17.067 120.533-8.533 194.133 72.533 240C588.8 678.4 612.267 736 612.267 736c3.2-32-72.534-150.4-124.8-194.133z m145.066 179.2s32-109.867 0-208c-28.8-87.467-53.333-117.334-52.266-179.2 1.066-61.867 29.866-182.4 45.866-197.334 0 0-100.266 89.6-101.333 185.6-1.067 96 39.467 141.867 64 182.4 24.533 40.534 57.6 110.934 43.733 216.534zM522.667 214.4s-80 118.4-60.8 228.267C464 461.867 476.8 498.133 528 552.533c51.2 54.4 92.8 148.267 96 167.467 0 0-2.133-104.533-40.533-173.867C545.067 476.8 478.933 388.267 502.4 294.4c4.267-23.467 20.267-80 20.267-80z"
fill="#EC4C2E" p-id="1696"></path>
</svg>
);
export const DorisSvg = () => (
<svg t="1640789853861" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
......@@ -304,6 +313,18 @@ export const DorisSvg = () => (
fill="#5168AC" p-id="13681"></path>
</svg>
);
export const StarRocksSvg = () => (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 60.45" width={svgSize} height={svgSize}>
<path fill="#fabf00"
d="M16.17,26.33c-4-3.27-8.36-6.88-10.69-8.81L3.85,16.18c-1.13-.93-2-2.58-.1-3.71C4.58,12,18.78,3.83,24,.8A5.94,5.94,0,0,1,30,.8L40,6.59a1.18,1.18,0,0,1,0,2.05L16.52,22.11A2.57,2.57,0,0,0,16.17,26.33Z"/>
<path fill="#337e8d"
d="M22,35.88,12.48,50.45a2.37,2.37,0,0,1-3.17.75L3,47.55A6,6,0,0,1,0,42.4V18.08a5.94,5.94,0,0,1,2.39-4.76c-1.7,1.31-1,2.78.1,3.72L21.57,32.75A2.38,2.38,0,0,1,22,35.88Z"/>
<path fill="#337e8d"
d="M37.83,34.11l10.69,8.81,1.63,1.34c1.13.94,2,2.59.1,3.72-.83.49-15,8.64-20.27,11.67a6,6,0,0,1-5.95,0L14,53.86a1.19,1.19,0,0,1,0-2.06L37.48,38.34A2.58,2.58,0,0,0,37.83,34.11Z"/>
<path fill="#337e8d"
d="M32,24.57,41.52,10a2.37,2.37,0,0,1,3.17-.75L51,12.9a5.94,5.94,0,0,1,3,5.15V42.37a5.94,5.94,0,0,1-2.39,4.76c1.7-1.31,1-2.78-.1-3.72L32.43,27.69A2.37,2.37,0,0,1,32,24.57Z"/>
</svg>
);
export const HiveSvg = () => (
<svg t="1647425762735" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
......
......@@ -45,6 +45,9 @@ export function getDBImage(type: string) {
case 'hive':
imageUrl += 'hive.png';
break;
case 'starrocks':
imageUrl += 'starrocks.jpg';
break;
default:
imageUrl += 'db.jpg';
}
......
......@@ -19,19 +19,17 @@
import React, {useRef, useState} from "react";
import {PageContainer, FooterToolbar} from '@ant-design/pro-layout';
import {PageContainer} from '@ant-design/pro-layout';
import {
DownOutlined,
HeartOutlined,
PlusOutlined,
UserOutlined,
SettingOutlined,
CheckCircleOutlined,
DeleteOutlined,
EditOutlined,
EllipsisOutlined,
CheckCircleOutlined,
ExclamationCircleOutlined, DeleteOutlined
ExclamationCircleOutlined,
HeartOutlined,
PlusOutlined
} from '@ant-design/icons';
import {Progress, Tag, Button, Space, Badge, Typography, Image, Row, Col, Card, Avatar, Modal} from 'antd';
import {Button, Card, Image, Modal, Space, Tag, Typography} from 'antd';
import ProList from '@ant-design/pro-list';
import {handleRemove, queryData} from "@/components/Common/crud";
import {getDBImage} from "@/pages/DataBase/DB";
......@@ -53,7 +51,7 @@ const cardBodyStyle = {
};
const DataBaseTableList: React.FC<{}> = (props: any) => {
const { dispatch} = props;
const {dispatch} = props;
const [chooseDBModalVisible, handleDBFormModalVisible] = useState<boolean>(false);
const [values, setValues] = useState<any>({});
const actionRef = useRef<ActionType>();
......@@ -95,7 +93,8 @@ const DataBaseTableList: React.FC<{}> = (props: any) => {
return [
<Button type="primary" onClick={() => {
setValues({});
handleDBFormModalVisible(true);}}>
handleDBFormModalVisible(true);
}}>
<PlusOutlined/> 新建
</Button>,
];
......@@ -109,7 +108,6 @@ const DataBaseTableList: React.FC<{}> = (props: any) => {
renderItem={(row) => {
return (
<Card
style={{width: 300}}
hoverable={true}
bodyStyle={cardBodyStyle}
......@@ -117,14 +115,14 @@ const DataBaseTableList: React.FC<{}> = (props: any) => {
<div className={styles.cardImage}>
<Image
preview={false}
style={{padding: '20px'}}
style={{padding: '20px 60px'}}
src={getDBImage(row.type)}
fallback="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMIAAADDCAYAAADQvc6UAAABRWlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8LAwSDCIMogwMCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsis7PPOq3QdDFcvjV3jOD1boQVTPQrgSkktTgbSf4A4LbmgqISBgTEFyFYuLykAsTuAbJEioKOA7DkgdjqEvQHEToKwj4DVhAQ5A9k3gGyB5IxEoBmML4BsnSQk8XQkNtReEOBxcfXxUQg1Mjc0dyHgXNJBSWpFCYh2zi+oLMpMzyhRcASGUqqCZ16yno6CkYGRAQMDKMwhqj/fAIcloxgHQqxAjIHBEugw5sUIsSQpBobtQPdLciLEVJYzMPBHMDBsayhILEqEO4DxG0txmrERhM29nYGBddr//5/DGRjYNRkY/l7////39v///y4Dmn+LgeHANwDrkl1AuO+pmgAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAwqADAAQAAAABAAAAwwAAAAD9b/HnAAAHlklEQVR4Ae3dP3PTWBSGcbGzM6GCKqlIBRV0dHRJFarQ0eUT8LH4BnRU0NHR0UEFVdIlFRV7TzRksomPY8uykTk/zewQfKw/9znv4yvJynLv4uLiV2dBoDiBf4qP3/ARuCRABEFAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghggQAQZQKAnYEaQBAQaASKIAQJEkAEEegJmBElAoBEgghgg0Aj8i0JO4OzsrPv69Wv+hi2qPHr0qNvf39+iI97soRIh4f3z58/u7du3SXX7Xt7Z2enevHmzfQe+oSN2apSAPj09TSrb+XKI/f379+08+A0cNRE2ANkupk+ACNPvkSPcAAEibACyXUyfABGm3yNHuAECRNgAZLuYPgEirKlHu7u7XdyytGwHAd8jjNyng4OD7vnz51dbPT8/7z58+NB9+/bt6jU/TI+AGWHEnrx48eJ/EsSmHzx40L18+fLyzxF3ZVMjEyDCiEDjMYZZS5wiPXnyZFbJaxMhQIQRGzHvWR7XCyOCXsOmiDAi1HmPMMQjDpbpEiDCiL358eNHurW/5SnWdIBbXiDCiA38/Pnzrce2YyZ4//59F3ePLNMl4PbpiL2J0L979+7yDtHDhw8vtzzvdGnEXdvUigSIsCLAWavHp/+qM0BcXMd/q25n1vF57TYBp0a3mUzilePj4+7k5KSLb6gt6ydAhPUzXnoPR0dHl79WGTNCfBnn1uvSCJdegQhLI1vvCk+fPu2ePXt2tZOYEV6/fn31dz+shwAR1sP1cqvLntbEN9MxA9xcYjsxS1jWR4AIa2Ibzx0tc44fYX/16lV6NDFLXH+YL32jwiACRBiEbf5KcXoTIsQSpzXx4N28Ja4BQoK7rgXiydbHjx/P25TaQAJEGAguWy0+2Q8PD6/Ki4R8EVl+bzBOnZY95fq9rj9zAkTI2SxdidBHqG9+skdw43borCXO/ZcJdraPWdv22uIEiLA4q7nvvCug8WTqzQveOH26fodo7g6uFe/a17W3+nFBAkRYENRdb1vkkz1CH9cPsVy/jrhr27PqMYvENYNlHAIesRiBYwRy0V+8iXP8+/fvX11Mr7L7ECueb/r48eMqm7FuI2BGWDEG8cm+7G3NEOfmdcTQw4h9/55lhm7DekRYKQPZF2ArbXTAyu4kDYB2YxUzwg0gi/41ztHnfQG26HbGel/crVrm7tNY+/1btkOEAZ2M05r4FB7r9GbAIdxaZYrHdOsgJ/wCEQY0J74TmOKnbxxT9n3FgGGWWsVdowHtjt9Nnvf7yQM2aZU/TIAIAxrw6dOnAWtZZcoEnBpNuTuObWMEiLAx1HY0ZQJEmHJ3HNvGCBBhY6jtaMoEiJB0Z29vL6ls58vxPcO8/zfrdo5qvKO+d3Fx8Wu8zf1dW4p/cPzLly/dtv9Ts/EbcvGAHhHyfBIhZ6NSiIBTo0LNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiECRCjUbEPNCRAhZ6NSiAARCjXbUHMCRMjZqBQiQIRCzTbUnAARcjYqhQgQoVCzDTUnQIScjUohAkQo1GxDzQkQIWejUogAEQo121BzAkTI2agUIkCEQs021JwAEXI2KoUIEKFQsw01J0CEnI1KIQJEKNRsQ80JECFno1KIABEKNdtQcwJEyNmoFCJAhELNNtScABFyNiqFCBChULMNNSdAhJyNSiEC/wGgKKC4YMA4TAAAAABJRU5ErkJggg=="
/>
</div>
}
actions={[
<HeartOutlined key="setting" onClick={()=>{
<HeartOutlined key="setting" onClick={() => {
onCheckHeartBeat(row);
}}/>,
<EditOutlined key="edit" onClick={() => {
......
......@@ -336,6 +336,11 @@
<artifactId>dlink-metadata-phoenix</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-starrocks</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-gateway</artifactId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment