mirror of
https://github.com/crawlab-team/crawlab.git
synced 2026-01-21 17:21:09 +01:00
* 更新Dockerfile构建文件,升级NodeJS依赖版本。 * 遵循ESLint重新格式化代码,修复部分警告 * 登录Token失效增加登出提示 * 网络请求问题增加错误错误提示 * 升级UI依赖库
249 lines
6.2 KiB
Vue
249 lines
6.2 KiB
Vue
<template>
|
|
<div class="setting-list-table-view">
|
|
<el-row>
|
|
<el-table
|
|
:data="list"
|
|
class="table edit"
|
|
:header-cell-style="{background:'rgb(48, 65, 86)',color:'white'}"
|
|
:cell-style="getCellClassStyle"
|
|
>
|
|
<el-table-column class-name="action" width="80px" align="right">
|
|
<template slot-scope="scope">
|
|
<!-- <i class="action-item el-icon-copy-document" @click="onCopyField(scope.row)"></i>-->
|
|
<i class="action-item el-icon-remove-outline" @click="onRemoveField(scope.row)" />
|
|
<i class="action-item el-icon-circle-plus-outline" @click="onAddField(scope.row)" />
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column :label="$t('Name')" width="240px">
|
|
<template slot-scope="scope">
|
|
<el-input
|
|
v-model="scope.row.name"
|
|
:placeholder="$t('Name')"
|
|
suffix-icon="el-icon-edit"
|
|
@change="onChange(scope.row)"
|
|
/>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column :label="$t('Value')" width="auto" min-width="120px">
|
|
<template slot-scope="scope">
|
|
<el-input
|
|
v-model="scope.row.value"
|
|
:placeholder="$t('Value')"
|
|
suffix-icon="el-icon-edit"
|
|
@change="onChange(scope.row)"
|
|
/>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-row>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
mapState
|
|
} from 'vuex'
|
|
|
|
export default {
|
|
name: 'SettingFieldsTableView',
|
|
props: {
|
|
type: {
|
|
type: String,
|
|
default: 'list'
|
|
},
|
|
title: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
stageNames: {
|
|
type: Array,
|
|
default() {
|
|
return []
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
...mapState('spider', [
|
|
'spiderForm'
|
|
]),
|
|
list() {
|
|
const list = []
|
|
for (const name in this.spiderForm.config.settings) {
|
|
if (Object.prototype.hasOwnProperty.call(this.spiderForm.config.settings, name)) {
|
|
const value = this.spiderForm.config.settings[name]
|
|
list.push({ name, value })
|
|
}
|
|
}
|
|
return list
|
|
}
|
|
},
|
|
created() {
|
|
if (this.list.length === 0) {
|
|
this.$store.commit(
|
|
'spider/SET_SPIDER_FORM_CONFIG_SETTING_ITEM',
|
|
'VARIABLE_NAME_' + Math.floor(new Date().getTime()),
|
|
'VARIABLE_VALUE_' + Math.floor(new Date().getTime())
|
|
)
|
|
}
|
|
},
|
|
methods: {
|
|
onChange(row) {
|
|
if (this.list.filter(d => d.name === row.name).length > 1) {
|
|
this.$message.error(this.$t(`Duplicated field names for ${row.name}`))
|
|
}
|
|
this.$store.commit('spider/SET_SPIDER_FORM_CONFIG_SETTINGS', this.list)
|
|
},
|
|
onRemoveField(row) {
|
|
this.$st.sendEv('爬虫详情', '配置', '删除设置')
|
|
const list = JSON.parse(JSON.stringify(this.list))
|
|
for (let i = 0; i < list.length; i++) {
|
|
if (row.name === list[i].name) {
|
|
list.splice(i, 1)
|
|
}
|
|
}
|
|
if (list.length === 0) {
|
|
list.push({
|
|
name: `VARIABLE_NAME_${Math.floor(new Date().getTime())}`,
|
|
value: `VARIABLE_VALUE_${Math.floor(new Date().getTime())}`
|
|
})
|
|
}
|
|
this.$store.commit('spider/SET_SPIDER_FORM_CONFIG_SETTINGS', list)
|
|
},
|
|
onAddField(row) {
|
|
this.$st.sendEv('爬虫详情', '配置', '添加设置')
|
|
const list = JSON.parse(JSON.stringify(this.list))
|
|
for (let i = 0; i < list.length; i++) {
|
|
if (row.name === list[i].name) {
|
|
const name = 'VARIABLE_NAME_' + Math.floor(new Date().getTime())
|
|
const value = 'VARIABLE_VALUE_' + Math.floor(new Date().getTime())
|
|
list.push({ name, value })
|
|
break
|
|
}
|
|
}
|
|
this.$store.commit('spider/SET_SPIDER_FORM_CONFIG_SETTINGS', list)
|
|
},
|
|
getCellClassStyle({ row, columnIndex }) {
|
|
if (columnIndex === 1) {
|
|
// 字段名称
|
|
if (!row.name) {
|
|
return {
|
|
'border': '1px solid red'
|
|
}
|
|
}
|
|
} else if (columnIndex === 3) {
|
|
// 选择器
|
|
if (!row.css && !row.xpath) {
|
|
return {
|
|
'border': '1px solid red'
|
|
}
|
|
}
|
|
}
|
|
},
|
|
onChangeNextStage(row) {
|
|
this.list.forEach(f => {
|
|
if (f.name !== row.name) {
|
|
this.$set(f, 'next_stage', '')
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.el-table.edit >>> .el-table__body td {
|
|
padding: 0;
|
|
}
|
|
|
|
.el-table.edit >>> .el-table__body td .cell {
|
|
padding: 0;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.el-table.edit >>> .el-input__inner:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.el-table.edit >>> .el-input__inner {
|
|
height: 36px;
|
|
border: none;
|
|
border-radius: 0;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.el-table.edit >>> .el-select .el-input .el-select__caret {
|
|
line-height: 36px;
|
|
}
|
|
|
|
.el-table.edit >>> .button-selector-item {
|
|
cursor: pointer;
|
|
margin: 0 5px;
|
|
}
|
|
|
|
.el-table.edit >>> .el-tag.inactive {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.el-table.edit >>> .action {
|
|
background: none !important;
|
|
border: none;
|
|
}
|
|
|
|
.el-table.edit >>> tr {
|
|
border: none;
|
|
}
|
|
|
|
.el-table.edit >>> tr th {
|
|
border-right: 1px solid rgb(220, 223, 230);
|
|
}
|
|
|
|
.el-table.edit >>> tr td:nth-child(2) {
|
|
border-left: 1px solid rgb(220, 223, 230);
|
|
}
|
|
|
|
.el-table.edit >>> tr td {
|
|
border-right: 1px solid rgb(220, 223, 230);
|
|
}
|
|
|
|
.el-table.edit::before {
|
|
background: none;
|
|
}
|
|
|
|
.el-table.edit >>> .action-item {
|
|
font-size: 14px;
|
|
margin-right: 5px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.el-table.edit >>> .action-item:last-child {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.button-group-container {
|
|
/*display: inline-block;*/
|
|
/*width: 100%;*/
|
|
}
|
|
|
|
.button-group-container .title {
|
|
float: left;
|
|
line-height: 32px;
|
|
}
|
|
|
|
.button-group-container .button-group {
|
|
float: right;
|
|
}
|
|
|
|
.action-button-group {
|
|
display: flex;
|
|
margin-left: 10px;
|
|
}
|
|
|
|
.action-button-group >>> .el-checkbox__label {
|
|
font-size: 12px;
|
|
}
|
|
|
|
.el-table.edit >>> .el-select.disabled .el-input__inner {
|
|
color: lightgrey;
|
|
}
|
|
</style>
|