提交 340dd613 authored 作者: taojinlong's avatar taojinlong

fix: API 数据源校验

上级 ac5703b4
...@@ -367,7 +367,6 @@ public class JdbcProvider extends DatasourceProvider { ...@@ -367,7 +367,6 @@ public class JdbcProvider extends DatasourceProvider {
try (Connection con = getConnection(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) { try (Connection con = getConnection(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) {
return "Success"; return "Success";
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
DataEaseException.throwException(e.getMessage()); DataEaseException.throwException(e.getMessage());
} }
return "Error"; return "Error";
......
...@@ -467,6 +467,10 @@ public class ExtractDataService { ...@@ -467,6 +467,10 @@ public class ExtractDataService {
while ((line = input.readLine()) != null) { while ((line = input.readLine()) != null) {
errMsg = errMsg + line + System.getProperty("line.separator"); errMsg = errMsg + line + System.getProperty("line.separator");
} }
input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) {
errMsg = errMsg + line + System.getProperty("line.separator");
}
throw new Exception(errMsg); throw new Exception(errMsg);
} }
}catch (Exception e){ }catch (Exception e){
......
...@@ -161,7 +161,16 @@ public class DatasourceService { ...@@ -161,7 +161,16 @@ public class DatasourceService {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource); datasourceRequest.setDatasource(datasource);
datasourceProvider.checkStatus(datasourceRequest); String status = datasourceProvider.checkStatus(datasourceRequest);
if (status.equalsIgnoreCase("Success")) {
return ResultHolder.success("Success");
}
if (status.equalsIgnoreCase("Warning")) {
return ResultHolder.error("Datasource has invalid items");
}
if (status.equalsIgnoreCase("Error")) {
return ResultHolder.error("Datasource is invalid");
}
return ResultHolder.success("Success"); return ResultHolder.success("Success");
}catch (Exception e){ }catch (Exception e){
return ResultHolder.error("Datasource is invalid: " + e.getMessage()); return ResultHolder.error("Datasource is invalid: " + e.getMessage());
...@@ -178,8 +187,17 @@ public class DatasourceService { ...@@ -178,8 +187,17 @@ public class DatasourceService {
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasource); datasourceRequest.setDatasource(datasource);
datasourceProvider.checkStatus(datasourceRequest); String status = datasourceProvider.checkStatus(datasourceRequest);
datasource.setStatus("Success"); datasource.setStatus(status);
if (status.equalsIgnoreCase("Success")) {
return ResultHolder.success("Success");
}
if (status.equalsIgnoreCase("Warning")) {
return ResultHolder.error("Datasource has invalid items");
}
if (status.equalsIgnoreCase("Error")) {
return ResultHolder.error("Datasource is invalid");
}
return ResultHolder.success("Success"); return ResultHolder.success("Success");
}catch (Exception e){ }catch (Exception e){
datasource.setStatus("Error"); datasource.setStatus("Error");
...@@ -206,7 +224,8 @@ public class DatasourceService { ...@@ -206,7 +224,8 @@ public class DatasourceService {
// 获取当前数据源下的db类型数据集 // 获取当前数据源下的db类型数据集
DatasetTableExample datasetTableExample = new DatasetTableExample(); DatasetTableExample datasetTableExample = new DatasetTableExample();
datasetTableExample.createCriteria().andTypeEqualTo("db").andDataSourceIdEqualTo(datasource.getId());
datasetTableExample.createCriteria().andTypeIn(Arrays.asList("db","api")).andDataSourceIdEqualTo(datasource.getId());
List<DatasetTable> datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); List<DatasetTable> datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample);
List<DBTableDTO> list = new ArrayList<>(); List<DBTableDTO> list = new ArrayList<>();
for (TableDesc tableDesc : tables) { for (TableDesc tableDesc : tables) {
...@@ -256,6 +275,7 @@ public class DatasourceService { ...@@ -256,6 +275,7 @@ public class DatasourceService {
DatasourceExample example = new DatasourceExample(); DatasourceExample example = new DatasourceExample();
DatasourceExample.Criteria criteria = example.createCriteria(); DatasourceExample.Criteria criteria = example.createCriteria();
criteria.andNameEqualTo(datasource.getName()); criteria.andNameEqualTo(datasource.getName());
criteria.andTypeEqualTo(datasource.getType());
if (StringUtils.isNotEmpty(datasource.getId())) { if (StringUtils.isNotEmpty(datasource.getId())) {
criteria.andIdNotEqualTo(datasource.getId()); criteria.andIdNotEqualTo(datasource.getId());
} }
...@@ -271,8 +291,16 @@ public class DatasourceService { ...@@ -271,8 +291,16 @@ public class DatasourceService {
public ApiDefinition checkApiDatasource(ApiDefinition apiDefinition) throws Exception { public ApiDefinition checkApiDatasource(ApiDefinition apiDefinition) throws Exception {
String response = ApiProvider.execHttpRequest(apiDefinition); String response = ApiProvider.execHttpRequest(apiDefinition);
if(StringUtils.isEmpty(response)){
throw new Exception("该请求返回数据为空");
}
List<LinkedHashMap> datas = new ArrayList<>();
try {
datas = JsonPath.read(response,apiDefinition.getDataPath());
}catch (Exception e){
throw new Exception("jsonPath 路径错误:" + e.getMessage());
}
List<LinkedHashMap> datas = JsonPath.read(response,apiDefinition.getDataPath());
List<JSONObject> dataList = new ArrayList<>(); List<JSONObject> dataList = new ArrayList<>();
List<DatasetTableField> fields = new ArrayList<>(); List<DatasetTableField> fields = new ArrayList<>();
Boolean getFileds = true; Boolean getFileds = true;
......
...@@ -1310,7 +1310,7 @@ export default { ...@@ -1310,7 +1310,7 @@ export default {
port_no_less_then_0: 'Port cannot be less than zero', port_no_less_then_0: 'Port cannot be less than zero',
priority: 'Advanced setting', priority: 'Advanced setting',
extra_params: 'Extra JDBC connection string', extra_params: 'Extra JDBC connection string',
please_input_dataPath: '请输入 JsonPath 数据路径', please_input_dataPath: 'Please enter the JsonPath data path',
warning: 'Contains invalid datasets', warning: 'Contains invalid datasets',
data_table: 'Dataset Table', data_table: 'Dataset Table',
data_table_name: 'Dataset Table name', data_table_name: 'Dataset Table name',
......
...@@ -125,7 +125,7 @@ export default { ...@@ -125,7 +125,7 @@ export default {
methods: { methods: {
initDataSource() { initDataSource() {
listDatasource().then(response => { listDatasource().then(response => {
this.options = response.data this.options = response.data.filter(item => item.type !== 'api')
}) })
}, },
kettleState() { kettleState() {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<el-row> <el-row>
<el-row style="height: 26px;" class="title-text"> <el-row style="height: 26px;" class="title-text">
<span style="line-height: 26px;"> <span style="line-height: 26px;">
{{ param.tableId?$t('dataset.edit_sql'):$t('dataset.add_sql_table') }} {{ param.tableId ? $t('dataset.edit_sql') : $t('dataset.add_sql_table') }}
</span> </span>
<el-row style="float: right"> <el-row style="float: right">
<el-button size="mini" @click="cancel"> <el-button size="mini" @click="cancel">
...@@ -14,11 +14,12 @@ ...@@ -14,11 +14,12 @@
</el-button> </el-button>
</el-row> </el-row>
</el-row> </el-row>
<el-divider /> <el-divider/>
<el-row> <el-row>
<el-form :inline="true"> <el-form :inline="true">
<el-form-item class="form-item"> <el-form-item class="form-item">
<el-select v-model="dataSource" filterable :placeholder="$t('dataset.pls_slc_data_source')" size="mini" @change="changeDatasource()"> <el-select v-model="dataSource" filterable :placeholder="$t('dataset.pls_slc_data_source')" size="mini"
@change="changeDatasource()">
<el-option <el-option
v-for="item in options" v-for="item in options"
:key="item.id" :key="item.id"
...@@ -28,19 +29,20 @@ ...@@ -28,19 +29,20 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item class="form-item"> <el-form-item class="form-item">
<el-input v-model="name" size="mini" :placeholder="$t('commons.name')" /> <el-input v-model="name" size="mini" :placeholder="$t('commons.name')"/>
</el-form-item> </el-form-item>
<el-form-item v-if="!param.tableId" class="form-item"> <el-form-item v-if="!param.tableId" class="form-item">
<el-select v-model="mode" filterable :placeholder="$t('dataset.connect_mode')" size="mini"> <el-select v-model="mode" filterable :placeholder="$t('dataset.connect_mode')" size="mini">
<el-option :label="$t('dataset.direct_connect')" value="0" /> <el-option :label="$t('dataset.direct_connect')" value="0"/>
<el-option :label="$t('dataset.sync_data')" value="1" :disabled="!kettleRunning || selectedDatasource.type==='es' || selectedDatasource.type==='ck'|| selectedDatasource.type==='mongo'|| selectedDatasource.type==='redshift' || selectedDatasource.type==='hive'" /> <el-option :label="$t('dataset.sync_data')" value="1"
:disabled="!kettleRunning || selectedDatasource.type==='es' || selectedDatasource.type==='ck'|| selectedDatasource.type==='mongo'|| selectedDatasource.type==='redshift' || selectedDatasource.type==='hive'"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="mode === '1'" class="form-item"> <el-form-item v-if="mode === '1'" class="form-item">
<el-select v-model="syncType" filterable :placeholder="$t('dataset.connect_mode')" size="mini"> <el-select v-model="syncType" filterable :placeholder="$t('dataset.connect_mode')" size="mini">
<el-option :label="$t('dataset.sync_now')" value="sync_now" /> <el-option :label="$t('dataset.sync_now')" value="sync_now"/>
<el-option :label="$t('dataset.sync_latter')" value="sync_latter" /> <el-option :label="$t('dataset.sync_latter')" value="sync_latter"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
...@@ -62,7 +64,9 @@ ...@@ -62,7 +64,9 @@
<el-card class="box-card dataPreview" shadow="never"> <el-card class="box-card dataPreview" shadow="never">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>{{ $t('dataset.data_preview') }}</span> <span>{{ $t('dataset.data_preview') }}</span>
<el-button style="float: right; padding: 3px 0" type="text" size="mini" @click="getSQLPreview">{{ $t('dataset.preview') }}</el-button> <el-button style="float: right; padding: 3px 0" type="text" size="mini" @click="getSQLPreview">
{{ $t('dataset.preview') }}
</el-button>
</div> </div>
<div class="text item"> <div class="text item">
<ux-grid <ux-grid
...@@ -95,9 +99,9 @@ ...@@ -95,9 +99,9 @@
</template> </template>
<script> <script>
import { post, listDatasource, isKettleRunning } from '@/api/dataset/dataset' import {post, listDatasource, isKettleRunning} from '@/api/dataset/dataset'
import { codemirror } from 'vue-codemirror' import {codemirror} from 'vue-codemirror'
import { getTable } from '@/api/dataset/dataset' import {getTable} from '@/api/dataset/dataset'
// 核心样式 // 核心样式
import 'codemirror/lib/codemirror.css' import 'codemirror/lib/codemirror.css'
// 引入主题后还需要在 options 中指定主题才会生效 // 引入主题后还需要在 options 中指定主题才会生效
...@@ -123,7 +127,7 @@ import 'codemirror/addon/hint/show-hint' ...@@ -123,7 +127,7 @@ import 'codemirror/addon/hint/show-hint'
export default { export default {
name: 'AddSQL', name: 'AddSQL',
components: { codemirror }, components: {codemirror},
props: { props: {
param: { param: {
type: Object, type: Object,
...@@ -163,7 +167,7 @@ export default { ...@@ -163,7 +167,7 @@ export default {
}, },
watch: { watch: {
'param.tableId': { 'param.tableId': {
handler: function() { handler: function () {
this.resetComponent() this.resetComponent()
this.initTableInfo() this.initTableInfo()
} }
...@@ -199,14 +203,14 @@ export default { ...@@ -199,14 +203,14 @@ export default {
}, },
calHeight() { calHeight() {
const that = this const that = this
setTimeout(function() { setTimeout(function () {
const currentHeight = document.documentElement.clientHeight const currentHeight = document.documentElement.clientHeight
that.height = currentHeight - 56 - 30 - 26 - 25 - 43 - 160 - 10 - 37 - 20 - 10 - 16 that.height = currentHeight - 56 - 30 - 26 - 25 - 43 - 160 - 10 - 37 - 20 - 10 - 16
}, 10) }, 10)
}, },
initDataSource() { initDataSource() {
listDatasource().then(response => { listDatasource().then(response => {
this.options = response.data this.options = response.data.filter(item => item.type !== 'api')
}) })
}, },
...@@ -237,7 +241,7 @@ export default { ...@@ -237,7 +241,7 @@ export default {
dataSourceId: this.dataSource, dataSourceId: this.dataSource,
type: 'sql', type: 'sql',
// info: '{"sql":"' + this.sql + '"}', // info: '{"sql":"' + this.sql + '"}',
info: JSON.stringify({ sql: this.sql.trim() }) info: JSON.stringify({sql: this.sql.trim()})
}).then(response => { }).then(response => {
this.fields = response.data.fields this.fields = response.data.fields
this.data = response.data.data this.data = response.data.data
...@@ -280,7 +284,7 @@ export default { ...@@ -280,7 +284,7 @@ export default {
syncType: this.syncType, syncType: this.syncType,
mode: parseInt(this.mode), mode: parseInt(this.mode),
// info: '{"sql":"' + this.sql + '"}', // info: '{"sql":"' + this.sql + '"}',
info: JSON.stringify({ sql: this.sql.trim() }) info: JSON.stringify({sql: this.sql.trim()})
} }
post('/dataset/table/update', table).then(response => { post('/dataset/table/update', table).then(response => {
// this.$store.dispatch('dataset/setSceneData', new Date().getTime()) // this.$store.dispatch('dataset/setSceneData', new Date().getTime())
...@@ -292,9 +296,9 @@ export default { ...@@ -292,9 +296,9 @@ export default {
cancel() { cancel() {
// this.dataReset() // this.dataReset()
if (this.param.tableId) { if (this.param.tableId) {
this.$emit('switchComponent', { name: 'ViewTable', param: this.param.table }) this.$emit('switchComponent', {name: 'ViewTable', param: this.param.table})
} else { } else {
this.$emit('switchComponent', { name: '' }) this.$emit('switchComponent', {name: ''})
} }
}, },
...@@ -327,48 +331,51 @@ export default { ...@@ -327,48 +331,51 @@ export default {
</script> </script>
<style scoped> <style scoped>
.el-divider--horizontal { .el-divider--horizontal {
margin: 12px 0; margin: 12px 0;
} }
.form-item { .form-item {
margin-bottom: 6px; margin-bottom: 6px;
} }
.el-checkbox { .el-checkbox {
margin-bottom: 14px; margin-bottom: 14px;
margin-left: 0; margin-left: 0;
margin-right: 14px; margin-right: 14px;
} }
.el-checkbox.is-bordered + .el-checkbox.is-bordered { .el-checkbox.is-bordered + .el-checkbox.is-bordered {
margin-left: 0; margin-left: 0;
} }
.codemirror { .codemirror {
height: 160px; height: 160px;
overflow-y: auto; overflow-y: auto;
} }
.codemirror >>> .CodeMirror-scroll {
height: 160px;
overflow-y: auto;
}
.dataPreview>>>.el-card__header{ .codemirror >>> .CodeMirror-scroll {
padding: 6px 8px; height: 160px;
} overflow-y: auto;
}
.dataPreview>>>.el-card__body{ .dataPreview >>> .el-card__header {
padding:10px; padding: 6px 8px;
} }
span{ .dataPreview >>> .el-card__body {
font-size: 14px; padding: 10px;
} }
.span-number{
color: #0a7be0; span {
} font-size: 14px;
.table-count{ }
color: #606266;
} .span-number {
color: #0a7be0;
}
.table-count {
color: #606266;
}
</style> </style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论