mirror of https://github.com/EasyDarwin/EasyDarwin
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
7.0 KiB
178 lines
7.0 KiB
<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> |
|
|
|
|