From e6790d88fc5b1ac33d239c0d90ce6cdea666b821 Mon Sep 17 00:00:00 2001 From: mk1990 <153958232@qq.com> Date: 星期一, 16 五月 2022 10:14:24 +0800 Subject: [PATCH] Merge branch 'wvp-28181-2.0' of https://github.com/mk1990/wvp-GB28181-pro into wvp-28181-2.0 --- web_src/src/components/PushVideoList.vue | 520 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 329 insertions(+), 191 deletions(-) diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue index 4a93d7a..7b5a406 100644 --- a/web_src/src/components/PushVideoList.vue +++ b/web_src/src/components/PushVideoList.vue @@ -1,205 +1,343 @@ <template> - <div id="pushVideoList"> - <el-container> - <el-header> - <uiHeader></uiHeader> - </el-header> - <el-main> - <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;"> - <span style="font-size: 1rem; font-weight: bold;">鎺ㄦ祦鍒楄〃</span> - </div> - <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;"> - <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">娣诲姞浠g悊</el-button> - </div> - <devicePlayer ref="devicePlayer"></devicePlayer> - <el-table :data="pushList" border style="width: 100%" :height="winHeight"> - <el-table-column prop="app" label="APP" width="180" align="center"> - </el-table-column> - <el-table-column prop="stream" label="娴両D" width="240" align="center"> - </el-table-column> - <el-table-column prop="totalReaderCount" label="鍦ㄧ嚎浜烘暟" width="240" align="center"> - </el-table-column> - <el-table-column prop="createStamp" label="寮�濮嬫椂闂�" align="center"> - </el-table-column> - + <div id="pushVideoList" style="width: 100%"> + <div class="page-header"> + <div class="page-title">鎺ㄦ祦鍒楄〃</div> + <div class="page-header-btn"> + 鎼滅储: + <el-input @input="getPushList" style="margin-right: 1rem; width: auto;" size="mini" placeholder="鍏抽敭瀛�" + prefix-icon="el-icon-search" v-model="searchSrt" clearable></el-input> + 娴佸獟浣�: + <el-select size="mini" @change="getPushList" style="margin-right: 1rem;" v-model="mediaServerId" + placeholder="璇烽�夋嫨" default-first-option> + <el-option label="鍏ㄩ儴" value=""></el-option> + <el-option + v-for="item in mediaServerList" + :key="item.id" + :label="item.id" + :value="item.id"> + </el-option> + </el-select> + 鎺ㄦ祦鐘舵��: + <el-select size="mini" style="margin-right: 1rem;" @change="getPushList" v-model="pushing" placeholder="璇烽�夋嫨" + default-first-option> + <el-option label="鍏ㄩ儴" value=""></el-option> + <el-option label="鎺ㄦ祦杩涜涓�" value="true"></el-option> + <el-option label="鎺ㄦ祦鏈繘琛�" value="false"></el-option> + </el-select> + <el-button icon="el-icon-upload2" size="mini" style="margin-right: 1rem;" type="primary" @click="importChannel"> + 閫氶亾瀵煎叆 + </el-button> + <el-button icon="el-icon-download" size="mini" style="margin-right: 1rem;" type="primary"> + <a style="color: #FFFFFF; text-align: center; text-decoration: none" href="/static/file/鎺ㄦ祦閫氶亾瀵煎叆.zip" + download='鎺ㄦ祦閫氶亾瀵煎叆.zip'>涓嬭浇妯℃澘</a> + </el-button> + <el-button icon="el-icon-delete" size="mini" style="margin-right: 1rem;" + :disabled="multipleSelection.length === 0" type="danger" @click="batchDel">鎵归噺绉婚櫎 + </el-button> + </div> + </div> + <devicePlayer ref="devicePlayer"></devicePlayer> + <addStreamTOGB ref="addStreamTOGB"></addStreamTOGB> + <el-table ref="pushListTable" :data="pushList" border style="width: 100%" :height="winHeight" + @selection-change="handleSelectionChange" :row-key="(row)=> row.app + row.stream"> + <el-table-column align="center" type="selection" :reserve-selection="true" width="55"> + </el-table-column> + <el-table-column prop="name" label="鍚嶇О" align="center"> + </el-table-column> + <el-table-column prop="app" label="APP" align="center"> + </el-table-column> + <el-table-column prop="stream" label="娴両D" align="center"> + </el-table-column> + <el-table-column prop="gbId" label="鍥芥爣缂栫爜" width="200" align="center"> + </el-table-column> + <el-table-column prop="mediaServerId" label="娴佸獟浣�" width="200" align="center"> + </el-table-column> + <el-table-column label="寮�濮嬫椂闂�" align="center" width="200"> + <template slot-scope="scope"> + <el-button-group> + {{ dateFormat(parseInt(scope.row.createStamp)) }} + </el-button-group> + </template> + </el-table-column> + <el-table-column label="姝e湪鎺ㄦ祦" align="center" width="100"> + <template slot-scope="scope"> + {{ (scope.row.status == false && scope.row.gbId == null) || scope.row.status ? '鏄�' : '鍚�' }} + </template> + </el-table-column> - <el-table-column label="鎿嶄綔" width="360" align="center" fixed="right"> - <template slot-scope="scope"> - <el-button-group> - <el-button size="mini" icon="el-icon-video-play" @click="playPuhsh(scope.row)">鎾斁</el-button> - <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopPuhsh(scope.row)">鍋滄</el-button> - </el-button-group> - </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> - </el-main> - </el-container> - </div> + <el-table-column label="鎿嶄綔" width="360" align="center" fixed="right"> + <template slot-scope="scope"> + <el-button-group> + <el-button size="mini" icon="el-icon-video-play" + v-if="(scope.row.status == false && scope.row.gbId == null) || scope.row.status" + @click="playPush(scope.row)">鎾斁 + </el-button> + <el-button size="mini" icon="el-icon-delete" type="danger" @click="stopPush(scope.row)">绉婚櫎</el-button> + <el-button size="mini" icon="el-icon-position" type="primary" v-if="!!!scope.row.gbId" + @click="addToGB(scope.row)">鍔犲叆鍥芥爣 + </el-button> + <el-button size="mini" icon="el-icon-position" type="primary" v-if="!!scope.row.gbId" + @click="removeFromGB(scope.row)">绉诲嚭鍥芥爣 + </el-button> + </el-button-group> + </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> + <importChannel ref="importChannel"></importChannel> + </div> </template> <script> - import streamProxyEdit from './dialog/StreamProxyEdit.vue' - import devicePlayer from './dialog/devicePlayer.vue' - import uiHeader from './UiHeader.vue' - export default { - name: 'pushVideoList', - components: { - devicePlayer, - streamProxyEdit, - uiHeader - }, - data() { - return { - pushList: [], //璁惧鍒楄〃 - currentPusher: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - currentDeviceChannelsLenth:0, - winHeight: window.innerHeight - 200, - currentPage:1, - count:15, - total:0, - getDeviceListLoading: false - }; - }, - computed: { - }, - mounted() { - this.initData(); - // this.updateLooper = setInterval(this.initData, 10000); - }, - destroyed() { - this.$destroy('videojs'); - clearTimeout(this.updateLooper); - }, - methods: { - initData: function() { - this.getPushList(); - }, - currentChange: function(val){ - this.currentPage = val; - this.getPushList(); - }, - handleSizeChange: function(val){ - this.count = val; - this.getPushList(); - }, - getPushList: function() { - let that = this; - this.getDeviceListLoading = true; - this.$axios.get(`/api/media/list`,{ - params: { - page: that.currentPage, - count: that.count - } - } ) - .then(function (res) { - console.log(res); - console.log(res.data.list); - that.total = res.data.total; - that.pushList = res.data.list; - that.getDeviceListLoading = false; - }) - .catch(function (error) { - console.log(error); - that.getDeviceListLoading = false; - }); - }, - addStreamProxy: function(){ - console.log(2222) - this.$refs.streamProxyEdit.openDialog(null, this.initData) - }, - saveStreamProxy: function(){ - }, - playPuhsh: function(row){ - let that = this; - this.getListLoading = true; - this.$axios.get(`/api/media/getStreamInfoByAppAndStream`,{ - params: { - app: row.app, - stream: row.stream - } - }) - .then(function (res) { - that.getListLoading = false; - that.$refs.devicePlayer.openDialog("streamPlay", null, null, { - streamInfo: res.data, - hasAudio: true - }); - }) - .catch(function (error) { - console.log(error); - that.getListLoading = false; - }); - }, - stopPuhsh: function(row){ - console.log(row) - } +import streamProxyEdit from './dialog/StreamProxyEdit.vue' +import devicePlayer from './dialog/devicePlayer.vue' +import addStreamTOGB from './dialog/addStreamTOGB.vue' +import uiHeader from '../layout/UiHeader.vue' +import importChannel from './dialog/importChannel.vue' +import MediaServer from './service/MediaServer' - } - }; +export default { + name: 'pushVideoList', + components: { + devicePlayer, + addStreamTOGB, + streamProxyEdit, + uiHeader, + importChannel, + }, + data() { + return { + pushList: [], //璁惧鍒楄〃 + currentPusher: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 + updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 + currentDeviceChannelsLenth: 0, + winHeight: window.innerHeight - 250, + mediaServerObj: new MediaServer(), + currentPage: 1, + count: 15, + total: 0, + searchSrt: "", + pushing: "", + mediaServerId: "", + mediaServerList: [], + multipleSelection: [], + getDeviceListLoading: false + }; + }, + computed: {}, + mounted() { + this.initData(); + this.updateLooper = setInterval(this.getPushList, 2000); + }, + destroyed() { + clearTimeout(this.updateLooper); + }, + methods: { + initData: function () { + this.mediaServerObj.getOnlineMediaServerList((data) => { + this.mediaServerList = data.data; + }) + this.getPushList(); + }, + currentChange: function (val) { + this.currentPage = val; + this.getPushList(); + }, + handleSizeChange: function (val) { + this.count = val; + this.getPushList(); + }, + getPushList: function () { + let that = this; + this.getDeviceListLoading = true; + this.$axios({ + method: 'get', + url: `/api/push/list`, + params: { + page: that.currentPage, + count: that.count, + query: that.searchSrt, + pushing: that.pushing, + mediaServerId: that.mediaServerId, + } + }).then(function (res) { + that.total = res.data.total; + that.pushList = res.data.list; + that.getDeviceListLoading = false; + }).catch(function (error) { + console.error(error); + that.getDeviceListLoading = false; + }); + }, + + playPush: function (row) { + let that = this; + this.getListLoading = true; + this.$axios({ + method: 'get', + url: '/api/media/stream_info_by_app_and_stream', + params: { + app: row.app, + stream: row.stream, + mediaServerId: row.mediaServerId + } + }).then(function (res) { + that.getListLoading = false; + that.$refs.devicePlayer.openDialog("streamPlay", null, null, { + streamInfo: res.data.data, + hasAudio: true + }); + }).catch(function (error) { + console.error(error); + that.getListLoading = false; + }); + }, + stopPush: function (row) { + let that = this; + that.$axios({ + method: "post", + url: "/api/push/stop", + params: { + app: row.app, + streamId: row.stream + } + }).then((res) => { + if (res.data == "success") { + that.initData() + } + }).catch(function (error) { + console.error(error); + }); + }, + addToGB: function (row) { + this.$refs.addStreamTOGB.openDialog({ + app: row.app, + stream: row.stream, + mediaServerId: row.mediaServerId + }, this.initData); + }, + removeFromGB: function (row) { + let that = this; + that.$axios({ + method: "delete", + url: "/api/push/remove_form_gb", + data: row + }).then((res) => { + if (res.data == "success") { + that.initData() + } + }).catch(function (error) { + console.error(error); + }); + }, + dateFormat: function (/** timestamp=0 **/) { + let ts = arguments[0] || 0; + let t, y, m, d, h, i, s; + t = ts ? new Date(ts) : new Date(); + y = t.getFullYear(); + m = t.getMonth() + 1; + d = t.getDate(); + h = t.getHours(); + i = t.getMinutes(); + s = t.getSeconds(); + // 鍙牴鎹渶瑕佸湪杩欓噷瀹氫箟鏃堕棿鏍煎紡 + return y + '-' + (m < 10 ? '0' + m : m) + '-' + (d < 10 ? '0' + d : d) + ' ' + (h < 10 ? '0' + h : h) + ':' + (i < 10 ? '0' + i : i) + ':' + (s < 10 ? '0' + s : s); + }, + importChannel: function () { + this.$refs.importChannel.openDialog(() => { + + }) + }, + batchDel: function () { + this.$confirm(`纭畾鍒犻櫎閫変腑鐨�${this.multipleSelection.length}涓�氶亾?`, '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + let that = this; + that.$axios({ + method: "delete", + url: "/api/push/batchStop", + data: { + gbStreams: this.multipleSelection + } + }).then((res) => { + this.initData(); + this.$refs.pushListTable.clearSelection(); + }).catch(function (error) { + console.error(error); + }); + }).catch(() => { + + }); + }, + handleSelectionChange: function (val) { + this.multipleSelection = val; + }, + } +}; </script> <style> - .videoList { - display: flex; - flex-wrap: wrap; - align-content: flex-start; - } +.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 { + 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 { + 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-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; - } +.video-item-title { + position: absolute; + bottom: 0; + color: #000000; + background-color: #ffffff; + line-height: 1.5rem; + padding: 0.3rem; + width: 14.4rem; +} </style> -- Gitblit v1.8.0