vue element-ui 下拉框 以及 input 限制输入,小数点后保留两位 界面设计案例 和 例子:支持mp4和m3u8视频播放

news2024/11/15 13:04:27

vue input 限制输入,小数点后保留两位 以及 图片垂直居中显示 和 分享 git 小技巧-CSDN博客文章浏览阅读430次,点赞5次,收藏4次。error:Your local changes to the following files would be overwritten by merge:_error: your local changes to the following files w-CSDN博客。情况二:当本地的已经乱了,但是远端的master已经合并了你最后一次的代码,此时你可以先把你本地修改的文件先拷贝一份出来,然后让远端的master的代码强行覆盖掉当前的目录内容。https://blog.csdn.net/weixin_41987016/article/details/139592956?spm=1001.2014.3001.5501(1)下拉框 以及 input 限制输入,小数点后保留两位 界面设计案例

<template>
  <div class="info-settings">
    <el-form :model="formData" label-width="120px">
      <el-form-item label="类型:">
        <el-select v-model="formData.infoType" placeholder="请选择">
          <el-option label="周提醒" value="weekly"></el-option>
          <el-option label="月提醒" value="monthly"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="提醒标准:">
        <div class="form-item">
          <el-button class="text-button self-button" plain disabled>就业率</el-button>
          <el-select v-model="formData.thresholdOperator" placeholder="请选择" disabled>
            <el-option label=">" value="greaterThan"></el-option>
            <el-option label="<" value="lessThan"></el-option>
          </el-select>
          <el-input v-model="formData.thresholdValue" placeholder="请输入"
            @input="checkThresholdValue(formData.thresholdValue)" @blur="completeThresholdValue">
            <i slot="suffix" style="font-style:normal;margin-right: 10px;">%</i>
          </el-input>
        </div>
      </el-form-item>
      <el-form-item>
        <div class="form-item">
          <el-button class="text-button self-button" plain disabled>GPD</el-button>
          <el-select v-model="formData.GPDOperator" placeholder="请选择" disabled>
            <el-option label=">" value="greaterThan"></el-option>
            <el-option label="<" value="lessThan"></el-option>
          </el-select>
          <el-input v-model="formData.GPDValue" placeholder="请输入" @input="checkGPDValue(formData.GPDValue)"
            @blur="completeGPDValue">
            <i slot="suffix" style="font-style:normal;margin-right: 10px;">%</i>
          </el-input>
        </div>
      </el-form-item>
      <el-form-item>
        <div class="form-item">
          <el-button class="text-button self-button" plain disabled>工资</el-button>
          <el-select v-model="formData.revenueOperator" placeholder="请选择" disabled>
            <el-option label=">" value="greaterThan"></el-option>
            <el-option label="<" value="lessThan"></el-option>
          </el-select>
          <el-input v-model="formData.revenueValue" placeholder="请输入" @input="checkRevenueValue(formData.revenueValue)"
            @blur="completeRevenueValue">
            <i slot="suffix" style="font-style:normal;margin-right: 10px;">元</i>
          </el-input>
        </div>
      </el-form-item>
      <el-form-item label="提醒文案标题:">
        <el-input type="textarea" v-model="formData.infoMessage" placeholder="请输入提醒文案标题" maxlength="20" show-word-limit></el-input>
      </el-form-item>
      <el-form-item label="提醒文案内容:">
        <el-input type="textarea" v-model="formData.infoContent" placeholder="请输入提醒文案内容" maxlength="200" show-word-limit></el-input>
      </el-form-item>
      <el-form-item>
        <el-button @click="cancel" class="medium-button">取消</el-button>
        <el-button type="primary" @click="confirm" class="medium-button">确定</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        infoType: 'weekly',
        thresholdOperator: 'greaterThan',
        thresholdValue: '',
        GPDOperator: 'lessThan',
        GPDValue: '',
        revenueOperator: 'greaterThan',
        revenueValue: '',
        infoMessage: '',
        infoContent: ''
      }
    };
  },
  methods: {
    cancel() {
      // 取消按钮的操作
    },
    confirm() {
      // 确定按钮的操作
    },
    checkThresholdValue(value) {
      this.formData.thresholdValue = this.checkNumber(value);
    },
    checkGPDValue(value) {
      this.formData.GPDValue = this.checkNumber(value);
    },
    checkRevenueValue(value) {
      this.formData.revenueValue = this.checkNumber(value);
    },
    checkNumber(value) {
      let number = value
        .replace(/[^\d.]/g, '') // 清除“数字”和“.”以外的字符
        .replace(/\.{2,}/g, '.') // 只保留第一个. 清除多余的
        .replace(/^(-)*(\d+)\.(\d{0,2}).*$/, '$1$2.$3'); // 只能输入两个小数

      return number;
    },
    completeThresholdValue() {
      this.completeNumber('thresholdValue');
    },
    completeGPDValue() {
      this.completeNumber('GPDValue');
    },
    completeRevenueValue() {
      this.completeNumber('revenueValue');
    },
    completeNumber(field) {
      let value = this.formData[field].trim();
      if (!value) {
        this.formData[field] = ''; // 如果数字为空,则清空输入框
        return; // 如果数字为空,不继续进行后续操作
      }

      let number = parseFloat(value).toFixed(2); // 将数字转换为浮点数再转换回字符串,去掉前导零
      if ((number < 0 || number > 100) && field.toString() !== 'revenueValue') {
        this.$message.error({
          message: '输入的范围应为0-100%',
          duration: 400
        });
        this.number = undefined
        return
      }

      // 判断价格小数部分是否需要补全
      const needsCompletion = !/\.\d{2}$/.test(value)
      this.formData[field] = number;
      // 如果需要补全,则提示用户
      if (needsCompletion) {
        this.$message.info({
          message: '数字已自动补全为两位小数。',
          duration: 400
        });
      }
    }
  }
};
</script>

<style scoped>
.info-settings .el-form-item__content {
  display: flex;
  align-items: center;
}

.info-settings .el-input__suffix {
  font-size: 14px;
}

.form-item {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
  /* 添加下方间距 */
}

.form-item>* {
  margin-right: 10px;
}

.text-button {
  color: #909399;
  font-size: 14px;
}

.self-button {
  min-width: 80px;
  /* 设置按钮最小宽度 */
  color: #000000;
  /* 设置按钮文字颜色为黑色 */
  display: flex;
  justify-content: center;
  /* 文本水平居中 */
  align-items: center;
  /* 文本垂直居中 */
}

.medium-button {
  width: 80px;
  /* 设置按钮宽度 */
}
 </style>
<style>
.el-textarea__inner::-webkit-scrollbar {
  width: 6px;
  height: 6px;
}
 
.el-textarea__inner::-webkit-scrollbar-thumb {
  border-radius: 3px;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  background-color: #c3c3c3;
}
 
.el-textarea__inner::-webkit-scrollbar-track {
  background-color: transparent;
}
</style>

(2)点击表格中的图片,可以查看,图片可以垂直水平居中放在表格中

<template>
  <div>
    <el-table :data="tableData" :cell-style="{ textAlign: 'center' }" :header-cell-style="{ textAlign: 'center' }">
      <el-table-column prop="name" label="Name"></el-table-column>
      <el-table-column prop="age" label="Age"></el-table-column>
      <el-table-column prop="gender" label="Gender"></el-table-column>
      <el-table-column label="Cover" align="center" class="no-padding">
        <template slot-scope="scope">
          <div class="cover-wrapper">
            <el-image class="cover-image" :src="require('@/assets/cover_test.png')" style="object-fit: cover;"
              @click="showImage(scope.row.cover)">
            </el-image>
          </div>
        </template>
      </el-table-column>
    </el-table>

    <!-- 图片查看器 -->
    <div v-if="isImageViewerOpen" class="image-overlay" @click="hideImageViewer">
        <el-image :src="currentImage" class="image-viewer"></el-image>
    </div>
    
  </div>
</template>

<script>

export default {
  data() {
    return {
      tableData: [
        { name: 'John', age: 30, gender: 'Male', cover: require('@/assets/cover_test.png') },
        { name: 'Jane', age: 25, gender: 'Female', cover: require('@/assets/cover_test.png') },
        // Add more data as needed
      ],
      isImageViewerOpen: false,
      currentImage: '',
      viewerVisible: false
    };
  },
  methods: {
    showImage(image) {
      this.currentImage = image;
      this.isImageViewerOpen = true;
      this.viewerVisible = true;
    },
    hideImageViewer() {
      this.isImageViewerOpen = false;
    }
  }
};
</script>

<style scoped>
/* .cover-wrapper {
    position: relative;
    overflow: hidden;
  }
  .cover-image {
    width: 80px;
    height: 45px;
    cursor: pointer;
  } */
.image-overlay {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
}

.image-viewer {
  max-width: 90%;
  max-height: 90%;
}
</style>


<style scoped>
.cover-wrapper {
  position: relative;
  overflow: hidden;
}

.el-table .cover-image-show {
  width: 80px;
  top: 2.5px;
  height: 45px;
  cursor: pointer;
}

/* 将表格中带有no-padding类的单元格的padding设置为0 */
.el-table /deep/ .cell {
  padding: 0;
}
</style>

(3)支持mp4和m3u8视频播放 

<template>
  <div>
    <el-button @click="openDialog('http://ai-xxxxxxxx_34.m3u8', 1)" type="primary">Open Video 1 (.m3u8)</el-button>
    <el-button @click="openDialog('http://tx-xxxx.mp4', 2)" type="primary">Open Video 2 (.mp4)</el-button>
    <el-button @click="openDialog('', 3)" type="primary">Unable to play.</el-button>
    <el-button @click="openDialog('http://tx-xx.cdn.xxx.com/2422/12233421/', 3)" type="primary">err Link</el-button>

    <el-dialog
      v-if="showDialog"
      :visible.sync="showDialog"
      :title="'Video ' + currentPlayerId"
      @close="closeDialog"
      width="720px"
      class="video-dialog"
    >
      <div v-if="videoError">
        <p>{{ videoError }}</p>
      </div>
      <video :id="'videoPlayer' + currentPlayerId" :class="videoClass" style="width: 100%;" controls preload="auto" :width="videoWidth" ></video>
    </el-dialog>
  </div>
</template>

<script>
import videojs from 'video.js';
import 'video.js/dist/video-js.css';

export default {
  data() {
    return {
      showDialog: false,
      currentPlayerId: null,
      videoPlayer: null,
      videoError: null,
      videoWidth: '720px', // Default width
      videoHeight: '450px', // Default height
      videoClass: 'video-js vjs-default-skin vjs-big-play-centered' // Default class
    };
  },
  methods: {
    openDialog(url, playerId) {
      this.showDialog = true;
      this.currentPlayerId = playerId;
      this.videoError = null;
      // Wait for next tick to ensure the element is mounted before initializing Video.js
      this.$nextTick(() => {
        this.initVideoPlayer(url);
      });
    },
    closeDialog() {
      if (this.videoPlayer) {
        this.videoPlayer.dispose();
        this.videoPlayer = null;
      }
      this.showDialog = false;
      this.currentPlayerId = null;
      this.videoError = null;
    },
    initVideoPlayer(url) {
      this.videoPlayer = videojs('videoPlayer' + this.currentPlayerId, {
        html5: {
          hls: {
            overrideNative: true
          }
        },
        playbackRates: [0.5, 1, 1.5, 2]
      });

      this.videoPlayer.on('error', (error) => {
        console.error('Video playback error:', error);
        this.videoError = 'Unable to play the video.';
      });

      const type = this.getVideoType(url);

      if (type === 'video/mp4') {
        this.videoPlayer.src({
          src: url,
          type: 'video/mp4'
        });
      } else if (type === 'application/x-mpegURL') {
        this.videoPlayer.src({
          src: url,
          type: 'application/x-mpegURL'
        });
      }

      this.videoPlayer.ready(() => {
        // 忽略未使用的变量
        /* eslint-disable no-unused-vars */
        // const videoEl = document.getElementById('videoPlayer' + this.currentPlayerId);
        // const aspectRatio = this.videoPlayer.videoWidth() / this.videoPlayer.videoHeight();
        // this.videoWidth = 720;
        // this.videoHeight = this.videoWidth / aspectRatio;
        // videoEl.style.height = `${this.videoHeight}px`;
        this.videoPlayer.play();
      });
      
    },
    getVideoType(url) {
      const extension = url.toLowerCase().includes('.mp4') ? 'mp4' : 'm3u8';
      if (extension === 'mp4') {
        return 'video/mp4';
      } else if (extension === 'm3u8') {
        return 'application/x-mpegURL';
      } else {
        return '';
      }
    }
  },
  beforeDestroy() {
    if (this.videoPlayer) {
      this.videoPlayer.dispose();
      this.videoPlayer = null;
    }
  }
};
</script>

<style>
/* Add any custom styles for the video player here */
.video-dialog {
  .el-dialog__header {
    border-bottom: none;
  }
   .el-dialog__body {
    padding: 0;
  }
  /*
  .dialog-content {
    padding:0 40px;
  }
  .el-dialog__footer {
    padding: 10px 10px 10px;
    border-top: none;
  } */
}

</style>


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

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

相关文章

传神社区|数据集合集第3期|中文NLP数据集合集

自从ChatGPT等大型语言模型&#xff08;Large Language Model, LLM&#xff09;出现以来&#xff0c;其类通用人工智能&#xff08;AGI&#xff09;能力引发了自然语言处理&#xff08;NLP&#xff09;领域的新一轮研究和应用浪潮。尤其是ChatGLM、LLaMA等普通开发者都能运行的…

计算机SCI期刊,中科院3区,IF=3.4,难度不大,无预警风险

一、期刊名称 Automated Software Engineering 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.4 中科院分区&#xff1a;3区 三、期刊征稿范围 自动化软件工程是一份档案&#xff0c;同行评审的期刊&#xff0c;发表研…

网络故障排除:保持网络稳定与业务连续

目录 什么是网络故障&#xff1f; 网络故障排除的基本步骤 1. 问题识别 2. 确定故障范围 3. 检查物理连接 4. 检查设备配置 5. 测试与诊断 6. 实施解决方案 7. 验证与监控 了解更多 在现代企业中&#xff0c;网络的稳定性和性能直接影响业务的连续性和效率。作为一名…

算法day26

第一题 429. N 叉树的层序遍历 本题的要求我们可以通过队列来辅助完成层序遍历&#xff1b; 如下图的n叉树&#xff1a; 步骤一&#xff1a; 我们定义一个队列&#xff0c;先进行根节点入队列操作&#xff1b; 步骤二&#xff1a; 我们进行当前队列每一个元素的出队列操作&…

复旦大学首本大模型中文书太厉害啦!【大模型书籍推荐】

前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术如同璀璨的星辰&#xff0c;照亮了我们与机器沟通的道路。而今&#xff0c;复旦大学自然语言处理实验室的教授团队&#xff0c;如同航海家般&#xff0c;为我们带来了一本指引大语言模型领域前行…

[Java基础揉碎]网络相关概念

目录 网络通信 网络 ip地址 ​编辑 域名 ​编辑 网络协议 TCP和UDP 网络编程比较重要的的InetAddress类 Socket ​编辑 tcp字节流编程 案例一 案例二​编辑 案例三 网络上传文件 ​编辑​编辑 ​编辑 netstat tcp网络通信客户端也是通过端口和服务端进行通讯的…

python怎么保留小数

保留两位小数&#xff0c;并做四舍五入处理 方法一&#xff1a;使用字符串格式化 a 12.345 print("%.2f" % a)# 12.35 方法二&#xff1a;使用round内置函数 a 12.345 a1 round(a, 2) print(a1)# 12.35 方法三&#xff1a;使用decimal模块 from decimal import D…

每日一题39:甲板上的战舰

一、每日一题 题意 这题的标题应该是《棋盘上的战舰》&#xff0c;来源于 海战棋&#xff0c;把横着或竖着的连续 X 看成一艘战舰&#xff0c;统计棋盘上有多少艘战舰。 思路 战舰的个数&#xff0c;等于战舰「头部」的个数。如下图&#xff0c;我们只需要统计蓝色 X 的个数&…

LLM应用实战:当图谱问答(KBQA)集成大模型(三)

1. 背景 最近比较忙(也有点茫)&#xff0c;本qiang~想切入多模态大模型领域&#xff0c;所以一直在潜心研读中... 本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结&#xff0c;对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战&#xff1a;当KBQ…

Android 14 系统启动流程 之 启动init进程、启动Zygote进程

Android 14 系统启动流程 之 启动init进程、启动Zygote进程 废话不多说&#xff0c;先上图&#xff0c;不清楚的可以在评论区留言。

计算机体系结构学习(一)

计算机体系结构的发展 20 世纪五六十年代, 由于工艺技术的限制, 计算机都做得很简单, 计算机体系结构主要研究怎么做加减乘除, Computer Architecture 基本上等于 Computer Arithmetic。 20 世纪七八十年代的时候, 以精简指令集 (Reduced Instruction Set Computer, 简称 RISC…

AI大模型战场:通用大模型与垂直大模型的角逐

随着人工智能技术的迅猛发展&#xff0c;AI大模型已成为推动科技进步的重要力量。然而&#xff0c;在AI大模型的战场上&#xff0c;通用大模型与垂直大模型之间的分化日益明显。两者各有其独特的优势和潜力&#xff0c;在不同的应用场景中发挥着重要作用。那么&#xff0c;在这…

SSM 离散数学线上考试系统-计算机毕业设计源码83059

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;高校当然也不例外。离散数学线上考试系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

信创4.0|暴雨出席空间智能软件技术交流会

6月19日&#xff0c;由自然资源部地理信息系统技术创新中心、中国测绘学会软件与信息技术服务工委会、内蒙古自治区测绘学会共同主办的“空间智能软件技术交流会暨自然资源数字化治理交流会”在呼和浩特举办&#xff0c;500余位嘉宾汇聚一堂&#xff0c;就空间智能赋能数字经济…

MyBatis的配置文件,即:src->main->resources的配置

目录 1、properties 标签 1.1 mybatis-config.xml 1.2 db.properties 1.3 在SqlMapConfig.xml 中 引入数据库配置信息 2、typeAliases 标签 2.1 定义别名 2.2 使用别名 3、Mappers标签 作用&#xff1a;用来在核心配置文件中引入映射文件 引入方式&#xff0c;有以下…

vue生成二维码中间自定义logo并截图分享

需求描述&#xff1a;在公众号中&#xff0c;生成二维码&#xff0c;并在二维码中央添加自定义logo&#xff0c;然后生成一张分享给好友的 二维码图片。 一、用到的依赖包 npm install --save html2canvas <script srchttps://cdn.staticfile.org/jquery/2.1.1/jquery.min…

【APP移动端自动化测试】第一节.环境配置和adb调试工具

文章目录 前言一、Java环境搭建二、AndroidSDK环境搭建三、Android模拟器安装四、adb调试工具基本介绍 4.1 adb构成和基本原理 4.2 adb获取包名&#xff0c;界面名 4.3 adb文件传输 4.4 adb获取app启动时间 4.5 adb获取手机日志 4.6 adb其他有关…

室内、户外安防监控超低功耗24g人体雷达感应模块,智能门铃、灯光控制新体验

在当今这个智能科技日新月异的时代&#xff0c;雷达感应模块正逐渐成为智能家居领域的一颗璀璨新星。其超低功耗、无误触、无漏触等特性&#xff0c;以及在户外环境下能够智能过滤环境干扰的独特优势&#xff0c;使得雷达感应模块在智能门铃、灯光照明等方面的应用越来越广泛。…

【C++】list 容器的增删改查---模拟实现(图例超详细解析!!!)

目录 一、前言 二、 list 容器的模拟实现思 ✨ 模块分析 ✨ 作用分析 三、list的节点类设计 四、list 的迭代器类设计 ⭐ 迭代器类--存在的意义 ⭐ 迭代器类--模拟实现 &#x1f4a6; 模板参数 和 成员变量 &#x1f4a6; 构造函数 &#x1f4a6; 运算符的重载 &…