Merge branch 'master' of github.com:gcpaas/DataRoom

main
wu.jian2 2 years ago
commit 803b2e0f6e

@ -60,7 +60,7 @@
<clickhouse.version>0.3.2</clickhouse.version> <clickhouse.version>0.3.2</clickhouse.version>
<commons-io.version>2.2</commons-io.version> <commons-io.version>2.2</commons-io.version>
<okhttp3.version>4.9.1</okhttp3.version> <okhttp3.version>4.9.1</okhttp3.version>
<dataset.core.version>1.0.1.2023072703.Alpha</dataset.core.version> <dataset.core.version>1.0.1.2023072801.Alpha</dataset.core.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>

@ -147,6 +147,40 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="21">
<el-form-item
label="请求地址"
prop="config.url"
>
<el-input
v-model="dataForm.config.url"
autocomplete="off"
class="bs-el-input"
placeholder="请输入静态请求地址或动态请求地址,动态请求地址必须以${baseUrl}开头"
clearable
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="请求类型"
prop="config.method"
>
<el-radio-group
v-model="dataForm.config.method"
class="bs-radio-wrap"
>
<el-radio-button label="get">
GET
</el-radio-button>
<el-radio-button label="post">
POST
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item
label="标签" label="标签"
@ -160,186 +194,190 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item <el-tabs
label="请求类型" v-model="activeName"
prop="config.method" class="bs-el-tabs tabs-box"
> >
<el-radio-group <el-tab-pane
v-model="dataForm.config.method" label="请求头"
class="bs-radio-wrap" name="head"
> >
<el-radio-button label="get"> <el-form-item
GET prop="config.headers"
</el-radio-button> label-width="0px"
<el-radio-button label="post">
POST
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item
label="请求地址"
prop="config.url"
>
<el-input
v-model="dataForm.config.url"
autocomplete="off"
class="bs-el-input"
placeholder="请输入静态请求地址或动态请求地址,动态请求地址必须以${baseUrl}开头"
clearable
/>
</el-form-item>
<el-form-item
label="请求头"
prop="config.headers"
>
<el-button
type="primary"
@click="addHeader"
>
增加
</el-button>
<el-row
v-for="(item,index) in dataForm.config.headers"
:key="index"
:gutter="10"
:span="21"
>
<el-col :span="5">
<el-form-item
label="键"
:prop="'config.headers.'+index+'.key'"
label-width="50px"
:rules="rules.key"
>
<el-input
v-model="dataForm.config.headers[index].key"
placeholder="请输入键"
clearable
@blur="dataForm.config.headers[index].key = inputChange($event)"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item
label="值"
:prop="'config.headers.'+index+'.value'"
label-width="50px"
:rules="rules.value"
>
<el-input
v-model="dataForm.config.headers[index].value"
placeholder="请输入值"
clearable
@blur="dataForm.config.headers[index].value = inputChange($event)"
/>
</el-form-item>
</el-col>
<el-col
:span="2"
style="text-align: center"
> >
<el-button <el-button
type="primary" type="primary"
@click="delHeader(index)" @click="addHeader"
> >
移除 增加
</el-button> </el-button>
</el-col> <el-row
</el-row> v-for="(item,index) in dataForm.config.headers"
</el-form-item> :key="index"
<el-form-item :gutter="10"
label="请求参数" :span="21"
prop="config.params" style="margin-top: 10px"
:rules="dataForm.config.method==='get'?rules.params:[{ required: false}]"
>
<el-button
type="primary"
@click="addParam"
>
增加
</el-button>
<el-row
v-for="(item,index) in dataForm.config.params"
:key="index"
:gutter="10"
:span="21"
>
<el-col :span="7">
<el-form-item
label="键"
:prop="'config.params.'+index+'.key'"
label-width="50px"
:rules="rules.key"
> >
<el-input <el-col :span="5">
v-model="dataForm.config.params[index].key" <el-form-item
placeholder="请输入键" label="键"
clearable :prop="'config.headers.'+index+'.key'"
@blur="dataForm.config.params[index].key = inputChange($event)" label-width="50px"
/> :rules="rules.key"
</el-form-item> >
</el-col> <el-input
<el-col :span="7"> v-model="dataForm.config.headers[index].key"
<el-form-item placeholder="请输入键"
label="值" clearable
:prop="'config.params.'+index+'.value'" @blur="dataForm.config.headers[index].key = inputChange($event)"
label-width="50px" />
:rules="rules.value" </el-form-item>
> </el-col>
<el-input <el-col :span="5">
v-model="dataForm.config.params[index].value" <el-form-item
placeholder="请输入值" label="值"
clearable :prop="'config.headers.'+index+'.value'"
@blur="dataForm.config.params[index].value = inputChange($event)" label-width="50px"
/> :rules="rules.value"
</el-form-item> >
</el-col> <el-input
<el-col v-model="dataForm.config.headers[index].value"
:span="2" placeholder="请输入值"
style="text-align: center" clearable
@blur="dataForm.config.headers[index].value = inputChange($event)"
/>
</el-form-item>
</el-col>
<el-col
:span="2"
style="text-align: center"
>
<el-button
type="primary"
@click="delHeader(index)"
>
移除
</el-button>
</el-col>
</el-row>
</el-form-item>
</el-tab-pane>
<el-tab-pane
label="请求参数"
name="param"
>
<el-form-item
prop="config.params"
label-width="0px"
:rules="dataForm.config.method==='get'?rules.params:[{ required: false}]"
> >
<el-button <el-button
type="primary" type="primary"
@click="delParam(index)" @click="addParam"
> >
移除 增加
</el-button> </el-button>
</el-col> <el-row
</el-row> v-for="(item,index) in dataForm.config.params"
</el-form-item> :key="index"
<el-form-item :gutter="10"
v-if="dataForm.config.method === 'post'" :span="21"
label="请求体" style="margin-top: 10px"
prop="requestScript" >
> <el-col :span="7">
<el-input <el-form-item
v-model="dataForm.config.body" label="键"
class="bs-el-input" :prop="'config.params.'+index+'.key'"
type="textarea" label-width="50px"
:autosize="{ minRows: 10, maxRows: 10}" :rules="rules.key"
clearable >
/> <el-input
</el-form-item> v-model="dataForm.config.params[index].key"
<el-form-item placeholder="请输入键"
label="请求脚本" clearable
prop="requestScript" @blur="dataForm.config.params[index].key = inputChange($event)"
> />
<codemirror </el-form-item>
v-model.trim="dataForm.config.requestScript" </el-col>
:options="codemirrorOption" <el-col :span="7">
class="code" <el-form-item
/> label="值"
</el-form-item> :prop="'config.params.'+index+'.value'"
<el-form-item label-width="50px"
label="响应脚本" :rules="rules.value"
prop="responseScript" >
> <el-input
<codemirror v-model="dataForm.config.params[index].value"
v-model.trim="dataForm.config.responseScript" placeholder="请输入值"
:options="codemirrorOption" clearable
class="code" @blur="dataForm.config.params[index].value = inputChange($event)"
/> />
</el-form-item> </el-form-item>
</el-col>
<el-col
:span="2"
style="text-align: center"
>
<el-button
type="primary"
@click="delParam(index)"
>
移除
</el-button>
</el-col>
</el-row>
</el-form-item>
</el-tab-pane>
<el-tab-pane
v-if="dataForm.config.method === 'post'"
label="请求体"
name="second"
>
<el-form-item
prop="requestScript"
label-width="0px"
>
<el-input
v-model="dataForm.config.body"
class="bs-el-input"
type="textarea"
:autosize="{ minRows: 10, maxRows: 10}"
clearable
/>
</el-form-item>
</el-tab-pane>
<el-tab-pane
label="请求脚本"
name="reqScript"
>
<el-form-item
prop="requestScript"
label-width="0px"
>
<codemirror
v-model.trim="dataForm.config.requestScript"
:options="codemirrorOption"
class="code"
/>
</el-form-item>
</el-tab-pane>
<el-tab-pane
label="响应脚本"
name="respScript"
>
<el-form-item
prop="responseScript"
label-width="0px"
>
<codemirror
v-model.trim="dataForm.config.responseScript"
:options="codemirrorOption"
class="code"
/>
</el-form-item>
</el-tab-pane>
</el-tabs>
</el-form> </el-form>
<div <div
v-if="isEdit" v-if="isEdit"
@ -479,6 +517,7 @@
> >
<div class="bs-table-box"> <div class="bs-table-box">
<el-table <el-table
v-if="dataPreviewList && dataPreviewList.length"
align="center" align="center"
:data="dataPreviewList" :data="dataPreviewList"
max-height="400" max-height="400"
@ -498,6 +537,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-empty v-else />
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane <el-tab-pane
@ -629,6 +669,7 @@ export default {
} }
} }
return { return {
activeName: 'head',
options: [{ options: [{
value: 'string', value: 'string',
label: '字符串' label: '字符串'
@ -688,7 +729,6 @@ export default {
completeSingle: true completeSingle: true
} }
}, },
activeName: 'data',
dataPreviewList: [], dataPreviewList: [],
outputFieldList: [], outputFieldList: [],
structurePreviewListCopy: [], structurePreviewListCopy: [],
@ -878,54 +918,6 @@ export default {
}) })
this.fieldDesc = fieldDesc this.fieldDesc = fieldDesc
}, },
// //
// replaceParams (paramsList) {
// this.newDataForm = _.cloneDeep(this.dataForm)
// this.newDataForm.config.url = this.evalStrFunc(paramsList, this.newDataForm.config.url)
// this.newDataForm.config.headers = this.evalArrFunc(paramsList, this.newDataForm.config.headers)
// this.newDataForm.config.params = this.evalArrFunc(paramsList, this.newDataForm.config.params)
// this.newDataForm.config.body = this.evalStrFunc(paramsList, this.newDataForm.config.body)
// },
// evalStrFunc (paramsList, string) {
// // name, value { name: '', token: '123'}
// const params = paramsList.reduce((acc, cur) => {
// acc[cur.name] = cur.value
// return acc
// }, {})
// // url ${xxx} ${params.xxx}
// const str = string.replace(/\$\{(\w+)\}/g, (match, p1) => {
// return '${params.' + p1 + '}'
// })
// const transformStr = ''
// // ${}, 使eval
// eval('transformStr = `' + str + '`')
// return transformStr
// },
// evalArrFunc (paramsList, arr) {
// // name, value { name: '', token: '123'}
// const params = paramsList.reduce((acc, cur) => {
// acc[cur.name] = cur.value
// return acc
// }, {})
//
// // name, value { _name: '${name}', _token: '${token}'}
// const paramsListObj = arr.reduce((acc, cur) => {
// acc[cur.key] = cur.value
// return acc
// }, {})
// //
// const paramsListStr = JSON.stringify(paramsListObj)
//
// // url ${xxx} ${params.xxx}
// const str = paramsListStr.replace(/\$\{(\w+)\}/g, (match, p1) => {
// return '${params.' + p1 + '}'
// })
// const transformStr = ''
// // ${}, 使eval
// eval('transformStr = `' + str + '`')
// const obj = JSON.parse(transformStr)
// return obj
// },
// //
getPramsList () { getPramsList () {
const paramNames1 = this.getValName(this.dataForm.config.url) const paramNames1 = this.getValName(this.dataForm.config.url)
@ -977,10 +969,10 @@ export default {
if (this.dataForm.config.requestType === 'frontend') { if (this.dataForm.config.requestType === 'frontend') {
// this.replaceParams(this.dataForm.config.paramsList) // this.replaceParams(this.dataForm.config.paramsList)
axiosFormatting({ ...this.dataForm.config }).then((res) => { axiosFormatting({ ...this.dataForm.config }).then((res) => {
this.dataPreviewList = res.data this.dataPreviewList = res.data && Array.isArray(res.data) ? res.data : []
// //
this.updateOoutputFieldList(this.dataPreviewList) this.updateOoutputFieldList(this.dataPreviewList)
console.log(res) this.$message.success('解析并执行成功')
}) })
} else { } else {
// //
@ -991,7 +983,7 @@ export default {
dataSetType: 'http' dataSetType: 'http'
} }
datasetExecuteTest(executeParams).then(res => { datasetExecuteTest(executeParams).then(res => {
this.dataPreviewList = res this.dataPreviewList = res.data && Array.isArray(res.data) ? res.data : []
// //
this.updateOoutputFieldList(this.dataPreviewList) this.updateOoutputFieldList(this.dataPreviewList)
this.$message.success('解析并执行成功') this.$message.success('解析并执行成功')
@ -1223,4 +1215,7 @@ export default {
.tree-box { .tree-box {
padding: 0; padding: 0;
} }
.tabs-box{
margin-left: 45px;
}
</style> </style>

@ -655,7 +655,11 @@ export default {
getData () { getData () {
const executeParams = { const executeParams = {
dataSourceId: this.dataForm.sourceId, dataSourceId: this.dataForm.sourceId,
script: this.dataForm.fieldInfo.join(','), script:JSON.stringify({
fieldInfo: this.dataForm.fieldInfo,//
tableName: this.dataForm.tableName,
repeatStatus: this.dataForm.repeatStatus
}) ,
// //
params: [], params: [],
dataSetType: 'original', dataSetType: 'original',
@ -856,7 +860,11 @@ export default {
if (!this.dataForm.sourceId || !this.dataForm.tableName) return if (!this.dataForm.sourceId || !this.dataForm.tableName) return
const executeParams = { const executeParams = {
dataSourceId: this.dataForm.sourceId, dataSourceId: this.dataForm.sourceId,
script: this.dataForm.fieldInfo.join(','), script:JSON.stringify({
fieldInfo: this.dataForm.fieldInfo,//
tableName: this.dataForm.tableName,
repeatStatus: this.dataForm.repeatStatus
}) ,
// //
params: [], params: [],
dataSetType: 'original', dataSetType: 'original',

@ -71,28 +71,13 @@ export default {
pageCode: this.pageCode, pageCode: this.pageCode,
size: size, size: size,
type: config.type type: config.type
}).then((res) => { }).then(async (res) => {
let _res = _.cloneDeep(res)
// 如果是http数据集的前端代理则需要调封装的axios请求 // 如果是http数据集的前端代理则需要调封装的axios请求
// if (data.executionByFrontend) {
// axiosFormatting(data.data).then(res => {
// config = this.dataFormatting(config, res)
// this.changeChartConfig(config)
// })
// }
// if (data.datasetType !== 'http' && data.executionByFrontend) {
// try {
// const scriptAfterReplacement = data.data.replace(/\${(.*?)}/g, (match, p) => {
// // 根据parmas的key获取value
// return `'${this.config.dataSource?.params[p]}' || '${p}'`
// })
// // eslint-disable-next-line no-new-func
// const scriptMethod = new Function(scriptAfterReplacement)
// data.data = scriptMethod()
// } catch (error) {
// console.error('数据集脚本执行失败', error)
// }
// }
if (res.executionByFrontend) { if (res.executionByFrontend) {
if (res.data.datasetType === 'http') {
_res = await axiosFormatting(res.data)
}
if (res.data.datasetType === 'js') { if (res.data.datasetType === 'js') {
try { try {
const scriptAfterReplacement = res.data.script.replace(/\${(.*?)}/g, (match, p) => { const scriptAfterReplacement = res.data.script.replace(/\${(.*?)}/g, (match, p) => {
@ -101,13 +86,13 @@ export default {
}) })
// eslint-disable-next-line no-new-func // eslint-disable-next-line no-new-func
const scriptMethod = new Function(scriptAfterReplacement) const scriptMethod = new Function(scriptAfterReplacement)
res.data = scriptMethod() _res.data = scriptMethod()
} catch (error) { } catch (error) {
console.error('JS数据集脚本执行失败', error) console.error('JS数据集脚本执行失败', error)
} }
} }
} }
config = this.dataFormatting(config, res) config = this.dataFormatting(config, _res)
this.changeChartConfig(config) this.changeChartConfig(config)
}).catch((err) => { }).catch((err) => {
console.error(err) console.error(err)
@ -132,15 +117,13 @@ export default {
filterList: filterList || this.filterList filterList: filterList || this.filterList
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
getUpdateChartInfo(params).then((res) => { getUpdateChartInfo(params).then(async (res) => {
let _res = _.cloneDeep(res)
// 如果是http数据集的前端代理则需要调封装的axios请求 // 如果是http数据集的前端代理则需要调封装的axios请求
// if (data.executionByFrontend) {
// axiosFormatting(data.data).then(res => {
// config = this.dataFormatting(config, res)
// this.changeChartConfig(config)
// })
// }
if (res.executionByFrontend) { if (res.executionByFrontend) {
if (res.data.datasetType === 'http') {
_res = await axiosFormatting(res.data)
}
if (res.data.datasetType === 'js') { if (res.data.datasetType === 'js') {
try { try {
const scriptAfterReplacement = res.data.script.replace(/\${(.*?)}/g, (match, p) => { const scriptAfterReplacement = res.data.script.replace(/\${(.*?)}/g, (match, p) => {
@ -149,14 +132,13 @@ export default {
}) })
// eslint-disable-next-line no-new-func // eslint-disable-next-line no-new-func
const scriptMethod = new Function(scriptAfterReplacement) const scriptMethod = new Function(scriptAfterReplacement)
res.data = scriptMethod() _res.data = scriptMethod()
} catch (error) { } catch (error) {
console.error('JS数据集脚本执行失败', error) console.error('JS数据集脚本执行失败', error)
} }
} }
} }
config = this.dataFormatting(config, res) config = this.dataFormatting(config, _res)
this.changeChartConfig(config)
if (this.chart) { if (this.chart) {
// 单指标组件和多指标组件的changeData传参不同 // 单指标组件和多指标组件的changeData传参不同
if (['Liquid', 'Gauge', 'RingProgress'].includes(config.chartType)) { if (['Liquid', 'Gauge', 'RingProgress'].includes(config.chartType)) {

@ -35,12 +35,10 @@ export default function axiosFormatting (customConfig) {
instance.interceptors.response.use(response => { instance.interceptors.response.use(response => {
if (response.data.code === 200) { if (response.data.code === 200) {
// 执行响应脚本 // 执行响应脚本
const resp = _.cloneDeep(response.data) // eslint-disable-next-line no-new-func
eval(newCustomConfig.responseScript) const getResp = new Function('response', newCustomConfig.responseScript)
Message({ const resp = getResp(response)
message: '执行成功', console.log(resp)
type: 'success'
})
return Promise.resolve(resp) return Promise.resolve(resp)
} else { } else {
Message({ Message({
@ -80,7 +78,7 @@ function replaceUrlParam (url, paramName, paramValue) {
} }
// 将参数的值替换掉其他配置中对应属性的值 // 将参数的值替换掉其他配置中对应属性的值
function replaceParams (customConfig) { function replaceParams (customConfig) {
let newConfig = _.cloneDeep(customConfig) const newConfig = _.cloneDeep(customConfig)
newConfig.url = evalStrFunc(newConfig.paramsList, newConfig.url) newConfig.url = evalStrFunc(newConfig.paramsList, newConfig.url)
newConfig.headers = evalArrFunc(newConfig.paramsList, newConfig.headers) newConfig.headers = evalArrFunc(newConfig.paramsList, newConfig.headers)
newConfig.params = evalArrFunc(newConfig.paramsList, newConfig.params) newConfig.params = evalArrFunc(newConfig.paramsList, newConfig.params)

Loading…
Cancel
Save