Commit dc9f83c2 authored by godkaikai's avatar godkaikai

0.1.0 rc

parent 31384a46
package com.dlink.controller;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* AntDesignController
*
* @author wenmo
* @since 2021/6/4 9:00
**/
@Controller
public class AntDesignController implements ErrorController {
@Override
public String getErrorPath(){
return "/error";
}
@RequestMapping(value = "/error")
public String getIndex(){
return "index"; //返回index页面
}
/*@RequestMapping("/api/**")
public ApiResult api(HttpServletRequest request, HttpServletResponse response){
return apiProxy.proxy(request, response);
}
@RequestMapping(value="/**", method=HTTPMethod.GET)
public String index(){
return "index";
}*/
}
\ No newline at end of file
...@@ -38,6 +38,10 @@ public class StudioServiceImpl implements StudioService { ...@@ -38,6 +38,10 @@ public class StudioServiceImpl implements StudioService {
Assert.check(cluster); Assert.check(cluster);
host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost()); host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost());
Assert.checkHost(host); Assert.checkHost(host);
if(!host.equals(cluster.getJobManagerHost())){
cluster.setJobManagerHost(host);
clusterService.updateById(cluster);
}
} }
JobManager jobManager = new JobManager(host,studioExecuteDTO.getSession(),studioExecuteDTO.getMaxRowNum()); JobManager jobManager = new JobManager(host,studioExecuteDTO.getSession(),studioExecuteDTO.getMaxRowNum());
return jobManager.execute(studioExecuteDTO.getStatement(), new ExecutorSetting( return jobManager.execute(studioExecuteDTO.getStatement(), new ExecutorSetting(
...@@ -57,6 +61,10 @@ public class StudioServiceImpl implements StudioService { ...@@ -57,6 +61,10 @@ public class StudioServiceImpl implements StudioService {
Assert.check(cluster); Assert.check(cluster);
host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost()); host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost());
Assert.checkHost(host); Assert.checkHost(host);
if(!host.equals(cluster.getJobManagerHost())){
cluster.setJobManagerHost(host);
clusterService.updateById(cluster);
}
} }
JobManager jobManager = new JobManager(host,studioDDLDTO.getSession(),1000); JobManager jobManager = new JobManager(host,studioDDLDTO.getSession(),1000);
return jobManager.execute(studioDDLDTO.getStatement(), new ExecutorSetting( return jobManager.execute(studioDDLDTO.getStatement(), new ExecutorSetting(
......
...@@ -43,6 +43,10 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen ...@@ -43,6 +43,10 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
Assert.check(statement); Assert.check(statement);
String host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost()); String host = FlinkCluster.testFlinkJobManagerIP(cluster.getHosts(), cluster.getJobManagerHost());
Assert.checkHost(host); Assert.checkHost(host);
if(!host.equals(cluster.getJobManagerHost())){
cluster.setJobManagerHost(host);
clusterService.updateById(cluster);
}
JobManager jobManager = new JobManager(host); JobManager jobManager = new JobManager(host);
return jobManager.submit(statement.getStatement(), task.getRemoteExecutorSetting()); return jobManager.submit(statement.getStatement(), task.getRemoteExecutorSetting());
} }
......
spring: spring:
datasource: datasource:
url: jdbc:mysql://192.168.24.1:3306/dlink?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true url: jdbc:mysql://10.1.51.25:3306/dlink?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: dlink username: dfly
password: dlink password: Dareway@2020
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
application: application:
name: dlink name: dlink
......
...@@ -27,12 +27,12 @@ export default [ ...@@ -27,12 +27,12 @@ export default [
icon: 'consoleSql', icon: 'consoleSql',
component: './FlinkSqlStudio', component: './FlinkSqlStudio',
}, },
{ /*{
path: '/task', path: '/task',
name: 'task', name: 'task',
icon: 'partition', icon: 'partition',
component: './Task', component: './Task',
}, },*/
{ {
path: '/cluster', path: '/cluster',
name: 'cluster', name: 'cluster',
...@@ -42,7 +42,7 @@ export default [ ...@@ -42,7 +42,7 @@ export default [
{ {
path: '/document', path: '/document',
name: 'document', name: 'document',
icon: 'cluster', icon: 'container',
component: './Document', component: './Document',
}, },
/*{ /*{
......
...@@ -113,9 +113,10 @@ const StudioConnector = (props:any) => { ...@@ -113,9 +113,10 @@ const StudioConnector = (props:any) => {
let newTableData = tableData; let newTableData = tableData;
for (let i=0; i<newTableData.length; i++) { for (let i=0; i<newTableData.length; i++) {
if (newTableData[i].tablename == item.tablename) { if (newTableData[i].tablename == item.tablename) {
// newTableData.splice(i, 1); newTableData.splice(i, 1);
delete newTableData[i]; // delete newTableData[i];
setTableData(newTableData); // setTableData(newTableData);
getTables();
break; break;
} }
} }
...@@ -190,7 +191,7 @@ const StudioConnector = (props:any) => { ...@@ -190,7 +191,7 @@ const StudioConnector = (props:any) => {
> >
获取Connectors 获取Connectors
</Button> </Button>
{tableData.length>0?(<Table dataSource={tableData} columns={getColumns()} />):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)} {tableData&&tableData.length>0?(<Table dataSource={tableData} columns={getColumns()} />):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)}
</> </>
); );
}; };
......
import {DownOutlined, HeartOutlined, PlusOutlined, UserOutlined} from '@ant-design/icons'; import { Input, Drawer, Modal} from 'antd';
import {Button, message, Input, Drawer, Modal} from 'antd';
import React, {useState, useRef} from 'react'; import React, {useState, useRef} from 'react';
import {PageContainer, FooterToolbar} from '@ant-design/pro-layout';
import type {ProColumns, ActionType} from '@ant-design/pro-table'; 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';
...@@ -9,12 +7,10 @@ import ProDescriptions from '@ant-design/pro-descriptions'; ...@@ -9,12 +7,10 @@ import ProDescriptions from '@ant-design/pro-descriptions';
import type {DocumentTableListItem} from '@/pages/Document/data.d'; import type {DocumentTableListItem} from '@/pages/Document/data.d';
import { queryData,} from "@/components/Common/crud"; import { queryData,} from "@/components/Common/crud";
import {connect} from "umi";
import {StateType} from "@/pages/FlinkSqlStudio/model";
const url = '/api/document'; const url = '/api/document';
const StudioDocument = () => { const StudioFX = () => {
const actionRef = useRef<ActionType>(); const actionRef = useRef<ActionType>();
const [row, setRow] = useState<DocumentTableListItem>(); const [row, setRow] = useState<DocumentTableListItem>();
const columns: ProColumns<DocumentTableListItem>[] = [ const columns: ProColumns<DocumentTableListItem>[] = [
...@@ -186,7 +182,7 @@ const StudioDocument = () => { ...@@ -186,7 +182,7 @@ const StudioDocument = () => {
dataIndex: 'likeNum', dataIndex: 'likeNum',
hideInForm: true, hideInForm: true,
hideInSearch: true, hideInSearch: true,
hideInTable: false, hideInTable: true,
}, },
{ {
title: '是否启用', title: '是否启用',
...@@ -253,7 +249,7 @@ const StudioDocument = () => { ...@@ -253,7 +249,7 @@ const StudioDocument = () => {
return ( return (
<> <>
<ProTable<DocumentTableListItem> <ProTable<DocumentTableListItem>
headerTitle="文档管理" headerTitle="文档浏览"
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
...@@ -287,6 +283,4 @@ const StudioDocument = () => { ...@@ -287,6 +283,4 @@ const StudioDocument = () => {
</>); </>);
}; };
export default connect(({ Studio }: { Studio: StateType }) => ({ export default StudioFX;
current: Studio.current,
}))(StudioDocument);
...@@ -7,7 +7,7 @@ import styles from "./index.less"; ...@@ -7,7 +7,7 @@ import styles from "./index.less";
import StudioMsg from "./StudioMsg"; import StudioMsg from "./StudioMsg";
import StudioTable from "./StudioTable"; import StudioTable from "./StudioTable";
import StudioHistory from "./StudioHistory"; import StudioHistory from "./StudioHistory";
import StudioDocument from "./StudioDocument"; import StudioFX from "./StudioFX";
const { TabPane } = Tabs; const { TabPane } = Tabs;
...@@ -81,7 +81,7 @@ const StudioConsole = (props:any) => { ...@@ -81,7 +81,7 @@ const StudioConsole = (props:any) => {
} }
key="6" key="6"
> >
<StudioDocument /> <StudioFX />
</TabPane> </TabPane>
<TabPane <TabPane
tab={ tab={
......
import {message, Input, Button, Space, Table, Dropdown, Menu, Empty,Divider} from "antd";
import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi";
import {useState} from "react";
// import Highlighter from 'react-highlight-words';
import { SearchOutlined,DownOutlined,TableOutlined } from '@ant-design/icons';
import React from "react";
import {executeDDL} from "@/pages/FlinkSqlStudio/service";
const StudioConnector = (props:any) => {
const {current} = props;
const [tableData,setTableData] = useState<[]>([]);
const [loadings,setLoadings] = useState<boolean[]>([]);
const [searchText,setSearchText] = useState<string>('');
const [searchedColumn,setSearchedColumn] = useState<string>('');
const getColumnSearchProps = (dIndex) => ({
filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
<div style={{ padding: 8 }}>
<Input
placeholder={`Search ${dIndex}`}
value={selectedKeys[0]}
onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={() => handleSearch(selectedKeys, confirm, dIndex)}
style={{ marginBottom: 8, display: 'block' }}
/>
<Space>
<Button
type="primary"
onClick={() => handleSearch(selectedKeys, confirm, dIndex)}
icon={<SearchOutlined />}
size="small"
style={{ width: 90 }}
>
搜索
</Button>
<Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 90 }}>
重置
</Button>
<Button
type="link"
size="small"
onClick={() => {
setSearchText(selectedKeys[0]);
setSearchedColumn(dIndex);
}}
>
过滤
</Button>
</Space>
</div>
),
filterIcon: filtered => <SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />,
onFilter: (value, record) =>
record[dIndex]
? record[dIndex].toString().toLowerCase().includes(value.toLowerCase())
: '',
/*render: text =>
searchedColumn === dIndex ? (
<Highlighter
highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
searchWords={[searchText]}
autoEscape
textToHighlight={text ? text.toString() : ''}
/>
) : (
text
),*/
});
const handleSearch = (selectedKeys, confirm, dIndex) => {
confirm();
setSearchText(selectedKeys[0]);
setSearchedColumn(dIndex);
};
const handleReset = (clearFilters) => {
clearFilters();
setSearchText('');
};
const MoreBtn: React.FC<{
item:any
}> = ({item}) => (
<Dropdown
overlay={
<Menu onClick={({key}) => keyEvent(key, item)}>
<Menu.Item key="desc">描述</Menu.Item>
<Menu.Item key="delete">删除</Menu.Item>
</Menu>
}
>
<a>
更多 <DownOutlined/>
</a>
</Dropdown>
);
const keyEvent=(key, item)=>{
if(key=='delete'){
let newLoadings = [...loadings];
newLoadings[1] = true;
setLoadings(newLoadings);
const res = executeDDL({
statement:"drop table "+item.tablename,
clusterId: current.task.clusterId,
session:current.task.session,
});
res.then((result)=>{
if(result.datas.success){
let newTableData = tableData;
for (let i=0; i<newTableData.length; i++) {
if (newTableData[i].tablename == item.tablename) {
newTableData.splice(i, 1);
setTableData(newTableData);
break;
}
}
}
let newLoadings = [...loadings];
newLoadings[1] = false;
setLoadings(newLoadings);
});
}else{
message.warn("敬请期待");
}
};
const getTables = () => {
let newLoadings = [...loadings];
newLoadings[0] = true;
setLoadings(newLoadings);
const res = executeDDL({
statement:"show tables",
clusterId: current.task.clusterId,
session:current.task.session,
});
res.then((result)=>{
if(result.datas.result.rowData.length>0){
setTableData(result.datas.result.rowData);
}else {
setTableData([]);
}
let newLoadings = [...loadings];
newLoadings[0] = false;
setLoadings(newLoadings);
});
};
const getColumns=()=>{
let columns:any=[{
title: "表名",
dataIndex: "tablename",
key: "tablename",
sorter: true,
...getColumnSearchProps("tablename"),
},{
title: '操作',
dataIndex: 'option',
valueType: 'option',
render: (_, record) => [
<a
onClick={() => {
message.warn('敬请期待');
}}
>
描述
</a>,<Divider type="vertical" />,<a
onClick={() => {
keyEvent('delete',record);
}}
>
删除
</a>
],
},];
return columns;
};
return (
<>
<Button
type="primary"
icon={<TableOutlined />}
loading={loadings[0]}
onClick={() => getTables()}
>
获取Connectors
</Button>
{tableData.length>0?(<Table dataSource={tableData} columns={getColumns()} />):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)}
</>
);
};
export default connect(({ Studio }: { Studio: StateType }) => ({
current: Studio.current,
}))(StudioConnector);
...@@ -5,7 +5,7 @@ import {BarsOutlined,SettingOutlined,AuditOutlined,ScheduleOutlined,AppstoreOutl ...@@ -5,7 +5,7 @@ import {BarsOutlined,SettingOutlined,AuditOutlined,ScheduleOutlined,AppstoreOutl
FireOutlined} from "@ant-design/icons"; FireOutlined} from "@ant-design/icons";
import StudioMenu from "./StudioMenu"; import StudioMenu from "./StudioMenu";
import {Row, Col, Card, Empty, Tabs, Form} from "antd"; import {Row, Col, Card, Empty, Tabs, Form,BackTop} from "antd";
import StudioTree from "./StudioTree"; import StudioTree from "./StudioTree";
import StudioTabs from "./StudioTabs"; import StudioTabs from "./StudioTabs";
import {StateType} from "@/pages/FlinkSqlStudio/model"; import {StateType} from "@/pages/FlinkSqlStudio/model";
...@@ -75,6 +75,7 @@ const Studio: React.FC<StudioProps> = ({sql}) => { ...@@ -75,6 +75,7 @@ const Studio: React.FC<StudioProps> = ({sql}) => {
</Col> </Col>
</Row> </Row>
</Card> </Card>
<BackTop />
</div> </div>
) )
}; };
......
...@@ -46,11 +46,6 @@ const DocumentTableList: React.FC<{}> = () => { ...@@ -46,11 +46,6 @@ const DocumentTableList: React.FC<{}> = () => {
} }
}; };
const checkHeartBeats = async ()=>{
await handleOption(url+'/heartbeats','心跳检测',null);
actionRef.current?.reloadAndRest?.();
};
const MoreBtn: React.FC<{ const MoreBtn: React.FC<{
item: DocumentTableListItem; item: DocumentTableListItem;
}> = ({item}) => ( }> = ({item}) => (
...@@ -219,21 +214,21 @@ const DocumentTableList: React.FC<{}> = () => { ...@@ -219,21 +214,21 @@ const DocumentTableList: React.FC<{}> = () => {
dataIndex: 'description', dataIndex: 'description',
valueType: 'textarea', valueType: 'textarea',
hideInForm: false, hideInForm: false,
hideInSearch: true, hideInSearch: false,
hideInTable: true, hideInTable: true,
}, },
{ {
title: '版本', title: '版本',
sorter: true, sorter: true,
dataIndex: 'version', dataIndex: 'version',
hideInForm: true, hideInForm: false,
hideInSearch: true, hideInSearch: true,
hideInTable: true, hideInTable: true,
}, },
{ {
title: '是否启用', title: '是否启用',
dataIndex: 'enabled', dataIndex: 'enabled',
hideInForm: true, hideInForm: false,
hideInSearch: true, hideInSearch: true,
hideInTable: false, hideInTable: false,
filters: [ filters: [
...@@ -318,9 +313,6 @@ const DocumentTableList: React.FC<{}> = () => { ...@@ -318,9 +313,6 @@ const DocumentTableList: React.FC<{}> = () => {
<Button type="primary" onClick={() => handleModalVisible(true)}> <Button type="primary" onClick={() => handleModalVisible(true)}>
<PlusOutlined/> 新建 <PlusOutlined/> 新建
</Button>, </Button>,
<Button type="primary" onClick={() => checkHeartBeats()}>
<HeartOutlined /> 心跳
</Button>,
]} ]}
request={(params, sorter, filter) => queryData(url,{...params, sorter, filter})} request={(params, sorter, filter) => queryData(url,{...params, sorter, filter})}
columns={columns} columns={columns}
......
...@@ -86,7 +86,7 @@ export default (): React.ReactNode => { ...@@ -86,7 +86,7 @@ export default (): React.ReactNode => {
<Link href="">FlinkSql Studio 自动完成函数</Link> <Link href="">FlinkSql Studio 自动完成函数</Link>
</li> </li>
<li> <li>
<Link href="">细节优化</Link> <Link href="">用户与授权</Link>
</li> </li>
</ul> </ul>
</Paragraph></>} reverse={true}> </Paragraph></>} reverse={true}>
......
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