• Element中el-form嵌套el-table双击编辑提交检验


     <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;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
        }
      }
    }
    

      

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/14794971.html
Copyright © 2020-2023  润新知