Commit f195f7d7 authored by godkaikai's avatar godkaikai

数据源flink配置片段和扩展phoenix

parent bfdac7ca
......@@ -132,12 +132,19 @@
<!--<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-mysql</artifactId>
<version>0.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-doris</artifactId>
<version>0.6.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-phoenix</artifactId>
</dependency>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>4.14.2-HBase-1.4</version>
</dependency>-->
<!--<dependency>
<groupId>org.apache.flink</groupId>
......
......@@ -40,6 +40,8 @@ public class DataBase extends SuperEntity {
private String flinkConfig;
private String flinkTemplate;
private String dbVersion;
private boolean status;
......
......@@ -96,7 +96,7 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
Driver driver = Driver.build(dataBase.getDriverConfig());
List<Column> columns = driver.listColumns(schemaName, tableName);
Table table = Table.build(tableName, schemaName, columns);
return table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkConfig());
return table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkTemplate());
}
@Override
......@@ -126,7 +126,7 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
Driver driver = Driver.build(dataBase.getDriverConfig());
Table table = driver.getTable(schemaName, tableName);
SqlGeneration sqlGeneration = new SqlGeneration();
sqlGeneration.setFlinkSqlCreate(table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkConfig()));
sqlGeneration.setFlinkSqlCreate(table.getFlinkTableSql(dataBase.getName(), dataBase.getFlinkTemplate()));
sqlGeneration.setSqlSelect(table.getSqlSelect(dataBase.getName()));
sqlGeneration.setSqlCreate(driver.getCreateTableSql(table));
return sqlGeneration;
......@@ -138,7 +138,7 @@ public class DataBaseServiceImpl extends SuperServiceImpl<DataBaseMapper, DataBa
List<String> list = new ArrayList<>();
for (DataBase dataBase : dataBases) {
if (Asserts.isNotNullString(dataBase.getFlinkConfig())) {
list.add(dataBase.getName() + ":=" + dataBase.getFlinkConfig() + ";\n");
list.add(dataBase.getName() + ":=" + dataBase.getFlinkConfig() + "\n;\n");
}
}
return list;
......
......@@ -2,33 +2,6 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dlink.mapper.DataBaseMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.dlink.model.DataBase">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="alias" property="alias" />
<result column="group_name" property="groupName" />
<result column="type" property="type" />
<result column="url" property="url" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="db_version" property="dbVersion" />
<result column="note" property="note" />
<result column="flink_config" property="flinkConfig" />
<result column="status" property="status" />
<result column="health_time" property="healthTime" />
<result column="heartbeat_time" property="heartbeatTime" />
<result column="enabled" property="enabled" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, alias,group_name, type,url,username,password,db_version,note,flink_config,status,health_time,heartbeat_time, enabled, create_time, update_time
</sql>
<select id="selectForProTable" resultType="com.dlink.model.DataBase">
select
a.*
......
......@@ -16,6 +16,7 @@
<flink.version>1.14.3</flink.version>
<flinkcdc.version>2.1.1</flinkcdc.version>
<commons.version>1.3.1</commons.version>
<commons-lang3.version>3.1</commons-lang3.version>
<scala.binary.version>2.11</scala.binary.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
......@@ -47,6 +48,10 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
<version>${flink.version}</version>
</dependency>
......@@ -80,6 +85,12 @@
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-client-hadoop</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
......@@ -95,6 +106,12 @@
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>${flinkcdc.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
......@@ -109,5 +126,10 @@
<artifactId>commons-cli</artifactId>
<version>${commons.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -14,6 +14,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--<scope.type>provided</scope.type>-->
<hadoop.version>3.1.0</hadoop.version>
<commons-lang3.version>3.1</commons-lang3.version>
<scope.type>compile</scope.type>
</properties>
......@@ -30,6 +31,10 @@
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
<version>${hadoop.version}</version>
</dependency>
......@@ -103,6 +108,12 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
</dependencies>
<build>
......
......@@ -94,6 +94,7 @@ CREATE TABLE `dlink_database` (
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注释',
`flink_config` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Flink配置',
`flink_template` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Flink模板',
`db_version` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '版本,如oracle的11g,hbase的2.2.3',
`status` tinyint(1) NULL DEFAULT 0 COMMENT '状态',
`health_time` datetime(0) NULL DEFAULT NULL COMMENT '最近健康时间',
......
......@@ -489,7 +489,7 @@ ADD COLUMN `env_id` int(11) NULL COMMENT '环境ID' AFTER `jar_id`;
-- 0.6.0-SNAPSHOT 2022-01-28
-- ----------------------------
ALTER TABLE `dlink_database`
ADD COLUMN `flink_config` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '环境ID' AFTER `note`;
ADD COLUMN `flink_config` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Flink配置' AFTER `note`;
-- ----------------------------
-- 0.6.0-SNAPSHOT 2022-02-02
......@@ -529,5 +529,10 @@ update dlink_catalogue set type = 'FlinkJar' where task_id in (select id as task
-- ----------------------------
ALTER TABLE `dlink_task`
ADD COLUMN `batch_model` tinyint(1) NULL DEFAULT 0 COMMENT '使用批模式' AFTER `statement_set`;
-- ----------------------------
-- 0.6.0-SNAPSHOT 2022-02-18
-- ----------------------------
ALTER TABLE `dlink_database`
ADD COLUMN `flink_template` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'Flink模板' AFTER `flink_config`;
SET FOREIGN_KEY_CHECKS = 1;
......@@ -19,8 +19,9 @@ public class PhoenixTest {
@Before
public void init() {
DriverConfig config = new DriverConfig();
config.setName("phoenix");
config.setType("Phoenix");
config.setUrl("jdbc:phoenix:xxx");
config.setUrl("jdbc:phoenix:10.1.51.24:2181");
try {
driver = Driver.build(config);
} catch (Exception e) {
......
export function getDBImage(type: string) {
let imageUrl = 'database/';
switch (type.toLowerCase()){
switch (type.toLowerCase()) {
case 'mysql':
imageUrl += 'mysql.jpg';
break;
......@@ -20,8 +19,13 @@ export function getDBImage(type: string) {
case 'doris':
imageUrl += 'doris.jpeg';
break;
case 'phoenix':
imageUrl += 'phoenix.png';
break;
default:
imageUrl += 'db.jpg';
}
return imageUrl;
}
export const FALLBACK = "data:image/png;base64,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";
import React, {useState} from 'react';
import {Modal,Image,message,List,Card} from 'antd';
import {Modal,Image,List,Card} from 'antd';
import {DataBaseItem} from '../data.d';
import {connect} from "umi";
import {StateType} from "@/pages/FlinkSqlStudio/model";
import {getDBImage} from "@/pages/DataBase/DB";
import MysqlForm from "@/pages/DataBase/components/MySqlForm";
import OracleForm from "@/pages/DataBase/components/OracleForm";
import SqlServerForm from "@/pages/DataBase/components/SqlServerForm";
import DorisForm from "@/pages/DataBase/components/DorisForm";
import ClickHouseForm from "@/pages/DataBase/components/ClickHouseForm";
import {FALLBACK, getDBImage} from "@/pages/DataBase/DB";
import DataBaseForm from "@/pages/DataBase/components/DataBaseForm";
import {createOrModifyDatabase, testDatabaseConnect} from "@/pages/DataBase/service";
export type UpdateFormProps = {
......@@ -38,6 +34,9 @@ const data:any = [
{
type: 'Doris',
},
{
type: 'Phoenix',
},
];
const DBForm: React.FC<UpdateFormProps> = (props) => {
......@@ -52,10 +51,6 @@ const DBForm: React.FC<UpdateFormProps> = (props) => {
const [dbType, setDbType] = useState<string>();
const chooseOne = (item:DataBaseItem)=>{
/*if((item.type!='ClickHouse')&&(item.type !='MySql')){
message.success('敬请期待');
return;
}*/
setDbType(item.type);
};
......@@ -104,60 +99,17 @@ const DBForm: React.FC<UpdateFormProps> = (props) => {
height={80}
preview={false}
src={getDBImage(item.type)}
fallback="data:image/png;base64,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"
fallback={FALLBACK}
/>
</Card>
</List.Item>
)}
/>)
}
<MysqlForm
onCancel={() => setDbType(undefined)}
modalVisible={dbType=='MySql'||values.type=='MySql'}
values={values}
onSubmit={(value) => {
onSubmit(value);
}}
onTest={(value) => {
onTest(value);
}}
/>
<OracleForm
onCancel={() => setDbType(undefined)}
modalVisible={dbType=='Oracle'||values.type=='Oracle'}
values={values}
onSubmit={(value) => {
onSubmit(value);
}}
onTest={(value) => {
onTest(value);
}}
/>
<SqlServerForm
onCancel={() => setDbType(undefined)}
modalVisible={dbType=='SqlServer'||values.type=='SqlServer'}
values={values}
onSubmit={(value) => {
onSubmit(value);
}}
onTest={(value) => {
onTest(value);
}}
/>
<DorisForm
onCancel={() => setDbType(undefined)}
modalVisible={dbType=='Doris'||values.type=='Doris'}
values={values}
onSubmit={(value) => {
onSubmit(value);
}}
onTest={(value) => {
onTest(value);
}}
/>
<ClickHouseForm
<DataBaseForm
onCancel={() => setDbType(undefined)}
modalVisible={dbType=='ClickHouse'||values.type=='ClickHouse'}
modalVisible={!!values.type||!!dbType}
type={(!values.type)?dbType:values.type}
values={values}
onSubmit={(value) => {
onSubmit(value);
......
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Space, Select} from 'antd';
import {Form, Button, Input, Space, Select, Divider} from 'antd';
import Switch from "antd/es/switch";
import TextArea from "antd/es/input/TextArea";
import {DataBaseItem} from "@/pages/DataBase/data";
import {FALLBACK, getDBImage} from "@/pages/DataBase/DB";
export type ClickHouseFormProps = {
......@@ -12,6 +13,7 @@ export type ClickHouseFormProps = {
onTest: (values: Partial<DataBaseItem>) => void;
modalVisible: boolean;
values: Partial<DataBaseItem>;
type?: string;
};
const Option = Select.Option;
......@@ -20,18 +22,18 @@ const formLayout = {
wrapperCol: {span: 13},
};
const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
const DataBaseForm: React.FC<ClickHouseFormProps> = (props) => {
const [formVals, setFormVals] = useState<Partial<DataBaseItem>>({
id: props.values.id,
name: props.values.name,
alias: props.values.alias,
type: "ClickHouse",
groupName: props.values.groupName,
url: props.values.url,
username: props.values.username,
password: props.values.password,
dbVersion: props.values.dbVersion,
flinkConfig: props.values.flinkConfig,
flinkTemplate: props.values.flinkTemplate,
note: props.values.note,
enabled: props.values.enabled,
});
......@@ -43,18 +45,19 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
onCancel: handleModalVisible,
modalVisible,
values,
type
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleUpdate({...formVals, ...fieldsValue});
setFormVals({type,...formVals, ...fieldsValue});
handleUpdate({type,...formVals, ...fieldsValue});
};
const testForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleTest({...formVals, ...fieldsValue});
setFormVals({type,...formVals, ...fieldsValue});
handleTest({type,...formVals, ...fieldsValue});
};
const onReset = () => {
......@@ -64,6 +67,7 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
const renderContent = (formVals) => {
return (
<>
<Divider>{type}</Divider>
<Form.Item
name="name"
label="名称"
......@@ -92,7 +96,7 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
name="url"
label="url"
>
<TextArea placeholder="jdbc:clickhouse://{host}:{port}/{database}" allowClear
<TextArea placeholder="请输入格式正确的 url 连接" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
......@@ -109,9 +113,16 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
</Form.Item>
<Form.Item
name="flinkConfig"
label="Flink With 模板"
label="Flink 连接配置"
>
<TextArea placeholder="'connector' = 'jdbc',..." allowClear
<TextArea placeholder="请指定 Flink With 的默认配置" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="flinkTemplate"
label="Flink 连接模板"
>
<TextArea placeholder="请指定 Flink With 的生成模板" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
......@@ -149,17 +160,20 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
password: formVals.password,
note: formVals.note,
flinkConfig: formVals.flinkConfig,
flinkTemplate: formVals.flinkTemplate,
enabled: formVals.enabled,
}}
>
{renderContent(formVals)}
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Space>
<Button htmlType="button" onClick={()=>{
handleModalVisible(false)
}}>
返回
</Button>
{!formVals.id ?
<Button htmlType="button" onClick={() => {
handleModalVisible(false)
}}>
返回
</Button>:undefined
}
<Button htmlType="button" onClick={onReset}>
重置
</Button>
......@@ -178,4 +192,4 @@ const ClickHouseForm: React.FC<ClickHouseFormProps> = (props) => {
);
};
export default ClickHouseForm;
export default DataBaseForm;
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Space, Select} from 'antd';
import Switch from "antd/es/switch";
import TextArea from "antd/es/input/TextArea";
import {DataBaseItem} from "@/pages/DataBase/data";
export type DorisFormProps = {
onCancel: (flag?: boolean, formVals?: Partial<DataBaseItem>) => void;
onSubmit: (values: Partial<DataBaseItem>) => void;
onTest: (values: Partial<DataBaseItem>) => void;
modalVisible: boolean;
values: Partial<DataBaseItem>;
};
const Option = Select.Option;
const formLayout = {
labelCol: {span: 7},
wrapperCol: {span: 13},
};
const DorisForm: React.FC<DorisFormProps> = (props) => {
const [formVals, setFormVals] = useState<Partial<DataBaseItem>>({
id: props.values.id,
name: props.values.name,
alias: props.values.alias,
type: "Doris",
groupName: props.values.groupName,
url: props.values.url,
username: props.values.username,
password: props.values.password,
dbVersion: props.values.dbVersion,
flinkConfig: props.values.flinkConfig,
note: props.values.note,
enabled: props.values.enabled,
});
const [form] = Form.useForm();
const {
onSubmit: handleUpdate,
onTest: handleTest,
onCancel: handleModalVisible,
modalVisible,
values,
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleUpdate({...formVals, ...fieldsValue});
};
const testForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleTest({...formVals, ...fieldsValue});
};
const onReset = () => {
form.resetFields();
};
const renderContent = (formVals) => {
return (
<>
<Form.Item
name="name"
label="名称"
rules={[{required: true, message: '请输入名称!'}]}>
<Input placeholder="请输入唯一英文标识"/>
</Form.Item>
<Form.Item
name="alias"
label="别名"
>
<Input placeholder="请输入别名"/>
</Form.Item>
<Form.Item
name="groupName"
label="分组类型"
>
<Select >
<Option value="来源">来源</Option>
<Option value="数仓">数仓</Option>
<Option value="应用">应用</Option>
<Option value="备份">备份</Option>
<Option value="其他">其他</Option>
</Select>
</Form.Item>
<Form.Item
name="url"
label="url"
>
<TextArea placeholder="jdbc:mysql://{host}:{port}/{database}" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="username"
label="用户名"
>
<Input/>
</Form.Item>
<Form.Item
name="password"
label="密码"
>
<Input.Password/>
</Form.Item>
<Form.Item
name="flinkConfig"
label="Flink With 模板"
>
<TextArea placeholder="'connector' = 'doris',..." allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="note"
label="注释"
>
<Input placeholder="请输入"/>
</Form.Item>
<Form.Item
name="enabled"
label="是否启用"
>
<Switch checkedChildren="启用" unCheckedChildren="禁用"
defaultChecked={formVals.enabled}/>
</Form.Item>
</>
);
};
return (
<>{
modalVisible && (
<>
<Form
{...formLayout}
form={form}
initialValues={{
id: formVals.id,
name: formVals.name,
alias: formVals.alias,
type: formVals.type,
groupName: formVals.groupName,
url: formVals.url,
username: formVals.username,
password: formVals.password,
note: formVals.note,
flinkConfig: formVals.flinkConfig,
enabled: formVals.enabled,
}}
>
{renderContent(formVals)}
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Space>
<Button htmlType="button" onClick={()=>{
handleModalVisible(false)
}}>
返回
</Button>
<Button htmlType="button" onClick={onReset}>
重置
</Button>
<Button type="primary" htmlType="button" onClick={testForm}>
测试
</Button>
<Button type="primary" htmlType="button" onClick={submitForm}>
保存
</Button>
</Space>
</Form.Item>
</Form>
</>
)
}</>
);
};
export default DorisForm;
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Space, Select} from 'antd';
import Switch from "antd/es/switch";
import TextArea from "antd/es/input/TextArea";
import {DataBaseItem} from "@/pages/DataBase/data";
export type MysqlFormProps = {
onCancel: (flag?: boolean, formVals?: Partial<DataBaseItem>) => void;
onSubmit: (values: Partial<DataBaseItem>) => void;
onTest: (values: Partial<DataBaseItem>) => void;
modalVisible: boolean;
values: Partial<DataBaseItem>;
};
const Option = Select.Option;
const formLayout = {
labelCol: {span: 7},
wrapperCol: {span: 13},
};
const MysqlForm: React.FC<MysqlFormProps> = (props) => {
const [formVals, setFormVals] = useState<Partial<DataBaseItem>>({
id: props.values.id,
name: props.values.name,
alias: props.values.alias,
type: "MySql",
groupName: props.values.groupName,
url: props.values.url,
username: props.values.username,
password: props.values.password,
dbVersion: props.values.dbVersion,
flinkConfig: props.values.flinkConfig,
note: props.values.note,
enabled: props.values.enabled,
});
const [form] = Form.useForm();
const {
onSubmit: handleUpdate,
onTest: handleTest,
onCancel: handleModalVisible,
modalVisible,
values,
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleUpdate({...formVals, ...fieldsValue});
};
const testForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleTest({...formVals, ...fieldsValue});
};
const onReset = () => {
form.resetFields();
};
const renderContent = (formVals) => {
return (
<>
<Form.Item
name="name"
label="名称"
rules={[{required: true, message: '请输入名称!'}]}>
<Input placeholder="请输入唯一英文标识"/>
</Form.Item>
<Form.Item
name="alias"
label="别名"
>
<Input placeholder="请输入别名"/>
</Form.Item>
<Form.Item
name="groupName"
label="分组类型"
>
<Select >
<Option value="来源">来源</Option>
<Option value="数仓">数仓</Option>
<Option value="应用">应用</Option>
<Option value="备份">备份</Option>
<Option value="其他">其他</Option>
</Select>
</Form.Item>
<Form.Item
name="url"
label="url"
>
<TextArea placeholder="jdbc:mysql://{host}:{port}/{database}" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="username"
label="用户名"
>
<Input/>
</Form.Item>
<Form.Item
name="password"
label="密码"
>
<Input.Password/>
</Form.Item>
<Form.Item
name="flinkConfig"
label="Flink With 模板"
>
<TextArea placeholder="'connector' = 'jdbc',..." allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="note"
label="注释"
>
<Input placeholder="请输入"/>
</Form.Item>
<Form.Item
name="enabled"
label="是否启用"
>
<Switch checkedChildren="启用" unCheckedChildren="禁用"
defaultChecked={formVals.enabled}/>
</Form.Item>
</>
);
};
return (
<>{
modalVisible && (
<>
<Form
{...formLayout}
form={form}
initialValues={{
id: formVals.id,
name: formVals.name,
alias: formVals.alias,
type: formVals.type,
groupName: formVals.groupName,
url: formVals.url,
username: formVals.username,
password: formVals.password,
note: formVals.note,
flinkConfig: formVals.flinkConfig,
enabled: formVals.enabled,
}}
>
{renderContent(formVals)}
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Space>
<Button htmlType="button" onClick={()=>{
handleModalVisible(false)
}}>
返回
</Button>
<Button htmlType="button" onClick={onReset}>
重置
</Button>
<Button type="primary" htmlType="button" onClick={testForm}>
测试
</Button>
<Button type="primary" htmlType="button" onClick={submitForm}>
保存
</Button>
</Space>
</Form.Item>
</Form>
</>
)
}</>
);
};
export default MysqlForm;
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Space, Select} from 'antd';
import Switch from "antd/es/switch";
import TextArea from "antd/es/input/TextArea";
import {DataBaseItem} from "@/pages/DataBase/data";
export type OracleFormProps = {
onCancel: (flag?: boolean, formVals?: Partial<DataBaseItem>) => void;
onSubmit: (values: Partial<DataBaseItem>) => void;
onTest: (values: Partial<DataBaseItem>) => void;
modalVisible: boolean;
values: Partial<DataBaseItem>;
};
const Option = Select.Option;
const formLayout = {
labelCol: {span: 7},
wrapperCol: {span: 13},
};
const OracleForm: React.FC<OracleFormProps> = (props) => {
const [formVals, setFormVals] = useState<Partial<DataBaseItem>>({
id: props.values.id,
name: props.values.name,
alias: props.values.alias,
type: "Oracle",
groupName: props.values.groupName,
url: props.values.url,
username: props.values.username,
password: props.values.password,
dbVersion: props.values.dbVersion,
flinkConfig: props.values.flinkConfig,
note: props.values.note,
enabled: props.values.enabled,
});
const [form] = Form.useForm();
const {
onSubmit: handleUpdate,
onTest: handleTest,
onCancel: handleModalVisible,
modalVisible,
values,
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleUpdate({...formVals, ...fieldsValue});
};
const testForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleTest({...formVals, ...fieldsValue});
};
const onReset = () => {
form.resetFields();
};
const renderContent = (formVals) => {
return (
<>
<Form.Item
name="name"
label="名称"
rules={[{required: true, message: '请输入名称!'}]}>
<Input placeholder="请输入唯一英文标识"/>
</Form.Item>
<Form.Item
name="alias"
label="别名"
>
<Input placeholder="请输入别名"/>
</Form.Item>
<Form.Item
name="groupName"
label="分组类型"
>
<Select >
<Option value="来源">来源</Option>
<Option value="数仓">数仓</Option>
<Option value="应用">应用</Option>
<Option value="备份">备份</Option>
<Option value="其他">其他</Option>
</Select>
</Form.Item>
<Form.Item
name="url"
label="url"
>
<TextArea placeholder="jdbc:oracle:thin:@{host}:{port}:{database}" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="username"
label="用户名"
>
<Input/>
</Form.Item>
<Form.Item
name="password"
label="密码"
>
<Input.Password/>
</Form.Item>
<Form.Item
name="flinkConfig"
label="Flink With 模板"
>
<TextArea placeholder="'connector' = 'jdbc',..." allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="note"
label="注释"
>
<Input placeholder="请输入"/>
</Form.Item>
<Form.Item
name="enabled"
label="是否启用"
>
<Switch checkedChildren="启用" unCheckedChildren="禁用"
defaultChecked={formVals.enabled}/>
</Form.Item>
</>
);
};
return (
<>{
modalVisible && (
<>
<Form
{...formLayout}
form={form}
initialValues={{
id: formVals.id,
name: formVals.name,
alias: formVals.alias,
type: formVals.type,
groupName: formVals.groupName,
url: formVals.url,
username: formVals.username,
password: formVals.password,
note: formVals.note,
flinkConfig: formVals.flinkConfig,
enabled: formVals.enabled,
}}
>
{renderContent(formVals)}
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Space>
<Button htmlType="button" onClick={()=>{
handleModalVisible(false)
}}>
返回
</Button>
<Button htmlType="button" onClick={onReset}>
重置
</Button>
<Button type="primary" htmlType="button" onClick={testForm}>
测试
</Button>
<Button type="primary" htmlType="button" onClick={submitForm}>
保存
</Button>
</Space>
</Form.Item>
</Form>
</>
)
}</>
);
};
export default OracleForm;
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Space, Select} from 'antd';
import Switch from "antd/es/switch";
import TextArea from "antd/es/input/TextArea";
import {DataBaseItem} from "@/pages/DataBase/data";
export type SqlServerFormProps = {
onCancel: (flag?: boolean, formVals?: Partial<DataBaseItem>) => void;
onSubmit: (values: Partial<DataBaseItem>) => void;
onTest: (values: Partial<DataBaseItem>) => void;
modalVisible: boolean;
values: Partial<DataBaseItem>;
};
const Option = Select.Option;
const formLayout = {
labelCol: {span: 7},
wrapperCol: {span: 13},
};
const SqlServerForm: React.FC<SqlServerFormProps> = (props) => {
const [formVals, setFormVals] = useState<Partial<DataBaseItem>>({
id: props.values.id,
name: props.values.name,
alias: props.values.alias,
type: "SqlServer",
groupName: props.values.groupName,
url: props.values.url,
username: props.values.username,
password: props.values.password,
dbVersion: props.values.dbVersion,
flinkConfig: props.values.flinkConfig,
note: props.values.note,
enabled: props.values.enabled,
});
const [form] = Form.useForm();
const {
onSubmit: handleUpdate,
onTest: handleTest,
onCancel: handleModalVisible,
modalVisible,
values,
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleUpdate({...formVals, ...fieldsValue});
};
const testForm = async () => {
const fieldsValue = await form.validateFields();
setFormVals({...formVals, ...fieldsValue});
handleTest({...formVals, ...fieldsValue});
};
const onReset = () => {
form.resetFields();
};
const renderContent = (formVals) => {
return (
<>
<Form.Item
name="name"
label="名称"
rules={[{required: true, message: '请输入名称!'}]}>
<Input placeholder="请输入唯一英文标识"/>
</Form.Item>
<Form.Item
name="alias"
label="别名"
>
<Input placeholder="请输入别名"/>
</Form.Item>
<Form.Item
name="groupName"
label="分组类型"
>
<Select >
<Option value="来源">来源</Option>
<Option value="数仓">数仓</Option>
<Option value="应用">应用</Option>
<Option value="备份">备份</Option>
<Option value="其他">其他</Option>
</Select>
</Form.Item>
<Form.Item
name="url"
label="url"
>
<TextArea placeholder="jdbc:sqlserver://{host}:{port};DatabaseName={database}" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="username"
label="用户名"
>
<Input/>
</Form.Item>
<Form.Item
name="password"
label="密码"
>
<Input.Password/>
</Form.Item>
<Form.Item
name="flinkConfig"
label="Flink With 模板"
>
<TextArea placeholder="'connector' = 'jdbc',..." allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
<Form.Item
name="note"
label="注释"
>
<Input placeholder="请输入"/>
</Form.Item>
<Form.Item
name="enabled"
label="是否启用"
>
<Switch checkedChildren="启用" unCheckedChildren="禁用"
defaultChecked={formVals.enabled}/>
</Form.Item>
</>
);
};
return (
<>{
modalVisible && (
<>
<Form
{...formLayout}
form={form}
initialValues={{
id: formVals.id,
name: formVals.name,
alias: formVals.alias,
type: formVals.type,
groupName: formVals.groupName,
url: formVals.url,
username: formVals.username,
password: formVals.password,
note: formVals.note,
flinkConfig: formVals.flinkConfig,
enabled: formVals.enabled,
}}
>
{renderContent(formVals)}
<Form.Item wrapperCol={{offset: 8, span: 16}}>
<Space>
<Button htmlType="button" onClick={()=>{
handleModalVisible(false)
}}>
返回
</Button>
<Button htmlType="button" onClick={onReset}>
重置
</Button>
<Button type="primary" htmlType="button" onClick={testForm}>
测试
</Button>
<Button type="primary" htmlType="button" onClick={submitForm}>
保存
</Button>
</Space>
</Form.Item>
</Form>
</>
)
}</>
);
};
export default SqlServerForm;
......@@ -9,6 +9,7 @@ export type DataBaseItem = {
password: string,
note: string,
flinkConfig: string,
flinkTemplate: string,
dbVersion: string,
status: boolean,
healthTime: Date,
......@@ -18,22 +19,6 @@ export type DataBaseItem = {
updateTime: Date,
};
export type DataBaseFormProps = {
name: string,
alias: string,
groupName: string,
type: string,
ip: string,
port: number,
url: string,
username: string,
password: string,
note: string,
flinkConfig: string,
dbVersion: string,
enabled: boolean,
}
export type Column = {
name: string,
type: string,
......
import request from "umi-request";
import {getInfoById, handleAddOrUpdate, handleOption, postAll} from "@/components/Common/crud";
import {getInfoById, handleAddOrUpdate, postAll} from "@/components/Common/crud";
import {DataBaseItem} from "@/pages/DataBase/data";
import {message} from "antd";
import {Protocol} from "puppeteer-core";
export async function createOrModifyDatabase(databse: DataBaseItem) {
return handleAddOrUpdate('/api/database', databse);
......
......@@ -230,6 +230,36 @@
<artifactId>dlink-metadata-mysql</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-oracle</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-sqlserver</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-postgresql</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-clickhouse</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-doris</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-metadata-phoenix</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