mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-26 17:49:15 +01:00
* 更新Dockerfile构建文件,升级NodeJS依赖版本。 * 遵循ESLint重新格式化代码,修复部分警告 * 登录Token失效增加登出提示 * 网络请求问题增加错误错误提示 * 升级UI依赖库
221 lines
5.5 KiB
Vue
221 lines
5.5 KiB
Vue
<template>
|
|
<el-dialog
|
|
:title="$t('Parameters')"
|
|
:visible="visible"
|
|
:before-close="beforeClose"
|
|
class="parameters-dialog"
|
|
width="720px"
|
|
>
|
|
<div class="action-wrapper">
|
|
<el-button
|
|
type="primary"
|
|
size="small"
|
|
@click="onAdd"
|
|
>
|
|
{{ $t('Add') }}
|
|
</el-button>
|
|
</div>
|
|
<el-table
|
|
:data="paramData"
|
|
border
|
|
:header-cell-style="{background:'rgb(48, 65, 86)',color:'white'}"
|
|
>
|
|
<el-table-column
|
|
:label="$t('Parameter Type')"
|
|
width="100px"
|
|
>
|
|
<template slot-scope="scope">
|
|
<el-select v-model="scope.row.type" size="small">
|
|
<el-option
|
|
:label="$t('Spider')"
|
|
value="spider"
|
|
/>
|
|
<el-option
|
|
:label="$t('Setting')"
|
|
value="setting"
|
|
/>
|
|
<el-option
|
|
:label="$t('Other')"
|
|
value="other"
|
|
/>
|
|
</el-select>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column
|
|
:label="$t('Parameter Name')"
|
|
width="240px"
|
|
>
|
|
<template slot-scope="scope">
|
|
<el-autocomplete
|
|
v-if="scope.row.type === 'setting'"
|
|
v-model="scope.row.name"
|
|
size="small"
|
|
suffix-icon="el-icon-edit"
|
|
:fetch-suggestions="querySearch"
|
|
/>
|
|
<el-input
|
|
v-else-if="scope.row.type === 'spider'"
|
|
v-model="scope.row.name"
|
|
size="small"
|
|
suffix-icon="el-icon-edit"
|
|
/>
|
|
<div v-else style="text-align: center">
|
|
N/A
|
|
</div>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column
|
|
:label="$t('Parameter Value')"
|
|
>
|
|
<template slot-scope="scope">
|
|
<el-input v-model="scope.row.value" size="small" suffix-icon="el-icon-edit" />
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column
|
|
:label="$t('Action')"
|
|
width="60px"
|
|
align="center"
|
|
>
|
|
<template slot-scope="scope">
|
|
<div class="action-btn-wrapper">
|
|
<el-button type="danger" icon="el-icon-delete" size="mini" circle @click="onRemove(scope.$index)" />
|
|
</div>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
<template slot="footer">
|
|
<el-button type="plain" size="small" @click="$emit('close')">{{ $t('Cancel') }}</el-button>
|
|
<el-button type="primary" size="small" @click="onConfirm">
|
|
{{ $t('Confirm') }}
|
|
</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'ParametersDialog',
|
|
props: {
|
|
visible: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
param: {
|
|
type: String,
|
|
default: ''
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
paramData: []
|
|
}
|
|
},
|
|
watch: {
|
|
visible(value) {
|
|
if (value) this.initParamData()
|
|
}
|
|
},
|
|
methods: {
|
|
beforeClose() {
|
|
this.$emit('close')
|
|
},
|
|
initParamData() {
|
|
const mArr = this.param.match(/((?:-[-a-zA-Z0-9] )?(?:\w+=)?\w+)/g)
|
|
if (!mArr) {
|
|
this.paramData = []
|
|
this.paramData.push({ type: 'spider', name: '', value: '' })
|
|
return
|
|
}
|
|
this.paramData = []
|
|
mArr.forEach(s => {
|
|
s = s.trim()
|
|
const d = {}
|
|
const arr = s.split(' ')
|
|
if (arr.length === 1) {
|
|
d.type = 'other'
|
|
d.value = s
|
|
} else {
|
|
const arr2 = arr[1].split('=')
|
|
d.name = arr2[0]
|
|
d.value = arr2[1]
|
|
if (arr[0] === '-a') {
|
|
d.type = 'spider'
|
|
} else if (arr[0] === '-s') {
|
|
d.type = 'setting'
|
|
} else {
|
|
d.type = 'other'
|
|
d.value = s
|
|
}
|
|
}
|
|
this.paramData.push(d)
|
|
})
|
|
if (this.paramData.length === 0) {
|
|
this.paramData.push({ type: 'spider', name: '', value: '' })
|
|
}
|
|
},
|
|
onConfirm() {
|
|
const param = this.paramData
|
|
.filter(d => d.value)
|
|
.map(d => {
|
|
let s = ''
|
|
if (d.type === 'setting') {
|
|
s = `-s ${d.name}=${d.value}`
|
|
} else if (d.type === 'spider') {
|
|
s = `-a ${d.name}=${d.value}`
|
|
} else if (d.type === 'other') {
|
|
s = d.value
|
|
}
|
|
return s
|
|
})
|
|
.filter(s => !!s)
|
|
.join(' ')
|
|
this.$emit('confirm', param)
|
|
},
|
|
onRemove(index) {
|
|
this.paramData.splice(index, 1)
|
|
},
|
|
onAdd() {
|
|
this.paramData.push({ type: 'spider', name: '', value: '' })
|
|
},
|
|
querySearch(queryString, cb) {
|
|
let data = this.$utils.scrapy.settingParamNames
|
|
if (!queryString) {
|
|
return cb(data.map(s => {
|
|
return { value: s, label: s }
|
|
}))
|
|
}
|
|
data = data
|
|
.filter(s => s.match(new RegExp(queryString, 'i')))
|
|
.sort((a, b) => a < b ? 1 : -1)
|
|
cb(data.map(s => {
|
|
return { value: s, label: s }
|
|
}))
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.parameters-dialog >>> .el-table td,
|
|
.parameters-dialog >>> .el-table td .cell {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
.parameters-dialog >>> .el-table td .cell .el-autocomplete {
|
|
width: 100%;
|
|
}
|
|
|
|
.parameters-dialog >>> .el-table td .cell .el-input__inner {
|
|
border: none;
|
|
}
|
|
|
|
.parameters-dialog .action-wrapper {
|
|
margin-bottom: 10px;
|
|
text-align: right;
|
|
}
|
|
|
|
.parameters-dialog .action-btn-wrapper {
|
|
}
|
|
</style>
|