control.vue 8.9 KB
<template>
	<div id="app">
		<el-container>
			<el-header>
				<uiHeader></uiHeader>
			</el-header>
			<el-main>
				<div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;">
					<span style="font-size: 1rem; font-weight: bold;">控制台</span>
					<div style="position: absolute; right: 1rem; top: 0.3rem;">
						<el-popover placement="bottom" width="750" height="300" trigger="click">
							<div style="height: 600px;overflow:auto;">
								<table class="table-c" cellspacing="0">
									<tr v-for="(value, key, index) in serverConfig">
										<td style="width: 18rem; text-align: right;">{{ key }}</td>
										<td style="width: 33rem; text-align:left">{{ value }}</td>
									</tr>
								</table>
							</div>
							<el-button type="primary" slot="reference" size="mini" @click="getServerConfig()">查看服务器配置</el-button>
						</el-popover>
						<el-button style="margin-left: 1rem;" type="danger" size="mini" @click="reStartServer()">重启服务器</el-button>
					</div>
				</div>
				<el-row :gutter="30">
					<el-col :span="12"><div class="control-table" id="ThreadsLoad">table1</div></el-col>
					<el-col :span="12"><div class="control-table" id="WorkThreadsLoad">table2</div></el-col>
				</el-row>
				<el-table :data="allSessionData" style="margin-top: 1rem;">
					<el-table-column prop="peer_ip" label="远端"></el-table-column>
					<el-table-column prop="local_ip" label="本地"></el-table-column>
					<el-table-column prop="typeid" label="类型"></el-table-column>
					<el-table-column align="right">
						<template slot="header" slot-scope="scope">
							<el-button icon="el-icon-refresh-right" circle @click="getAllSession()"></el-button>
						</template>
						<template slot-scope="scope">
							<el-button @click.native.prevent="deleteRow(scope.$index, allSessionData)" type="text" size="small">移除</el-button>
						</template>
					</el-table-column>
				</el-table>

			</el-main>
			<!-- <el-footer style="position: absolute; bottom: 0; width: 100%;">ZLMediaKit-VUE_UI v1</el-footer> -->
		</el-container>

	</div>
</template>

<script>

import uiHeader from './UiHeader.vue'

import echarts from 'echarts';
export default {
	name: 'app',
	components: {
		echarts,
		uiHeader
	},
	data() {
		return {
			tableOption: {
				// legend: {},
				xAxis: {},
				yAxis: {},
				label: {},
				tooltip: {},
				dataZoom: [],
				series: []
			},
			table1Option: {
				// legend: {},
				xAxis: {},
				yAxis: {},
				label: {},
				tooltip: {},
				series: []
			},
			mChart: null,
			mChart1: null,
			charZoomStart: 0,
			charZoomEnd: 100,
			chartInterval: 0, //更新图表统计图定时任务标识
			allSessionData: [],
			visible: false,
			serverConfig: {}
		};
	},
	mounted() {
		this.getAllSession();
		this.initTable();
		this.updateData();
		this.chartInterval = setInterval(this.updateData, 3000);
	},
	destroyed() {
		clearInterval(this.chartInterval); //释放定时任务
	},
	methods: {
		updateData: function() {
			this.getThreadsLoad();
		},
		/**
		 * 获取线程状态
		 */
		getThreadsLoad: function() {
			let that = this;
			this.$axios({
				method: 'get',
				url: '/zlm/index/api/getThreadsLoad'
			}).then(function(res) {
				if (res.data.code == 0) {
					that.tableOption.xAxis.data.push(new Date().toLocaleTimeString());
					that.table1Option.xAxis.data.push(new Date().toLocaleTimeString());

					for (var i = 0; i < res.data.data.length; i++) {
						if (that.tableOption.series[i] === undefined) {
							let data = {
								data: [],
								type: 'line'
							};
							let data1 = {
								data: [],
								type: 'line'
							};
							data.data.push(res.data.data[i].delay);
							data1.data.push(res.data.data[i].load);
							that.tableOption.series.push(data);
							that.table1Option.series.push(data1);
						} else {
							that.tableOption.series[i].data.push(res.data.data[i].delay);
							that.table1Option.series[i].data.push(res.data.data[i].load);
						}
					}
					that.tableOption.dataZoom[0].start = that.charZoomStart;
					that.tableOption.dataZoom[0].end = that.charZoomEnd;
					that.table1Option.dataZoom[0].start = that.charZoomStart;
					that.table1Option.dataZoom[0].end = that.charZoomEnd;
					//that.myChart = echarts.init(document.getElementById('ThreadsLoad'));
					that.myChart.setOption(that.tableOption, true);
					// that.myChart1 = echarts.init(document.getElementById('WorkThreadsLoad'));
					that.myChart1.setOption(that.table1Option, true);
				}
			});
		},
		initTable: function() {
			let that = this;
			this.tableOption.xAxis = {
				type: 'category',
				data: [], // x轴数据
				name: '时间', // x轴名称
				// x轴名称样式
				nameTextStyle: {
					fontWeight: 300,
					fontSize: 15
				}
			};
			this.tableOption.yAxis = {
				type: 'value',
				name: '延迟率', // y轴名称
				boundaryGap: [0, '100%'],
				max: 100,
				axisLabel: {
					show: true,
					interval: 'auto',
					formatter: '{value} %'
				},
				// y轴名称样式
				nameTextStyle: {
					fontWeight: 300,
					fontSize: 15
				}
			};
			this.tableOption.dataZoom = [
				{
					show: true,
					start: this.charZoomStart,
					end: this.charZoomEnd
				}
			];
			this.myChart = echarts.init(document.getElementById('ThreadsLoad'));
			this.myChart.setOption(this.tableOption);
			this.myChart.on('dataZoom', function(event) {
				if (event.batch) {
					that.charZoomStart = event.batch[0].start;
					that.charZoomEnd = event.batch[0].end;
				} else {
					that.charZoomStart = event.start;
					that.charZoomEnd = event.end;
				}
			});

			this.table1Option.xAxis = {
				type: 'category',
				data: [], // x轴数据
				name: '时间', // x轴名称
				// x轴名称样式
				nameTextStyle: {
					fontWeight: 300,
					fontSize: 15
				}
			};
			this.table1Option.yAxis = {
				type: 'value',
				name: '负载率', // y轴名称
				boundaryGap: [0, '100%'],
				max: 100,
				axisLabel: {
					show: true,
					interval: 'auto',
					formatter: '{value} %'
				},
				// y轴名称样式
				nameTextStyle: {
					fontWeight: 300,
					fontSize: 15
				}
			};
			this.table1Option.dataZoom = [
				{
					show: true,
					start: this.charZoomStart,
					end: this.charZoomEnd
				}
			];
			this.myChart1 = echarts.init(document.getElementById('WorkThreadsLoad'));
			this.myChart1.setOption(this.table1Option);
			this.myChart1.on('dataZoom', function(event) {
				if (event.batch) {
					that.charZoomStart = event.batch[0].start;
					that.charZoomEnd = event.batch[0].end;
				} else {
					that.charZoomStart = event.start;
					that.charZoomEnd = event.end;
				}
			});
		},

		getAllSession: function() {
			let that = this;
			that.allSessionData = [];
			console.log("地址:"+'/zlm/index/api/getAllSession');
			this.$axios({
				method: 'get',
				url: '/zlm/index/api/getAllSession'
			}).then(function(res) {
				res.data.data.forEach(item => {
					let data = {
						peer_ip: item.peer_ip,
						local_ip: item.local_ip,
						typeid: item.typeid,
						id: item.id
					};
					that.allSessionData.push(data);
				});
			});
		},
		getServerConfig: function() {
			let that = this;
			this.$axios({
				method: 'get',
				url: '/zlm/index/api/getServerConfig'
			}).then(function(res) {
				that.serverConfig = res.data.data[0];
				that.visible = true;
			});
		},
		reStartServer: function() {
			let that = this;
			this.$confirm('此操作将重启媒体服务器, 是否继续?', '提示', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning'
			}).then(() => {
				let that = this;
				this.$axios({
					method: 'get',
					url: '/zlm/index/api/restartServer'
				}).then(function(res) {
					that.getAllSession();
					if (res.data.code == 0) {
						that.$message({
							type: 'success',
							message: '操作完成'
						});
					}
				});
			});
		},
		deleteRow: function(index, tabledata) {
			let that = this;
			this.$confirm('此操作将断开该通信链路, 是否继续?', '提示', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning'
			})
				.then(() => {
					that.deleteSession(tabledata[index].id);
				})
				.catch(() => {
					console.log('id:' + JSON.stringify(tabledata[index]));
					this.$message({
						type: 'info',
						message: '已取消删除'
					});
				});
			console.log(JSON.stringify(tabledata[index]));
		},
		deleteSession: function(id) {
			let that = this;
			this.$axios({
				method: 'get',
				url: '/zlm/index/api/kick_session&id=' + id
			}).then(function(res) {
				that.getAllSession();
				that.$message({
					type: 'success',
					message: '删除成功!'
				});
			});
		}
	}
};
</script>

<style>
#app {
	height: 100%;
}
.control-table {
	background-color: #ffffff;
	height: 25rem;
}
.table-c {
	border-right: 1px solid #dcdcdc;
	border-bottom: 1px solid #dcdcdc;
}
.table-c td {
	border-left: 1px solid #dcdcdc;
	border-top: 1px solid #dcdcdc;
	padding: 0.2rem;
}
.el-table {
	width: 99.9% !important;
}
</style>