EasyDarwin/web_src/components/PusherList.vue

179 lines
7.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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">&times;</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>