From fb843d41c1e186b2109bfeea73509cad2b135cdc Mon Sep 17 00:00:00 2001 From: xiaoxie <hotcoffie@163.com> Date: 星期四, 21 四月 2022 12:33:10 +0800 Subject: [PATCH] 1.重构全局页面结构,从之前每个页面独立绘制改为路由嵌套 2.全局页面样式优化,如滚动条、标题栏等 --- web_src/src/components/PushVideoList.vue | 606 ++++++++++++++++++++++++++++-------------------------- 1 files changed, 310 insertions(+), 296 deletions(-) diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue index 4c803da..7b5a406 100644 --- a/web_src/src/components/PushVideoList.vue +++ b/web_src/src/components/PushVideoList.vue @@ -1,18 +1,14 @@ <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-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> + <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" @@ -21,309 +17,327 @@ :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-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> - <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-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" 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> - </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 addStreamTOGB from './dialog/addStreamTOGB.vue' - import uiHeader from './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; - }); - }, +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' - 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){ +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:"post", - url:"/api/push/stop", - params: { - app: row.app, - streamId: row.stream + method: "delete", + url: "/api/push/batchStop", + data: { + gbStreams: this.multipleSelection } - }).then((res)=>{ - if (res.data == "success") { - that.initData() - } + }).then((res) => { + this.initData(); + this.$refs.pushListTable.clearSelection(); }).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(()=>{ + }).catch(() => { - }) - }, - 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; - }, - } - }; + }); + }, + 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