Commit c0732c6c by 郁子恒

优化采集表单

parent 4ca0469f
......@@ -425,7 +425,7 @@ export default {
/* 窗口整体样式 */
.tooltips {
min-width: 460px;
min-height: 500px;
min-height: 460px;
background-color: white;
border: solid #3384FF 3px;
position: fixed;
......
......@@ -2,53 +2,42 @@
<div class="collectionForm">
<div style="display: flex;height: 40px;padding-left: 15px;text-align: left;align-items: center;justify-content: space-between;">
<div style="display: flex;">
<el-button style="width: 80px;height: 30px;" size="mini" class="button-new-tag" @click="selectElement" v-if="isSelectForm">批量选择元素</el-button>
<el-button style="width: 80px;height: 30px;" size="mini" class="button-new-tag" @click="selectElement">批量选择元素</el-button>
<el-button style="width: 60px;height: 30px;margin-left: 10px !important;" size="small" class="button-new-tag" @click="cancelSelect" v-if="isSelectForm">取消选择</el-button>
<el-button style="width: 60px;height: 30px;" size="mini" class="button-new-tag" @click="columnBack" v-else>返回</el-button>
</div>
<el-button style="margin-right: 15px;" size="small" class="button-new-tag" @click="getForm" v-if="isSelectForm">获取表单信息</el-button>
</div>
<!-- 全部表格信息 -->
<div style="overflow: auto;height: 305px;" :style="{ width: widthResize + 'px' }">
<vxe-table key="1" :data="SelectFormData" ref="xTableColumn" border class="mytable-scrollbar" height="250" auto-resize style="margin-bottom: 5px;" v-if="isSelectForm">
<vxe-column field="" title="属性名" min-width="150">
<div style="overflow: auto;height: 230px;" :style="{ width: widthResize + 'px' }">
<vxe-table key="1" :data="SelectFormData" ref="xTableColumn" border class="mytable-scrollbar" height="220" auto-resize style="margin-bottom: 5px;">
<vxe-column field="" min-width="150">
<template #header>
<span style="font-size: 13px;">属性名</span>
</template>
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
<span>选中内容:{{ row.text }}</span>
<vxe-input v-model="row.name" placeholder="请填写属性名" size="mini"></vxe-input>
</div>
</template>
</vxe-column>
<vxe-column field="" title="值类型" min-width="170">
<vxe-column field="" min-width="170">
<template #header>
<span style="font-size: 13px;">值类型</span>
</template>
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
<span>选中内容:{{ row.text }}</span>
<el-select style="height: 28px;" v-model="row.type" placeholder="选择值类型" v-if="row.typeOptions.length > 1" :popper-append-to-body="false" filterable remote>
<el-option v-for="num in row.typeOptions" :key="num.xpath" :value="num.value" :label="num.label"></el-option>
<el-option v-for="num in row.typeOptions" :key="num.xpath" :value="num.label" :label="num.value"></el-option>
</el-select>
<vxe-input style="width: 100% !important;" v-model="row.type" :placeholder="row.typeOptions[0].label" size="mini" v-else disabled></vxe-input>
<vxe-input style="width: 100% !important;" v-model="row.type" :placeholder="row.typeOptions[0].value" size="mini" v-else disabled></vxe-input>
</div>
</template>
</vxe-column>
<vxe-column title="操作" min-width="70" fixed="right">
<template #default="{ row }">
<vxe-button status="danger" content="删除" @click="columnDelete(row)" style="width: 50px;"></vxe-button>
</template>
</vxe-column>
</vxe-table>
<vxe-table key="2" :data="formData" ref="xTableColumn2" border class="mytable-scrollbar" height="250" auto-resize style="margin-bottom: 5px;" v-else>
<vxe-column field="" title="属性名" min-width="150">
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
<span>{{ row.name }}</span>
</div>
<vxe-column min-width="70" fixed="right">
<template #header>
<span style="font-size: 13px;">操作</span>
</template>
</vxe-column>
<vxe-column field="" title="内容" min-width="150">
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
<span>{{ row.content }}</span>
</div>
<template #default="{ row }">
<img style="width: 50px;height: 28px;vertical-align: bottom;" src="../assets/close.svg" @click="columnDelete(row)">
</template>
</vxe-column>
</vxe-table>
......@@ -57,14 +46,14 @@
</template>
<script>
// import VXETable, { t } from 'vxe-table'
import VXETable, { t } from 'vxe-table'
export default {
name: 'collectionForm',
components: {},
props: ['activedAction', 'widthResize'],
data () {
return {
isSelectForm: true,
isSelectForm: false,
SelectFormData: [],
formData: [],
form: null,
......@@ -73,23 +62,17 @@ export default {
}
},
created () {
if (this.activedAction.form !== undefined) {
for (let i = 0; i < this.activedAction.form.cells.length; i++) {
let info = {};
info.type = this.activedAction.form.cells[i].type;
info.name = this.activedAction.form.cells[i].name;
info.title = this.activedAction.form.cells[i].title;
info.typeOptions = this.activedAction.form.cells[i].types;
info.xpath = this.activedAction.form.cells[i].xpath;
this.SelectFormData.push(info)
if (this.activedAction.formList == undefined) {
return
}
if (this.activedAction.formList.length !== 0) {
this.SelectFormData = this.activedAction.formList
}
},
mounted () { },
watch: {
SelectFormData: {
handler (newVal) {
this.activedAction.formList = [];
this.activedAction.formList = this.SelectFormData
this.$emit('dataChanged', this.activedAction);
console.log(this.activedAction)
......@@ -103,35 +86,6 @@ export default {
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
methods: {
getForm () {
let _this = this
for (let i = 0; i < _this.SelectFormData.length; i++) {
let obj = {};
obj.name = _this.SelectFormData[i].name;
obj.title = _this.SelectFormData[i].title;
obj.typeOptions = _this.SelectFormData[i].typeOptions;
obj.type = _this.SelectFormData[i].type;
let content = _this.getFormData(_this.SelectFormData[i].xpath, _this.SelectFormData[i].type)
obj.content = content
_this.formData.push(obj)
}
console.log(_this.SelectFormData)
// 验证name属性是否唯一
_this.validateNames(_this.SelectFormData)
},
getFormData (xpath, type) {
// 获取元素
let result = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);
// 获取查询结果的第一个元素
let element = result.iterateNext();
console.log(element)
if (type == 'xpath') {
return xpath
} else {
return element[type]
}
},
// 删除数据行
columnDelete (row) {
let _this = this
......@@ -139,12 +93,6 @@ export default {
!== row._X_ROW_KEY
)
_this.SelectFormData = _this.SelectFormData.filter(xpath => xpath.xpath !== row.xpath);
// _this.form.cells = _this.form.cells.filter(xpath => xpath !== row.xpath);
},
columnBack () {
let _this = this
_this.isSelectForm = true
_this.formData = []
},
// 定义事件处理函数
contextMenuHandler (event) {
......@@ -167,9 +115,9 @@ export default {
if (targetElement.tagName === 'A') {
// 定义一个对象info,用于存储提取的信息
info = {
xpath: 'xpath',
url: 'href',
text: 'text'
xpath: '元素路径',
url: '超链接',
text: '文本'
};
// 将info对象的属性转换为选项数组,每个选项是一个对象包含label和value属性
typeOptions = Object.entries(info).map(([label, value]) => {
......@@ -188,9 +136,9 @@ export default {
} else if (targetElement.tagName === 'IMG') {
// 定义一个对象info,用于存储提取的信息
info = {
xpath: 'xpath',
src: 'src',
alt: 'alt'
xpath: '元素路径',
src: '超链接',
alt: '属性'
};
// 将info对象的属性转换为选项数组,每个选项是一个对象包含label和value属性
typeOptions = Object.entries(info).map(([label, value]) => {
......@@ -207,7 +155,7 @@ export default {
} else {
// 定义一个对象info,用于存储提取的信息
info = {
text: 'text'
text: '文本'
};
// 将info对象的属性转换为选项数组,每个选项是一个对象包含label和value属性
typeOptions = Object.entries(info).map(([label, value]) => {
......@@ -220,7 +168,7 @@ export default {
info.xpath = _this.getElementXPath(targetElement)
// 获取目标元素的文本内容,赋值给info对象的contentText属性
info.text = targetElement.textContent
// info.title = 'columnName'
info.title = 'columnName'
}
info.name = 'ID' + _this.index++
info.type = ''
......@@ -246,41 +194,16 @@ export default {
},
// 选择元素按钮调用
selectElement () {
this.isSelectForm = true;
// 添加事件监听器
document.addEventListener('contextmenu', this.contextMenuHandler, false);
},
// 取消按钮调用
cancelSelect () {
this.isSelectForm = false;
// 在取消按钮点击时移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
validateNames (arr) {
// let _this = this;
let names = new Set();
// 检查元素是否为空
if (this.SelectFormData.length == 0) {
this.$message.error("还未选择元素");
return
}
// 遍历 arr
for (const item of arr) {
// 检查 name 是否为空
if (!item.name) {
this.$message.error("属性名不能为空");
return; // 如果 name 为空,则退出函数
}
// 检查类型是否为空
if (item.typeOptions.length == 1) {
item.type = item.typeOptions[0].value
} else if (item.typeOptions.length > 1) {
if (item.type == '') {
this.$message.error("类型值不能为空");
return;
} else { this.isSelectForm = false }
}
names.add(item.name);
}
}
},
}
</script>
......@@ -292,4 +215,18 @@ export default {
.vxe-input--inner {
width: 120px !important;
}
.vxe-table--render-default .vxe-body--column,
.vxe-table--render-default .vxe-footer--column,
.vxe-table--render-default .vxe-header--column {
line-height: 15px;
text-align: center;
}
.vxe-table--render-default .vxe-body--column:not(.col--ellipsis),
.vxe-table--render-default .vxe-footer--column:not(.col--ellipsis),
.vxe-table--render-default .vxe-header--column:not(.col--ellipsis) {
padding-top: 5px;
padding-bottom: 5px;
}
</style>
\ No newline at end of file
......@@ -22,9 +22,7 @@
</div>
<!-- 全部表格信息 -->
<div style="overflow: auto;height: 290px;" :style="{ width: widthResize + 'px' }">
<vxe-table :data="SelectTableData" ref="xTableColumn" border class="mytable-scrollbar" height="250"
v-if="isSelectTable" auto-resize style="margin-bottom: 5px;" @current-change="currentChangeEvent"
highlight-hover-row highlight-current-row>
<vxe-table :data="SelectTableData" ref="xTableColumn" border class="mytable-scrollbar" height="250" v-if="isSelectTable" auto-resize style="margin-bottom: 5px;" @current-change="currentChangeEvent" highlight-hover-row highlight-current-row>
<vxe-column field="" title="列名" min-width="150">
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
......@@ -45,20 +43,16 @@
<template v-slot="{ row }">
<div style="display: flex;flex-direction: column;">
<!-- <span>选中内容:{{ row.contentText }}</span> -->
<el-select style="height: 28px;" v-model="row.type" placeholder="选择值类型"
v-if="row.typeOptions.length > 1" :popper-append-to-body="false" filterable remote>
<el-option v-for="num in row.typeOptions" :key="num.xpath" :value="num.label"
:label="num.value"></el-option>
<el-select style="height: 28px;" v-model="row.type" placeholder="选择值类型" v-if="row.typeOptions.length > 1" :popper-append-to-body="false" filterable remote>
<el-option v-for="num in row.typeOptions" :key="num.xpath" :value="num.label" :label="num.value"></el-option>
</el-select>
<vxe-input style="width: 100% !important;" v-model="row.type"
:placeholder="row.typeOptions[0].value" size="mini" v-else disabled></vxe-input>
<vxe-input style="width: 100% !important;" v-model="row.type" :placeholder="row.typeOptions[0].value" size="mini" v-else disabled></vxe-input>
</div>
</template>
</vxe-column>
<vxe-column title="操作" min-width="70" fixed="right">
<template #default="{ row }">
<img style="width: 50px;height: 28px;vertical-align: bottom;" src="../assets/close.svg"
@click="columnDelete(row)">
<img style="width: 50px;height: 28px;vertical-align: bottom;" src="../assets/close.svg" @click="columnDelete(row)">
<!-- <vxe-button status="danger" content="删除" @click="columnDelete(row)"
style="width: 50px;"></vxe-button> -->
</template>
......
......@@ -48,7 +48,6 @@ export default {
};
},
created () {
// console.log(this.activedAction);
if (this.activedAction.Target !== undefined) {
this.actionConfig.Target = this.activedAction.Target;
}
......@@ -68,7 +67,6 @@ export default {
this.activedAction.Target = this.actionConfig.Target;
this.activedAction.Attributes = this.actionConfig.Attributes;
this.$emit('dataChanged', this.activedAction);
// console.log(this.activedAction)
},
deep: true
}
......@@ -102,6 +100,7 @@ export default {
},
// 取消按钮调用
cancelSelect () {
this.outputState = false;
// 在取消按钮点击时移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
......
......@@ -8,9 +8,6 @@
</div>
<!-- 表单区域 -->
<el-form label-position="left" :model="actionConfig">
<!-- <el-form-item label="查找方式">
<el-input v-model="actionConfig.Target.Type" disabled></el-input>
</el-form-item> -->
<el-form-item>
<div style="display: flex;width: 100%;">
<span style="font-size: 13px;width: 85px;padding-left: 15px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容:</span>
......@@ -53,7 +50,18 @@ export default {
this.actionConfig.Target = this.activedAction.Target;
}
},
mounted () { },
mounted () {
let _this = this
document.addEventListener('click', function (event) {
// 如果点击的不是当前高亮的元素,移除高亮
if (event.target !== window.currentlyHighlighted) {
if (window.currentlyHighlighted) {
window.currentlyHighlighted.style.backgroundColor = '';
}
window.currentlyHighlighted = null;
}
});
},
beforeDestroy () {
// 在组件销毁前移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
......@@ -86,6 +94,13 @@ export default {
this.actionConfig.Target.Selector = elementInfo.Xpath;
this.actionConfig.Target.InnerText = elementInfo.Text;
this.clickState = false;
// 移除先前元素的背景色(如果有)
if (window.currentlyHighlighted) {
window.currentlyHighlighted.style.backgroundColor = '';
}
// 更新背景色并保存当前元素
event.target.style.backgroundColor = 'orange';
window.currentlyHighlighted = event.target;
// 移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
......@@ -99,6 +114,7 @@ export default {
// 取消按钮调用
cancelSelect () {
this.clickState = false;
// 在取消按钮点击时移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
......
......@@ -54,7 +54,6 @@ export default {
}
},
created () {
// console.log(this.activedAction);
if (this.activedAction.Target !== undefined) {
this.actionConfig.Target = this.activedAction.Target;
}
......@@ -62,7 +61,18 @@ export default {
this.actionConfig.InputValue = this.activedAction.InputValue;
}
},
mounted () { },
mounted () {
let _this = this
document.addEventListener('click', function (event) {
// 如果点击的不是当前高亮的元素,移除高亮
if (event.target !== window.currentlyHighlighted) {
if (window.currentlyHighlighted) {
window.currentlyHighlighted.style.backgroundColor = '';
}
window.currentlyHighlighted = null;
}
});
},
watch: {
actionConfig: {
handler (newVal) {
......@@ -70,7 +80,6 @@ export default {
this.activedAction.InputValue = this.actionConfig.InputValue;
this.activedAction.Script = this.actionConfig.Script;
this.$emit('dataChanged', this.activedAction);
console.log(this.activedAction)
},
deep: true
}
......@@ -89,7 +98,6 @@ export default {
Xpath: this.getElementXPath(element),
TagName: element.tagName
};
console.log(elementInfo.TagName)
if (elementInfo.TagName != 'INPUT') {
this.$message.error("请选择输入框");
this.actionConfig.Target.tagName = '未选择输入框';
......@@ -98,10 +106,15 @@ export default {
this.actionConfig.Target.tagName = '已选择输入框';
}
this.elementInfos = elementInfo;
console.log(event);
this.actionConfig.Target.Selector = elementInfo.Xpath;
this.inputState = false;
// 移除先前元素的背景色(如果有)
if (window.currentlyHighlighted) {
window.currentlyHighlighted.style.backgroundColor = '';
}
// 更新背景色并保存当前元素
event.target.style.backgroundColor = 'orange';
window.currentlyHighlighted = event.target;
// 移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
......@@ -115,6 +128,7 @@ export default {
// 取消按钮调用
cancelSelect () {
this.inputState = false;
// 在取消按钮点击时移除事件监听器
document.removeEventListener('contextmenu', this.contextMenuHandler);
},
......
......@@ -25,7 +25,6 @@ export default {
};
},
created () {
// console.log(this.activedAction);
if (this.activedAction.Script !== undefined) {
this.actionConfig.Script = this.activedAction.Script;
}
......@@ -36,7 +35,6 @@ export default {
handler (newVal) {
this.activedAction.Script = this.actionConfig.Script;
this.$emit('dataChanged', this.activedAction);
console.log(this.activedAction)
},
deep: true
}
......
......@@ -33,7 +33,6 @@ export default {
};
},
created () {
console.log(this.activedAction);
if (this.activedAction.Url !== undefined) {
this.actionConfig.Url = this.activedAction.Url;
}
......@@ -44,7 +43,6 @@ export default {
handler (newVal) {
this.activedAction.Url = this.actionConfig.Url;
this.$emit('dataChanged', this.activedAction);
console.log(this.activedAction)
},
deep: true
}
......
......@@ -26,7 +26,6 @@ export default {
};
},
created () {
// console.log(this.activedAction);
if (this.activedAction.PauseMilliseconds !== undefined) {
this.actionConfig.PauseMilliseconds = this.activedAction.PauseMilliseconds;
}
......@@ -37,7 +36,6 @@ export default {
handler (newVal) {
this.activedAction.PauseMilliseconds = this.actionConfig.PauseMilliseconds;
this.$emit('dataChanged', this.activedAction);
console.log(this.activedAction)
},
deep: true
}
......
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