Commit 44ba44d2 authored by wenmo's avatar wenmo

0.1.0 rc4

parent b02ec081
...@@ -74,6 +74,10 @@ ...@@ -74,6 +74,10 @@
<groupId>com.dlink</groupId> <groupId>com.dlink</groupId>
<artifactId>dlink-core</artifactId> <artifactId>dlink-core</artifactId>
</dependency> </dependency>
<!--<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-connector</artifactId>
</dependency>-->
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
...@@ -92,6 +96,19 @@ ...@@ -92,6 +96,19 @@
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId> <artifactId>versions-maven-plugin</artifactId>
</plugin> </plugin>
<!--<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.dlink.Dlink</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>-->
</plugins> </plugins>
<finalName>${project.artifactId}</finalName> <finalName>${project.artifactId}</finalName>
</build> </build>
......
...@@ -6,12 +6,13 @@ import com.dlink.dto.StudioExecuteDTO; ...@@ -6,12 +6,13 @@ import com.dlink.dto.StudioExecuteDTO;
import com.dlink.model.Task; import com.dlink.model.Task;
import com.dlink.result.RunResult; import com.dlink.result.RunResult;
import com.dlink.service.StudioService; import com.dlink.service.StudioService;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import java.util.ArrayList;
import org.springframework.web.bind.annotation.RestController; import java.util.List;
/** /**
* StudioController * StudioController
...@@ -31,7 +32,7 @@ public class StudioController { ...@@ -31,7 +32,7 @@ public class StudioController {
* 执行Sql * 执行Sql
*/ */
@PostMapping("/executeSql") @PostMapping("/executeSql")
public Result executeSql(@RequestBody StudioExecuteDTO studioExecuteDTO) throws Exception { public Result executeSql(@RequestBody StudioExecuteDTO studioExecuteDTO) {
RunResult runResult = studioService.executeSql(studioExecuteDTO); RunResult runResult = studioService.executeSql(studioExecuteDTO);
return Result.succeed(runResult,"执行成功"); return Result.succeed(runResult,"执行成功");
} }
...@@ -40,8 +41,31 @@ public class StudioController { ...@@ -40,8 +41,31 @@ public class StudioController {
* 进行DDL操作 * 进行DDL操作
*/ */
@PostMapping("/executeDDL") @PostMapping("/executeDDL")
public Result executeDDL(@RequestBody StudioDDLDTO studioDDLDTO) throws Exception { public Result executeDDL(@RequestBody StudioDDLDTO studioDDLDTO) {
RunResult runResult = studioService.executeDDL(studioDDLDTO); RunResult runResult = studioService.executeDDL(studioDDLDTO);
return Result.succeed(runResult,"执行成功"); return Result.succeed(runResult,"执行成功");
} }
/**
* 清除指定session
*/
@DeleteMapping("/clearSession")
public Result clearSession(@RequestBody JsonNode para) {
if (para.size()>0){
List<String> error = new ArrayList<>();
for (final JsonNode item : para){
String session = item.asText();
if(!studioService.clearSession(session)){
error.add(session);
}
}
if(error.size()==0) {
return Result.succeed("清除成功");
}else {
return Result.succeed("清除部分成功,但"+error.toString()+"清除失败,共"+error.size()+"次失败。");
}
}else{
return Result.failed("请选择要清除的记录");
}
}
} }
...@@ -14,4 +14,6 @@ public interface StudioService { ...@@ -14,4 +14,6 @@ public interface StudioService {
RunResult executeSql(StudioExecuteDTO studioExecuteDTO); RunResult executeSql(StudioExecuteDTO studioExecuteDTO);
RunResult executeDDL(StudioDDLDTO studioDDLDTO); RunResult executeDDL(StudioDDLDTO studioDDLDTO);
boolean clearSession(String session);
} }
...@@ -11,6 +11,7 @@ import com.dlink.model.Cluster; ...@@ -11,6 +11,7 @@ import com.dlink.model.Cluster;
import com.dlink.result.RunResult; import com.dlink.result.RunResult;
import com.dlink.service.ClusterService; import com.dlink.service.ClusterService;
import com.dlink.service.StudioService; import com.dlink.service.StudioService;
import com.dlink.session.SessionPool;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -70,4 +71,13 @@ public class StudioServiceImpl implements StudioService { ...@@ -70,4 +71,13 @@ public class StudioServiceImpl implements StudioService {
return jobManager.execute(studioDDLDTO.getStatement(), new ExecutorSetting( return jobManager.execute(studioDDLDTO.getStatement(), new ExecutorSetting(
ExecuteType)); ExecuteType));
} }
@Override
public boolean clearSession(String session) {
if(SessionPool.remove(session)>0){
return true;
}else{
return false;
}
}
} }
<?xml version="1.0" encoding="UTF-8"?>
<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</artifactId>
<groupId>com.dlink</groupId>
<version>0.1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>dlink-connector</artifactId>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.12.4</flink.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>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId>
<!--<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>-->
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version>
<!--<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>-->
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-jdbc_2.11</artifactId>
<version>${flink.version}</version>
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
<finalName>${project.artifactId}</finalName>
</build>
</project>
\ No newline at end of file
...@@ -11,14 +11,14 @@ ...@@ -11,14 +11,14 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<artifactId>dlink-core</artifactId> <artifactId>dlink-core</artifactId>
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.12.4</flink.version> <flink.version>1.12.4</flink.version>
<scala.binary.version>2.11</scala.binary.version> <scala.binary.version>2.11</scala.binary.version>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version> <junit.version>4.12</junit.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
...@@ -26,37 +26,40 @@ ...@@ -26,37 +26,40 @@
</dependency> </dependency>
<!--<dependency> <!--<dependency>
<groupId>org.apache.flink</groupId> <groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner_${scala.binary.version}</artifactId> <artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<version>${flink.version}</version> <version>${flink.version}</version>
</dependency>--> </dependency>-->
<dependency> <!--<dependency>
<groupId>org.apache.flink</groupId> <groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-blink_${scala.binary.version}</artifactId> <artifactId>flink-clients_${scala.binary.version}</artifactId>
<version>${flink.version}</version> <version>${flink.version}</version>
</dependency> </dependency>-->
<dependency> <!--<dependency>
<groupId>org.apache.flink</groupId> <groupId>org.apache.flink</groupId>
<artifactId>flink-clients_${scala.binary.version}</artifactId> <artifactId>force-shading</artifactId>
<version>${flink.version}</version> <version>${flink.version}</version>
</dependency> </dependency>-->
<dependency> <!--<dependency>
<groupId>org.apache.flink</groupId> <groupId>org.apache.flink</groupId>
<artifactId>flink-connector-jdbc_2.11</artifactId> <artifactId>flink-connector-jdbc_2.11</artifactId>
<version>${flink.version}</version> <version>${flink.version}</version>
<scope>provided</scope> </dependency>-->
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>${junit.version}</version> <version>${junit.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!--&lt;!&ndash;@Nullable&ndash;&gt;
<dependency> <dependency>
<groupId>com.google.code.findbugs</groupId> <groupId>com.dlink</groupId>
<artifactId>jsr305</artifactId> <artifactId>dlink-connector</artifactId>
<version>1.3.9</version> <!--<scope>provided</scope>-->
</dependency>--> </dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
...@@ -110,14 +110,16 @@ public class JobManager { ...@@ -110,14 +110,16 @@ public class JobManager {
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
StackTraceElement[] trace = e.getStackTrace(); StackTraceElement[] trace = e.getCause().getStackTrace();
StringBuffer resMsg = new StringBuffer(""); /*StringBuffer resMsg = new StringBuffer("");
for (StackTraceElement s : trace) { for (StackTraceElement s : trace) {
resMsg.append(" \n " + s + " "); resMsg.append(" \n " + s + " ");
} }*/
runResult.setFinishDate(LocalDateTime.now()); runResult.setFinishDate(LocalDateTime.now());
runResult.setSuccess(false); runResult.setSuccess(false);
runResult.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + " \n >>>堆栈信息<<<" + resMsg.toString()); // runResult.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage());
// runResult.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + " \n >>>堆栈信息<<<" + resMsg.toString());
runResult.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + "\n >>>异常原因<<< \n" + e.getCause().toString());
return runResult; return runResult;
} }
return runResult; return runResult;
...@@ -164,12 +166,14 @@ public class JobManager { ...@@ -164,12 +166,14 @@ public class JobManager {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
StackTraceElement[] trace = e.getStackTrace(); StackTraceElement[] trace = e.getStackTrace();
StringBuilder resMsg = new StringBuilder(); /*StringBuilder resMsg = new StringBuilder();
for (StackTraceElement s : trace) { for (StackTraceElement s : trace) {
resMsg.append(" \n " + s + " "); resMsg.append(" \n " + s + " ");
} }*/
result.setSuccess(false); result.setSuccess(false);
result.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + "\n >>>堆栈信息<<<" + resMsg.toString()); // result.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage());
// result.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + "\n >>>堆栈信息<<<" + resMsg.toString());
result.setError(LocalDateTime.now().toString() + ":" + "运行第" + currentIndex + "行sql时出现异常:" + e.getMessage() + "\n >>>异常原因<<< \n" + e.getCause().toString());
return result; return result;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# 定义变量 # 定义变量
# 要运行的jar包路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到 # 要运行的jar包路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
JAR_NAME="./dlink-admin.jar" JAR_NAME="./dlink-admin.jar"
LIB_PATH="./lib" SETTING="-Djava.ext.dirs=./lib"
# 如果输入格式不对,给出提示! # 如果输入格式不对,给出提示!
tips() { tips() {
...@@ -19,7 +19,7 @@ start() { ...@@ -19,7 +19,7 @@ start() {
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'` pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行 # -z 表示如果$pid为空时执行
if [ -z $pid ]; then if [ -z $pid ]; then
nohup java -Djava.ext.dirs=$LIB_PATH -Doracle.jdbc.thinLogonCapability=o3 -jar -Xms512M -Xmx2048M -XX:PermSize=512M -XX:MaxPermSize=1024M $JAR_NAME > /dev/null 2>&1 & nohup java $SETTING -jar -Xms512M -Xmx2048M -XX:PermSize=512M -XX:MaxPermSize=1024M $JAR_NAME > /dev/null 2>&1 &
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'` pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo "" echo ""
echo "Service ${JAR_NAME} is starting!pid=${pid}" echo "Service ${JAR_NAME} is starting!pid=${pid}"
......
spring:
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
username: dlink
password: dlink
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: dlink
server:
port: 8888
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.dlink.model
global-config:
db-config:
id-type: auto
configuration:
##### mybatis-plus打印完整sql(只适用于开发环境)
log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
dlink:
##### 登录用户配置
login:
username: admin
password: admin
\ No newline at end of file
...@@ -12,7 +12,7 @@ export async function queryData(url:string,params?: TableListParams) { ...@@ -12,7 +12,7 @@ export async function queryData(url:string,params?: TableListParams) {
}); });
} }
export async function removeData(url:string,params: number[]) { export async function removeData(url:string,params: any[]) {
return request(url, { return request(url, {
method: 'DELETE', method: 'DELETE',
data: { data: {
...@@ -87,7 +87,7 @@ export const handleRemove = async (url:string,selectedRows: []) => { ...@@ -87,7 +87,7 @@ export const handleRemove = async (url:string,selectedRows: []) => {
} }
}; };
export const handleSubmit = async (url:string,title:string,selectedRows: []) => { export const handleSubmit = async (url:string,title:string,selectedRows: any[]) => {
const hide = message.loading('正在'+title); const hide = message.loading('正在'+title);
if (!selectedRows) return true; if (!selectedRows) return true;
try { try {
......
...@@ -3,9 +3,10 @@ import {StateType} from "@/pages/FlinkSqlStudio/model"; ...@@ -3,9 +3,10 @@ import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi"; import {connect} from "umi";
import {useState} from "react"; import {useState} from "react";
// import Highlighter from 'react-highlight-words'; // import Highlighter from 'react-highlight-words';
import { SearchOutlined,DownOutlined,TableOutlined } from '@ant-design/icons'; import { SearchOutlined,DownOutlined,DeleteOutlined } from '@ant-design/icons';
import React from "react"; import React from "react";
import {executeDDL} from "@/pages/FlinkSqlStudio/service"; import {executeDDL} from "@/pages/FlinkSqlStudio/service";
import {handleRemove} from "@/components/Common/crud";
const StudioConnector = (props:any) => { const StudioConnector = (props:any) => {
...@@ -151,6 +152,22 @@ const StudioConnector = (props:any) => { ...@@ -151,6 +152,22 @@ const StudioConnector = (props:any) => {
}); });
}; };
const clearSession = () => {
let newLoadings = [...loadings];
newLoadings[2] = true;
setLoadings(newLoadings);
let session = {
id:current.task.clusterId+'_'+current.task.session,
};
const res = handleRemove('/api/studio/clearSession',[session]);
res.then((result)=>{
getTables();
let newLoadings = [...loadings];
newLoadings[2] = false;
setLoadings(newLoadings);
});
};
const getColumns=()=>{ const getColumns=()=>{
let columns:any=[{ let columns:any=[{
title: "表名", title: "表名",
...@@ -183,14 +200,20 @@ const StudioConnector = (props:any) => { ...@@ -183,14 +200,20 @@ const StudioConnector = (props:any) => {
return ( return (
<> <>
<Space>
<Button
type="primary"
icon={<SearchOutlined />}
loading={loadings[0]}
onClick={() => getTables()}
/>
<Button <Button
type="primary" danger
icon={<TableOutlined />} icon={<DeleteOutlined />}
loading={loadings[0]} loading={loadings[2]}
onClick={() => getTables()} onClick={() => clearSession()}
> />
获取Connectors </Space>
</Button>
{tableData&&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} />)}
</> </>
); );
......
...@@ -15,19 +15,10 @@ const StudioFX = () => { ...@@ -15,19 +15,10 @@ const StudioFX = () => {
const [row, setRow] = useState<DocumentTableListItem>(); const [row, setRow] = useState<DocumentTableListItem>();
const columns: ProColumns<DocumentTableListItem>[] = [ const columns: ProColumns<DocumentTableListItem>[] = [
{ {
title: '名称', title: '函数',
dataIndex: 'name', dataIndex: 'name',
tip: '名称是唯一的',
sorter: true, sorter: true,
width:'400px', width:'400px',
formItemProps: {
rules: [
{
required: true,
message: '名称为必填项',
},
],
},
render: (dom, entity) => { render: (dom, entity) => {
return <a onClick={() => setRow(entity)}>{dom}</a>; return <a onClick={() => setRow(entity)}>{dom}</a>;
}, },
...@@ -176,7 +167,8 @@ const StudioFX = () => { ...@@ -176,7 +167,8 @@ const StudioFX = () => {
hideInForm: true, hideInForm: true,
hideInSearch: true, hideInSearch: true,
hideInTable: true, hideInTable: true,
},{ },
{
title: '赞', title: '赞',
sorter: true, sorter: true,
dataIndex: 'likeNum', dataIndex: 'likeNum',
...@@ -249,7 +241,7 @@ const StudioFX = () => { ...@@ -249,7 +241,7 @@ const StudioFX = () => {
return ( return (
<> <>
<ProTable<DocumentTableListItem> <ProTable<DocumentTableListItem>
headerTitle="文档浏览" headerTitle="FlinkSql 函数浏览"
actionRef={actionRef} actionRef={actionRef}
rowKey="id" rowKey="id"
search={{ search={{
......
import { Tabs,Empty } from "antd"; import { Tabs,Empty } from "antd";
import {CodeOutlined, TableOutlined,RadarChartOutlined,CalendarOutlined,FileSearchOutlined,DesktopOutlined import {CodeOutlined, TableOutlined,RadarChartOutlined,CalendarOutlined,FileSearchOutlined,DesktopOutlined
,FunctionOutlined} from "@ant-design/icons"; ,FunctionOutlined,ApartmentOutlined} from "@ant-design/icons";
import {StateType} from "@/pages/FlinkSqlStudio/model"; import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi"; import {connect} from "umi";
import styles from "./index.less"; import styles from "./index.less";
...@@ -16,7 +16,7 @@ const { TabPane } = Tabs; ...@@ -16,7 +16,7 @@ const { TabPane } = Tabs;
const StudioConsole = (props:any) => { const StudioConsole = (props:any) => {
return ( return (
<Tabs defaultActiveKey="1" size="small"> <Tabs defaultActiveKey="StudioMsg" size="small">
<TabPane <TabPane
tab={ tab={
<span> <span>
...@@ -24,7 +24,7 @@ const StudioConsole = (props:any) => { ...@@ -24,7 +24,7 @@ const StudioConsole = (props:any) => {
信息 信息
</span> </span>
} }
key="1" key="StudioMsg"
> >
<StudioMsg /> <StudioMsg />
</TabPane> </TabPane>
...@@ -35,7 +35,7 @@ const StudioConsole = (props:any) => { ...@@ -35,7 +35,7 @@ const StudioConsole = (props:any) => {
结果 结果
</span> </span>
} }
key="2" key="StudioTable"
> >
<StudioTable /> <StudioTable />
</TabPane> </TabPane>
...@@ -46,7 +46,18 @@ const StudioConsole = (props:any) => { ...@@ -46,7 +46,18 @@ const StudioConsole = (props:any) => {
指标 指标
</span> </span>
} }
key="3" key="StudioMetrics"
>
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
</TabPane>
<TabPane
tab={
<span>
<ApartmentOutlined />
血缘
</span>
}
key="StudioConsanguinity"
> >
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
</TabPane> </TabPane>
...@@ -57,7 +68,7 @@ const StudioConsole = (props:any) => { ...@@ -57,7 +68,7 @@ const StudioConsole = (props:any) => {
进程 进程
</span> </span>
} }
key="4" key="StudioProcess"
> >
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
</TabPane> </TabPane>
...@@ -68,7 +79,7 @@ const StudioConsole = (props:any) => { ...@@ -68,7 +79,7 @@ const StudioConsole = (props:any) => {
历史 历史
</span> </span>
} }
key="5" key="StudioHistory"
> >
<StudioHistory /> <StudioHistory />
</TabPane> </TabPane>
...@@ -79,7 +90,7 @@ const StudioConsole = (props:any) => { ...@@ -79,7 +90,7 @@ const StudioConsole = (props:any) => {
函数 函数
</span> </span>
} }
key="6" key="StudioFX"
> >
<StudioFX /> <StudioFX />
</TabPane> </TabPane>
...@@ -90,7 +101,7 @@ const StudioConsole = (props:any) => { ...@@ -90,7 +101,7 @@ const StudioConsole = (props:any) => {
文档 文档
</span> </span>
} }
key="7" key="StudioDocument"
> >
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
</TabPane> </TabPane>
......
import styles from "./index.less"; import styles from "./index.less";
import {Menu, Dropdown, Tooltip, Row, Col,Popconfirm,notification} from "antd"; import {Menu, Dropdown, Tooltip, Row, Col, Popconfirm, notification, Modal} from "antd";
import {PauseCircleTwoTone, CopyTwoTone, DeleteTwoTone,PlayCircleTwoTone,DiffTwoTone, import {PauseCircleTwoTone, CopyTwoTone, DeleteTwoTone,PlayCircleTwoTone,DiffTwoTone,
FileAddTwoTone,FolderOpenTwoTone,SafetyCertificateTwoTone,SaveTwoTone,FlagTwoTone, FileAddTwoTone,FolderOpenTwoTone,SafetyCertificateTwoTone,SaveTwoTone,FlagTwoTone,
EnvironmentOutlined,SmileOutlined} from "@ant-design/icons"; EnvironmentOutlined,SmileOutlined,RocketTwoTone} from "@ant-design/icons";
import Space from "antd/es/space"; import Space from "antd/es/space";
import Divider from "antd/es/divider"; import Divider from "antd/es/divider";
import Button from "antd/es/button/button"; import Button from "antd/es/button/button";
import Breadcrumb from "antd/es/breadcrumb/Breadcrumb"; import Breadcrumb from "antd/es/breadcrumb/Breadcrumb";
import {StateType} from "@/pages/FlinkSqlStudio/model"; import {StateType} from "@/pages/FlinkSqlStudio/model";
import {connect} from "umi"; import {connect} from "umi";
import { postAll} from "@/components/Common/crud"; import {handleSubmit, postAll} from "@/components/Common/crud";
import {executeSql} from "@/pages/FlinkSqlStudio/service"; import {executeSql} from "@/pages/FlinkSqlStudio/service";
const menu = ( const menu = (
...@@ -69,6 +69,21 @@ const StudioMenu = (props: any) => { ...@@ -69,6 +69,21 @@ const StudioMenu = (props: any) => {
}) })
}; };
const submit=()=>{
Modal.confirm({
title: '异步提交作业',
content: '确定异步提交该作业到其配置的集群吗?',
okText: '确认',
cancelText: '取消',
onOk:async () => {
let task = {
id:current.task.id,
};
handleSubmit('/api/task/submit','作业',[task]);
}
});
};
const saveSqlAndSettingToTask = async() => { const saveSqlAndSettingToTask = async() => {
const fieldsValue = await form.validateFields(); const fieldsValue = await form.validateFields();
if(current.task){ if(current.task){
...@@ -81,9 +96,6 @@ const StudioMenu = (props: any) => { ...@@ -81,9 +96,6 @@ const StudioMenu = (props: any) => {
type: "Studio/saveTask", type: "Studio/saveTask",
payload: task, payload: task,
}); });
/*const success = handleAddOrUpdate('api/task',task);
console.log(success);
console.log(tabs);*/
}else{ }else{
} }
...@@ -91,7 +103,8 @@ const StudioMenu = (props: any) => { ...@@ -91,7 +103,8 @@ const StudioMenu = (props: any) => {
const runMenu = ( const runMenu = (
<Menu> <Menu>
<Menu.Item onClick={execute}>执行</Menu.Item> <Menu.Item onClick={execute}>同步执行</Menu.Item>
<Menu.Item onClick={submit}>异步提交</Menu.Item>
</Menu> </Menu>
); );
...@@ -174,6 +187,13 @@ const StudioMenu = (props: any) => { ...@@ -174,6 +187,13 @@ const StudioMenu = (props: any) => {
onClick={execute} onClick={execute}
/> />
</Tooltip> </Tooltip>
<Tooltip title="提交当前的作业到集群">
<Button
type="text"
icon={<RocketTwoTone />}
onClick={submit}
/>
</Tooltip>
<Popconfirm <Popconfirm
title="您确定要停止所有的 FlinkSql 任务吗?" title="您确定要停止所有的 FlinkSql 任务吗?"
// onConfirm={confirm} // onConfirm={confirm}
......
...@@ -6,7 +6,7 @@ import {getCatalogueTreeData} from "@/pages/FlinkSqlStudio/service"; ...@@ -6,7 +6,7 @@ import {getCatalogueTreeData} from "@/pages/FlinkSqlStudio/service";
import {convertToTreeData, DataType, TreeDataNode} from "@/components/Studio/StudioTree/Function"; import {convertToTreeData, DataType, TreeDataNode} from "@/components/Studio/StudioTree/Function";
import style from "./index.less"; import style from "./index.less";
import {StateType} from "@/pages/FlinkSqlStudio/model"; import {StateType} from "@/pages/FlinkSqlStudio/model";
import {getInfoById, handleAddOrUpdate, handleInfo, handleRemove} from "@/components/Common/crud"; import {getInfoById, handleAddOrUpdate, handleInfo, handleRemove, handleSubmit} from "@/components/Common/crud";
import UpdateCatalogueForm from './components/UpdateCatalogueForm'; import UpdateCatalogueForm from './components/UpdateCatalogueForm';
import {ActionType} from "@ant-design/pro-table"; import {ActionType} from "@ant-design/pro-table";
import UpdateTaskForm from "@/components/Studio/StudioTree/components/UpdateTaskForm"; import UpdateTaskForm from "@/components/Studio/StudioTree/components/UpdateTaskForm";
...@@ -77,6 +77,8 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -77,6 +77,8 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
setRightClickNodeTreeItem(null); setRightClickNodeTreeItem(null);
if(key=='Open'){ if(key=='Open'){
toOpen(rightClickNode); toOpen(rightClickNode);
}else if(key=='Submit'){
toSubmit(rightClickNode);
}else if(key=='CreateCatalogue'){ }else if(key=='CreateCatalogue'){
createCatalogue(rightClickNode); createCatalogue(rightClickNode);
}else if(key=='CreateTask'){ }else if(key=='CreateTask'){
...@@ -99,7 +101,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -99,7 +101,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
return; return;
} }
} }
const result = getInfoById('api/task',node.taskId); const result = getInfoById('/api/task',node.taskId);
result.then(result=>{ result.then(result=>{
let newTabs = tabs; let newTabs = tabs;
let newPane = { let newPane = {
...@@ -140,6 +142,21 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -140,6 +142,21 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
} }
}; };
const toSubmit=(node:TreeDataNode)=>{
Modal.confirm({
title: '提交作业',
content: '确定提交该作业到其配置的集群吗?',
okText: '确认',
cancelText: '取消',
onOk:async () => {
let task = {
id:node.taskId,
};
handleSubmit('/api/task/submit','作业',[task]);
}
});
};
const toRename=(node:TreeDataNode)=>{ const toRename=(node:TreeDataNode)=>{
handleUpdateCatalogueModalVisible(true); handleUpdateCatalogueModalVisible(true);
setIsCreate(false); setIsCreate(false);
...@@ -171,7 +188,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -171,7 +188,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
okText: '确认', okText: '确认',
cancelText: '取消', cancelText: '取消',
onOk:async () => { onOk:async () => {
await handleRemove('api/catalogue',[node]); await handleRemove('/api/catalogue',[node]);
getTreeData(); getTreeData();
} }
}); });
...@@ -190,9 +207,16 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -190,9 +207,16 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
if(rightClickNode&&rightClickNode.isLeaf){ if(rightClickNode&&rightClickNode.isLeaf){
menuItems=(<> menuItems=(<>
<Menu.Item key='Open'>{'打开'}</Menu.Item> <Menu.Item key='Open'>{'打开'}</Menu.Item>
<Menu.Item key='Submit'>{'异步提交'}</Menu.Item>
<Menu.Item key='Rename'>{'重命名'}</Menu.Item> <Menu.Item key='Rename'>{'重命名'}</Menu.Item>
<Menu.Item key='Delete'>{'删除'}</Menu.Item> <Menu.Item key='Delete'>{'删除'}</Menu.Item>
</>) </>)
}else if(rightClickNode&&rightClickNode.children&&rightClickNode.children.length>0){
menuItems=(<>
<Menu.Item key='CreateCatalogue'>{'创建目录'}</Menu.Item>
<Menu.Item key='CreateTask'>{'创建作业'}</Menu.Item>
<Menu.Item key='Rename'>{'重命名'}</Menu.Item>
</>)
}else{ }else{
menuItems=(<> menuItems=(<>
<Menu.Item key='CreateCatalogue'>{'创建目录'}</Menu.Item> <Menu.Item key='CreateCatalogue'>{'创建目录'}</Menu.Item>
...@@ -259,7 +283,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -259,7 +283,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
<UpdateCatalogueForm <UpdateCatalogueForm
onSubmit={async (value) => { onSubmit={async (value) => {
const success = await handleAddOrUpdate( const success = await handleAddOrUpdate(
isCreate?'api/catalogue':'api/catalogue/toRename',value); isCreate?'/api/catalogue':'/api/catalogue/toRename',value);
if (success) { if (success) {
handleUpdateCatalogueModalVisible(false); handleUpdateCatalogueModalVisible(false);
setCatalogueFormValues({}); setCatalogueFormValues({});
...@@ -278,7 +302,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => { ...@@ -278,7 +302,7 @@ const StudioTree: React.FC<StudioTreeProps> = (props) => {
{updateTaskModalVisible? ( {updateTaskModalVisible? (
<UpdateTaskForm <UpdateTaskForm
onSubmit={async (value) => { onSubmit={async (value) => {
const success = await handleAddOrUpdate('api/catalogue/createTask',value); const success = await handleAddOrUpdate('/api/catalogue/createTask',value);
if (success) { if (success) {
handleUpdateTaskModalVisible(false); handleUpdateTaskModalVisible(false);
setTaskFormValues({}); setTaskFormValues({});
......
...@@ -195,7 +195,6 @@ const Model: ModelType = { ...@@ -195,7 +195,6 @@ const Model: ModelType = {
newCurrent=payload.panes[i]; newCurrent=payload.panes[i];
} }
} }
console.log(newCurrent);
return { return {
...state, ...state,
current:{ current:{
...@@ -247,7 +246,6 @@ const Model: ModelType = { ...@@ -247,7 +246,6 @@ const Model: ModelType = {
} }
} }
newSession.push(payload); newSession.push(payload);
console.log(newSession);
return { return {
...state, ...state,
session:newSession, session:newSession,
......
...@@ -68,10 +68,13 @@ export default (): React.ReactNode => { ...@@ -68,10 +68,13 @@ export default (): React.ReactNode => {
<Paragraph> <Paragraph>
<ul> <ul>
<li> <li>
<Link href="">FlinkSql Studio 会话管理</Link> <Link href="">FlinkSql Studio 进程监控</Link>
</li> </li>
<li> <li>
<Link href="">FlinkSql Studio 进程监控</Link> <Link href="">FlinkSql Studio 集群总览</Link>
</li>
<li>
<Link href="">FlinkSql Studio 集群任务</Link>
</li> </li>
<li> <li>
<Link href="">FlinkSql Studio 任务详情</Link> <Link href="">FlinkSql Studio 任务详情</Link>
......
...@@ -49,7 +49,6 @@ const Login: React.FC = () => { ...@@ -49,7 +49,6 @@ const Login: React.FC = () => {
const fetchUserInfo = async () => { const fetchUserInfo = async () => {
const userInfo = await initialState?.fetchUserInfo?.(); const userInfo = await initialState?.fetchUserInfo?.();
console.log(userInfo);
if (userInfo) { if (userInfo) {
setInitialState({ setInitialState({
...initialState, ...initialState,
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
<modules> <modules>
<module>dlink-core</module> <module>dlink-core</module>
<module>dlink-admin</module> <module>dlink-admin</module>
<module>dlink-connector</module>
</modules> </modules>
<properties> <properties>
...@@ -120,6 +121,11 @@ ...@@ -120,6 +121,11 @@
<artifactId>dlink-core</artifactId> <artifactId>dlink-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.dlink</groupId>
<artifactId>dlink-connector</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build> <build>
......
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