|
|
|
<template>
|
|
|
|
<div class="container-fluid no-padding">
|
|
|
|
<div class="alert alert-success alert-dismissible">
|
|
|
|
<small>
|
|
|
|
<strong><i class="fa fa-info-circle"></i> 提示 : </strong>
|
|
|
|
屏幕直播工具可以采用<a href="https://github.com/EasyDSS/EasyScreenLive" target="_blank"> EasyScreenLive <i class="fa fa-external-link"></i></a>,
|
|
|
|
<span class="push-url-format">推流URL规则: rtsp://{ip}:{port}/{id}</span> ,
|
|
|
|
例如 : rtsp://www.easydarwin.org:554/your_stream_id
|
|
|
|
</small>
|
|
|
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="box box-success">
|
|
|
|
<div class="box-header">
|
|
|
|
<h4 class="text-success text-center">推流列表</h4>
|
|
|
|
<form class="form-inline">
|
|
|
|
<div class="form-group">
|
|
|
|
<button type="button" class="btn btn-sm btn-success" @click.prevent="$refs['pullRTSPDlg'].show()"><i class="fa fa-plus"></i> 拉流分发</button>
|
|
|
|
</div>
|
|
|
|
<div class="form-group pull-right">
|
|
|
|
<div class="input-group">
|
|
|
|
<input type="text" class="form-control" placeholder="搜索" v-model.trim="q" @keydown.enter.prevent ref="q">
|
|
|
|
<div class="input-group-btn">
|
|
|
|
<button type="button" class="btn btn-default" @click.prevent="doSearch" >
|
|
|
|
<i class="fa fa-search"></i>
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
<div class="box-body">
|
|
|
|
<el-table :data="pushers" stripe class="view-list" :default-sort="{prop: 'startAt', order: 'descending'}" @sort-change="sortChange">
|
|
|
|
<el-table-column prop="id" label="ID" min-width="120"></el-table-column>
|
|
|
|
<el-table-column label="播放地址" min-width="240" show-overflow-tooltip>
|
|
|
|
<template slot-scope="scope">
|
|
|
|
<span>
|
|
|
|
<i class="fa fa-copy" role="button" v-clipboard="scope.row.url" title="点击拷贝" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></i>
|
|
|
|
{{scope.row.url}}
|
|
|
|
</span>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column label="源地址" min-width="240" show-overflow-tooltip>
|
|
|
|
<template slot-scope="scope">
|
|
|
|
<span v-if="scope.row.source">
|
|
|
|
<i class="fa fa-copy" role="button" v-clipboard="scope.row.source" title="点击拷贝" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></i>
|
|
|
|
{{scope.row.source}}
|
|
|
|
</span>
|
|
|
|
<span v-else>-</span>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
<el-table-column prop="transType" label="传输方式" min-width="100"></el-table-column>
|
|
|
|
<el-table-column prop="inBytes" label="上行流量" min-width="120" :formatter="formatBytes" sortable="custom"></el-table-column>
|
|
|
|
<el-table-column prop="outBytes" label="下行流量" min-width="120" :formatter="formatBytes" sortable="custom"></el-table-column>
|
|
|
|
<el-table-column prop="onlines" label="在线人数" min-width="100" sortable="custom"></el-table-column>
|
|
|
|
<el-table-column prop="startAt" label="开始时间" min-width="200" sortable="custom"></el-table-column>
|
|
|
|
<el-table-column label="操作" min-width="120" fixed="right">
|
|
|
|
<template slot-scope="scope">
|
|
|
|
<div class="btn-group">
|
|
|
|
<a role="button" class="btn btn-xs btn-danger" @click.prevent="stop(scope.row)">
|
|
|
|
<i class="fa fa-stop"></i> 停止
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table>
|
|
|
|
</div>
|
|
|
|
<div class="box-footer clearfix" v-if="total > 0">
|
|
|
|
<el-pagination layout="prev,pager,next" class="pull-right" :total="total" :page-size.sync="pageSize" :current-page.sync="currentPage"></el-pagination>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<PullRTSPDlg ref="pullRTSPDlg" @submit="getPushers"></PullRTSPDlg>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import PullRTSPDlg from "components/PullRTSPDlg.vue"
|
|
|
|
import prettyBytes from "pretty-bytes";
|
|
|
|
|
|
|
|
import _ from "lodash";
|
|
|
|
export default {
|
|
|
|
components: {
|
|
|
|
PullRTSPDlg
|
|
|
|
},
|
|
|
|
props: {},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
q: "",
|
|
|
|
sort: "startAt",
|
|
|
|
order: "descending",
|
|
|
|
pushers: [],
|
|
|
|
total: 0,
|
|
|
|
timer: 0,
|
|
|
|
pageSize: 10,
|
|
|
|
currentPage: 1
|
|
|
|
};
|
|
|
|
},
|
|
|
|
beforeDestroy() {
|
|
|
|
if (this.timer) {
|
|
|
|
clearInterval(this.timer);
|
|
|
|
this.timer = 0;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
// this.$refs["q"].focus();
|
|
|
|
this.timer = setInterval(() => {
|
|
|
|
this.getPushers();
|
|
|
|
}, 3000);
|
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
q: function(newVal, oldVal) {
|
|
|
|
this.doDelaySearch();
|
|
|
|
},
|
|
|
|
currentPage: function(newVal, oldVal) {
|
|
|
|
this.doSearch(newVal);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
getPushers() {
|
|
|
|
$.get("/api/v1/pushers", {
|
|
|
|
q: this.q,
|
|
|
|
start: (this.currentPage -1) * this.pageSize,
|
|
|
|
limit: this.pageSize,
|
|
|
|
sort: this.sort,
|
|
|
|
order: this.order
|
|
|
|
}).then(data => {
|
|
|
|
this.total = data.total;
|
|
|
|
this.pushers = data.rows;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
doSearch(page = 1) {
|
|
|
|
var query = {};
|
|
|
|
if (this.q) query["q"] = this.q;
|
|
|
|
this.$router.replace({
|
|
|
|
path: `/pushers/${page}`,
|
|
|
|
query: query
|
|
|
|
});
|
|
|
|
},
|
|
|
|
doDelaySearch: _.debounce(function() {
|
|
|
|
this.doSearch();
|
|
|
|
}, 500),
|
|
|
|
sortChange(data) {
|
|
|
|
this.sort = data.prop;
|
|
|
|
this.order = data.order;
|
|
|
|
this.getPushers();
|
|
|
|
},
|
|
|
|
formatBytes(row, col, val) {
|
|
|
|
if (val == undefined) return "-";
|
|
|
|
return prettyBytes(val);
|
|
|
|
},
|
|
|
|
stop(row) {
|
|
|
|
this.$confirm(`确认停止 ${row.path} ?`, "提示").then(() => {
|
|
|
|
$.get("/api/v1/stream/stop", {
|
|
|
|
id: row.id
|
|
|
|
}).then(data => {
|
|
|
|
this.getPushers();
|
|
|
|
})
|
|
|
|
}).catch(() => {});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
beforeRouteEnter(to, from, next) {
|
|
|
|
next(vm => {
|
|
|
|
vm.q = to.query.q || "";
|
|
|
|
vm.currentPage = parseInt(to.params.page) || 1;
|
|
|
|
});
|
|
|
|
},
|
|
|
|
beforeRouteUpdate(to, from, next) {
|
|
|
|
next();
|
|
|
|
this.$nextTick(() => {
|
|
|
|
this.q = to.query.q || "";
|
|
|
|
this.currentPage = parseInt(to.params.page) || 1;
|
|
|
|
this.pushers = [];
|
|
|
|
this.getPushers();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|