Commit a65ab4b6 authored by godkaikai's avatar godkaikai

0.2.3

parent 581960ab
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -8,6 +8,9 @@ spring:
name: dlink
flyway:
enabled: true
clean-disabled: true
# baseline-on-migrate: true
table: dlink_schema_history
server:
port: 8888
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink-client</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink-client</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink-connectors</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
......
......@@ -5,7 +5,7 @@
<parent>
<artifactId>dlink</artifactId>
<groupId>com.dlink</groupId>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
......
......@@ -8,11 +8,12 @@ import { SearchOutlined,DownOutlined,DeleteOutlined,CommentOutlined } from '@ant
import React from "react";
import {executeDDL} from "@/pages/FlinkSqlStudio/service";
import {handleRemove} from "@/components/Common/crud";
import {showTables} from "@/components/Studio/StudioEvent/DDL";
const StudioConnector = (props:any) => {
const {current} = props;
const {current,dispatch,currentSessionCluster} = props;
const [tableData,setTableData] = useState<[]>([]);
const [loadings,setLoadings] = useState<boolean[]>([]);
const [searchText,setSearchText] = useState<string>('');
......@@ -135,26 +136,7 @@ const StudioConnector = (props:any) => {
};
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)=>{
setClusterName(current.task.clusterName);
setSession(current.task.session);
if(result.datas.result.rowData.length>0){
setTableData(result.datas.result.rowData);
}else {
setTableData([]);
}
let newLoadings = [...loadings];
newLoadings[0] = false;
setLoadings(newLoadings);
});
showTables(current.task.clusterId,current.task.clusterName,current.task.session,dispatch);
};
const clearSession = () => {
......@@ -224,14 +206,15 @@ const StudioConnector = (props:any) => {
<Breadcrumb className={styles["session-path"]}>
<CommentOutlined />
<Divider type="vertical" />
<Breadcrumb.Item>{clusterName}</Breadcrumb.Item>
<Breadcrumb.Item>{session}</Breadcrumb.Item>
<Breadcrumb.Item>{currentSessionCluster.clusterName}</Breadcrumb.Item>
<Breadcrumb.Item>{currentSessionCluster.session}</Breadcrumb.Item>
</Breadcrumb>
{tableData&&tableData.length>0?(<Table dataSource={tableData} columns={getColumns()} size="small" />):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)}
{currentSessionCluster.connectors&&currentSessionCluster.connectors.length>0?(<Table dataSource={currentSessionCluster.connectors} columns={getColumns()} size="small" />):(<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />)}
</>
);
};
export default connect(({ Studio }: { Studio: StateType }) => ({
current: Studio.current,
currentSessionCluster: Studio.currentSessionCluster,
}))(StudioConnector);
import {Typography, Input, Button, Space, Table, Select, Tag, Form, Empty} from "antd";
import {Typography, Input, Button, Space, Table, Select, Tag, Form, Empty,Tooltip} from "antd";
import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi";
import {useState} from "react";
......@@ -110,12 +110,12 @@ const StudioTable = (props:any) => {
>
{current.console.result.map((item,index)=> {
if(item.success) {
let tag = (<><Tag color="processing">{item.finishDate}</Tag>
let tag = (<> <Tooltip placement="topLeft" title={item.statement}><Tag color="processing">{item.finishDate}</Tag>
<Text underline>[{item.sessionId}:{item.flinkHost}:{item.flinkPort}]</Text>
{item.jobName&&<Text code>{item.jobName}</Text>}
{item.jobId&&<Text code>{item.jobId}</Text>}
<Text keyboard>{item.time}ms</Text>
{item.statement}</>);
{item.statement}</Tooltip></>);
return (<Option value={index} label={tag}>
{tag}
</Option>)
......
import {executeDDL} from "@/pages/FlinkSqlStudio/service";
import FlinkSQL from "./FlinkSQL";
export function showTables(clusterId:number,clusterName:string,session:string,dispatch:any) {
const res = executeDDL({
statement:FlinkSQL.SHOW_TABLES,
clusterId: clusterId,
session:session,
});
res.then((result)=>{
let tableData = [];
if(result.datas.result.rowData.length>0){
tableData = result.datas.result.rowData;
}
dispatch&&dispatch({
type: "Studio/refreshCurrentSessionCluster",
payload: {
session: session,
clusterId: clusterId,
clusterName: clusterName,
connectors: tableData,
},
});
});
}
const SQL = {
SHOW_TABLES:"show tables",
};
export default SQL;
......@@ -12,6 +12,7 @@ import {connect} from "umi";
import { postDataArray} from "@/components/Common/crud";
import {executeSql} from "@/pages/FlinkSqlStudio/service";
import StudioHelp from "../StudioHelp";
import {showTables} from "@/components/Studio/StudioEvent/DDL";
const menu = (
<Menu>
......@@ -76,16 +77,16 @@ const StudioMenu = (props: any) => {
type: "Studio/saveTabs",
payload: newTabs,
});
showTables(current.task.clusterId,current.task.clusterName,current.task.session,dispatch);
})
};
const submit= () =>{
if(!current.task.id){
message.error(`草稿【${current.title}】无法被提交,请创建或选择有效作业进行提交`);
return false;
return;
}
const taskKey = (Math.random()*1000)+'';
Modal.confirm({
title: '异步提交作业',
content: `确定异步提交作业【${current.task.alias}】到其配置的集群吗?请确认您的作业是否已经被保存!`,
......@@ -117,7 +118,7 @@ const StudioMenu = (props: any) => {
const fieldsValue = await form.validateFields();
if(current.task){
let task = {
id:current.key,
...current.task,
statement:current.value,
...fieldsValue
};
......
......@@ -4,6 +4,7 @@ import {Form, InputNumber,Input,Switch,Select,Tag,Row,Col,Divider,Tooltip,Button
import {InfoCircleOutlined,PlusOutlined,MinusSquareOutlined} from "@ant-design/icons";
import styles from "./index.less";
import {useEffect, useState} from "react";
import {showTables} from "@/components/Studio/StudioEvent/DDL";
const { Option } = Select;
......@@ -59,6 +60,10 @@ const StudioSetting = (props: any) => {
payload: newTabs,
});
};
const onChangeClusterSession = ()=>{
showTables(current.task.clusterId,current.task.clusterName,current.task.session,dispatch);
};
return (
<>
<Row>
......@@ -136,6 +141,7 @@ const StudioSetting = (props: any) => {
placeholder="选择Flink集群"
defaultValue={0}
optionLabelProp="label"
onChange={onChangeClusterSession}
>
<Option value={0} label={(<><Tag color="default">Local</Tag>本地环境</>)}>
<Tag color="default">Local</Tag>
......@@ -155,6 +161,7 @@ const StudioSetting = (props: any) => {
placeholder="选择会话"
// defaultValue='admin'
allowClear
onChange={onChangeClusterSession}
dropdownRender={menu => (
<div>
{menu}
......
......@@ -5,6 +5,7 @@ import {
queryData
} from "@/components/Common/crud";
import {Form} from "antd";
import {executeDDL} from "@/pages/FlinkSqlStudio/service";
export type ClusterType = {
id: number,
......@@ -37,9 +38,9 @@ export type TaskType = {
createTime?: Date,
updateTime?: Date,
statement?: string,
session:string;
maxRowNum:number;
jobName:string;
session: string;
maxRowNum: number;
jobName: string;
};
export type ConsoleType = {
......@@ -48,12 +49,12 @@ export type ConsoleType = {
export type TabsItemType = {
title: string;
key: number ,
value:string;
key: number,
value: string;
closable: boolean;
path: string[];
task?:TaskType;
console:ConsoleType;
task?: TaskType;
console: ConsoleType;
monaco?: any;
}
......@@ -68,15 +69,26 @@ export type RightClickMenu = {
id: number,
name: string
};
export type ConnectorType = {
tablename: string;
}
export type SessionClusterType = {
session: string;
clusterId: number;
clusterName: string;
connectors: ConnectorType[];
}
export type StateType = {
cluster?:ClusterType[];
cluster?: ClusterType[];
currentSessionCluster: SessionClusterType[];
current: TabsItemType;
sql?: string;
monaco?: any;
currentPath?: string[];
tabs:TabsType;
session:string[];
rightClickMenu?:boolean;
tabs: TabsType;
session: string[];
rightClickMenu?: boolean;
};
export type ModelType = {
......@@ -94,6 +106,7 @@ export type ModelType = {
saveTaskData: Reducer<StateType>;
saveSession: Reducer<StateType>;
showRightClickMenu: Reducer<StateType>;
refreshCurrentSessionCluster: Reducer<StateType>;
};
};
......@@ -111,66 +124,72 @@ const getClusters = async () => {
const Model: ModelType = {
namespace: 'Studio',
state: {
cluster:getClusters(),
cluster: getClusters(),
currentSessionCluster: {
session: '',
clusterId: 0,
clusterName: '本地环境',
connectors: [],
},
current: {
title: '草稿',
key: 0 ,
value:'',
key: 0,
value: '',
closable: false,
path: ['草稿'],
task:{
jobName:'草稿',
task: {
jobName: '草稿',
checkPoint: 0,
savePointPath: '',
parallelism: 1,
fragment: true,
clusterId: 0,
clusterName:"本地环境",
clusterName: "本地环境",
maxRowNum: 100,
session:'',
alias:'草稿',
session: '',
alias: '草稿',
},
console:{
result:[],
console: {
result: [],
},
monaco: {},
},
sql: '',
monaco: {},
currentPath: [],
tabs:{
tabs: {
activeKey: 0,
panes: [{
title: '草稿',
key: 0 ,
value:'',
key: 0,
value: '',
closable: false,
path: ['草稿'],
task:{
jobName:'草稿',
task: {
jobName: '草稿',
checkPoint: 0,
savePointPath: '',
parallelism: 1,
fragment: true,
clusterId: 0,
clusterName:"本地环境",
session:'',
clusterName: "本地环境",
session: '',
maxRowNum: 100,
alias:'草稿',
alias: '草稿',
},
console:{
result:[],
console: {
result: [],
},
monaco: {},
}],
},
session:[],
rightClickMenu:false
session: [],
rightClickMenu: false
},
effects: {
*saveTask({ payload }, { call, put }) {
yield call(handleAddOrUpdate,'api/task', payload);
* saveTask({payload}, {call, put}) {
yield call(handleAddOrUpdate, 'api/task', payload);
yield put({
type: 'saveTaskData',
payload,
......@@ -179,130 +198,138 @@ const Model: ModelType = {
},
reducers: {
saveSql(state, { payload }) {
saveSql(state, {payload}) {
const tabs = state.tabs;
let newCurrent = state.current;
newCurrent.value=payload;
for(let i=0;i<tabs.panes.length;i++){
if(tabs.panes[i].key==tabs.activeKey){
tabs.panes[i].value=payload;
tabs.panes[i].task&&(tabs.panes[i].task.statement=payload);
newCurrent.value = payload;
for (let i = 0; i < tabs.panes.length; i++) {
if (tabs.panes[i].key == tabs.activeKey) {
tabs.panes[i].value = payload;
tabs.panes[i].task && (tabs.panes[i].task.statement = payload);
}
}
return {
...state,
current:{
current: {
...newCurrent
},
tabs:{
tabs: {
...tabs
},
};
},
saveCurrentPath(state, { payload }) {
saveCurrentPath(state, {payload}) {
return {
...state,
currentPath:payload,
currentPath: payload,
};
},
saveMonaco(state, { payload }) {
saveMonaco(state, {payload}) {
return {
...state,
monaco:{
monaco: {
...payload
},
};
},
saveTabs(state, { payload }) {
saveTabs(state, {payload}) {
let newCurrent = state.current;
for(let i=0;i<payload.panes.length;i++){
if(payload.panes[i].key==payload.activeKey){
newCurrent=payload.panes[i];
for (let i = 0; i < payload.panes.length; i++) {
if (payload.panes[i].key == payload.activeKey) {
newCurrent = payload.panes[i];
}
}
return {
...state,
current:{
current: {
...newCurrent,
},
tabs:{
tabs: {
...payload,
},
};
},
deleteTabByKey(state, { payload }) {
deleteTabByKey(state, {payload}) {
let newTabs = state.tabs;
for(let i=0;i<newTabs.panes.length;i++){
if(newTabs.panes[i].key==payload){
for (let i = 0; i < newTabs.panes.length; i++) {
if (newTabs.panes[i].key == payload) {
newTabs.panes.splice(i, 1);
break;
}
}
let newCurrent = newTabs.panes[newTabs.panes.length-1];
if(newTabs.activeKey==payload) {
let newCurrent = newTabs.panes[newTabs.panes.length - 1];
if (newTabs.activeKey == payload) {
newTabs.activeKey = newCurrent.key;
}
return {
...state,
current:{
current: {
...newCurrent,
},
tabs:{
tabs: {
...newTabs,
},
};
},
changeActiveKey(state, { payload }) {
changeActiveKey(state, {payload}) {
let tabs = state.tabs;
tabs.activeKey = payload;
let newCurrent = state.current;
for(let i=0;i<tabs.panes.length;i++){
if(tabs.panes[i].key==tabs.activeKey){
newCurrent=tabs.panes[i];
for (let i = 0; i < tabs.panes.length; i++) {
if (tabs.panes[i].key == tabs.activeKey) {
newCurrent = tabs.panes[i];
}
}
return {
...state,
current:{
current: {
...newCurrent,
},
tabs:{
tabs: {
...tabs,
},
currentPath:newCurrent.path,
currentPath: newCurrent.path,
};
},
saveTaskData(state, { payload }) {
saveTaskData(state, {payload}) {
let newTabs = state.tabs;
for(let i=0;i<newTabs.panes.length;i++){
if(newTabs.panes[i].key==newTabs.activeKey){
newTabs.panes[i].task=payload;
for (let i = 0; i < newTabs.panes.length; i++) {
if (newTabs.panes[i].key == newTabs.activeKey) {
newTabs.panes[i].task = payload;
}
}
return {
...state,
tabs:{
tabs: {
...newTabs,
},
};
},
saveSession(state, { payload }) {
saveSession(state, {payload}) {
let newSession = state.session;
for(let i=0;i<newSession.length;i++){
if(newSession[i].key==payload){
for (let i = 0; i < newSession.length; i++) {
if (newSession[i].key == payload) {
return {};
}
}
newSession.push(payload);
return {
...state,
session:newSession,
session: newSession,
};
},
showRightClickMenu(state, {payload}) {
return {
...state,
rightClickMenu: payload,
};
},
showRightClickMenu(state, { payload }) {
refreshCurrentSessionCluster(state, {payload}) {
return {
...state,
rightClickMenu:payload,
currentSessionCluster: {
...payload
},
};
},
},
......
......@@ -229,7 +229,7 @@ export default (): React.ReactNode => {
</ul>
</Paragraph>
</Timeline.Item>
<Timeline.Item><Text code>0.2.3</Text> <Text type="secondary">2021-06-17</Text>
<Timeline.Item><Text code>0.2.3</Text> <Text type="secondary">2021-06-21</Text>
<p> </p>
<Paragraph>
<ul>
......@@ -248,6 +248,15 @@ export default (): React.ReactNode => {
<li>
<Link>增加了连接器当前的集群与会话显示</Link>
</li>
<li>
<Link>增加了选择集群或会话以及同步执行时的连接器自动刷新</Link>
</li>
<li>
<Link>解决了在修改作业配置后异步提交作业名未定义的问题</Link>
</li>
<li>
<Link>增加了历史记录下拉列表鼠标悬浮显示全部SQL的功能</Link>
</li>
</ul>
</Paragraph>
</Timeline.Item>
......
......@@ -7,7 +7,7 @@
<groupId>com.dlink</groupId>
<artifactId>dlink</artifactId>
<packaging>pom</packaging>
<version>0.3.0-SANPSHOT</version>
<version>0.2.3</version>
<modules>
<module>dlink-core</module>
<module>dlink-admin</module>
......
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