【vue】iframe相关问题

news2024/9/21 19:07:09

一、刷新iframe页面

iframe的地址没有改变的话,每打开一次iframe页面,都不会主动更新页面的。

以下有几种方法,都可以实现,每打开一次页面,就刷新一下

  1. 给iframe添加key

<template>
  <div id="Iframe">
    <el-dialog
      append-to-body
      style="margin-top: -10vh"
      custom-class="scrollbar"
      :visible.sync="iframeVisible"
      width="90%"
      @close="close"
    >
      <iframe
        :key="key"
        id="iframe"
        ref="iframeBox"
        :src="url"
        frameborder="0"
        width="100%"
        sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
        :style="{ height: calHeight }"
        scrolling="auto"
      ></iframe>
    </el-dialog>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
import { getToken, setToken } from "@/utils/auth";

export default {
  name: "Iframe",
  computed: {
    ...mapGetters(["userid", "name"]),
    //计算属性 , 设置iframe高度为窗口高度少100px
    calHeight() {
      return window.innerHeight - 150 + "px";
    },
  },
  props: {
    url: String,
    dataid: String,
  },
  data() {
    return {
      iframeVisible: false,
      key: new Date().getTime(),
    };
  },
  watch: {
    // 方法一:
    // iframe上添加key,然后监听
    $route: {
      handler(val) {
        this.key = new Date().getTime();
      },
      immediate: true,
    },
  },
};
</script>

  1. 给iframe的src中的地址添加时间戳

<template>
  <div id="Iframe">
    <el-dialog
      append-to-body
      style="margin-top: -10vh"
      custom-class="scrollbar"
      :visible.sync="iframeVisible"
      width="90%"
      @close="close"
    >
      <iframe
        id="iframe"
        ref="iframeBox"
        :src="url"
        frameborder="0"
        width="100%"
        sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
        :style="{ height: calHeight }"
        scrolling="auto"
      ></iframe>
    </el-dialog>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
import { getToken, setToken } from "@/utils/auth";

export default {
  name: "Iframe",
  computed: {
    ...mapGetters(["userid", "name"]),
    //计算属性 , 设置iframe高度为窗口高度少100px
    calHeight() {
      return window.innerHeight - 150 + "px";
    },
  },
  props: {
    url: String,
    dataid: String,
  },
  data() {
    return {
      iframeVisible: false,
    };
  },
  watch: {
     url(newVal, oldVal) {
       if (getToken()) {
         // 方法二
         this.iframeInit(newVal);
       }
     },
  },
  methods: {
    //iframe 初始化
     iframeInit(newVal) {
       let iframe = document.createElement("iframe");
    //利用异步延迟加载和链接随机传参来达到刷新iframe缓存的目的,不加此步骤iframe页面不更新
       this.forceUpdataIframe(iframe, newVal);
     },
     //强制刷新iframe缓存
     forceUpdataIframe(iframe, newVal) {
       setTimeout(() => {
         let fresh_link =
           new Date().getTime() + Math.floor(Math.random() * 1000000); //获取当前时间戳
         String.prototype.splice = function (start, newStr) {
           return this.slice(0, start) + newStr + this.slice(start);
         };
         let strIndex = newVal.indexOf("/#/");
         let url = newVal.splice(strIndex, "?time=" + fresh_link);
         console.log("url", url);
         iframe.src = url;
         // window.open(newVal + "?time=" + fresh_link, "refresh_name");
       }, 300);
     },
  },
};
</script>

二、iframe是在弹窗中的,当我在iframe中的页面点击按钮后,需关闭iframe所在弹窗

其实就是子组件关闭父组件的弹窗,但是这是在iframe中操作的,所以不能用之前的方法

父组件(放置iframe的页面)

<template>
  <div id="Iframe">
    <el-dialog
      append-to-body
      style="margin-top: -10vh"
      custom-class="scrollbar"
      :visible.sync="iframeVisible"
      width="90%"
      @close="close"
    >
      <iframe
        :key="key"
        id="iframe"
        ref="iframeBox"
        :src="url"
        frameborder="0"
        width="100%"
        sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
        :style="{ height: calHeight }"
        scrolling="auto"
      ></iframe>
    </el-dialog>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
export default {
  name: "Iframe",
  computed: {
    ...mapGetters(["userid", "name"]),
    //计算属性 , 设置iframe高度为窗口高度少100px
    calHeight() {
      return window.innerHeight - 150 + "px";
    },
  },

  props: {
    url: String,
    dataid: String,
  },
  data() {
    return {
      iframeVisible: false,
      key: new Date().getTime(),
    };
  },
  watch: {
    // iframe上添加key,然后监听
    $route: {
      handler(val) {
        this.key = new Date().getTime();
      },
      immediate: true,
    },
  },
  mounted() {
    // 注册监听框架传来的数据
    this.$nextTick(() => {
      // 在外部 Vue 的 window 上添加 postMessage 的监听,并且绑定处理函数 handleMessage
      window.addEventListener("message", this.handleMessage);
    });
  },
  destroyed() {
    // 注意移除监听!
    window.removeEventListener("message", this.handleMessage);
  },
  methods: {
    close() {
      this.iframeVisible = false;
    },
    handleMessage(event) {
      if (event) {
        this.iframeVisible = event.data;
      } else {
        this.iframeVisible = true;
      }
    },
  },
};
</script>

<style lang="scss">
#Iframe {
  width: 100%;
  //   height: 100%;
  // padding: 0 10vw;
  z-index: -1 !important;

  .el-dialog__header {
    background-color: transparent !important;
    padding: 0;
  }
  .el-dialog__body {
    background-color: #f9fafc;
    border-radius: 10px;
    padding: 40px 50px 30px;
    height: calc(100vh - 80px);
    overflow: hidden;
    overflow-y: scroll;

    &::-webkit-scrollbar {
      width: 6px;
      height: 6px;
    }

    // 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
    &::-webkit-scrollbar-button {
      display: none;
    }

    // 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
    &::-webkit-scrollbar-thumb {
      background: rgba(144, 147, 153, 0.3);
      cursor: pointer;
      border-radius: 4px;
    }

    // 边角,即两个滚动条的交汇处
    &::-webkit-scrollbar-corner {
      display: none;
    }

    // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
    &::-webkit-resizer {
      display: none;
    }
  }

  .el-dialog__headerbtn .el-dialog__close {
    color: #909399;
    width: 50px;
    height: 30px;
    line-height: 30px;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
  }
  // 发起新的弹窗
  .dialog-footer {
    height: 50px;
    line-height: 50px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-top: 20px;
  }
  .dialog-header {
    height: 60px;
    line-height: 60px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-bottom: 20px;
    padding: 0 10px;
    font-size: 16px;
    font-weight: 600;
  }
  .center {
    display: flex;
    width: 100%;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    padding: 20px;
  }
}
.scrollbar {
  width: 100%;
  //   height: 100%;
  // padding: 0 10vw;
  z-index: -1 !important;

  .el-dialog__header {
    background-color: transparent !important;
    padding: 0;
  }
  .el-dialog__body {
    background-color: #f9fafc;
    border-radius: 10px;
    padding: 40px 50px 30px;
    height: calc(100vh - 80px);
    overflow: hidden;
    overflow-y: scroll;

    &::-webkit-scrollbar {
      width: 6px;
      height: 6px;
    }

    // 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
    &::-webkit-scrollbar-button {
      display: none;
    }

    // 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
    &::-webkit-scrollbar-thumb {
      background: rgba(144, 147, 153, 0.3);
      cursor: pointer;
      border-radius: 4px;
    }

    // 边角,即两个滚动条的交汇处
    &::-webkit-scrollbar-corner {
      display: none;
    }

    // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
    &::-webkit-resizer {
      display: none;
    }
  }

  .el-dialog__headerbtn .el-dialog__close {
    color: #909399;
    width: 50px;
    height: 30px;
    line-height: 30px;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
  }
  // 发起新的弹窗
  .dialog-footer {
    height: 50px;
    line-height: 50px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-top: 20px;
  }
  .dialog-header {
    height: 60px;
    line-height: 60px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-bottom: 20px;
    padding: 0 10px;
    font-size: 16px;
    font-weight: 600;
  }
  .center {
    display: flex;
    width: 100%;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    padding: 20px;
  }
}
</style>

子组件(iframe中跳转的页面)

<template>
  <div id="GetFrom">
     <el-button size="small" class="addbtn" @click="sub()">保存</el-button >
  </div>
</template>

<script>
export default {
  methods: {
    sub() {
      window.parent.postMessage(false, "*"); //关闭iframe所在的弹窗
    },
  },
};
</script>

三、iframe已经加载完毕,但是进度条还一直加载中

  1. 其他软件会影响iframe

我遇到的情况是,我这边没有任何问题,其他人也没有,但是又一个人就是遇到进度条一直在加载中,后来发现是因为他电脑上的小狐狸钱包在后台运行,所以影响到了iframe,把它关掉就可以了。

四、iframe传参并跳转页面

我这里是点击按钮,出现iframe页面,iframe是封装在弹窗中的,你们用的话直接在页面中使用iframe,然后跳转就行,就不一定要封装iframe了。
这里我就把主要代码贴出来

使用页面传递参数

<template>
  <div id="EditDialog">
      <el-dialog
      append-to-body
      custom-class="dialog"
      :title="title.appname"
      :visible.sync="dialog"
      width="90%"
      style="margin-top: -10vh"
      >
          <div
              style="display: inline; margin: 0 5px"
              v-for="(obj, ind) in List.button"
              :key="ind"
            >
              <el-button
                v-if="obj.type === 3"
                size="small"
                class="Cancelbtn"
                @click="newpage(obj)"
                >{{ obj.name }}</el-button
              >
            </div>
      </el-dialog>

      <!-- 新页面 -->
     <Iframe ref="Iframe" :dataid="Form.dataid" :url="url"></Iframe>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
import Iframe from "@/views/dashboard/Iframe/Iframe.vue";
import { AddComments, Reject,Confirm,BpmUrge,BpmBack,BPMALL} from "@/api/Bpm";

export default {
   data() {
    return {
      dialog: false,
      url: "", //给iframe的地址 
    };
  },
   methods: {
    //打开iframe页面
    newpage(obj) {
      // obj.add_url后端返回的是这样的:http://192.168.4.160:9528/#/Generation?dataid={dataid}
      //其中http://192.168.4.160:9528是在开发阶段就是我们前端运行的地址,项目部署后,就是后端正式的地址
      //  /#/Generation是页面
      //dataid是参数,需要我们赋值的
      if (obj.add_url) {
        const a = obj.add_url.replace(/{dataid}/, this.Form.dataid);
        obj.add_url = a; //绝对路径,也就是http://192.168.4.160:9528开头
        this.url = a;
        //注意使用这种方法iframe需要加sandbox="allow-forms allow-scripts allow-same-origin allow-popups",不然会全屏
        //this.List.add_url = `/#/Generation`;//相对路径
      }
      this.$refs.Iframe.iframeVisible = true;//打开组件的弹窗
    },
   }
}
</script>

iframe组件

<template>
  <div id="Iframe">
    <el-dialog
      append-to-body
      style="margin-top: -10vh"
      custom-class="scrollbar"
      :visible.sync="iframeVisible"
      width="90%"
      @close="close"
    >
      <iframe
        :key="key"
        id="iframe"
        ref="iframeBox"
        :src="url"
        frameborder="0"
        width="100%"
        sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
        :style="{ height: calHeight }"
        scrolling="auto"
      ></iframe>
    </el-dialog>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
import { getToken, setToken } from "@/utils/auth";

export default {
  name: "Iframe",
  computed: {
    ...mapGetters(["userid", "name"]),
    //计算属性 , 设置iframe高度为窗口高度少100px
    calHeight() {
      return window.innerHeight - 150 + "px";
    },
  },

  props: {
    url: String,
    dataid: String,
  },
  data() {
    return {
      iframeVisible: false,
      key: new Date().getTime(),
    };
  },
  watch: {
    $route: {
      handler(val) {
        this.key = new Date().getTime();
      },
      immediate: true,
    },
  },
  mounted() {
    // 注册监听框架传来的数据
    this.$nextTick(() => {
      // 在外部 Vue 的 window 上添加 postMessage 的监听,并且绑定处理函数 handleMessage
      window.addEventListener("message", this.handleMessage);
    });
  },
  destroyed() {
    // 注意移除监听!
    window.removeEventListener("message", this.handleMessage);
  },
  methods: {
    close() {
      this.iframeVisible = false;
    },

    handleMessage(event) {
      if (event) {
        this.iframeVisible = event.data;
      } else {
        this.iframeVisible = true;
      }
    },
  },
};
</script>

<style lang="scss">
#Iframe {
  width: 100%;
  //   height: 100%;
  // padding: 0 10vw;
  z-index: -1 !important;

  .el-dialog__header {
    background-color: transparent !important;
    padding: 0;
  }
  .el-dialog__body {
    background-color: #f9fafc;
    border-radius: 10px;
    padding: 40px 50px 30px;
    height: calc(100vh - 80px);
    overflow: hidden;
    overflow-y: scroll;

    &::-webkit-scrollbar {
      width: 6px;
      height: 6px;
    }

    // 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
    &::-webkit-scrollbar-button {
      display: none;
    }

    // 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
    &::-webkit-scrollbar-thumb {
      background: rgba(144, 147, 153, 0.3);
      cursor: pointer;
      border-radius: 4px;
    }

    // 边角,即两个滚动条的交汇处
    &::-webkit-scrollbar-corner {
      display: none;
    }

    // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
    &::-webkit-resizer {
      display: none;
    }
  }

  .el-dialog__headerbtn .el-dialog__close {
    color: #909399;
    width: 50px;
    height: 30px;
    line-height: 30px;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
  }
  // 发起新的弹窗
  .dialog-footer {
    height: 50px;
    line-height: 50px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-top: 20px;
  }
  .dialog-header {
    height: 60px;
    line-height: 60px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-bottom: 20px;
    padding: 0 10px;
    font-size: 16px;
    font-weight: 600;
  }
  .center {
    display: flex;
    width: 100%;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    padding: 20px;
  }
}
.scrollbar {
  width: 100%;
  //   height: 100%;
  // padding: 0 10vw;
  z-index: -1 !important;

  .el-dialog__header {
    background-color: transparent !important;
    padding: 0;
  }
  .el-dialog__body {
    background-color: #f9fafc;
    border-radius: 10px;
    padding: 40px 50px 30px;
    height: calc(100vh - 80px);
    overflow: hidden;
    overflow-y: scroll;

    &::-webkit-scrollbar {
      width: 6px;
      height: 6px;
    }

    // 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
    &::-webkit-scrollbar-button {
      display: none;
    }

    // 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
    &::-webkit-scrollbar-thumb {
      background: rgba(144, 147, 153, 0.3);
      cursor: pointer;
      border-radius: 4px;
    }

    // 边角,即两个滚动条的交汇处
    &::-webkit-scrollbar-corner {
      display: none;
    }

    // 两个滚动条的交汇处上用于通过拖动调整元素大小的小控件
    &::-webkit-resizer {
      display: none;
    }
  }

  .el-dialog__headerbtn .el-dialog__close {
    color: #909399;
    width: 50px;
    height: 30px;
    line-height: 30px;
    border-radius: 5px;
    background-color: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
  }
  // 发起新的弹窗
  .dialog-footer {
    height: 50px;
    line-height: 50px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-top: 20px;
  }
  .dialog-header {
    height: 60px;
    line-height: 60px;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    flex-wrap: wrap;
    margin-bottom: 20px;
    padding: 0 10px;
    font-size: 16px;
    font-weight: 600;
  }
  .center {
    display: flex;
    width: 100%;
    background: #fff;
    box-shadow: 2px 2px 6px rgba(138, 169, 192, 0.2);
    border-radius: 5px;
    padding: 20px;
  }
}
</style>

iframe要跳转到的页面,接收参数

data() {
    return {
      dataid: "", //编辑弹窗传递的参数
    };
 },
created() {
    // 获取父级中iframe的src,这样就可以获取参数
    this.dataid = window.parent.document
      .getElementById("iframe")
      .src.split("=")[1];
  },

这篇文章看完如果您觉得有所收获,认为还行的话,就点个赞收藏一下呗

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

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

相关文章

一名IC验证工程师的成长路径是怎么样的?来听听工程师的见解

IC验证这个岗位对于非科班的学生是比较友好的&#xff0c;因为验证需要具备的技能UVM&#xff0c;SV&#xff0c;C等&#xff0c;非科班和科班的差距不会拉开太大。因其岗位需求量巨大而格外受到了大家的青睐&#xff0c;甚至成为不少学生的转行首选。 验证对于IC的重要性 IC…

汽车 12V 和 24V 电池输入保护推荐

简介汽车电池电源线路在运行系统时容易出现瞬变。所需的典型保护包括过压、过载、反极性和跨接启动。在汽车 的生命周期中&#xff0c;交流发电机可能会被更换为非OEM 部件。售后市场上的交流发电机可能具有不同的负载突降&#xff08;LOAD DUMP&#xff09;保护或没有负载突降…

论文阅读-Attention Bottlenecks for Multimodal Fusion(多模态特征融合)

一、论文信息 论文题目&#xff1a;Attention Bottlenecks for Multimodal Fusion paperwithcode&#xff1a;https://paperswithcode.com/paper/attention-bottlenecks-for-multimodal-fusion Github&#xff1a;https://github.com/google-research/scenic/tree/main/scen…

产品故事:语雀两度生死局

语雀是一款文档和知识库产品&#xff0c;2016 年从一个技术团队支付宝体验技术部生长出来&#xff0c;2021 年蚂蚁成立了智能协同事业部&#xff0c;重点产品即为语雀&#xff0c;以独立 BU 运作&#xff0c;算是完成了“成人礼”。我们和玉伯聊了聊语雀的成长故事。 极客时间&…

C++基础知识【3】控制语句

目录 前言 一、条件语句 1.1、if 语句 1.2、if-else 语句 1.3、switch 语句 二、循环语句 2.1、while 循环 2.2、do-while 循环 2.3、for 循环 三、跳转语句 3.1、break语句 3.2、continue语句 3.3、goto语句 四、一些新特性 4.1、if 语句和 switch 语句…

【数据结构与算法】图遍历算法 ( 深度优先搜索代码示例 )

文章目录一、深度优先搜索算法二、完整代码示例完整代码示例执行结果一、深度优先搜索算法 深度优先搜索算法步骤 : 将 深度优先搜索 算法步骤 转为代码 ; ① 访问初始结点 : 访问 初始结点 v , 并将该 初始结点 v 标记为 " 已访问 " ; 设置一个 访问标记 数组 , 数…

《C++ Primer》 第九章 顺序容器

《C Primer》 第九章 顺序容器 9.1 顺序容器概述 容器&#xff1a;特定类型对象的集合 顺序容器类型 vector 可变大小数组&#xff0c;支持快速随机访问&#xff0c;在尾部之外的位置插入或删除元素可能很慢deque 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快…

【2022-09-14】米哈游秋招笔试三道编程题

第一题&#xff1a;最短子串 题目描述 米小游拿到了一个字符串&#xff0c;她想截取一个连续子串&#xff0c;使得该子串中包含至少k个连续的“mihoyo”。 你可以帮米小游求出最短的子串长度&#xff0c;以及对应的子串位置吗&#xff1f; 输入描述 第一行输入两个正整数n…

产品父子流程技术方案设计

产品父子流程技术方案设计 一、整体设计 根据业务需求分析&#xff0c;产品涉及法人代表及实控人风控决策流程调用&#xff0c;旨在降低风险&#xff0c;提高行内线上贷款业务风险决策的能力。 二、业务流程 1.业务流程图 2.交易流程 在授信交易切面入口处对法人代表及实控…

Spark性能优化三 checkpoint

&#xff08;一&#xff09;checkpoint介绍 checkpoint&#xff0c;是Spark提供的一个比较高级的功能。有时候&#xff0c;我们的Spark任务&#xff0c;比较复杂&#xff0c;从初始化RDD开始&#xff0c;到最后整个任务完成&#xff0c;有比较多的步骤&#xff0c;比如超过10个…

关于flex盒子padding-right/margin-right不生效

错误代码实例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"width…

论文投稿指南——中文核心期刊推荐(科学、科学研究)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

element input 输入框校验

element input 输入框校验 很久之前有写过一篇&#xff1a;element 输入框只可以输入正整数 在这里对它进行补充 校验input输入框是否符合 以下是常用的一些&#xff1a; 限制输入中文&#xff1a;/^[\u4e00-\u9fa5]$/ const checkName (rule, value, callback) > {if…

逆约瑟夫问题

约瑟夫问题可以说十分经典&#xff0c;其没有公式解也是广为人知的~ 目录 前言 一、约瑟夫问题与逆约瑟夫问题 1.约瑟夫问题 2.逆约瑟夫问题 二、思考与尝试&#xff08;显然有很多失败&#xff09; 问题分析 尝试一&#xff1a;递归/递推的尝试 尝试二&#xff1a;条件…

Doris入门篇-分区分桶实验

简介 测试分区分桶效果。 分区的基本操作 添加分区 ALTER TABLE v2x_olap_database.government_car ADD PARTITION p20221203 VALUES LESS THAN ("2022-12-04");动态分区表不能添加分区&#xff0c;需要转为手动分区表。 查看分区 show partitions from <表…

【深度估计】单目深度估计

文章目录什么是深度估计&#xff1f;什么是视差深度估计与三维重建单目深度估计研究历程单目深度估计方法传统方法基于线索线性透视聚焦/散焦度天气散射阴影纹理遮挡高度运动线索基于物体自身运动基于摄像机的运动基于机器学习参数学习方法开创性工作改进加入语义信息条件随机场…

《工业机器视觉检测123》(1.1) 目标检测样本类别不平衡的问题(持续更新...)

部分内容转载自&#xff1a;https://www.cnblogs.com/inchbyinch/p/12642760.html 参考分类任务中解决类别不平衡的办法&#xff1a; 1 什么是类别不平衡问题&#xff1f; 类别不平衡&#xff08;class-imbalance&#xff09;&#xff0c;也叫数据倾斜&#xff0c;数据不平衡…

Tomcat面试问题总结

1.Tomcat是什么&#xff1f;Tomcat 服务器Apache软件基金会项目中的一个核心项目&#xff0c;是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首…

EasyCVR视频融合平台的视频处理与AI智能分析流程实操案例介绍

EasyCVR基于云边端一体化架构&#xff0c;能支持海量视频的轻量化接入与汇聚管理。在视频能力上&#xff0c;可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等。 除了视频能力之外&#xff0c;将…

浅谈设备防漏扫

场景描述 随着社会的信息化&#xff0c;互联网安全被国家越来越重视&#xff0c;漏洞扫描&#xff08;简称漏扫&#xff09;业务也在被规范列入企事业单位的信息安全的标准中。 从安全角度来看&#xff0c;漏扫本身是为用户的用网安全做保障&#xff0c;避免木马、病毒等通过…