<el-form ref="form" :rules="rules" :model="form">
<el-table
class="treat-table"
:data="form.dataTable.slice((pageIndex-1)*pageSize,pageIndex*pageSize)"
height="100%"
@cell-dblclick="dbClickHandle"
@selection-change="handleSelectionChange"
>
<el-table-column align="center" type="selection" width="50" />
<el-table-column label="序号" width="60px" align="center">
<template slot-scope="scope">
{{ setIndex(scope.$index,pageIndex,pageSize) }}
</template>
</el-table-column>
<el-table-column label="设备名称" width="100px" show-overflow-tooltip prop="AssetName" />
<el-table-column label="策略名称" prop="RuleName">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['RuleName']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.RuleName' " :rules="rules.RuleName" :data="form.dataTable.RuleName">
<el-input
:ref="'RuleName'+$index"
v-model="row.RuleName"
@keyup.enter.native="$event.target.blur"
@change="handleEdit(row, $index)"
@blur="inputBlur(row,$index,'RuleName')"
/>
</el-form-item>
<span v-if="!showEdit[$index]['RuleName']">{{ row.RuleName }}</span>
</template>
</el-table-column>
<el-table-column label="协议" prop="Prot" width="100">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['Prot']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.Prot' " :data="form.dataTable.Prot">
<el-select
:ref="'Prot'+$index"
v-model="row.Prot"
filterable
@visible-change="visibleChange($event,row,$index,'Prot')"
@change="selectChange(row, $index)"
>
<el-option
v-for="item in protList"
:key="item.id"
:label="item.Prot"
:value="item.Prot"
/>
</el-select>
</el-form-item>
<span v-if="!showEdit[$index]['Prot']">{{ row.Prot }}</span>
</template>
</el-table-column>
<el-table-column label="业务规则" prop="BusinessIndex" width="150">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['BusinessIndex']" class="el-form-item-class" :prop=" 'dataTable.' + $index + '.BusinessIndex' " :data="form.dataTable.BusinessIndex">
<el-select
:ref="'BusinessIndex'+$index"
v-model="row.BusinessIndex"
filterable
@visible-change="visibleChange($event,row,$index,'BusinessIndex')"
@change="selectChange(row, $index)"
>
<el-option
v-for="item in businessList"
:key="item.BusinessIndex"
:label="item.BusinessName"
:value="item.BusinessIndex"
/>
</el-select>
</el-form-item>
<span v-if="!showEdit[$index]['BusinessIndex']">{{ toBusiness(row.BusinessIndex) }}</span>
</template>
</el-table-column>
<el-table-column label="源地址" prop="Srcip" width="220">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['Srcip']" :prop=" 'dataTable.' + $index + '.Srcip' " :rules="rules.Srcip">
<el-input
:ref="'Srcip'+$index"
v-model="row.Srcip"
oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\\[\]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、\u4e00-\u9fa5]/g, '')"
@keyup.enter.native="$event.target.blur"
@change="handleEdit(row, $index)"
@blur="inputBlur(row,$index,'Srcip')"
/>
</el-form-item>
<span v-if="!showEdit[$index]['Srcip']">{{ row.Srcip }}</span>
</template>
</el-table-column>
<el-table-column label="源端口" prop="Srcport" width="120">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['Srcport']" :prop=" 'dataTable.' + $index + '.Srcport' " :rules="rules.Srcport">
<el-input
:ref="'Srcport'+$index"
v-model="row.Srcport"
oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\\[\]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、\u4e00-\u9fa5]/g, '')"
@keyup.enter.native="$event.target.blur"
@change="handleEdit(row, $index)"
@blur="inputBlur(row,$index,'Srcport')"
/>
</el-form-item>
<span v-if="!showEdit[$index]['Srcport']">{{ row.Srcport }}</span>
</template>
</el-table-column>
<el-table-column label="目的地址" prop="Dstip" width="220">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['Dstip']" :prop=" 'dataTable.' + $index + '.Dstip' " :rules="rules.Dstip">
<el-input
:ref="'Dstip'+$index"
v-model="row.Dstip"
oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\\[\]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、\u4e00-\u9fa5]/g, '')"
@keyup.enter.native="$event.target.blur"
@change="handleEdit(row, $index)"
@blur="inputBlur(row,$index,'Dstip')"
/>
</el-form-item>
<span v-if="!showEdit[$index]['Dstip']">{{ row.Dstip }}</span>
</template>
</el-table-column>
<el-table-column label="目的端口" prop="Dstport" width="120">
<template slot-scope="{row,$index}">
<el-form-item v-if="showEdit[$index]['Dstport']" :prop=" 'dataTable.' + $index + '.Dstport' " :rules="rules.Dstport">
<el-input
:ref="'Dstport'+$index"
v-model="row.Dstport"
oninput="value=value.replace(/[ a-zA-Z`~!@#$%^&()_+=<>?{}|,;'\\[\]·~!@#¥%……&()——+={}|《》?:“”【】、;‘’,。、\u4e00-\u9fa5]/g, '')"
@keyup.enter.native="$event.target.blur"
@change="handleEdit(row, $index)"
@blur="inputBlur(row,$index,'Dstport')"
/>
</el-form-item>
<span v-if="!showEdit[$index]['Dstport']">{{ row.Dstport }}</span>
</template>
</el-table-column>
<el-table-column label="启用" align="center" width="50">
<template slot-scope="scope">
<el-switch
:value="scope.row.using"
active-color="#227EE1"
inactive-color="#BCBCBC"
@change="changeC(scope.row)"
/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="250">
<template slot-scope="scope">
<el-tooltip content="下发" placement="top" effect="light">
<img
style="cursor: pointer;height:13px;width:13px"
:src="require('@/assets/button-Icon/down1.png')"
@click="IssueHandleCheck([scope.row])"
>
</el-tooltip>
<el-tooltip content="关联事件" placement="top" effect="light">
<img
style="margin-top:5px;cursor: pointer;margin-left:10px"
:src="require('@/assets/button-Icon/associate.png')"
@click="openEventDialog(scope.row)"
>
</el-tooltip>
</template>
</el-table-column>
</el-table>
</el-form>
js:
export default {
name: 'GatekeeperTreat',
components: {
ComponentEventsDialog,
ComponentLoginValidate
},
directives: {
focus: {
// 指令的定义
inserted: function(el) {
el.focus()
}
}
},
data() {
// 判断Ip
var checkIp = (rule, value, callback) => {
checkValidateIpAndPort(value, 'IP', callback)
callback()
}
// 判断端口
var checkPort = (rule, value, callback) => {
checkValidateIpAndPort(value, 'PORT', callback)
callback()
}
return {
form: {
dataTable: [
]
},
// dataTable: [],
pageIndex: 1,
pageSize: 15,
totleCount: 0,
multipleSelection: [],
loading: false,
businessList: [
{ BusinessIndex: 0,
BusinessName: '无' }
],
// 显示编辑框
showEdit: [],
// 协议数据
protList: [
{
id: 0,
Prot: 'TCP'
},
{
id: 1,
Prot: 'UDP'
},
{
id: 2,
Prot: 'ICMP'
}
],
loginIshow: false, // 是否显示二次验证弹框
// 校验
rules: {
// 名称
RuleName: [
{ required: true, message: '名称不能为空', trigger: 'blur' },
{ min: 1, max: 63, message: '长度在 1 到 63 个字符', trigger: 'blur' }
],
// 源地址
Srcip: [
{ required: true, message: '源地址不能为空', trigger: 'blur' },
{ validator: checkIp, trigger: 'blur' }
],
// 源端口
Srcport: [
{ required: true, message: '源端口不能为空', trigger: 'blur' },
{ validator: checkPort, trigger: 'blur' }
],
// 目的地址
Dstip: [
{ required: true, message: '目的地址不能为空', trigger: 'blur' },
{ validator: checkIp, trigger: 'blur' }
],
// 目的端口
Dstport: [
{ required: true, message: '目的端口不能为空', trigger: 'blur' },
{ validator: checkPort, trigger: 'blur' }
]
}
}
},
watch: {
// 监控tableData数据,发生改变的时候跟新单元格显示状态
'form.dataTable': function() {
this.setShowEdit()
}
},
methods: {
showUs(datas) {
this.analysis(datas)
},
setIndex(index, page, size) {
return index + 1 + (page - 1) * size
},
visibleChange(flag, row, index, column) {
if (!flag) {
this.inputBlur(row, index, column)
}
},
// 初始化单元格显示状态
setShowEditInit() {
for (const item of this.showEdit) {
for (const innerItem in item) {
item[innerItem] = false
}
}
},
// 设置单元显示转换数据
setShowEdit() {
const tempShowEdit = []
for (const item of this.form.dataTable) {
const tempShow = {}
for (const innerItem in item) {
tempShow[innerItem] = false
}
tempShowEdit.push(tempShow)
}
this.showEdit = tempShowEdit
},
// 切换单元格为编辑
dbClickHandle(row, column, cell, event) {
const nowObj = column.property
const index = this.form.dataTable.indexOf(row)
this.showEdit[index][nowObj] = true
if (nowObj === 'BusinessIndex') {
this.getBusinessHandle(row.Code)
}
this.$nextTick(() => {
this.$refs[nowObj + index].focus()
})
},
// 点击修改
handleEdit(row, index) {
this.form.dataTable[index] = row
},
// 失焦
inputBlur(row, index, column) {
const idx = this.form.dataTable.indexOf(row)
if (idx === index) {
var datas = this.showEdit[index]
var prop = 'dataTable.' + index + '.' + column
this.$refs['form'].validateField(prop, (error) => {
if (!error) {
if (datas) {
for (const innerItem in datas) {
if (innerItem === column && datas[innerItem]) {
datas[innerItem] = false
}
}
}
}
})
}
},
// 下拉框修改
selectChange(row, index) {
const tempTableData = this.form.dataTable
tempTableData[index] = row
this.form.dataTable = tempTableData
},
// 下发(校验有错误不让下发)
IssueHandleCheck(datas) {
this.$refs['form'].validate((valid) => {
if (!valid) return
if (datas && datas.length > 0) {
this.$refs.LoginValidateRef.showUs()
if (this.loginIshow) {
this.$refs.LoginValidateRef.executePar(() => {
this.loading = true
this.bulkAddGatekeeper(datas)
})
} else {
this.loading = true
this.bulkAddGatekeeper(datas)
}
} else {
this.$message.info('请选择下发策略')
this.loading = false
}
})
},
bulkAddGatekeeper(datas) {
bulkAddGatekeeper(datas, this.$store.state.user.accountName).then(res => {
if (res) {
if (res.code === 0) {
this.$message.success('策略下发成功')
this.$emit('initData', true)
} else {
this.$message.error(res.msg)
}
}
this.loading = false
}).catch(err => {
this.loading = false
console.error(err)
})
},
toBusiness(str) {
var result = '无'
for (var business of this.businessList) {
if (business.BusinessIndex === str) {
result = business.BusinessName
break
}
}
return result
},
// 单选框选中获取数据
handleSelectionChange(val) {
this.multipleSelection = val
},
// 页面改变
pageSizeChange(pageSize) {
this.pageSize = pageSize
},
// 当前页
pageCurrentChange(pageIndex) {
this.pageIndex = pageIndex
},
// 获取业务规则
async getBusinessHandle(id) {
const data = {
id: id
}
this.businessList = [
{ BusinessIndex: 0,
BusinessName: '无' }
]
await LoadBusiness(data).then(res => {
if (res) {
if (res.code === 0) {
this.businessList = []
this.businessList = res.data.data.Data
this.businessList.unshift({
BusinessIndex: 0,
BusinessName: '无'
})
} else {
this.$message.error(res.msg)
}
}
})
},
openEventDialog(data) {
this.$refs.eventsDialogRef.showUs(data)
},
// 是否启用
changeC(data) {
data.using = !data.using
}
}
}