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

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>


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

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

相关文章

VS Code扩展开发介绍和快速示例

VS Code 介绍 VS Code&#xff08;Visual Studio Code&#xff09;是一款由微软开发的轻量级的免费开源的源代码编辑器&#xff0c;它支持多种操作系统&#xff0c;包括Windows、macOS和Linux。以下是对VS Code的详细介绍&#xff1a; 一、跨平台支持 VS Code是一个真正的跨…

阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具&#xff0c;可以帮助企业或者个人实现多数据源的切换&#xff0c;这里通过阅读源码的方式解析是如何动态的切换数据源的&#xff0c;采用的版本是3.5.1 源码解析 通过官方文档可以看到&#x…

HTML制作一个太阳、地球、月球之间的绕转动画

大家好&#xff0c;今天制作一个太阳、地球、月球之间的绕转动画&#xff01; 先看具体效果&#xff1a; 要制作一个太阳、地球、月球之间的绕转动画&#xff0c;我们需要结合HTML、CSS和JavaScript。由于CSS动画和JavaScript动画各有优缺点&#xff0c;这里我将给出一个使用…

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字&#xff0c;并且时间长了会掉色&#xff0c;使汉字模糊难认&#xff0c;这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…

空山新雨后-故事和场景搭建(一)

1、关于故事 1.故事的灵感 2.故事的表线 3.故事的里线 4.故事的参考图 5.故事的资源 6.关于音乐,听了100多首音乐选出来的 2、场景搭建 1.放入HDRI,放入PostProcessVolumn,将PostProcessVolumn设置为无限范围,将曝光补偿、Min EUV、Max EUV都设置为0,

SpringBoot Vue Bootstrap 旅游管理系统

SpringBoot Vue 旅游管理系统源码&#xff0c;附带环境安装&#xff0c;运行说明 源码地址 开发环境 jdk1.8,mysql8,nodejs16,navicat,idea 使用技术springboot mybatis vue bootstrap 部分功能截图预览

投稿要求的Cover Letter该怎么写?附全文模版+例句

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 投稿时提交的Cover letter&#xff0c;是作者写给期刊编辑的信&#xff0c;编辑在看完你的cover letter之后&#xff0c;再决定是否继续看全文。Cover Letter不会随正文一起发…

零基础直接上手java跨平台桌面程序,使用javafx(五)TableView显示excel表

我们在窗口的中间加上TableVie&#xff1a; 在hello-view.fxml的文本中&#xff0c;要增加一些代码。在TableView定义中加上fx:id"TableView1"&#xff0c;这样java代码才方便访问&#xff0c;在java代码中要加上FXML private TableView TableView1;表示定义TableVie…

JDBC开发之四大核心API:DriverManager Connection Statement ResultSet

DriverManager 方法都是静态的 注册驱动 在Mysql5之后我们就不用注册驱动了 在jar包里已经写好了 读取文件 第二个方法 如果连接的是主机mysql并且端口是默认的3306 则可以简化书写 代码书写 import java.sql.Connection; import java.sql.DriverManager; import java.sql.S…

应急管理大泽动力6寸柴油水泵的使用方法

6寸柴油水泵的使用方法可以按照以下步骤进行&#xff0c;以确保操作的安全&#xff1a; 一、准备阶段 检查设备&#xff1a;确保6寸柴油水泵及其配件完好无损&#xff0c;特别是检查水泵的密封性能&#xff0c;确保无泄漏。 准备油料&#xff1a;根据参考文章1&#xff0c;为…

解决cmd命令出现乱码问题

方法1&#xff1a;修改CMD或PS显示编码(临时且不一定生效) CMD的默认编码为gdk&#xff08;简体中文&#xff09;&#xff0c;需修改为utf-8&#xff08;万国码&#xff09; 在命令行窗口输入 CHCP 65001窗口关闭后又会恢复成默认的gdk编码形式 方法2&#xff1a;更改系统设…

注意力机制篇 | YOLOv8改进之在C2f模块引入SpatialGroupEnhance注意力模块

前言:Hello大家好,我是小哥谈。这篇文章介绍了一种轻量级的神经网络模块SGE,它可以调整卷积神经网络中每个子特征的重要性,从而提高图像识别任务的性能。SGE通过生成注意力因子来调整每个子特征的强度,有效抑制噪声。与流行的CNN主干网络集成时,SGE可以显著提高图像识别性…

ConstraintLayout遇到的坑

背景 为了降低app的卡顿率&#xff0c;项目做了一次优化&#xff0c;将首页的的滑动控件viewPager改成了viewPager2&#xff0c;前者是一次性加载所有的布局文件&#xff0c;后者只会加载目标页面的布局文件&#xff0c;减少了计算和绘制的时间。在开发完后&#xff0c;发现了…

Vue 路由传递参数 query、params

1、to的对象写法,绑定参数 <template> 2 <ul> 3 <li v-for"m in messlist" :key"m.id"> 4 <router-link :to"{ //使用params时&#xff0c;这个路径必须用name及别名......name: xiangqing, path: /bbb/message/deta…

【GreenHills】解决GHS对于“//”注释符号进行报错的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决GHS对于使用“//”进行注释内容进行报错的问题 2、 问题场景 在代码中经常使用“//”进行内容注释。但是&#xff0c;在GHS中发现所有的注释信息都被显示了报错。报错信息如下图2-1。 图2-1 3、软硬件环境 1&a…

关于LayUI弹出层请求一次其他网页后无法再次点击按钮问题

问题描述 使用layer弹出层去请求另一个页面&#xff0c;关闭弹窗后本页面按钮无法点击也不报错,如下面弹窗代码 layer.open({type: 1,area: [500px, 400px],title: 编辑信息,shade: 0.6,shadeClose: true,maxmin: false,anim: 0,success: function (layero, index) {$.ajax({u…

【网络编程开发】7.TCP可靠传输的原理

7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;即传输控制协议&#xff0c;是网络通信中的一种重要协议&#xff0…

守护云端数据安全—安当透明加密TDE解决方案

国家安全部官微6月5日消息&#xff0c;云存储是一种新兴网络存储技术。近年来&#xff0c;随着网络“云”功能不断普及&#xff0c;“云端”数据也成为了境外间谍情报机关关注的重点&#xff0c;他们通过网络攻击、植入木马等各种手段&#xff0c;试图窃取我敏感信息和涉密数据…

将你的IOS升级到18

一、登录到苹果开发者网站 Apple Developer 二、选择IOS 18 三、选择Download 四、登录appleid 五、显示下载页面 六、登录你的手机

一款优秀的下载和共享工具

一、简介 1、它以舒适和快速的方式下载Internet文件&#xff0c;同时支持断点续传和嗅探视频音频的功能。 它具有站点抓取、批量下载队列和计划任务下载等功能&#xff0c;可以接管所有浏览器的下载任务&#xff0c;包括Edge&#xff0c;Firefox和Chrome等主流浏览器。 对于用…