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.
EasyDarwin/web_src/components/PlayerList.vue

143 lines
5.2 KiB

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>
RTSP低延时播放器可以采用<a href="https://github.com/EasyDSS/EasyPlayer-RTSP-Win" target="_blank"> EasyPlayer-RTSP <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 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="players" 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 prop="path" label="播放地址" min-width="240" show-overflow-tooltip>
<template slot-scope="scope">
<span>
<i class="fa fa-copy" role="button" v-clipboard="scope.row.path" title="点击拷贝" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></i>
{{scope.row.path}}
</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="startAt" label="开始时间" min-width="200" sortable="custom"></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>
</div>
</template>
<script>
import prettyBytes from "pretty-bytes";
import _ from "lodash";
export default {
props: {},
data() {
return {
q: "",
sort: "startAt",
order: "descending",
players: [],
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.getPlayers();
}, 3000);
},
watch: {
q: function(newVal, oldVal) {
this.doDelaySearch();
},
currentPage: function(newVal, oldVal) {
this.doSearch(newVal);
}
},
methods: {
getPlayers() {
$.get("/api/v1/players", {
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.players = data.rows;
});
},
doSearch(page = 1) {
var query = {};
if (this.q) query["q"] = this.q;
this.$router.replace({
path: `/players/${page}`,
query: query
});
},
doDelaySearch: _.debounce(function() {
this.doSearch();
}, 500),
sortChange(data) {
this.sort = data.prop;
this.order = data.order;
this.getPlayers();
},
formatBytes(row, col, val) {
if (val == undefined) return "-";
return prettyBytes(val);
}
},
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.players = [];
this.getPlayers();
});
}
};
</script>