vue 渲染数组,拖拽排序,渲染同一个数组拖拽排序不影响其他选中行状态

news2024/11/16 20:56:12

当我们能够设置单行状态改变的时候,那么肯定可以拿到选中的当前行的id或者下标index。
只要设定一个初始化值在拖拽开始的时候重新赋值,然后再处理选中状态的时候进行判断即可。
前期写的时候没有注意到这个问题,可以看这个文章。

在复测的时候发现了,当我改变任意一个排序的时候会影响到其他的状态。虽然其他行的顺序没有变化,但是设定的颜色却渲染了。
解决 ,在data 中初始设定一个新的变量 承接 选中的行的父元素下标 startIndex: ‘’, 在开始拖拽的时候获取并重新赋值, this.startIndex = i,在 isSelected 处理改变颜色的时候判断即可。
在这里插入图片描述

以前的问题

在这里插入图片描述
解决后不在影响
在这里插入图片描述
主要的代码也就在这里,天机了传值和接收赋值处理

isSelected(i, j) {
console.log(this.startIndex, ‘///this.startIndex’, i);
if(this.startIndex === i){
return j === this.selectedIndex; // 判断该图标是否被选中
}
},
dragStart (i, j, item2) {
console.log(i, j, item2, ‘----------------’);
this.startIndex = i // 开始选中的行下标。
this.dragStartIndex = j
this.dragStartData = item2
this.selectedIndex = j; // 更新选中的索引值
},
在这里插入图片描述

<template>
  <div class="atomizing-wrap">
    <div class="liquid-wrap">
      <div class="conduit1">
        <!-- <img src="../../../assets/images/emulsification/liquidtank/conduit1.png" alt="">
        <div class="lititle-wrap">
          <lititle title="井下原水"/>
        </div> -->
      </div>
      <div class="liquid-box">
        <liquid :dataInfo="dataInfos.emulsionSite" @liquidClik="liquidClik()"/>
      </div>
    </div>
    <div class="supercharge-box">
      <supercharge :dataInfo="dataInfos.superchargeSite" :typeInfo="dataInfos.emulsionSite"/>
    </div>
    <div class="pump-box">
      <pump :dataInfo="dataInfos" @pumpClik="pumpClik()"/>
    </div>
    <zmjdialog ref="zmjdialog" top="10vh" width="900px" @confirm="confirm" @cancel="cancel" >
      <el-form ref="ruleForm" :model="formData" label-width="150px">
        <div class="df">
          <!-- :rules="[{ required: true, message: '请输入测点', trigger: ['blur', 'change'] }]" -->
          <el-form-item
            prop="emulsionSite.site"
            label="清水箱测点"
          >
            <el-input v-model="formData.emulsionSite.site" placeholder="请输入清水箱测点">
            </el-input>
          </el-form-item>
          <el-form-item
          label-width="80px"
            prop="emulsionSite.unit"
            label="单位"
          >
            <el-input v-model="formData.emulsionSite.unit" :style="{width: '100px'}" placeholder="请输入单位">
            </el-input>
          </el-form-item>
          <el-form-item
          label-width="80px"
            prop="emulsionSite.maxValue"
            label="满量程"
          >
            <el-input v-model="formData.emulsionSite.maxValue" type="number" :style="{width: '100px'}" placeholder="满量程">
            </el-input>
          </el-form-item>
        </div>
        <div class="df">
          <el-form-item
            prop="systemSite.site"
            label="喷雾泵系统压力测点"
          >
            <el-input v-model="formData.systemSite.site" placeholder="请输入喷雾泵系统压力">
            </el-input>
          </el-form-item>
              <el-form-item
              label-width="80px"
            prop="systemSite.unit"
            label="单位"
          >
            <el-input v-model="formData.systemSite.unit" :style="{width: '100px'}" placeholder="请输入单位">
            </el-input>
          </el-form-item>
        </div>
        <div class="pressurize">
          <div class="addpressurize" @click="addpressurize">添加喷雾增压</div>
          <el-form-item
            v-for="(item, i) in formData.superchargeSite"
            :key="i"
            :label="`${i+1}#喷雾增压`"
          >
            <el-input v-model="item.site" placeholder="请输入喷雾增压测点">
            </el-input>
            <div v-if="i !== 0" class="el-icon-remove" @click="deletepressurize(i)"></div>
          </el-form-item>
              <!-- <el-form-item
              label-width="80px"
            prop="superchargeSite.number"
            label="数量"
            :rules="[{ required: true, message: '请输入数量', trigger: ['blur', 'change'] },{ validator: validatenum, trigger: 'blur'}]"
          >
            <el-input v-model="formData.superchargeSite.number" type="number" :style="{width: '100px'}" placeholder="请输入数量">
            </el-input>
          </el-form-item> -->
        </div>
        <div class="pump-list">
          <div class="title">
            <span>喷雾泵</span>
            <ul>
              <!-- <li @click="pumpcancel">取消</li> -->
              <li @click="addpump">添加</li>
            </ul>
          </div>
          <div class="ulmine">
            <el-collapse v-model="activeNames" @change="handleChange">
              <el-collapse-item v-for="(item, i) in formData.pumplist" :key="i" :name="i">
                <template slot="title">
                  {{ i+1 }}#{{ item.title }}
                  <div class="pumpdelete" @click.stop="pumpdelete(i)">删除</div>
                </template>
                <div class="ulmine-div">
                  <div class="addpumpsite" @click="addpumpsite(i)">添加测点</div>
                  <div class="df">
                    <el-form-item
                    label-width="100px"
                    label="喷雾泵测点"
                    >
                      <el-input v-model="item.site" placeholder="请输入测点">
                      </el-input>
                    </el-form-item>
                    <el-form-item
                    label-width="80px"
                    label="分站远控"
                    >
                      <el-switch
                        v-model="item.control"
                        >
                      </el-switch>
                    </el-form-item>
                    <el-form-item
                    label-width="80px"
                    label="解锁"
                    >
                      <el-switch
                        v-model="item.unlock"
                        >
                      </el-switch>
                    </el-form-item>
                  </div>
                  <div v-for="(item2, j) in item.list"
                    :key="j"
                    class="df"
                    draggable="true"
                    @dragstart="dragStart(i, j, item2)"
                    @dragover.prevent="dragOver(j)"
                    @dragend="dragEnd(i)"
                  >
                    <i class="el-icon-s-fold" :class="{'selected': isSelected(i, j)}"></i>
                    <el-form-item
                    label-width="100px"
                    label="测点名称"
                    >
                      <el-input v-model="item2.label" placeholder="请输入测点名称">
                      </el-input>
                    </el-form-item>
                    <el-form-item
                      label-width="50px"
                      label="测点"
                    >
                      <el-input v-model="item2.site" :style="{width: '100px'}" placeholder="请输入测点">
                      </el-input>
                    </el-form-item>
                    <el-form-item
                      label-width="50px"
                      label="单位"
                    >
                      <el-input v-model="item2.unit" :style="{width: '100px'}" placeholder="请输入单位">
                      </el-input>
                    </el-form-item>
                    <el-form-item
                      label-width="60px"
                      label="最大值"
                    >
                      <el-input v-model="item2.maxValue" type="number" :style="{width: '100px'}" placeholder="最大值">
                      </el-input>
                    </el-form-item>
                    <div class="el-icon-remove" @click="deletepumpsite(i,j)"></div>
                  </div>
                </div>
              </el-collapse-item>
            </el-collapse>
          </div>
        </div>
      </el-form>
    </zmjdialog>
    <zmjdialog ref="childInfoDialog" width="850px" top="30vh"  :title="`${label}历史数据`" @confirm="childInfoDialog">
      <zmj-echarts :ref="`historicalLineEcharts${EchartsId}`" :echarts-id="`historicalLineEcharts${EchartsId}`" :height="'200px'"></zmj-echarts>
    </zmjdialog>
  </div>
</template>

<script>
import ZmjEcharts from '@/components/zmjEcharts.vue'
import { shearerOptions } from '../../components/echarts/Historicalline.js'

export default {
  name: 'atomizing',
  components: {
    ZmjEcharts,
    liquid: () => import('./liquid.vue'),
    // lititle: () => import('./li-title.vue'),
    supercharge: () => import('./supercharge.vue'),
    pump: () => import('./pump.vue')
  },
  props: {
    dataInfo: {
      type: Object,
      default (){
        return {}
      }
    },
    dataTypeList: {
      type: Array,
      default (){
        return []
      }
    }
  },
  data () {
    return {
      activeNames: [0],
      formData: {},
      dataInfos: {},
      groupName: '', // 测点大类
      dataName: '', // 测名称
      deviceIdList: 1, // 设备号
      label: null,
      EchartsId: null,
      selectedIndex: -1,
      dragStartIndex: '',
      dragStartData: '',
      startIndex: ''
    }
  },
  watch: {
    dataInfo: {
      immediate: true,
      deep: true,
      handler (val) {
        this.formData = JSON.parse(JSON.stringify(val))
        this.dataInfos = JSON.parse(JSON.stringify(val))
      }
    }
  },
  computed: {},
  created () {},
  mounted () {
    this.bus.$on("waterCustomEvent", (v) => {
      this.dbChange(v, 'pumplistClikqs')
    });
    window.$eventBus.$on('wsMessage', message => {
      let dataType =  message.dataType
      message.data.forEach(val => {
        for(let i in this.dataInfos){
          if(Array.isArray(this.dataInfos[i])){
            this.dataInfos[i].forEach(v => {
              if(this.sifn(v.site) === dataType && this.sifn(v.site, 2) === val.deviceId){
                v.value = val.value
              }
              v.list && v.list.forEach(v2 => {
                if(this.sifn(v2.site) === dataType && this.sifn(v2.site, 2) === val.deviceId){
                  v2.value = val.value
                }
              })
            })
          }else if(this.sifn(this.dataInfos[i].site)  === dataType && this.sifn(this.dataInfos[i].site, 2) ===val.deviceId){
            this.dataInfos[i].value = val.value
          }
        }
      })
    })
  },
  beforeDestroy () {
    window.$eventBus.$off('wsMessage')
  },
  methods: {
    isSelected(i, j) {
      console.log(this.startIndex, '///this.startIndex', i);
      if(this.startIndex === i){
        return j === this.selectedIndex; // 判断该图标是否被选中
      }
    },
    dragStart (i, j, item2) {
      console.log(i, j, item2, '----------------');
      this.startIndex = i // 开始选中的行下标。
      this.dragStartIndex = j
      this.dragStartData = item2
      this.selectedIndex = j; // 更新选中的索引值
    },
    // 只要拖拽元素进入到放置区域就触发,这里实际是鼠标指针进入放置区域才触发
    dragOver (j) {
      this.dragOverIndex = j
    },
    dragEnd (i) {
      const copyTodolist = [...this.formData.pumplist[i].list]
      // 删除老的节点
      copyTodolist.splice(this.dragStartIndex, 1)
      // 在列表中目标位置增加新的节点
      copyTodolist.splice(this.dragOverIndex, 0, this.dragStartData)
      this.selectedIndex = this.dragOverIndex; // 更新选中的索引值
      this.formData.pumplist[i].list = [...copyTodolist]
      this.dragOverIndex = ''
    },
    pumpClik () {
      this.dbChange(this.dataInfos.systemSite, 'pumpClikqs')
    },
    liquidClik () {
      this.dbChange(this.dataInfos.emulsionSite, 'liquidClikqs')
    },
    dbChange(item, EchartsId) {
      this.EchartsId = EchartsId
      this.$refs.childInfoDialog.open()
      let newArr = item?.site?.split('/') || [];
      if(newArr.length === 3){
        this.groupName = `${newArr[0]}` // 测点大类
        this.deviceIdList =  `${newArr[1]}`*1 // 设备号
        this.dataName = `${newArr[2]}` // 测名称
      }
      this.label = item.label || item.title + (item.text ? item.text : '' )
      let params = {
        workFaceCode: window.$getStorage('workFaceInfo').workFaceCode,
        startTime: window.$dayjs().format('YYYY-MM-DD 00:00:00'),
        endTime: window.$dayjs().add(1, 'day').format('YYYY-MM-DD 00:00:00'),
        aggregateType : 'none', // 聚合类型 传none获取原始历史值
        groupName: this.groupName, // 测点大类
        dataName:  this.dataName, // 测名称
        deviceIdList: this.deviceIdList // 设备号
      }
      let thisDataList = null
      window.$axiosGet('deviceHistory', params).then((res) => {
        if(!res.length){
          this.$refs[`historicalLineEcharts${this.EchartsId}`] && this.$refs[`historicalLineEcharts${this.EchartsId}`].upDataEcharts(shearerOptions(res || [], params, this.dataInfos))
          return
        }
        thisDataList = res.map(item => {
          return item.data
        })
        this.$nextTick(() => {
          this.$refs[`historicalLineEcharts${this.EchartsId}`] && this.$refs[`historicalLineEcharts${this.EchartsId}`].getEchartsLiving();
          this.$refs[`historicalLineEcharts${this.EchartsId}`] && this.$refs[`historicalLineEcharts${this.EchartsId}`].upDataEcharts(shearerOptions(thisDataList || [], params, this.dataInfos))
        })
      }).catch(() => {
        this.$refs[`historicalLineEcharts${this.EchartsId}`] && this.$refs[`historicalLineEcharts${this.EchartsId}`].upDataEcharts(shearerOptions(thisDataList || [], params, this.dataInfos))
      })
    },
    childInfoDialog () {
      this.$refs.childInfoDialog.close()
    },
    sifn (v, i = 1) {
      if(v){
        let arr = v.split('/')
        if(arr.length === 3){
          if(i === 1){
            return `${arr[0]}_${arr[2]}`
          }else if(i === 2) {
            return Number(arr[1])
          }
        }else{
          return v
        }
      }else{
        return v
      }
    },
    handleChange (val) {
      console.log(val)
    },
    validatenum (rule, value, callback) {
      if (value === ''||value === null) {
        callback(new Error('数量不能为空'))
      } else if (Number(value) < 1 || Number(value) > 4) {
        callback(new Error('数量必须大于0且小于等于4'))
      } else {
        callback()
      }
    },
    // 乳化增压
    addpressurize () {
      if(this.formData.superchargeSite.length >= 4){
        this.$message.warning('喷雾增压最多添加4个')
        return
      }
      this.formData.superchargeSite.push({
        site: null,
        value: null
      })
    },
    // 乳化增压删除
    deletepressurize (i) {
      this.formData.superchargeSite.splice(i, 1)
    },
    addpump () {
      if(this.formData.pumplist.length >= 4){
        this.$message.warning('喷雾泵最多添加4个')
        return
      }
      this.formData.pumplist.push(
        {
          title: '喷雾泵',
          label: '喷雾泵测点',
          site: null,
          control: true,
          unlock: true,
          list: []
        }
      )
    },
    // 乳化泵取消修改
    pumpcancel () {

    },
    // 乳化泵删除
    pumpdelete (i) {
      if(this.formData.pumplist.length <= 1){
        this.$message.warning('喷雾泵最少有1个')
        return
      }
      this.formData.pumplist.splice(i, 1)
    },
    // 乳化泵测点添加
    addpumpsite (i) {
      this.formData.pumplist[i].list.push({
        label: null,
        site: null,
        unit: null,
        maxValue: null,
        value: null
      })
    },
    // 乳化泵测点删除
    deletepumpsite (i, j) {
      this.formData.pumplist[i].list.splice(j, 1)
    },
    edit () {
      this.formData = JSON.parse(JSON.stringify(this.dataInfo))
      this.$refs.zmjdialog.open()
    },
    confirm (){
      this.selectedIndex = -1;
      this.dragStartIndex = '';
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          this.$refs.zmjdialog.close()
          let arr = []
          for(let i in this.formData){
            if(Array.isArray(this.formData[i])){
              this.formData[i].forEach(v => {
                arr.push(v.site)
                v.list && v.list.forEach(v2 => {
                  arr.push(v2.site)
                })
              })
            }else{
              arr.push(this.formData[i].site)
            }
          }
          this.$emit('update:dataTypeList', arr)
          this.$emit('update:dataInfo', this.formData)
          this.$message.success('保存成功')
        } else {
          return false
        }
      })
    },
    cancel () {
      this.selectedIndex = -1;
      this.dragStartIndex = '';
      console.log('取消')
    }
  }
}
</script>
  <style lang="scss" scoped>
  .atomizing-wrap{
    position: relative;
      text-align: left;
  }
  .liquid-wrap{
      width:260px;
      margin-left: 20px;
      position: relative;
  }
  .conduit1{
      position: absolute;
      top: 20px;
      .lititle-wrap{
          position: absolute;
          top: 0;
          left: 20px;
      }
  }
  .liquid-box{
      position: absolute;
      left: 50px;
      top: 90px;
  }
  .supercharge-box{
      position: absolute;
      left: 246px;
      top: 45px;
  }
  .pump-box{
    position: absolute;
      left: 483px;
      top: 45px;
  }
  .pump-list{
  color: #fff;
  border:1px solid #999;
  border-radius: 5px;
  .title{
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 16px;
    width: 100%;
    height: 36px;
    background: rgba(238, 238, 238, 0.08);
    border-bottom: 1px solid #314150;
    box-sizing: border-box;
    ul{
      display: flex;
      li{
        margin-left: 8px;
        width: 64px;
        line-height: 24px;
        font-size: 14px;
        text-align: center;
        border-radius: 3px;
        user-select: none;
    cursor: pointer;
      }
      // >li:nth-child(1){
      //   border: 1px solid rgba(255, 255, 255, 0.24);
      // }
      >li:nth-child(1){
        border: 1px solid #0088FF;
      }
    }
  }
  .ulmine{
    padding: 10px 20px;
    height: 400px;
    overflow: hidden;
    overflow-y: scroll;
    .ulmine-div{
      position: relative;
      padding: 15px 0;
    }
    .el-icon-remove{
      cursor: pointer;
      height: 36px;
      line-height: 36px;
      font-size: 20px;
      padding-left: 15px;
      color: #999;
    }
    .pumpdelete{
        width: 64px;
        line-height: 24px;
        font-size: 14px;
        text-align: center;
        border-radius: 3px;
        cursor: pointer;
        border: 1px solid #B23B3B;
        margin-left: 620px;
    }
    .addpumpsite{
      position: absolute;
      line-height: 24px;
      font-size: 14px;
      text-align: center;
      border-radius: 3px;
      cursor: pointer;
      //right: 10px;
      top: 20px;
      width: 84px;
      right: 30px;
      border: 1px solid #0088FF;
    }
    .el-icon-s-fold{
      margin-top: 12px;
      color: #fff;
    }
    .selected {
      color: red; /* 设置选中时的颜色 */
    }
    ::v-deep{
      .el-collapse{
        border: none;
      }
      .el-collapse-item__header{
        padding-left: 20px;
        //background: transparent;
        color: #fff;
        border-bottom:none;
        background: rgba(238, 238, 238, 0.08);
      }
      .el-collapse-item__wrap{
        background: transparent;
        border-bottom: 1px dashed #7a7d80;
      }
      .el-collapse-item__content{
        color: #fff;
        padding-bottom: 0;
      }
    }
  }
  .ulmine::-webkit-scrollbar {
        display: none;
    }
}
.pressurize{
  position: relative;
  flex-wrap:wrap;
  .addpressurize{
    color: #fff;
    position: absolute;
      line-height: 24px;
      font-size: 14px;
      text-align: center;
      border-radius: 3px;
      cursor: pointer;
      left: 412px;
      top: 5px;
      width: 104px;
      border: 1px solid #0088FF;
      z-index: 99;
  }
  .el-icon-remove{
    cursor: pointer;
      height: 36px;
      line-height: 36px;
      font-size: 20px;
      padding-left: 10px;
      color: #999;
  }
}
  </style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keepalived 双机热备

本章主要内容&#xff1a; Keepalived 双机热备基础知识学会构建双机热备系统学会构建LVSHA 高可用群集 简介 在这个高度信息化的IT时代&#xff0c;企业的生产系统&#xff0c;业务运营&#xff0c;销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机和服务&#…

uboot工作原理介绍

uboot其实和电脑的BIOS是一个原理&#xff0c;它主要做两件事: &#xff08;1&#xff09;初始化硬件&#xff1b; &#xff08;2&#xff09;将系统文件&#xff08;或者说是内核&#xff09;从flash中读出来加载到DDR里面执行。 给大家解释下面几个问题&#xff1a; 为什么…

IDEA 中搭建 Spring Boot Maven 多模块项目 (父SpringBoot+子Maven)

第1步&#xff1a;新建一个SpringBoot 项目 作为 父工程 [Ref] 新建一个SpringBoot项目 删除无用的 .mvn 目录、 src 目录、 mvnw 及 mvnw.cmd 文件&#xff0c;最终只留 .gitignore 和 pom.xml 第2步&#xff1a;创建 子maven模块 第3步&#xff1a;整理 父 pom 文件 ① …

数据结构--排序

参考【算法】排序算法之希尔排序 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/122632213 1. 排序的定义 2. 插入排序 2.1 直接插入排序 在插入第i&#xff08;i>1)个记录时&#xff0c;前面的i-1个记录已经排好序 void insertSort(int r[],int n) {for(int i2;i<…

华为设备vlan下配置MSTP,STP选举

核心代码,不同实例&#xff0c;承载不同流量&#xff0c;为每个实例设置一个根网桥达到分流的效果 stp region-config //进入stp区域的设置 region-name R1 //区域命名为R1 instance 1 vlan 10 …

运维知识点-Sqlite

Sqlite 引入 依赖 引入 依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.36.0.3</version></dependency>import javafx.scene.control.Alert; import java.sql.*;public clas…

快乐学Python,数据分析之使用爬虫获取网页内容

在上一篇文章中&#xff0c;我们了解了爬虫的原理以及要实现爬虫的三个主要步骤&#xff1a;下载网页-分析网页-保存数据。 下面&#xff0c;我们就来看一下&#xff1a;如何使用Python下载网页。 1、网页是什么&#xff1f; 浏览器画网页的流程&#xff0c;是浏览器将用户输…

2023 安洵杯-PWN-【seccomp】

文章目录 检查设置注意事项 源码main函数sub_40143E(a1,a2,a3)sub_40119E()沙箱规则sub_40136E() 思路注意exp无chmod版本有chmod版本 检查 设置 在当前文件夹下或者其他地方建个flag文件&#xff0c;内容自己随意定&#x1f604; 注意事项 记得将动态链接器和动态库的文件…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

2023国赛 陕西省省级二等奖得主 数学建模学习资源推荐

美国最为权威的数学建模参考书Mathematical Modeling 在前言部分对数学建模有一个比较通俗易懂的解释&#xff1a; Mathematical modeling is the link between mathematics and the rest of the world. You ask a question. You think a bit, and then you refine the questi…

W25Q64讲解及历程

W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff08;ROM&#xff09;&#xff0c; ROM的特点就是掉电不丢失也就是非易失性存储器&#xff0c;和RAM掉电丢失不同&#xff1b; 常应用于数据存储、字库存储、固件程序存储等场景&#xff1b; 存储介质&…

x-cmd pkg | mermaid - 流程图、时序图等图表绘制工具

简介 mermaid-cli 是由 Mermaid 官方提供的命令行工具&#xff0c;用于将 Mermaid 语法的文本转换为 SVG / PNG / PDF。 Mermaid 是一个基于 JavaScript 的图表绘制工具&#xff0c;它使用简单的文本描述语法&#xff0c;就可以绘制出流程图、时序图、甘特图等多种图表。 首次…

跟着cherno手搓游戏引擎【6】ImGui和ImGui事件

导入ImGui&#xff1a; 下载链接&#xff1a; GitHub - TheCherno/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C with minimal dependencies 新建文件夹&#xff0c;把下载好的文件放入对应路径&#xff1a; SRC下的premake5.lua文件&#…

48 WAF绕过-权限控制之代码混淆及行为造轮子

目录 Safedog代码层手写及脚本绕过BT Aliyun代码层手写及脚本绕过safedog&#xff0c;BT&#xff0c;Aliyun-基于覆盖加密变异下编码解码绕过-代码层Safedog&#xff0c;BT&#xff0c;Aliyun-基于冰蝎新型控制器绕过全面测试-行为层Safedog,BT,Aliyun-基于手写新型控制器绕过全…

kotlin运行

1.使用android studio 由于我本身是做android的&#xff0c;android studio本身有内置kotlin的插件。但若只是想跑kotlin的程序&#xff0c;并不像和android程序绑在一起&#xff0c;可以创建一个kt文件&#xff0c;在里面写一个main函数&#xff0c;就可以直接运行kotlin程序…

如何隐藏服务器真实IP地址,隐藏服务器IP有什么好处

首先我们介绍了隐藏服务器IP的概念及工作模式&#xff0c;接着阐述了其对于DDoS攻击的防护作用。然后介绍了如何利用隐藏服务器IP增加系统性能和稳定性。接着我们讲述了如何隐藏服务器IP防止黑客攻击&#xff0c;最后总结了隐藏服务器IP在保护服务器和用户数据方面发挥的作用。…

10分钟读完一篇 AI 论文!​

已经2024年了&#xff0c;该出现一个写论文解读的AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff…

计算机网络期末复习(基础概念+三套卷子练习)

文章目录 第一章&#xff1a;计算机网络概念计算机网络的概念计算机网络体系结构 第二章&#xff1a;物理层物理层的基本概念物理层的基本通信技术 练题专题练习码分多址地址聚合 1.0选择填空大题练习 2.0选择填空大题练习 3.0选择填空大题练习 第一章&#xff1a;计算机网络概…

【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI

1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…

C++多线程学习[三]:成员函数作为线程入口

一、成员函数作为线程入口 #include<iostream> #include<thread> #include<string>using namespace std;class Mythread { public:string str;void Test(){cout << str << endl;} }; int main() {Mythread test;test.str "Test";thr…