Browse Source

增加云台控制,录像查询等

Administrator 5 years ago
parent
commit
118c6eeada
4 changed files with 470 additions and 385 deletions
  1. 145 0
      FalsificationData.js
  2. 0 1
      package.json
  3. 324 369
      src/components/gb28181/devicePlayer.vue
  4. 1 15
      vue.config.js

+ 145 - 0
FalsificationData.js

@@ -0,0 +1,145 @@
+//伪造测试数据
+const devices=[
+    {
+        "deviceId": "37010200491320000001",
+        "name": "浪潮仓外",
+        "manufacturer": "Hikvision",
+        "model": "iDS-2DE7223IX-A/S1",
+        "firmware": "V5.5.23",
+        "transport": "TCP",
+        "host": {
+            "ip": "10.200.64.194",
+            "port": 58206,
+            "address": "10.200.64.194:58206"
+        },
+        "online": 1,
+        "channelMap": {
+            "37010200491320000001": {
+                "channelId": "37010200491320000001",
+                "name": "济南第一粮库大门",
+                "manufacture": "Hikvision",
+                "model": "IP Camera",
+                "owner": "Owner",
+                "civilCode": "CivilCode",
+                "block": null,
+                "address": "Address",
+                "parental": 0,
+                "parentId": null,
+                "safetyWay": 0,
+                "registerWay": 1,
+                "certNum": null,
+                "certifiable": 0,
+                "errCode": 0,
+                "endTime": null,
+                "secrecy": "0",
+                "ipAddress": null,
+                "port": 0,
+                "password": null,
+                "status": 1,
+                "longitude": 0.0,
+                "latitude": 0.0
+            }
+        }
+    },
+    {
+        "deviceId": "34020000001320000004",
+        "name": null,
+        "manufacturer": "Dahua",
+        "model": "DH-SD-59D120T-HN",
+        "firmware": "V2.422.3.R.2016-11-30",
+        "transport": "UDP",
+        "host": {
+            "ip": "10.200.64.195",
+            "port": 5060,
+            "address": "10.200.64.195:5060"
+        },
+        "online": 0,
+        "channelMap": {
+            "34020000001320000004": {
+                "channelId": "34020000001320000004",
+                "name": "Camera 01",
+                "manufacture": "Dahua",
+                "model": "DH-SD-59D120T-HN",
+                "owner": "0",
+                "civilCode": "6532",
+                "block": null,
+                "address": "axy",
+                "parental": 0,
+                "parentId": null,
+                "safetyWay": 0,
+                "registerWay": 1,
+                "certNum": null,
+                "certifiable": 0,
+                "errCode": 0,
+                "endTime": null,
+                "secrecy": "0",
+                "ipAddress": null,
+                "port": 0,
+                "password": null,
+                "status": 1,
+                "longitude": 0.0,
+                "latitude": 0.0
+            },
+			"34020000001320000005": {
+			    "channelId": "34020000001320000005",
+			    "name": "Camera 011",
+			    "manufacture": "Dahua1",
+			    "model": "DH-SD-59D120T-HN",
+			    "owner": "0",
+			    "civilCode": "6532",
+			    "block": null,
+			    "address": "axy1",
+			    "parental": 0,
+			    "parentId": null,
+			    "safetyWay": 0,
+			    "registerWay": 1,
+			    "certNum": null,
+			    "certifiable": 0,
+			    "errCode": 0,
+			    "endTime": null,
+			    "secrecy": "0",
+			    "ipAddress": null,
+			    "port": 0,
+			    "password": null,
+			    "status": 1,
+			    "longitude": 0.0,
+			    "latitude": 0.0
+			}
+        }
+    }
+]
+
+const recordData={
+    "deviceId": "34020000001320000001",
+    "name": "假数据中化梁抵库",
+    "sumNum": 2,
+    "recordList": [
+        {
+            "deviceId": "34020000001320000001",
+            "name": "假数据中化梁抵库",
+            "filePath": "1589112259_1589112788",
+            "address": "Address 1",
+            "startTime": "2020-05-10 20:04:19",
+            "endTime": "2020-05-10 20:13:08",
+            "secrecy": 0,
+            "type": "time",
+            "recorderId": null
+        },
+        {
+            "deviceId": "34020000001320000001",
+            "name": "假数据中化梁抵库",
+            "filePath": "1589112788_1589113318",
+            "address": "Address 1",
+            "startTime": "2020-05-10 20:13:08",
+            "endTime": "2020-05-10 20:21:58",
+            "secrecy": 0,
+            "type": "time",
+            "recorderId": null
+        }
+    ]
+}
+
+export default{
+	devices,//设备列表
+	recordData,
+}

+ 0 - 1
package.json

@@ -19,7 +19,6 @@
   "devDependencies": {
     "@vue/cli-plugin-babel": "^3.8.0",
     "@vue/cli-service": "^3.8.0",
-    "copy-webpack-plugin": "^5.1.1",
     "vue-template-compiler": "^2.6.11"
   }
 }

+ 324 - 369
src/components/gb28181/devicePlayer.vue

@@ -1,19 +1,10 @@
 <template>
 	<div id="devicePlayer">
 		<el-dialog title="视频播放" top="0" :visible.sync="showVideoDialog" :destroy-on-close="true" @close="stop()">
-			<iframe
-				:src="videoUrl"
-				ref="videoRender"
-				style="width:100%; height:35rem;"
-				frameborder="no"
-				border="0"
-				marginwidth="0"
-				marginheight="0"
-				scrolling="no"
-				allowtransparency="yes"
-			></iframe>
+			<iframe :src="videoUrl" ref="videoRender" style="width:100%; height:35rem;" frameborder="no" border="0" marginwidth="0"
+			 marginheight="0" scrolling="no" allowtransparency="yes"></iframe>
 			<div id="shared" style="text-align: right;">
-				<el-tabs>
+				<el-tabs v-model="tabActiveName">
 					<el-tab-pane label="媒体流信息" name="media">
 						<div style="margin-bottom: 0.5rem;">
 							<el-button type="primary" size="small" @click="playRecord(true, '')">播放</el-button>
@@ -35,14 +26,17 @@
 					</el-tab-pane>
 					<!--{"code":0,"data":{"paths":["22-29-30.mp4"],"rootPath":"/home/kkkkk/Documents/ZLMediaKit/release/linux/Debug/www/record/hls/kkkkk/2020-05-11/"}}-->
 					<el-tab-pane label="录像查询" name="second">
+						<el-date-picker v-model="videoHistory.startTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="开始时间"
+						 @change="recordList()"></el-date-picker>
+						<el-date-picker v-model="videoHistory.endTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="结束时间"
+						 @change="recordList()"></el-date-picker>
 						<el-table :data="videoHistory.searchHistoryResult" style="width: 100%">
-							<el-table-column label="文件" prop="path" width="500"></el-table-column>
-							<el-table-column align="right" width="300">
-								<template slot="header" slot-scope="scope">
-									<el-date-picker v-model="videoHistory.searchHistoryParam" type="date" placeholder="选择日期" @change="recordList()"></el-date-picker>
-								</template>
-							</el-table-column>
-							<el-table-column label="">
+							<el-table-column label="名称" prop="name" width="150"></el-table-column>
+							<el-table-column label="文件" prop="filePath" width="300"></el-table-column>
+							<el-table-column label="开始时间" prop="startTime" width="160"></el-table-column>
+							<el-table-column label="结束时间" prop="endTime" width="160"></el-table-column>
+
+							<el-table-column label="操作">
 								<template slot-scope="scope">
 									<el-button type="primary" size="mini" @click="playRecord(false, scope.row)">播放</el-button>
 								</template>
@@ -50,31 +44,36 @@
 						</el-table>
 					</el-tab-pane>
 					<!--遥控界面-->
-					<el-tab-pane label="云台控制" name="third" style="display: flex; justify-content: center; width: 100%;">
-						<div class="control-wrapper">
-							<div class="control-btn control-top" @mousedown="ptzCamera(0, 1, 0)" @mouseup="ptzCamera(0, 0, 0)">
-								<i class="el-icon-caret-top"></i>
-								<div class="control-inner-btn control-inner"></div>
-							</div>
-							<div class="control-btn control-left" @mousedown="ptzCamera(1, 0, 0)" @mouseup="ptzCamera(0, 0, 0)">
-								<i class="el-icon-caret-left"></i>
-								<div class="control-inner-btn control-inner"></div>
-							</div>
-							<div class="control-btn control-bottom" @mousedown="ptzCamera(0, 2, 0)" @mouseup="ptzCamera(0, 0, 0)">
-								<i class="el-icon-caret-bottom"></i>
-								<div class="control-inner-btn control-inner"></div>
-							</div>
-							<div class="control-btn control-right" @mousedown="ptzCamera(2, 0, 0)" @mouseup="ptzCamera(0, 0, 0)">
-								<i class="el-icon-caret-right"></i>
-								<div class="control-inner-btn control-inner"></div>
-							</div>
-							<div class="control-round">
-								<div class="control-round-inner"><i class="fa fa-pause-circle"></i></div>
-							</div>
+					<el-tab-pane label="云台控制" name="third">
+						<div style="display: flex; justify-content: center;">
+							<div class="control-wrapper">
+								<div class="control-btn control-top" @mousedown="ptzCamera(0, 1, 0)" @mouseup="ptzCamera(0, 0, 0)">
+									<i class="el-icon-caret-top"></i>
+									<div class="control-inner-btn control-inner"></div>
+								</div>
+								<div class="control-btn control-left" @mousedown="ptzCamera(1, 0, 0)" @mouseup="ptzCamera(0, 0, 0)">
+									<i class="el-icon-caret-left"></i>
+									<div class="control-inner-btn control-inner"></div>
+								</div>
+								<div class="control-btn control-bottom" @mousedown="ptzCamera(0, 2, 0)" @mouseup="ptzCamera(0, 0, 0)">
+									<i class="el-icon-caret-bottom"></i>
+									<div class="control-inner-btn control-inner"></div>
+								</div>
+								<div class="control-btn control-right" @mousedown="ptzCamera(2, 0, 0)" @mouseup="ptzCamera(0, 0, 0)">
+									<i class="el-icon-caret-right"></i>
+									<div class="control-inner-btn control-inner"></div>
+								</div>
+								<div class="control-round">
+									<div class="control-round-inner"><i class="fa fa-pause-circle"></i></div>
+								</div>
 
-							<div style="position: absolute; left: 7.25rem; top: 2.25rem" @mousedown="ptzCamera(0, 0, 2)" @mouseup="ptzCamera(0, 0, 0)"><i class="el-icon-zoom-in"></i></div>
-							<div style="position: absolute; left: 7.25rem; top: 4.25rem;" @mousedown="ptzCamera(0, 0, 1)" @mouseup="ptzCamera(0, 0, 0)"><i class="el-icon-zoom-out"></i></div>
+								<div style="position: absolute; left: 7.25rem; top: 2.25rem" @mousedown="ptzCamera(0, 0, 2)" @mouseup="ptzCamera(0, 0, 0)"><i
+									 class="el-icon-zoom-in" style="font-size: 1.875rem;"></i></div>
+								<div style="position: absolute; left: 7.25rem; top: 4.25rem; font-size: 1.875rem;" @mousedown="ptzCamera(0, 0, 1)"
+								 @mouseup="ptzCamera(0, 0, 0)"><i class="el-icon-zoom-out"></i></div>
+							</div>
 						</div>
+
 					</el-tab-pane>
 				</el-tabs>
 			</div>
@@ -83,366 +82,322 @@
 </template>
 
 <script>
-export default {
-	name: 'devicePlayer',
-	props: {},
-	computed: {
-		getPlayerShared: function() {
-			let info = {
-				sharedUrl: window.location.host + '/' + this.videoUrl,
-				sharedIframe: '<iframe src="' + window.location.host + '/' + this.videoUrl + '"></iframe>',
-				sharedRtmp: this.videoUrl
-			};
-			return info;
-		}
-	},
-	data() {
-		return {
-			videoUrl: '',
-			videoHistory: {
-				searchHistoryParam: '',
-				searchHistoryResult: [] //媒体流历史记录搜索结果
-			},
-			showVideoDialog: false,
-			normalssrc: '',
-			ssrc: '',
-			deviceId: '',
-			channelId: ''
-		};
-	},
-	methods: {
-		play: function(normalssrc, deviceId, channelId) {
-			this.normalssrc = normalssrc;
-			this.deviceId = deviceId;
-			this.channelId = channelId;
-			let hex_ssrc = parseInt(normalssrc).toString(16);
-			let hex_ssrc_size = 8 - hex_ssrc.length;
-			for (var i = 0; i < hex_ssrc_size; i++) {
-				hex_ssrc = '0' + hex_ssrc;
+	import falsificationData from '../../../FalsificationData.js'
+	export default {
+		name: 'devicePlayer',
+		props: {},
+		computed: {
+			getPlayerShared: function() {
+				let info = {
+					sharedUrl: window.location.host + '/' + this.videoUrl,
+					sharedIframe: '<iframe src="' + window.location.host + '/' + this.videoUrl + '"></iframe>',
+					sharedRtmp: this.videoUrl
+				};
+				return info;
 			}
-			console.log('hex_ssrc:' + hex_ssrc);
-			this.ssrc = hex_ssrc.toLocaleUpperCase();
-			console.log('转换完成:' + this.ssrc);
-			this.videoUrl = '/video/video.html?url=' + this.$global.baseMediaUrl + 'rtp/' + this.ssrc + '.flv?st=' + new Date().getTime();
-			this.showVideoDialog = true;
-			console.log(this.ssrc);
 		},
-		stop: function() {
-			console.log('关闭视频');
-			this.videoUrl = '';
-			this.showVideoDialog = false;
-			let that = this;
-			this.$axios({
-				method: 'post',
-				url: this.$global.genGb28181Url('/api/play/' + this.ssrc + '/stop')
-			}).then(function(res) {
-				console.log(JSON.stringify(res));
-			});
+		created() {
+			this.videoHistory.searchHistoryResult = falsificationData.recordData.recordList;
 		},
-		copySharedInfo: function(data) {
-			console.log('复制内容:' + data);
-			let _this = this;
-			this.$copyText(data).then(
-				function(e) {
-					_this.$message({
-						showClose: true,
-						message: '复制成功',
-						type: 'success'
-					});
+		data() {
+			return {
+				videoUrl: '',
+				videoHistory: {
+					startTime: '',
+					endTime: '',
+					searchHistoryResult: [] //媒体流历史记录搜索结果
 				},
-				function(e) {
-					_this.$message({
-						showClose: true,
-						message: '复制失败,请手动复制',
-						type: 'error'
-					});
-				}
-			);
-		},
-		startRecord: function() {
-			let that = this;
-			let startURL = this.$global.genApiUrl('/startRecord') + '&type=1&vhost=__defaultVhost__&app=rtp&stream=' + this.ssrc;
-			console.log(startURL);
-			this.$axios({
-				method: 'get',
-				url: startURL
-			}).then(function(res) {
-				console.log(JSON.stringify(res.data));
-				if (res.data.code == 0 && res.data.result) {
-					that.$message({
-						showClose: true,
-						message: '开始录制',
-						type: 'success'
-					});
-				} else {
-					that.$message({
-						showClose: true,
-						message: res.data.msg,
-						type: 'error'
-					});
-				}
-			});
+				showVideoDialog: false,
+				normalssrc: '',
+				ssrc: '',
+				deviceId: '',
+				channelId: '',
+				tabActiveName: 'media'
+			};
 		},
-		stopRecord: function() {
-			let that = this;
-			let streamInfo = this.currentPlayerInfo;
-			let stopURL = this.$global.genApiUrl('/stopRecord') + '&type=1&vhost=__defaultVhost__&app=rtp&stream=' + this.ssrc;
-			console.log(stopURL);
-			this.$axios({
-				method: 'get',
-				url: stopURL
-			}).then(function(res) {
-				console.log(JSON.stringify(res.data));
-				if (res.data.code == 0 && res.data.result) {
-					that.$message({
-						showClose: true,
-						message: '结束录制',
-						type: 'success'
-					});
-				} else {
-					that.$message({
-						showClose: true,
-						message: res.data.msg,
-						type: 'error'
-					});
+		methods: {
+			getVideoUrlBySsrc: function(ssrc) {
+				console.log("生成1");
+				let hex_ssrc = parseInt(ssrc).toString(16);
+				let hex_ssrc_size = 8 - hex_ssrc.length;
+				for (var i = 0; i < hex_ssrc_size; i++) {
+					hex_ssrc = '0' + hex_ssrc;
 				}
-			});
-		},
-		recordList: function() {
-			let that = this;
-			console.log('当前ssrc:' + this.ssrc);
-			var date = this.videoHistory.searchHistoryParam;
-			var year = date.getFullYear();
-			var month = date.getMonth() + 1;
-			var day = date.getDate();
-			if (month < 10) {
-				month = '0' + month;
-			}
-			if (day < 10) {
-				day = '0' + day;
-			}
-			let nowDate = year + '-' + month + '-' + day;
-			let stopURL = this.$global.genApiUrl('/getMp4RecordFile') + '&vhost=__defaultVhost__&app=rtp&stream=' + this.ssrc + '&period=' + nowDate;
-
-			console.log(stopURL);
-			this.$axios({
-				method: 'get',
-				url: stopURL
-			}).then(function(res) {
-				console.log(JSON.stringify(res.data));
-				if (res.data.code == 0 && res.data) {
-					let mp4files = res.data.data.paths;
-					let rootPath = res.data.data.rootPath;
-					let weburltemp = rootPath.substr(rootPath.indexOf('record'));
-					let weburl = 'http://' + that.$global.ZLServerIp + '/' + weburltemp;
-					for (let i in mp4files) {
-						let fullMp4file = weburl + mp4files[i];
-						console.log(fullMp4file);
-						that.videoHistory.searchHistoryResult.push({
-							path: fullMp4file
+				console.log('hex_ssrc:' + hex_ssrc);
+				this.ssrc = hex_ssrc.toLocaleUpperCase();
+				console.log('转换完成:' + this.ssrc);
+				let videoUrl = this.$global.baseMediaUrl + 'rtp/' + this.ssrc + '.flv?st=' + new Date()
+					.getTime();
+				return videoUrl;
+			},
+			play: function(normalssrc, deviceId, channelId) {
+				this.normalssrc = normalssrc;
+				this.deviceId = deviceId;
+				this.channelId = channelId;
+				this.videoUrl = '/video/video.html?url=' + this.getVideoUrlBySsrc(normalssrc);
+				console.log("生成完成:"+this.videoUrl);
+				this.showVideoDialog = true;
+				console.log(this.ssrc);
+			},
+			stop: function() {
+				console.log('关闭视频');
+				this.videoUrl = '';
+				this.showVideoDialog = false;
+				let that = this;
+				this.$axios({
+					method: 'post',
+					url: this.$global.genGb28181Url('/api/play/' + this.ssrc + '/stop')
+				}).then(function(res) {
+					console.log(JSON.stringify(res));
+				});
+				
+				this.$axios({
+					method: 'post',
+					url: this.$global.genGb28181Url('/api/playback/' + this.ssrc + '/stop')
+				}).then(function(res) {
+					console.log(JSON.stringify(res));
+				});
+			},
+			copySharedInfo: function(data) {
+				console.log('复制内容:' + data);
+				let _this = this;
+				this.$copyText(data).then(
+					function(e) {
+						_this.$message({
+							showClose: true,
+							message: '复制成功',
+							type: 'success'
+						});
+					},
+					function(e) {
+						_this.$message({
+							showClose: true,
+							message: '复制失败,请手动复制',
+							type: 'error'
 						});
 					}
-					that.$message({
-						showClose: true,
-						message: '列表获取成功',
-						type: 'success'
-					});
-				} else {
-					that.$message({
-						showClose: true,
-						message: res.data.msg,
-						type: 'error'
-					});
+				);
+			},
+
+			recordList: function() {
+				if (!this.videoHistory.startTime || !this.videoHistory.endTime) {
+					return;
 				}
-			});
-		},
-		playRecord: function(isBackLive, rowData) {
-			console.log(JSON.stringify(rowData));
-			this.$refs.videoRender.contentWindow.postMessage(
-				{
-					cmd: 'switchUrl',
-					params: isBackLive
-						? {
+				let that = this;
+				this.$axios({
+					method: 'get',
+					url: this.$global.genGb28181Url('/api/record/' + this.deviceId + '/' + this.channelId) + '?startTime=' + this.videoHistory
+						.startTime + '&endTime=' + this.videoHistory.endTime
+				}).then(function(res) {
+					console.log(JSON.stringify(res));
+				}).catch(function(e) {
+					that.videoHistory.searchHistoryResult = falsificationData.recordData;
+				});
+
+			},
+			playRecord: function(isBackLive, rowData) {
+				console.log(JSON.stringify(rowData));
+				let that = this;
+				if (isBackLive) {
+					this.$refs.videoRender.contentWindow.postMessage({
+							cmd: 'switchUrl',
+							params: {
 								path: this.videoUrl.replace('/video/video.html?url=', '')
-						  }
-						: rowData
-				},
-				'*'
-			);
-		},
+							}
+						},
+						'*'
+					);
+					return;
+				}
+				this.$axios({
+					method: 'get',
+					url: this.$global.genGb28181Url(
+						'/api/playback/' + this.deviceId + '/' + this.channelId+'?startTime='+rowData.startTime+'&endTime='+rowData.endTime
+					)
+				}).then(function(res) {
+					let ssrc = res.data.ssrc;
+					let videoUrl = that.getVideoUrlBySsrc(ssrc);
+					that.$refs.videoRender.contentWindow.postMessage({
+							cmd: 'switchUrl',
+							params: {
+								path: videoUrl
+							}
+						},
+						'*'
+					);
+				});
 
-		ptzCamera: function(leftRight, upDown, zoom) {
-			console.log('云台控制:' + leftRight + ' : ' + upDown);
-			let that = this;
-			let data = { leftRight: leftRight, upDown: upDown };
-			this.$axios({
-				method: 'post',
-				data: data,
-				url: this.$global.genGb28181Url(
-					'/api/ptz/' + this.deviceId + '/' + this.channelId + '?leftRight=' + leftRight + '&upDown=' + upDown + '&inOut=' + zoom + '&moveSpeed=50&zoomSpeed=50'
-				)
-			}).then(function(res) {
-				console.log(JSON.stringify(res));
-			});
+			},
+			ptzCamera: function(leftRight, upDown, zoom) {
+				console.log('云台控制:' + leftRight + ' : ' + upDown + " : " + zoom);
+				let that = this;
+				this.$axios({
+					method: 'post',
+					url: this.$global.genGb28181Url(
+						'/api/ptz/' + this.deviceId + '/' + this.channelId + '?leftRight=' + leftRight + '&upDown=' + upDown +
+						'&inOut=' + zoom + '&moveSpeed=50&zoomSpeed=50'
+					)
+				}).then(function(res) {});
+			}
 		}
-	}
-};
+	};
 </script>
 
 <style>
-.control-wrapper {
-	position: relative;
-	width: 6.25rem;
-	height: 6.25rem;
-	max-width: 6.25rem;
-	max-height: 6.25rem;
-	margin: 0 auto;
-	border-radius: 100%;
-	float: left;
-}
+	.control-wrapper {
+		position: relative;
+		width: 6.25rem;
+		height: 6.25rem;
+		max-width: 6.25rem;
+		max-height: 6.25rem;
+		margin: 0 auto;
+		border-radius: 100%;
+		float: left;
+	}
 
-.control-btn {
-	display: flex;
-	justify-content: center;
-	position: absolute;
-	width: 44%;
-	height: 44%;
-	border-radius: 5px;
-	border: 1px solid #78aee4;
-	box-sizing: border-box;
-	transition: all 0.3s linear;
-}
+	.control-btn {
+		display: flex;
+		justify-content: center;
+		position: absolute;
+		width: 44%;
+		height: 44%;
+		border-radius: 5px;
+		border: 1px solid #78aee4;
+		box-sizing: border-box;
+		transition: all 0.3s linear;
+	}
 
-.control-btn i {
-	font-size: 20px;
-	color: #78aee4;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-}
+	.control-btn i {
+		font-size: 20px;
+		color: #78aee4;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
 
-.control-round {
-	position: absolute;
-	top: 21%;
-	left: 21%;
-	width: 58%;
-	height: 58%;
-	background: #fff;
-	border-radius: 100%;
-}
+	.control-round {
+		position: absolute;
+		top: 21%;
+		left: 21%;
+		width: 58%;
+		height: 58%;
+		background: #fff;
+		border-radius: 100%;
+	}
 
-.control-round-inner {
-	position: absolute;
-	left: 15%;
-	top: 15%;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	width: 70%;
-	height: 70%;
-	font-size: 40px;
-	color: #78aee4;
-	border: 1px solid #78aee4;
-	border-radius: 100%;
-	transition: all 0.3s linear;
-}
+	.control-round-inner {
+		position: absolute;
+		left: 15%;
+		top: 15%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		width: 70%;
+		height: 70%;
+		font-size: 40px;
+		color: #78aee4;
+		border: 1px solid #78aee4;
+		border-radius: 100%;
+		transition: all 0.3s linear;
+	}
 
-.control-inner-btn {
-	position: absolute;
-	width: 60%;
-	height: 60%;
-	background: #fafafa;
-}
+	.control-inner-btn {
+		position: absolute;
+		width: 60%;
+		height: 60%;
+		background: #fafafa;
+	}
 
-.control-top {
-	top: -8%;
-	left: 27%;
-	transform: rotate(-45deg);
-	border-radius: 5px 100% 5px 0;
-}
+	.control-top {
+		top: -8%;
+		left: 27%;
+		transform: rotate(-45deg);
+		border-radius: 5px 100% 5px 0;
+	}
 
-.control-top i {
-	transform: rotate(45deg);
-	border-radius: 5px 100% 5px 0;
-}
+	.control-top i {
+		transform: rotate(45deg);
+		border-radius: 5px 100% 5px 0;
+	}
 
-.control-top .control-inner {
-	left: -1px;
-	bottom: 0;
-	border-top: 1px solid #78aee4;
-	border-right: 1px solid #78aee4;
-	border-radius: 0 100% 0 0;
-}
+	.control-top .control-inner {
+		left: -1px;
+		bottom: 0;
+		border-top: 1px solid #78aee4;
+		border-right: 1px solid #78aee4;
+		border-radius: 0 100% 0 0;
+	}
 
-.control-top .fa {
-	transform: rotate(45deg) translateY(-7px);
-}
+	.control-top .fa {
+		transform: rotate(45deg) translateY(-7px);
+	}
 
-.control-left {
-	top: 27%;
-	left: -8%;
-	transform: rotate(45deg);
-	border-radius: 5px 0 5px 100%;
-}
+	.control-left {
+		top: 27%;
+		left: -8%;
+		transform: rotate(45deg);
+		border-radius: 5px 0 5px 100%;
+	}
 
-.control-left i {
-	transform: rotate(-45deg);
-}
+	.control-left i {
+		transform: rotate(-45deg);
+	}
 
-.control-left .control-inner {
-	right: -1px;
-	top: -1px;
-	border-bottom: 1px solid #78aee4;
-	border-left: 1px solid #78aee4;
-	border-radius: 0 0 0 100%;
-}
+	.control-left .control-inner {
+		right: -1px;
+		top: -1px;
+		border-bottom: 1px solid #78aee4;
+		border-left: 1px solid #78aee4;
+		border-radius: 0 0 0 100%;
+	}
 
-.control-left .fa {
-	transform: rotate(-45deg) translateX(-7px);
-}
+	.control-left .fa {
+		transform: rotate(-45deg) translateX(-7px);
+	}
+
+	.control-right {
+		top: 27%;
+		right: -8%;
+		transform: rotate(45deg);
+		border-radius: 5px 100% 5px 0;
+	}
 
-.control-right {
-	top: 27%;
-	right: -8%;
-	transform: rotate(45deg);
-	border-radius: 5px 100% 5px 0;
-}
-.control-right i {
-	transform: rotate(-45deg);
-}
+	.control-right i {
+		transform: rotate(-45deg);
+	}
 
-.control-right .control-inner {
-	left: -1px;
-	bottom: -1px;
-	border-top: 1px solid #78aee4;
-	border-right: 1px solid #78aee4;
-	border-radius: 0 100% 0 0;
-}
+	.control-right .control-inner {
+		left: -1px;
+		bottom: -1px;
+		border-top: 1px solid #78aee4;
+		border-right: 1px solid #78aee4;
+		border-radius: 0 100% 0 0;
+	}
 
-.control-right .fa {
-	transform: rotate(-45deg) translateX(7px);
-}
+	.control-right .fa {
+		transform: rotate(-45deg) translateX(7px);
+	}
 
-.control-bottom {
-	left: 27%;
-	bottom: -8%;
-	transform: rotate(45deg);
-	border-radius: 0 5px 100% 5px;
-}
+	.control-bottom {
+		left: 27%;
+		bottom: -8%;
+		transform: rotate(45deg);
+		border-radius: 0 5px 100% 5px;
+	}
 
-.control-bottom i {
-	transform: rotate(-45deg);
-}
+	.control-bottom i {
+		transform: rotate(-45deg);
+	}
 
-.control-bottom .control-inner {
-	top: -1px;
-	left: -1px;
-	border-bottom: 1px solid #78aee4;
-	border-right: 1px solid #78aee4;
-	border-radius: 0 0 100% 0;
-}
+	.control-bottom .control-inner {
+		top: -1px;
+		left: -1px;
+		border-bottom: 1px solid #78aee4;
+		border-right: 1px solid #78aee4;
+		border-radius: 0 0 100% 0;
+	}
 
-.control-bottom .fa {
-	transform: rotate(-45deg) translateY(7px);
-}
+	.control-bottom .fa {
+		transform: rotate(-45deg) translateY(7px);
+	}
 </style>

+ 1 - 15
vue.config.js

@@ -10,18 +10,4 @@ module.exports = {
 			}
 		}
 	}
-}
-const CopyWebpackPlugin = require('copy-webpack-plugin')
-plugins: [
-	new CopyWebpackPlugin([{
-			from: 'node_modules/@liveqing/liveplayer/dist/component/crossdomain.xml'
-		},
-		{
-			from: 'node_modules/@liveqing/liveplayer/dist/component/liveplayer.swf'
-		},
-		{
-			from: 'node_modules/@liveqing/liveplayer/dist/component/liveplayer-lib.min.js',
-			to: 'js/'
-		}
-	])
-]
+}