332 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="slw" :id="videoId">
 | |
|     <div class="slw-title">
 | |
|       <h2>{{ name }}</h2>
 | |
|       <div class="slw-title__close" @click="removeMonitor">
 | |
|         <i class="el-icon-circle-close"></i>
 | |
|         <span>关闭视频</span>
 | |
|       </div>
 | |
|     </div>
 | |
|     <iframe
 | |
|       v-if="isShow"
 | |
|       :id="id"
 | |
|       allow="autoplay *; microphone *; fullscreen *" allowfullscreen allowtransparency key="" allowusermedia frameBorder="no"
 | |
|       style="width: 100%; height: 100%;"
 | |
|       :src="`https://cdn.cunwuyun.cn/slw2.0/index.html?url=${src}`">
 | |
|     </iframe>
 | |
|     <div class="action-bar">
 | |
|       <div class="left">
 | |
|         <div class="left-btns">
 | |
|           <span :class="[currIndex === 0 ? 'active' : '']" @click="currIndex = 0">实时</span>
 | |
|           <span :class="[currIndex === 1 ? 'active' : '']" @click="currIndex = 1">历史</span>
 | |
|         </div>
 | |
|         <div
 | |
|           class="volume"
 | |
|           @mouseleave.stop="isShowVolume = false">
 | |
|           <img 
 | |
|             @mouseenter.stop="isShowVolume = true"
 | |
|             src="https://cdn.cunwuyun.cn/slw2.0/images/sound.png">
 | |
|           <div class="volume-slider" :class="[isShowVolume ? 'active' : '']">
 | |
|             <el-slider
 | |
|               input-size="mini"
 | |
|               v-model="volume"
 | |
|               vertical
 | |
|               @change="onVolume"
 | |
|               height="80px">
 | |
|             </el-slider>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|       <div class="right">
 | |
|         <img src="https://cdn.cunwuyun.cn/slw2.0/images/date.png" @click="isShowDate = true">
 | |
|         <img src="https://cdn.cunwuyun.cn/slw2.0/images/screenshots.png" title="截屏" @click="screenshots">
 | |
|         <img src="https://cdn.cunwuyun.cn/slw2.0/images/full-screen.png" :title="isFullscreen ? '退出全屏' : '全屏'" @click="fullscreen">
 | |
|       </div>
 | |
|     </div>
 | |
|     <ai-dialog
 | |
|       title="选择日期"
 | |
|       :visible.sync="isShowDate"
 | |
|       width="520px"
 | |
|       @onConfirm="onConfirm">
 | |
|       <el-form class="ai-form" ref="form" :model="form" label-width="80px" size="small">
 | |
|         <el-form-item label="选择日期" prop="date" :rules="[{ required: true, message: '请选择日期', trigger: 'change' }]">
 | |
|           <el-date-picker
 | |
|             value-format="yyyy-MM-DD"
 | |
|             v-model="form.date"
 | |
|             type="date"
 | |
|             placeholder="选择日期">
 | |
|           </el-date-picker>
 | |
|         </el-form-item>
 | |
|       </el-form>
 | |
|     </ai-dialog>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
|   export default {
 | |
|     props: ['src', 'name'],
 | |
| 
 | |
|     name: 'slwVideo',
 | |
| 
 | |
|     data () {
 | |
|       return {
 | |
|         currIndex: 0,
 | |
|         isShowDate: false,
 | |
|         isShowPlayBtn: false,
 | |
|         isShow: true,
 | |
|         isShowVolume: false,
 | |
|         form: {
 | |
|           date: ''
 | |
|         },
 | |
|         volume: 100,
 | |
|         videoId: `slwvideo-${new Date().getTime()}`,
 | |
|         id: `video-${new Date().getTime()}`,
 | |
|         isFullscreen: false
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     watch: {
 | |
|       src: {
 | |
|         handler (val) {
 | |
|           if (val) {
 | |
|             this.isShow = false
 | |
| 
 | |
|             this.$nextTick(() => {
 | |
|               this.isShow = true
 | |
|             })
 | |
|           }
 | |
|         },
 | |
|         immediate: true,
 | |
|         deep: true
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     mounted () {
 | |
|     },
 | |
| 
 | |
|     methods: {
 | |
|       exitFullscreen () {
 | |
|         if (document.exitFullscreen) {
 | |
|           document.exitFullscreen()
 | |
|         } else if (document.msExitFullscreen) {
 | |
|           document.msExitFullscreen()
 | |
|         } else if (document.mozCancelFullScreen) {
 | |
|           document.mozCancelFullScreen()
 | |
|         } else if (document.webkitExitFullscreen) {
 | |
|           document.webkitExitFullscreen()
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       onConfirm () {
 | |
|         this.$refs.form.validate((valid) => {
 | |
|           if (valid) {
 | |
|           }
 | |
|         })
 | |
|       },
 | |
| 
 | |
|       onVolume (e) {
 | |
|         const v = (e / 100).toFixed(1)
 | |
|         const subPage = document.querySelector(`#${this.id}`).contentWindow
 | |
|         subPage.postMessage({
 | |
|           type: 'volume',
 | |
|           value: Number(v)
 | |
|         }, '*')
 | |
|       },
 | |
| 
 | |
|       fullscreen () {
 | |
|         if (this.isFullscreen) {
 | |
|           this.exitFullscreen()
 | |
|         } else {
 | |
|           this.requestFullScreen(document.querySelector(`#${this.videoId}`))
 | |
|         }
 | |
| 
 | |
|         this.isFullscreen = !this.isFullscreen
 | |
|       },
 | |
| 
 | |
|       screenshots () {
 | |
|         const subPage = document.querySelector(`#${this.id}`).contentWindow
 | |
|         subPage.postMessage({
 | |
|           type: 'screenshot'
 | |
|         }, '*')
 | |
|       },
 | |
| 
 | |
|       removeMonitor () {
 | |
|         this.$emit('close')
 | |
|       },
 | |
| 
 | |
|       requestFullScreen (element) {
 | |
|         var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen;
 | |
|         if (requestMethod) {
 | |
|           requestMethod.call(element);
 | |
|         } else if (typeof window.ActiveXObject !== 'undefined') {
 | |
|           var wscript = new ActiveXObject('WScript.Shell')
 | |
|           if (wscript !== null) {
 | |
|             wscript.SendKeys('{F11}')
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .slw {
 | |
|     position: relative;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
| 
 | |
|     iframe {
 | |
|       border: none;
 | |
|     }
 | |
| 
 | |
|     .slw-title {
 | |
|       display: flex;
 | |
|       position: absolute;
 | |
|       align-items: center;
 | |
|       justify-content: space-between;
 | |
|       top: 0;
 | |
|       left: 0;
 | |
|       z-index: 1;
 | |
|       width: 100%;
 | |
|       height: 40px;
 | |
|       line-height: 40px;
 | |
|       padding: 0 16px;
 | |
|       background: rgba(0, 0, 0, 0.8);
 | |
| 
 | |
|       h2 {
 | |
|         font-size: 16px;
 | |
|         color: #fff;
 | |
|         font-weight: normal;
 | |
|       }
 | |
| 
 | |
|       .slw-title__close {
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|         justify-content: center;
 | |
|         width: 84px;
 | |
|         height: 32px;
 | |
|         background: linear-gradient(180deg, #2E3447 0%, #151825 100%);
 | |
|         border-radius: 2px;
 | |
|         cursor: pointer;
 | |
|         font-size: 12px;
 | |
|         color: #fff;
 | |
| 
 | |
|         &:hover {
 | |
|           opacity: 0.9;
 | |
|         }
 | |
| 
 | |
|         span {
 | |
|           margin-left: 4px;
 | |
|         }
 | |
| 
 | |
|         i {
 | |
|           position: relative;
 | |
|           font-size: 16px;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .action-bar {
 | |
|       display: flex;
 | |
|       position: absolute;
 | |
|       align-items: center;
 | |
|       justify-content: space-between;
 | |
|       bottom: 0;
 | |
|       left: 0;
 | |
|       z-index: 1;
 | |
|       width: 100%;
 | |
|       height: 40px;
 | |
|       padding: 0 16px;
 | |
|       background: rgba(0, 0, 0, 0.8);
 | |
| 
 | |
|       .left {
 | |
|         .volume {
 | |
|           position: relative;
 | |
|           height: 100%;
 | |
| 
 | |
|           .volume-slider {
 | |
|             display: none;
 | |
|             position: absolute;
 | |
|             bottom: 20px;
 | |
|             left: 50%;
 | |
|             z-index: -1;
 | |
|             opacity: 0;
 | |
|             padding: 20px 0 10px;
 | |
|             background-color: rgba(0, 0,0,.8);
 | |
|             transform: translate(-50%, 0);
 | |
|             transition: all ease 0.3s;
 | |
| 
 | |
|             &.active {
 | |
|               display: block;
 | |
|               z-index: 1;
 | |
|               opacity: 1;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         img {
 | |
|           cursor: pointer;
 | |
|         }
 | |
| 
 | |
|         .left-btns {
 | |
|           display: flex;
 | |
|           align-items: center;
 | |
|           width: 96px;
 | |
|           height: 24px;
 | |
|           margin-right: 10px;
 | |
|           background: #222838;
 | |
|           border-radius: 100px;
 | |
|           text-align: center;
 | |
|           overflow: hidden;
 | |
| 
 | |
|           span {
 | |
|             flex: 1;
 | |
|             height: 100%;
 | |
|             line-height: 24px;
 | |
|             background: #222838;
 | |
|             color: #c9c9c9;
 | |
|             font-size: 12px;
 | |
|             cursor: pointer;
 | |
| 
 | |
|             &.active {
 | |
|               color: #fff;
 | |
|               background: linear-gradient(180deg, #28B2EB 0%, #193D91 100%);
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       .right {
 | |
|         color: #c9c9c9;
 | |
|         font-size: 12px;
 | |
| 
 | |
|         span {
 | |
|           margin-right: 32px;
 | |
|           cursor: pointer;
 | |
| 
 | |
|           &:hover {
 | |
|             opacity: 0.6;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         img {
 | |
|           margin-right: 16px;
 | |
|           cursor: pointer;
 | |
| 
 | |
|           &:last-child {
 | |
|             margin-right: 0;
 | |
|           }
 | |
| 
 | |
|           &:hover {
 | |
|             opacity: 0.6;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       & > div {
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| </style> |