2021-03-30 18:46:34 +08:00
|
|
|
<template>
|
2022-04-21 12:33:10 +08:00
|
|
|
<div id="streamProxyList" style="width: 100%">
|
|
|
|
<div class="page-header">
|
|
|
|
<div class="page-title">拉流代理列表</div>
|
|
|
|
<div class="page-header-btn">
|
|
|
|
<el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">添加代理</el-button>
|
|
|
|
<el-button v-if="false" icon="el-icon-search" size="mini" style="margin-right: 1rem;" type="primary" @click="addOnvif">搜索ONVIF</el-button>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button>
|
2022-04-21 12:33:10 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<devicePlayer ref="devicePlayer"></devicePlayer>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table :data="streamProxyList" style="width: 100%" :height="winHeight">
|
|
|
|
<el-table-column prop="name" label="名称" min-width="120" show-overflow-tooltip/>
|
|
|
|
<el-table-column prop="app" label="流应用名" min-width="120" show-overflow-tooltip/>
|
|
|
|
<el-table-column prop="stream" label="流ID" min-width="120" show-overflow-tooltip/>
|
|
|
|
<el-table-column label="流地址" min-width="400" show-overflow-tooltip >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
2021-04-22 10:56:13 +08:00
|
|
|
|
2022-04-21 12:33:10 +08:00
|
|
|
<el-tag size="medium" v-if="scope.row.type == 'default'">
|
|
|
|
<i class="cpoy-btn el-icon-document-copy" title="点击拷贝" v-clipboard="scope.row.url" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></i>
|
|
|
|
{{scope.row.url}}
|
|
|
|
</el-tag>
|
|
|
|
<el-tag size="medium" v-if="scope.row.type != 'default'">
|
2023-06-05 10:28:11 +08:00
|
|
|
<i class="cpoy-btn el-icon-document-copy" title="点击拷贝" v-clipboard="scope.row.srcUrl" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></i>
|
|
|
|
{{scope.row.srcUrl}}
|
2022-04-21 12:33:10 +08:00
|
|
|
</el-tag>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table-column prop="mediaServerId" label="流媒体" min-width="180" ></el-table-column>
|
|
|
|
<el-table-column label="类型" width="100" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
2022-11-22 17:17:35 +08:00
|
|
|
<el-tag size="medium">{{scope.row.type === "default"? "直接代理":"FFMPEG代理"}}</el-tag>
|
2022-04-21 12:33:10 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2021-07-16 16:34:51 +08:00
|
|
|
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table-column prop="gbId" label="国标编码" min-width="180" show-overflow-tooltip/>
|
|
|
|
<el-table-column label="状态" min-width="120" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
|
|
|
<el-tag size="medium" v-if="scope.row.status">在线</el-tag>
|
|
|
|
<el-tag size="medium" type="info" v-if="!scope.row.status">离线</el-tag>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table-column label="启用" min-width="120" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
|
|
|
<el-tag size="medium" v-if="scope.row.enable">已启用</el-tag>
|
|
|
|
<el-tag size="medium" type="info" v-if="!scope.row.enable">未启用</el-tag>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table-column prop="createTime" label="创建时间" min-width="150" show-overflow-tooltip/>
|
2022-11-22 17:17:35 +08:00
|
|
|
<el-table-column label="音频" min-width="120" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
2023-06-09 15:19:18 +08:00
|
|
|
<el-tag size="medium" v-if="scope.row.enableAudio">已启用</el-tag>
|
|
|
|
<el-tag size="medium" type="info" v-if="!scope.row.enableAudio">未启用</el-tag>
|
2022-04-21 12:33:10 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2022-11-22 17:17:35 +08:00
|
|
|
<el-table-column label="录制" min-width="120" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
2023-06-09 15:19:18 +08:00
|
|
|
<el-tag size="medium" v-if="scope.row.enableMp4">已启用</el-tag>
|
|
|
|
<el-tag size="medium" type="info" v-if="!scope.row.enableMp4">未启用</el-tag>
|
2022-04-21 12:33:10 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2022-11-22 17:17:35 +08:00
|
|
|
<el-table-column label="无人观看" min-width="160" >
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
|
|
|
<div slot="reference" class="name-wrapper">
|
2023-06-09 15:19:18 +08:00
|
|
|
<el-tag size="medium" v-if="scope.row.enableRemoveNoneReader">移除</el-tag>
|
|
|
|
<el-tag size="medium" v-if="scope.row.enableDisableNoneReader">停用</el-tag>
|
|
|
|
<el-tag size="medium" type="info" v-if="!scope.row.enableRemoveNoneReader && !scope.row.enableDisableNoneReader">不做处理</el-tag>
|
2022-04-21 12:33:10 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</el-table-column>
|
2021-05-07 17:24:49 +08:00
|
|
|
|
2021-03-30 18:46:34 +08:00
|
|
|
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-table-column label="操作" width="360" fixed="right">
|
2022-04-21 12:33:10 +08:00
|
|
|
<template slot-scope="scope">
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-button size="medium" icon="el-icon-video-play" type="text" v-if="scope.row.enable" @click="play(scope.row)">播放</el-button>
|
|
|
|
<el-divider direction="vertical"></el-divider>
|
|
|
|
<el-button size="medium" icon="el-icon-switch-button" type="text" v-if="scope.row.enable" @click="stop(scope.row)">停用</el-button>
|
|
|
|
<el-divider direction="vertical"></el-divider>
|
2022-07-06 09:44:37 +08:00
|
|
|
<el-button size="medium" icon="el-icon-check" type="text" :loading="scope.row.startBtnLoading" v-if="!scope.row.enable" @click="start(scope.row)">启用</el-button>
|
2022-06-15 10:40:45 +08:00
|
|
|
<el-divider v-if="!scope.row.enable" direction="vertical"></el-divider>
|
|
|
|
<el-button size="medium" icon="el-icon-delete" type="text" style="color: #f56c6c" @click="deleteStreamProxy(scope.row)">删除</el-button>
|
2023-08-11 09:12:19 +08:00
|
|
|
<el-button size="medium" icon="el-icon-cloudy" type="text" @click="queryCloudRecords(scope.row)">云端录像
|
|
|
|
</el-button>
|
2022-04-21 12:33:10 +08:00
|
|
|
</template>
|
|
|
|
</el-table-column>
|
|
|
|
</el-table>
|
|
|
|
<el-pagination
|
|
|
|
style="float: right"
|
|
|
|
@size-change="handleSizeChange"
|
|
|
|
@current-change="currentChange"
|
|
|
|
:current-page="currentPage"
|
|
|
|
:page-size="count"
|
|
|
|
:page-sizes="[15, 25, 35, 50]"
|
|
|
|
layout="total, sizes, prev, pager, next"
|
|
|
|
:total="total">
|
|
|
|
</el-pagination>
|
|
|
|
<streamProxyEdit ref="streamProxyEdit" ></streamProxyEdit>
|
|
|
|
<onvifEdit ref="onvifEdit" ></onvifEdit>
|
2021-03-30 18:46:34 +08:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import streamProxyEdit from './dialog/StreamProxyEdit.vue'
|
2021-04-26 09:13:17 +08:00
|
|
|
import onvifEdit from './dialog/onvifEdit.vue'
|
2021-03-30 18:46:34 +08:00
|
|
|
import devicePlayer from './dialog/devicePlayer.vue'
|
2022-04-21 12:33:10 +08:00
|
|
|
import uiHeader from '../layout/UiHeader.vue'
|
2021-03-30 18:46:34 +08:00
|
|
|
export default {
|
|
|
|
name: 'streamProxyList',
|
|
|
|
components: {
|
|
|
|
devicePlayer,
|
|
|
|
streamProxyEdit,
|
2021-04-26 09:13:17 +08:00
|
|
|
onvifEdit,
|
2021-03-30 18:46:34 +08:00
|
|
|
uiHeader
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
2021-04-22 10:56:13 +08:00
|
|
|
streamProxyList: [],
|
2021-03-30 18:46:34 +08:00
|
|
|
currentPusher: {}, //当前操作设备对象
|
|
|
|
updateLooper: 0, //数据刷新轮训标志
|
|
|
|
currentDeviceChannelsLenth:0,
|
2021-06-01 17:05:07 +08:00
|
|
|
winHeight: window.innerHeight - 250,
|
2021-03-30 18:46:34 +08:00
|
|
|
currentPage:1,
|
|
|
|
count:15,
|
|
|
|
total:0,
|
2022-07-06 09:44:37 +08:00
|
|
|
startBtnLoading: false
|
2021-03-30 18:46:34 +08:00
|
|
|
};
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
this.initData();
|
2022-11-22 17:17:35 +08:00
|
|
|
this.startUpdateList()
|
2021-03-30 18:46:34 +08:00
|
|
|
},
|
|
|
|
destroyed() {
|
|
|
|
this.$destroy('videojs');
|
|
|
|
clearTimeout(this.updateLooper);
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
initData: function() {
|
|
|
|
this.getStreamProxyList();
|
|
|
|
},
|
2022-11-22 17:17:35 +08:00
|
|
|
stopUpdateList: function (){
|
|
|
|
window.clearInterval(this.updateLooper)
|
|
|
|
},
|
|
|
|
startUpdateList: function (){
|
|
|
|
this.updateLooper = setInterval(this.initData, 1000);
|
|
|
|
},
|
2021-03-30 18:46:34 +08:00
|
|
|
currentChange: function(val){
|
|
|
|
this.currentPage = val;
|
|
|
|
this.getStreamProxyList();
|
|
|
|
},
|
|
|
|
handleSizeChange: function(val){
|
|
|
|
this.count = val;
|
|
|
|
this.getStreamProxyList();
|
|
|
|
},
|
|
|
|
getStreamProxyList: function() {
|
|
|
|
let that = this;
|
2021-04-12 16:04:04 +08:00
|
|
|
this.$axios({
|
|
|
|
method: 'get',
|
2023-03-05 09:53:26 +08:00
|
|
|
url:`/api/proxy/list`,
|
2021-03-30 18:46:34 +08:00
|
|
|
params: {
|
|
|
|
page: that.currentPage,
|
|
|
|
count: that.count
|
|
|
|
}
|
2021-04-12 16:04:04 +08:00
|
|
|
}).then(function (res) {
|
2022-08-22 16:16:31 +08:00
|
|
|
if (res.data.code === 0) {
|
|
|
|
that.total = res.data.data.total;
|
|
|
|
for (let i = 0; i < res.data.data.list.length; i++) {
|
|
|
|
res.data.data.list[i]["startBtnLoading"] = false;
|
|
|
|
}
|
|
|
|
that.streamProxyList = res.data.data.list;
|
2022-07-06 09:44:37 +08:00
|
|
|
}
|
2021-04-12 16:04:04 +08:00
|
|
|
}).catch(function (error) {
|
2021-03-30 18:46:34 +08:00
|
|
|
console.log(error);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
addStreamProxy: function(){
|
|
|
|
this.$refs.streamProxyEdit.openDialog(null, this.initData)
|
|
|
|
},
|
2021-04-26 09:13:17 +08:00
|
|
|
addOnvif: function(){
|
|
|
|
this.$axios({
|
|
|
|
method: 'get',
|
2023-03-05 09:53:26 +08:00
|
|
|
url:`/api/onvif/search?timeout=3000`,
|
2021-04-26 09:13:17 +08:00
|
|
|
}).then((res) =>{
|
2022-08-22 16:16:31 +08:00
|
|
|
if (res.data.code === 0 ){
|
2021-04-26 09:13:17 +08:00
|
|
|
if (res.data.data.length > 0) {
|
|
|
|
this.$refs.onvifEdit.openDialog(res.data.data, (url)=>{
|
|
|
|
if (url != null) {
|
|
|
|
this.$refs.onvifEdit.close();
|
2023-06-05 10:28:11 +08:00
|
|
|
this.$refs.streamProxyEdit.openDialog({type: "default", url: url, srcUrl: url}, this.initData())
|
2021-04-26 09:13:17 +08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}else {
|
|
|
|
this.$message.success("未找到可用设备");
|
|
|
|
}
|
|
|
|
}else {
|
|
|
|
this.$message.error(res.data.msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
}).catch((error)=> {
|
|
|
|
this.$message.error(error.response.data.msg);
|
|
|
|
});
|
|
|
|
|
|
|
|
},
|
2021-03-30 18:46:34 +08:00
|
|
|
saveStreamProxy: function(){
|
|
|
|
},
|
|
|
|
play: function(row){
|
|
|
|
let that = this;
|
2021-04-12 16:04:04 +08:00
|
|
|
this.$axios({
|
|
|
|
method: 'get',
|
2023-03-05 09:53:26 +08:00
|
|
|
url:`/api/push/getPlayUrl`,
|
2021-03-30 18:46:34 +08:00
|
|
|
params: {
|
|
|
|
app: row.app,
|
2021-07-16 16:34:51 +08:00
|
|
|
stream: row.stream,
|
|
|
|
mediaServerId: row.mediaServerId
|
2021-03-30 18:46:34 +08:00
|
|
|
}
|
2021-04-12 16:04:04 +08:00
|
|
|
}).then(function (res) {
|
2021-07-19 17:22:54 +08:00
|
|
|
if (res.data.code === 0) {
|
|
|
|
that.$refs.devicePlayer.openDialog("streamPlay", null, null, {
|
|
|
|
streamInfo: res.data.data,
|
|
|
|
hasAudio: true
|
|
|
|
});
|
|
|
|
}else {
|
|
|
|
that.$message({
|
|
|
|
showClose: true,
|
|
|
|
message: "获取地址失败:" + res.data.msg,
|
|
|
|
type: "error",
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-04-12 16:04:04 +08:00
|
|
|
}).catch(function (error) {
|
2021-03-30 18:46:34 +08:00
|
|
|
console.log(error);
|
|
|
|
});
|
2021-04-22 10:56:13 +08:00
|
|
|
|
2021-03-30 18:46:34 +08:00
|
|
|
},
|
2023-08-11 09:12:19 +08:00
|
|
|
queryCloudRecords: function (row) {
|
|
|
|
|
|
|
|
this.$router.push(`/cloudRecordDetail/${row.app}/${row.stream}`)
|
|
|
|
},
|
2021-03-30 18:46:34 +08:00
|
|
|
deleteStreamProxy: function(row){
|
|
|
|
let that = this;
|
2023-06-09 15:50:33 +08:00
|
|
|
this.$confirm('确定删除此代理吗?', '提示', {
|
|
|
|
confirmButtonText: '确定',
|
|
|
|
cancelButtonText: '取消',
|
|
|
|
type: 'warning'
|
|
|
|
}).then(() => {
|
|
|
|
that.$axios({
|
|
|
|
method:"delete",
|
|
|
|
url:"/api/proxy/del",
|
|
|
|
params:{
|
|
|
|
app: row.app,
|
|
|
|
stream: row.stream
|
|
|
|
}
|
|
|
|
}).then((res)=>{
|
|
|
|
that.initData()
|
|
|
|
}).catch(function (error) {
|
|
|
|
console.log(error);
|
|
|
|
});
|
|
|
|
}).catch(() => {
|
|
|
|
});
|
2021-03-30 18:46:34 +08:00
|
|
|
},
|
|
|
|
start: function(row){
|
2022-11-22 17:17:35 +08:00
|
|
|
this.stopUpdateList()
|
2022-07-06 09:44:37 +08:00
|
|
|
this.$set(row, 'startBtnLoading', true)
|
2021-04-12 16:04:04 +08:00
|
|
|
this.$axios({
|
|
|
|
method: 'get',
|
2023-03-05 09:53:26 +08:00
|
|
|
url:`/api/proxy/start`,
|
2021-03-30 18:46:34 +08:00
|
|
|
params: {
|
|
|
|
app: row.app,
|
|
|
|
stream: row.stream
|
|
|
|
}
|
2022-11-22 17:17:35 +08:00
|
|
|
}).then((res)=> {
|
2022-08-22 16:16:31 +08:00
|
|
|
if (res.data.code === 0){
|
2022-11-22 17:17:35 +08:00
|
|
|
this.initData()
|
2021-04-22 10:56:13 +08:00
|
|
|
}else {
|
2022-11-22 17:17:35 +08:00
|
|
|
this.$message({
|
2021-04-22 10:56:13 +08:00
|
|
|
showClose: true,
|
2022-11-22 17:17:35 +08:00
|
|
|
message: "启动失败,请检查地址是否可用!",
|
2021-04-22 10:56:13 +08:00
|
|
|
type: "error",
|
|
|
|
});
|
|
|
|
}
|
2022-11-22 17:17:35 +08:00
|
|
|
this.$set(row, 'startBtnLoading', false)
|
|
|
|
this.startUpdateList()
|
|
|
|
}).catch((error)=> {
|
2021-03-30 18:46:34 +08:00
|
|
|
console.log(error);
|
2022-11-22 17:17:35 +08:00
|
|
|
this.$message({
|
|
|
|
showClose: true,
|
|
|
|
message: "启动失败,请检查地址是否可用!",
|
|
|
|
type: "error",
|
|
|
|
});
|
|
|
|
this.$set(row, 'startBtnLoading', false)
|
|
|
|
this.startUpdateList()
|
2021-03-30 18:46:34 +08:00
|
|
|
});
|
|
|
|
},
|
|
|
|
stop: function(row){
|
|
|
|
let that = this;
|
2021-04-12 16:04:04 +08:00
|
|
|
this.$axios({
|
|
|
|
method: 'get',
|
2023-03-05 09:53:26 +08:00
|
|
|
url:`/api/proxy/stop`,
|
2021-03-30 18:46:34 +08:00
|
|
|
params: {
|
|
|
|
app: row.app,
|
|
|
|
stream: row.stream
|
|
|
|
}
|
2021-04-12 16:04:04 +08:00
|
|
|
}).then(function (res) {
|
2021-03-30 18:46:34 +08:00
|
|
|
that.initData()
|
2021-04-12 16:04:04 +08:00
|
|
|
}).catch(function (error) {
|
2021-03-30 18:46:34 +08:00
|
|
|
console.log(error);
|
|
|
|
});
|
2022-06-15 10:40:45 +08:00
|
|
|
},
|
|
|
|
refresh: function (){
|
|
|
|
this.initData();
|
|
|
|
}
|
2021-03-30 18:46:34 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.videoList {
|
|
|
|
display: flex;
|
|
|
|
flex-wrap: wrap;
|
|
|
|
align-content: flex-start;
|
|
|
|
}
|
|
|
|
|
|
|
|
.video-item {
|
|
|
|
position: relative;
|
|
|
|
width: 15rem;
|
|
|
|
height: 10rem;
|
|
|
|
margin-right: 1rem;
|
|
|
|
background-color: #000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
.video-item-img {
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
bottom: 0;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
margin: auto;
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
}
|
|
|
|
|
|
|
|
.video-item-img:after {
|
|
|
|
content: "";
|
|
|
|
display: inline-block;
|
|
|
|
position: absolute;
|
|
|
|
z-index: 2;
|
|
|
|
top: 0;
|
|
|
|
bottom: 0;
|
|
|
|
left: 0;
|
|
|
|
right: 0;
|
|
|
|
margin: auto;
|
|
|
|
width: 3rem;
|
|
|
|
height: 3rem;
|
|
|
|
background-image: url("../assets/loading.png");
|
|
|
|
background-size: cover;
|
|
|
|
background-color: #000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
.video-item-title {
|
|
|
|
position: absolute;
|
|
|
|
bottom: 0;
|
|
|
|
color: #000000;
|
|
|
|
background-color: #ffffff;
|
|
|
|
line-height: 1.5rem;
|
|
|
|
padding: 0.3rem;
|
|
|
|
width: 14.4rem;
|
|
|
|
}
|
|
|
|
.cpoy-btn {
|
|
|
|
cursor: pointer;
|
|
|
|
margin-right: 10px;
|
|
|
|
}
|
|
|
|
</style>
|