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

当我们能够设置单行状态改变的时候,那么肯定可以拿到选中的当前行的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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解析HTTP响应的JSON数据

解析HTTP响应的JSON数据是许多Web开发任务中的常见需求。在Go语言中&#xff0c;可以使用标准库中的encoding/json包来轻松解析JSON数据。下面我将详细介绍如何解析HTTP响应的JSON数据。 首先&#xff0c;确保你已经发送了一个HTTP请求并获取到了响应。然后&#xff0c;你可以…

变电站综合自动化监控系统在某物流园35kV变电站中应用

摘 要&#xff1a;Acrel-1000变电站综合自动化系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#xff0c;可实现无人…

博途PLC增量式PID和脉冲轴组合控制阀门开度(算法介绍)

这篇博客我们以S7-1200PLC平台来举例,介绍我们的PID闭环控制器如何控制脉冲轴实现阀门角度控制。SMART PLC PID控制器控制伺服驱动器实现关节角度控制详细内容请参考下面文章: https://rxxw-control.blog.csdn.net/article/details/129658364https://rxxw-control.blog.csdn…

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…

新手小白如何正确做抖音小店无货源?这六个步骤,新手建议收藏!

大家好&#xff0c;我是电商花花。 新手想要做好抖音小店&#xff0c;就要有一个正确的做店方法&#xff0c;很多新手小白在做店的时候踩坑&#xff0c;或者做是不起来&#xff0c;然后开通后没啥订单销量。 下面我就把正确的抖音小店做店方法详细的流程分享出来&#xff0c;…

UniApp+Vue智慧工地信息化管理云平台源码(支持多工地使用)

智慧工地建设的意义 1、提高工程效率 智慧工地可以通过数字化手段&#xff0c;将工地的各个方面进行数字化存储和管理&#xff0c;从而实现的实时监测和共享。这可以大大提高工程的效率&#xff0c;减少工程中的人工干预&#xff0c;并且可以为后续的工程维护和升级提供便利。…

1月16日代码随想录最大二叉树

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构…

【分布式技术】监控平台zabbix对接grafana,优化dashboard

目录 第一步&#xff1a;在zabbix server服务端安装grafana&#xff0c;并启动 第二步&#xff1a; 访问http://ip:3000/login 第三步&#xff1a;创建数据源 第四步&#xff1a;导入dashboard模板 ps&#xff1a;自定义创建新面板 第一步&#xff1a;在zabbix server服务…

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

数仓建模理论与规范

一、 模型架构设计目标 数据仓库的定义 数据仓库是一个面向主题的&#xff08;Subject Oriented&#xff09;、集成的&#xff08;Integrated&#xff09;、相对稳定的&#xff08;Non-Volatile&#xff09;、反映历史变化&#xff08;Time Variant&#xff09;的数据集合&am…

❤ Uniapp使用一(文档和 API 篇)

❤ Uniapp使用一&#xff08;文档和 API 篇&#xff09; 一、介绍 uni-app官网&#xff1a;https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html …

AI嵌入式K210项目(4)-FPIOA

文章目录 前言一、FPIOA是什么&#xff1f;二、FPIOA代码分析总结 前言 磨刀不误砍柴工&#xff0c;在正式开始学习之前&#xff0c;我们先来了解下K210自带的FPIOA&#xff0c;这个概念可能与我们之前学习STM32有很多不同&#xff0c;STM32每个引脚都有特定的功能&#xff0c…

Spring基于AOP(面向切面编程)开发

概述 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&…

通过旋转机械臂,将机械臂上相机拍摄图像的任意点移动至图像中心的方法

计算原理 角度计算 相机CCD大小固定&#xff0c;即相机成像平面大小固定&#xff0c;相机视场角(FOV)仅由相机焦距F决定&#xff1b; 因此&#xff0c;定焦相机的FOV大小固定&#xff0c;通过上图可以看出相机视场角的计算公式为&#xff1a; FOV 2*atan&#xff08;w/2f&…

Windows 下 使用 VSCode 和 arm-none-eabi 编译Linux代码时 mkdir 命令出错

编译环境&#xff1a; IDE: VSCode 交叉编译器&#xff1a;arm-none-eabi make 命令&#xff1a;Mingw-w64 GCC for Windows 64 源代码管理&#xff1a;git 交叉编译器版本和安装目录: E:\work_soft\gcc-arm-none-eabi-10.3-2021.10 Mingw 版本和目录&#xff1a;E:\work_…

C++ 设计模式之外观模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是外观模式 外观模式Facade Pattern , 也被称为“⻔⾯模式”&#xff0c;是⼀种结构型设计模式&#…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】

Vue高级(二)

3.搭建vuex环境 创建文件&#xff1a;src/store/index.js //引入Vue核心库import Vue from vue//引入Vueximport Vuex from vuex//应用Vuex插件Vue.use(Vuex)//准备actions对象——响应组件中用户的动作const actions {}//准备mutations对象——修改state中的数据const mutat…

mac idea 配置docker 插件

mac默认配置 会报错 mac Can’t connect: com.intellij.docker.agent.Api TaskException: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? (Details: [2] No such file or directory) 终端执行 sudo ln -s "$HO…

中学生英语杂志中学生英语杂志社中学生英语编辑部2023年第46期目录

“《中学生英语》教育教改与考试研究中心”课题组课题成果交流 高中英语学习动机因素与其对学习成效的影响研究 仇丽; 3-4 主位推进程序在高中英语读后续写中的应用 陈媛媛; 5-6《中学生英语》投稿&#xff1a;cn7kantougao163.com 小学英语教学:互动式英语词汇记忆…