Commit c0e47d3b authored by wenmo's avatar wenmo

集群配置表格

parent b1396355
...@@ -76,4 +76,13 @@ public class ClusterConfigurationController { ...@@ -76,4 +76,13 @@ public class ClusterConfigurationController {
clusterConfiguration = clusterConfigurationService.getById(clusterConfiguration.getId()); clusterConfiguration = clusterConfigurationService.getById(clusterConfiguration.getId());
return Result.succeed(clusterConfiguration,"获取成功"); return Result.succeed(clusterConfiguration,"获取成功");
} }
/**
* 获取可用的集群列表
*/
@GetMapping("/listEnabledAll")
public Result listEnabledAll() {
List<ClusterConfiguration >clusters = clusterConfigurationService.listEnabledAll();
return Result.succeed(clusters,"获取成功");
}
} }
...@@ -21,7 +21,7 @@ import java.util.Map; ...@@ -21,7 +21,7 @@ import java.util.Map;
**/ **/
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("dlink_cluster_config") @TableName("dlink_cluster_configuration")
public class ClusterConfiguration extends SuperEntity { public class ClusterConfiguration extends SuperEntity {
private static final long serialVersionUID = 5830130188542066241L; private static final long serialVersionUID = 5830130188542066241L;
......
...@@ -3,6 +3,8 @@ package com.dlink.service; ...@@ -3,6 +3,8 @@ package com.dlink.service;
import com.dlink.db.service.ISuperService; import com.dlink.db.service.ISuperService;
import com.dlink.model.ClusterConfiguration; import com.dlink.model.ClusterConfiguration;
import java.util.List;
/** /**
* ClusterConfigService * ClusterConfigService
* *
...@@ -12,4 +14,7 @@ import com.dlink.model.ClusterConfiguration; ...@@ -12,4 +14,7 @@ import com.dlink.model.ClusterConfiguration;
public interface ClusterConfigurationService extends ISuperService<ClusterConfiguration> { public interface ClusterConfigurationService extends ISuperService<ClusterConfiguration> {
ClusterConfiguration getClusterConfigById(Integer id); ClusterConfiguration getClusterConfigById(Integer id);
List<ClusterConfiguration> listEnabledAll();
} }
package com.dlink.service.impl; package com.dlink.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dlink.db.service.impl.SuperServiceImpl; import com.dlink.db.service.impl.SuperServiceImpl;
import com.dlink.mapper.ClusterConfigurationMapper; import com.dlink.mapper.ClusterConfigurationMapper;
import com.dlink.model.ClusterConfiguration; import com.dlink.model.ClusterConfiguration;
import com.dlink.service.ClusterConfigurationService; import com.dlink.service.ClusterConfigurationService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* ClusterConfigServiceImpl * ClusterConfigServiceImpl
* *
...@@ -20,4 +23,9 @@ public class ClusterConfigurationServiceImpl extends SuperServiceImpl<ClusterCon ...@@ -20,4 +23,9 @@ public class ClusterConfigurationServiceImpl extends SuperServiceImpl<ClusterCon
clusterConfiguration.parseConfig(); clusterConfiguration.parseConfig();
return clusterConfiguration; return clusterConfiguration;
} }
@Override
public List<ClusterConfiguration> listEnabledAll() {
return this.list(new QueryWrapper<ClusterConfiguration>().eq("enabled",1));
}
} }
...@@ -368,4 +368,19 @@ update dlink_flink_document set fill_value=name; ...@@ -368,4 +368,19 @@ update dlink_flink_document set fill_value=name;
update dlink_flink_document set category='Function' where category='function' ; update dlink_flink_document set category='Function' where category='function' ;
CREATE TABLE `dlink_cluster_configuration` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`alias` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '别名',
`type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '类型',
`config_json` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '配置JSON',
`is_available` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '是否可用',
`note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '注释',
`enabled` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SET FOREIGN_KEY_CHECKS = 1; SET FOREIGN_KEY_CHECKS = 1;
...@@ -34,10 +34,22 @@ export default [ ...@@ -34,10 +34,22 @@ export default [
component: './Task', component: './Task',
},*/ },*/
{ {
path: '/cluster', path: '/clusters',
name: 'clusters',
icon: 'cluster',
routes:[
{
path: '/clusters/cluster',
name: 'cluster', name: 'cluster',
icon: 'cluster', icon: 'cluster',
component: './Cluster', component: './Cluster',
},{
path: '/clusters/clusterConfiguration',
name: 'clusterConfiguration',
icon: 'setting',
component: './ClusterConfiguration',
}
]
}, },
{ {
path: '/database', path: '/database',
......
...@@ -141,3 +141,13 @@ export function getFillAllByVersion(version:string,dispatch: any) { ...@@ -141,3 +141,13 @@ export function getFillAllByVersion(version:string,dispatch: any) {
}); });
}); });
} }
/*--- 刷新 集群 ---*/
export function showClusterConfiguration(dispatch: any) {
const res = getData('api/clusterConfiguration/listEnabledAll');
res.then((result) => {
result.datas && dispatch && dispatch({
type: "Studio/saveClusterConfiguration",
payload: result.datas,
});
});
}
...@@ -50,7 +50,9 @@ export default { ...@@ -50,7 +50,9 @@ export default {
'menu.editor.mind': '脑图编辑器', 'menu.editor.mind': '脑图编辑器',
'menu.editor.koni': '拓扑编辑器', 'menu.editor.koni': '拓扑编辑器',
'menu.demo': 'Demo 开发模板', 'menu.demo': 'Demo 开发模板',
'menu.cluster': '集群中心', 'menu.clusters': '集群中心',
'menu.clusters.cluster': '集群实例',
'menu.clusters.clusterConfiguration': '集群配置',
'menu.database': '数据源中心', 'menu.database': '数据源中心',
'menu.studio': 'FlinkSql IDE', 'menu.studio': 'FlinkSql IDE',
'menu.flinksqlstudio': 'FlinkSql Studio', 'menu.flinksqlstudio': 'FlinkSql Studio',
......
import React, {useEffect, useState} from 'react';
import {Form, Button, Input, Modal, Select} from 'antd';
import {ClusterConfigurationTableListItem} from "@/pages/ClusterConfiguration/data";
export type ClusterConfigurationFormProps = {
onCancel: (flag?: boolean) => void;
onSubmit: (values: Partial<ClusterConfigurationTableListItem>) => void;
modalVisible: boolean;
};
const Option = Select.Option;
const formLayout = {
labelCol: {span: 7},
wrapperCol: {span: 13},
};
const ClusterConfigurationForm: React.FC<ClusterConfigurationFormProps> = (props) => {
const [form] = Form.useForm();
const {
onSubmit: handleSubmit,
onCancel: handleModalVisible,
modalVisible,
} = props;
const submitForm = async () => {
const fieldsValue = await form.validateFields();
handleSubmit(fieldsValue);
};
const renderContent = () => {
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="type"
label="类型"
>
<Select defaultValue="Yarn" allowClear>
<Option value="Standalone">Flink Standalone</Option>
<Option value="Yarn">Flink On Yarn</Option>
<Option value="Others">Others</Option>
</Select>
</Form.Item>
<Form.Item
name="note"
label="注释"
>
<Input.TextArea placeholder="请输入文本注释" allowClear
autoSize={{minRows: 3, maxRows: 10}}/>
</Form.Item>
</>
);
};
const renderFooter = () => {
return (
<>
<Button onClick={() => handleModalVisible(false)}>取消</Button>
<Button type="primary" onClick={() => submitForm()}>
完成
</Button>
</>
);
};
return (
<Modal
width={640}
bodyStyle={{padding: '32px 40px 48px'}}
destroyOnClose
title="创建集群配置"
visible={modalVisible}
footer={renderFooter()}
onCancel={() => handleModalVisible()}
>
<Form
{...formLayout}
form={form}
>
{renderContent()}
</Form>
</Modal>
);
};
export default ClusterConfigurationForm;
export type ClusterConfigerationTableListItem = { export type ClusterConfigurationTableListItem = {
id: number, id: number,
name: string, name: string,
alias: string, alias: string,
type: string, type: string,
config: any, config: any,
isAvailable: boolean, available: boolean,
note: string, note: string,
enabled: boolean, enabled: boolean,
createTime: Date, createTime: Date,
......
import React, {useRef, useState} from "react"; import React, {useRef, useState} from "react";
import {DownOutlined, HeartOutlined, PlusOutlined, UserOutlined} from '@ant-design/icons'; import {DownOutlined, HeartOutlined, PlusOutlined, UserOutlined} from '@ant-design/icons';
import {ClusterConfigerationTableListItem} from "@/pages/Cluster/data";
import {ActionType, ProColumns} from "@ant-design/pro-table"; import {ActionType, ProColumns} from "@ant-design/pro-table";
import {Button, message, Input, Drawer, Modal, Dropdown, Menu} from 'antd'; import {Button, message, Input, Drawer, Modal, Dropdown, Menu} from 'antd';
import {PageContainer, FooterToolbar} from '@ant-design/pro-layout'; import {PageContainer, FooterToolbar} from '@ant-design/pro-layout';
import type {ProColumns, ActionType} from '@ant-design/pro-table';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
import ProDescriptions from '@ant-design/pro-descriptions'; import ProDescriptions from '@ant-design/pro-descriptions';
import {ClusterConfigerationTableListItem} from "@/pages/ClusterConfiguration/data"; import {ClusterConfigurationTableListItem} from "@/pages/ClusterConfiguration/data";
import {handleAddOrUpdate, handleRemove, queryData, updateEnabled} from "@/components/Common/crud"; import {handleAddOrUpdate, handleRemove, queryData, updateEnabled} from "@/components/Common/crud";
import {showCluster} from "@/components/Studio/StudioEvent/DDL"; import {showClusterConfiguration} from "@/components/Studio/StudioEvent/DDL";
import ClusterConfigurationForm from "@/pages/ClusterConfiguration/components/ClusterConfigurationForm";
const url = '/api/clusterConfigeration'; const url = '/api/clusterConfiguration';
const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
const {dispatch} = props; const {dispatch} = props;
const [row, setRow] = useState<ClusterConfigerationTableListItem>(); const [row, setRow] = useState<ClusterConfigurationTableListItem>();
const [createModalVisible, handleModalVisible] = useState<boolean>(false); const [modalVisible, handleModalVisible] = useState<boolean>(false);
const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false); const [updateModalVisible, handleUpdateModalVisible] = useState<boolean>(false);
const [formValues, setFormValues] = useState({}); const [formValues, setFormValues] = useState({});
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const [selectedRowsState, setSelectedRows] = useState<ClusterConfigerationTableListItem[]>([]); const [selectedRowsState, setSelectedRows] = useState<ClusterConfigurationTableListItem[]>([]);
const editAndDelete = (key: string | number, currentItem: ClusterConfigerationTableListItem) => { const editAndDelete = (key: string | number, currentItem: ClusterConfigurationTableListItem) => {
if (key === 'edit') { if (key === 'edit') {
handleUpdateModalVisible(true); handleUpdateModalVisible(true);
setFormValues(currentItem); setFormValues(currentItem);
...@@ -40,7 +39,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -40,7 +39,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
}; };
const MoreBtn: React.FC<{ const MoreBtn: React.FC<{
item: ClusterConfigerationTableListItem; item: ClusterConfigurationTableListItem;
}> = ({item}) => ( }> = ({item}) => (
<Dropdown <Dropdown
overlay={ overlay={
...@@ -56,7 +55,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -56,7 +55,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
</Dropdown> </Dropdown>
); );
const columns: ProColumns<ClusterConfigerationTableListItem>[] = [ const columns: ProColumns<ClusterConfigurationTableListItem>[] = [
{ {
title: '名称', title: '名称',
dataIndex: 'name', dataIndex: 'name',
...@@ -117,7 +116,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -117,7 +116,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
}, },
{ {
title: '是否可用', title: '是否可用',
dataIndex: 'enabled', dataIndex: 'available',
hideInForm: true, hideInForm: true,
hideInSearch: true, hideInSearch: true,
hideInTable: false, hideInTable: false,
...@@ -223,7 +222,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -223,7 +222,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
return ( return (
<PageContainer> <PageContainer>
<ProTable<ClusterConfigerationTableListItem> <ProTable<ClusterConfigurationTableListItem>
headerTitle="集群配置管理" headerTitle="集群配置管理"
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
...@@ -301,7 +300,19 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -301,7 +300,19 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
>批量禁用</Button> >批量禁用</Button>
</FooterToolbar> </FooterToolbar>
)} )}
<ClusterConfigurationForm
onSubmit={async (value) => {
const success = await handleAddOrUpdate("api/clusterConfiguration", value);
if (success) {
handleModalVisible(false);
showClusterConfiguration(dispatch);
}
}}
onCancel={() => {
handleModalVisible(false);
}}
modalVisible={modalVisible}
/>
<Drawer <Drawer
width={600} width={600}
visible={!!row} visible={!!row}
...@@ -311,7 +322,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -311,7 +322,7 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
closable={false} closable={false}
> >
{row?.name && ( {row?.name && (
<ProDescriptions<ClusterConfigerationTableListItem> <ProDescriptions<ClusterConfigurationTableListItem>
column={2} column={2}
title={row?.name} title={row?.name}
request={async () => ({ request={async () => ({
...@@ -328,4 +339,4 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => { ...@@ -328,4 +339,4 @@ const ClusterConfigurationTableList: React.FC<{}> = (props: any) => {
); );
}; };
export default ClusterConfigerationTableList; export default ClusterConfigurationTableList;
...@@ -18,6 +18,19 @@ export type ClusterType = { ...@@ -18,6 +18,19 @@ export type ClusterType = {
updateTime: Date, updateTime: Date,
} }
export type ClusterConfigurationType = {
id: number,
name: string,
alias: string,
type: string,
config: any,
available: boolean,
note: string,
enabled: boolean,
createTime: Date,
updateTime: Date,
}
export type DataBaseType = { export type DataBaseType = {
id: number, id: number,
name: string, name: string,
...@@ -104,6 +117,7 @@ export type SessionType = { ...@@ -104,6 +117,7 @@ export type SessionType = {
export type StateType = { export type StateType = {
cluster?: ClusterType[]; cluster?: ClusterType[];
clusterConfiguration?: ClusterConfigurationType[];
database?: DataBaseType[]; database?: DataBaseType[];
currentSession?: SessionType; currentSession?: SessionType;
current?: TabsItemType; current?: TabsItemType;
...@@ -139,6 +153,7 @@ export type ModelType = { ...@@ -139,6 +153,7 @@ export type ModelType = {
quitCurrentSession: Reducer<StateType>; quitCurrentSession: Reducer<StateType>;
saveResult: Reducer<StateType>; saveResult: Reducer<StateType>;
saveCluster: Reducer<StateType>; saveCluster: Reducer<StateType>;
saveClusterConfiguration: Reducer<StateType>;
saveDataBase: Reducer<StateType>; saveDataBase: Reducer<StateType>;
}; };
}; };
...@@ -147,6 +162,7 @@ const Model: ModelType = { ...@@ -147,6 +162,7 @@ const Model: ModelType = {
namespace: 'Studio', namespace: 'Studio',
state: { state: {
cluster: [], cluster: [],
clusterConfiguration: [],
database: [], database: [],
currentSession: { currentSession: {
connectors: [], connectors: [],
...@@ -399,6 +415,11 @@ const Model: ModelType = { ...@@ -399,6 +415,11 @@ const Model: ModelType = {
...state, ...state,
cluster: payload, cluster: payload,
}; };
},saveClusterConfiguration(state, {payload}) {
return {
...state,
clusterConfiguration: payload,
};
},saveDataBase(state, {payload}) { },saveDataBase(state, {payload}) {
return { return {
...state, ...state,
......
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