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/DeviceList.vue | 647 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 324 insertions(+), 323 deletions(-) diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue index 4f8b460..d934fe6 100644 --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -1,349 +1,350 @@ <template> - <div id="app"> - <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 style="position: absolute; right: 1rem; top: 0.3rem;"> - <el-button icon="el-icon-refresh-right" circle size="mini" :loading="getDeviceListLoading" @click="getDeviceList()"></el-button> - </div> - </div> - <!-- <devicePlayer ref="devicePlayer"></devicePlayer> --> - <!--璁惧鍒楄〃--> - <el-table :data="deviceList" border style="width: 100%;font-size: 12px;" :height="winHeight"> - <el-table-column prop="name" label="鍚嶇О" align="center"> - </el-table-column> - <el-table-column prop="deviceId" label="璁惧缂栧彿" width="180" align="center"> - </el-table-column> - <el-table-column label="鍦板潃" width="180" align="center"> - <template slot-scope="scope"> - <div slot="reference" class="name-wrapper"> - <el-tag size="medium">{{ scope.row.hostAddress }}</el-tag> - </div> - </template> - </el-table-column> - <el-table-column prop="manufacturer" label="鍘傚" align="center"> - </el-table-column> - <el-table-column label="娴佷紶杈撴ā寮�" align="center" width="120"> - <template slot-scope="scope"> - <el-select size="mini" @change="transportChange(scope.row)" v-model="scope.row.streamMode" placeholder="璇烽�夋嫨"> - <el-option key="UDP" label="UDP" value="UDP"></el-option> - <el-option key="TCP-ACTIVE" label="TCP涓诲姩妯″紡" :disabled="true" value="TCP-ACTIVE"></el-option> - <el-option key="TCP-PASSIVE" label="TCP琚姩妯″紡" value="TCP-PASSIVE"></el-option> - </el-select> - </template> - </el-table-column> - <el-table-column prop="channelCount" label="閫氶亾鏁�" align="center"> - </el-table-column> - <el-table-column label="鐘舵��" width="120" align="center"> - <template slot-scope="scope"> - <div slot="reference" class="name-wrapper"> - <el-tag size="medium" v-if="scope.row.online == 1">鍦ㄧ嚎</el-tag> - <el-tag size="medium" type="info" v-if="scope.row.online == 0">绂荤嚎</el-tag> - </div> - </template> - </el-table-column> - <el-table-column prop="keepaliveTime" label="鏈�杩戝績璺�" align="center" width="140"> - </el-table-column> - <el-table-column prop="registerTime" label="鏈�杩戞敞鍐�" align="center" width="140"> - </el-table-column> - <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" align="center" width="140"> - </el-table-column> - <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" align="center" width="140"> - </el-table-column> + <div id="app" style="width: 100%"> + <div class="page-header"> + <div class="page-title">璁惧鍒楄〃</div> + <div class="page-header-btn"> + <el-button icon="el-icon-refresh-right" circle size="mini" :loading="getDeviceListLoading" + @click="getDeviceList()"></el-button> + </div> + </div> + <!-- <devicePlayer ref="devicePlayer"></devicePlayer> --> + <!--璁惧鍒楄〃--> + <el-table :data="deviceList" border style="width: 100%;font-size: 12px;" :height="winHeight"> + <el-table-column prop="name" label="鍚嶇О" align="center"> + </el-table-column> + <el-table-column prop="deviceId" label="璁惧缂栧彿" width="180" align="center"> + </el-table-column> + <el-table-column label="鍦板潃" width="180" align="center"> + <template slot-scope="scope"> + <div slot="reference" class="name-wrapper"> + <el-tag size="medium">{{ scope.row.hostAddress }}</el-tag> + </div> + </template> + </el-table-column> + <el-table-column prop="manufacturer" label="鍘傚" align="center"> + </el-table-column> + <el-table-column label="娴佷紶杈撴ā寮�" align="center" width="120"> + <template slot-scope="scope"> + <el-select size="mini" @change="transportChange(scope.row)" v-model="scope.row.streamMode" placeholder="璇烽�夋嫨"> + <el-option key="UDP" label="UDP" value="UDP"></el-option> + <el-option key="TCP-ACTIVE" label="TCP涓诲姩妯″紡" :disabled="true" value="TCP-ACTIVE"></el-option> + <el-option key="TCP-PASSIVE" label="TCP琚姩妯″紡" value="TCP-PASSIVE"></el-option> + </el-select> + </template> + </el-table-column> + <el-table-column prop="channelCount" label="閫氶亾鏁�" align="center"> + </el-table-column> + <el-table-column label="鐘舵��" width="120" align="center"> + <template slot-scope="scope"> + <div slot="reference" class="name-wrapper"> + <el-tag size="medium" v-if="scope.row.online == 1">鍦ㄧ嚎</el-tag> + <el-tag size="medium" type="info" v-if="scope.row.online == 0">绂荤嚎</el-tag> + </div> + </template> + </el-table-column> + <el-table-column prop="keepaliveTime" label="鏈�杩戝績璺�" align="center" width="140"> + </el-table-column> + <el-table-column prop="registerTime" label="鏈�杩戞敞鍐�" align="center" width="140"> + </el-table-column> + <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" align="center" width="140"> + </el-table-column> + <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" align="center" width="140"> + </el-table-column> - <el-table-column label="鎿嶄綔" width="450" align="center" fixed="right"> - <template slot-scope="scope"> - <el-button size="mini" v-if="scope.row.online!=0" icon="el-icon-refresh" @click="refDevice(scope.row)" @mouseover="getTooltipContent(scope.row.deviceId)">鍒锋柊</el-button> - <el-button-group> - <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0" type="primary" @click="showChannelList(scope.row)">閫氶亾</el-button> - <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0" type="primary" @click="showDevicePosition(scope.row)">瀹氫綅</el-button> - <el-button size="mini" icon="el-icon-edit" type="primary" @click="edit(scope.row)">缂栬緫</el-button> - <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteDevice(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> - <deviceEdit ref="deviceEdit" ></deviceEdit> - <syncChannelProgress ref="syncChannelProgress" ></syncChannelProgress> - </el-main> - </el-container> - </div> + <el-table-column label="鎿嶄綔" width="450" align="center" fixed="right"> + <template slot-scope="scope"> + <el-button size="mini" v-if="scope.row.online!=0" icon="el-icon-refresh" @click="refDevice(scope.row)" + @mouseover="getTooltipContent(scope.row.deviceId)">鍒锋柊 + </el-button> + <el-button-group> + <el-button size="mini" icon="el-icon-video-camera-solid" v-bind:disabled="scope.row.online==0" + type="primary" @click="showChannelList(scope.row)">閫氶亾 + </el-button> + <el-button size="mini" icon="el-icon-location" v-bind:disabled="scope.row.online==0" type="primary" + @click="showDevicePosition(scope.row)">瀹氫綅 + </el-button> + <el-button size="mini" icon="el-icon-edit" type="primary" @click="edit(scope.row)">缂栬緫</el-button> + <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteDevice(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> + <deviceEdit ref="deviceEdit"></deviceEdit> + <syncChannelProgress ref="syncChannelProgress"></syncChannelProgress> + </div> </template> <script> - import uiHeader from './UiHeader.vue' - import deviceEdit from './dialog/deviceEdit.vue' - import syncChannelProgress from './dialog/SyncChannelProgress.vue' - export default { - name: 'app', - components: { - uiHeader, - deviceEdit, - syncChannelProgress, - }, - data() { - return { - deviceList: [], //璁惧鍒楄〃 - currentDevice: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 +import uiHeader from '../layout/UiHeader.vue' +import deviceEdit from './dialog/deviceEdit.vue' +import syncChannelProgress from './dialog/SyncChannelProgress.vue' - videoComponentList: [], - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - currentDeviceChannelsLenth:0, - winHeight: window.innerHeight - 200, - currentPage:1, - count:15, - total:0, - getDeviceListLoading: false, - }; - }, - computed: { - getcurrentDeviceChannels: function() { - let data = this.currentDevice['channelMap']; - let channels = null; - if (data) { - channels = Object.keys(data).map(key => { - return data[key]; - }); - this.currentDeviceChannelsLenth = channels.length; - } - return channels; - } - }, - mounted() { - this.initData(); - this.updateLooper = setInterval(this.initData, 10000); - }, - destroyed() { - this.$destroy('videojs'); - clearTimeout(this.updateLooper); - }, - methods: { - initData: function() { - this.getDeviceList(); - }, - currentChange: function(val){ - this.currentPage = val; - this.getDeviceList(); - }, - handleSizeChange: function(val){ - this.count = val; - this.getDeviceList(); - }, - getDeviceList: function() { - let that = this; - this.getDeviceListLoading = true; - this.$axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page: that.currentPage, - count: that.count - } - }).then(function (res) { - that.total = res.data.total; - that.deviceList = res.data.list; - that.getDeviceListLoading = false; - }).catch(function (error) { - console.error(error); - that.getDeviceListLoading = false; - }); +export default { + name: 'app', + components: { + uiHeader, + deviceEdit, + syncChannelProgress, + }, + data() { + return { + deviceList: [], //璁惧鍒楄〃 + currentDevice: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 - }, - deleteDevice: function(row) { - let msg = "纭畾鍒犻櫎姝よ澶囷紵" - if (row.online !== 0) { - msg = "鍦ㄧ嚎璁惧鍒犻櫎鍚庝粛鍙�氳繃娉ㄥ唽鍐嶆涓婄嚎銆�<br/>濡傞渶褰诲簳鍒犻櫎璇峰厛灏嗚澶囩绾裤��<br/><strong>纭畾鍒犻櫎姝よ澶囷紵</strong>" - } - this.$confirm(msg, '鎻愮ず', { - dangerouslyUseHTMLString : true, - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - center: true, - type: 'warning' - }).then(() => { - this.$axios({ - method: 'delete', - url:`/api/device/query/devices/${row.deviceId}/delete` - }).then((res)=>{ - this.getDeviceList(); - }).catch((error) =>{ - console.error(error); - }); - }).catch(() => { - + videoComponentList: [], + updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 + currentDeviceChannelsLenth: 0, + winHeight: window.innerHeight - 200, + currentPage: 1, + count: 15, + total: 0, + getDeviceListLoading: false, + }; + }, + computed: { + getcurrentDeviceChannels: function () { + let data = this.currentDevice['channelMap']; + let channels = null; + if (data) { + channels = Object.keys(data).map(key => { + return data[key]; }); + this.currentDeviceChannelsLenth = channels.length; + } + return channels; + } + }, + mounted() { + this.initData(); + this.updateLooper = setInterval(this.initData, 10000); + }, + destroyed() { + this.$destroy('videojs'); + clearTimeout(this.updateLooper); + }, + methods: { + initData: function () { + this.getDeviceList(); + }, + currentChange: function (val) { + this.currentPage = val; + this.getDeviceList(); + }, + handleSizeChange: function (val) { + this.count = val; + this.getDeviceList(); + }, + getDeviceList: function () { + let that = this; + this.getDeviceListLoading = true; + this.$axios({ + method: 'get', + url: `/api/device/query/devices`, + params: { + page: that.currentPage, + count: that.count + } + }).then(function (res) { + that.total = res.data.total; + that.deviceList = res.data.list; + that.getDeviceListLoading = false; + }).catch(function (error) { + console.error(error); + that.getDeviceListLoading = false; + }); + + }, + deleteDevice: function (row) { + let msg = "纭畾鍒犻櫎姝よ澶囷紵" + if (row.online !== 0) { + msg = "鍦ㄧ嚎璁惧鍒犻櫎鍚庝粛鍙�氳繃娉ㄥ唽鍐嶆涓婄嚎銆�<br/>濡傞渶褰诲簳鍒犻櫎璇峰厛灏嗚澶囩绾裤��<br/><strong>纭畾鍒犻櫎姝よ澶囷紵</strong>" + } + this.$confirm(msg, '鎻愮ず', { + dangerouslyUseHTMLString: true, + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + center: true, + type: 'warning' + }).then(() => { + this.$axios({ + method: 'delete', + url: `/api/device/query/devices/${row.deviceId}/delete` + }).then((res) => { + this.getDeviceList(); + }).catch((error) => { + console.error(error); + }); + }).catch(() => { + + }); - }, - showChannelList: function(row) { - this.$router.push(`/channelList/${row.deviceId}/0/15/1`); - }, - showDevicePosition: function(row) { - this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); - }, + }, + showChannelList: function (row) { + this.$router.push(`/channelList/${row.deviceId}/0/15/1`); + }, + showDevicePosition: function (row) { + this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); + }, - //gb28181骞冲彴瀵规帴 - //鍒锋柊璁惧淇℃伅 - refDevice: function(itemData) { - console.log("鍒锋柊瀵瑰簲璁惧:" + itemData.deviceId); - let that = this; - this.$axios({ - method: 'post', - url: '/api/device/query/devices/' + itemData.deviceId + '/sync' - }).then((res) => { - console.log("鍒锋柊璁惧缁撴灉锛�"+JSON.stringify(res)); - if (res.data.code !==0) { - that.$message({ - showClose: true, - message: res.data.msg, - type: 'error' - }); - }else{ - // that.$message({ - // showClose: true, - // message: res.data.msg, - // type: 'success' - // }); - this.$refs.syncChannelProgress.openDialog(itemData.deviceId) - } - that.initData() - }).catch((e) => { - console.error(e) + //gb28181骞冲彴瀵规帴 + //鍒锋柊璁惧淇℃伅 + refDevice: function (itemData) { + console.log("鍒锋柊瀵瑰簲璁惧:" + itemData.deviceId); + let that = this; + this.$axios({ + method: 'post', + url: '/api/device/query/devices/' + itemData.deviceId + '/sync' + }).then((res) => { + console.log("鍒锋柊璁惧缁撴灉锛�" + JSON.stringify(res)); + if (res.data.code !== 0) { that.$message({ showClose: true, - message: e, + message: res.data.msg, type: 'error' }); - }); - - }, - - getTooltipContent: async function (deviceId){ - let result = ""; - await this.$axios({ - method: 'get', - async: false, - url:`/api/device/query/${deviceId}/sync_status/`, - }).then((res) => { - if (res.data.code == 0) { - if (res.data.data.errorMsg !== null) { - result = res.data.data.errorMsg - } else if (res.data.msg !== null) { - result = res.data.msg - } else { - result = `鍚屾涓�...[${res.data.data.current}/${res.data.data.total}]`; - } - } - }) - return result; - }, - //閫氱煡璁惧涓婁紶濯掍綋娴� - sendDevicePush: function(itemData) { - // let deviceId = this.currentDevice.deviceId; - // let channelId = itemData.channelId; - // console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); - // let that = this; - // this.$axios({ - // method: 'get', - // url: '/api/play/' + deviceId + '/' + channelId - // }).then(function(res) { - // let ssrc = res.data.ssrc; - // that.$refs.devicePlayer.play(ssrc,deviceId,channelId); - // }).catch(function(e) { - // }); - }, - transportChange: function (row) { - console.log(`淇敼浼犺緭鏂瑰紡涓� ${row.streamMode}锛�${row.deviceId} `); - let that = this; - this.$axios({ - method: 'post', - url: '/api/device/query/transport/' + row.deviceId + '/' + row.streamMode - }).then(function(res) { - - }).catch(function(e) { + } else { + // that.$message({ + // showClose: true, + // message: res.data.msg, + // type: 'success' + // }); + this.$refs.syncChannelProgress.openDialog(itemData.deviceId) + } + that.initData() + }).catch((e) => { + console.error(e) + that.$message({ + showClose: true, + message: e, + type: 'error' }); - }, - edit: function (row) { - this.$refs.deviceEdit.openDialog(row, ()=>{ - this.$refs.deviceEdit.close(); - this.$message({ - showClose: true, - message: "璁惧淇敼鎴愬姛锛岄�氶亾瀛楃闆嗗皢鍦ㄤ笅娆℃洿鏂扮敓鏁�", - type: "success", - }); - setTimeout(this.getDeviceList, 200) + }); - }) - } + }, - } - }; + getTooltipContent: async function (deviceId) { + let result = ""; + await this.$axios({ + method: 'get', + async: false, + url: `/api/device/query/${deviceId}/sync_status/`, + }).then((res) => { + if (res.data.code == 0) { + if (res.data.data.errorMsg !== null) { + result = res.data.data.errorMsg + } else if (res.data.msg !== null) { + result = res.data.msg + } else { + result = `鍚屾涓�...[${res.data.data.current}/${res.data.data.total}]`; + } + } + }) + return result; + }, + //閫氱煡璁惧涓婁紶濯掍綋娴� + sendDevicePush: function (itemData) { + // let deviceId = this.currentDevice.deviceId; + // let channelId = itemData.channelId; + // console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + // let that = this; + // this.$axios({ + // method: 'get', + // url: '/api/play/' + deviceId + '/' + channelId + // }).then(function(res) { + // let ssrc = res.data.ssrc; + // that.$refs.devicePlayer.play(ssrc,deviceId,channelId); + // }).catch(function(e) { + // }); + }, + transportChange: function (row) { + console.log(`淇敼浼犺緭鏂瑰紡涓� ${row.streamMode}锛�${row.deviceId} `); + let that = this; + this.$axios({ + method: 'post', + url: '/api/device/query/transport/' + row.deviceId + '/' + row.streamMode + }).then(function (res) { + + }).catch(function (e) { + }); + }, + edit: function (row) { + this.$refs.deviceEdit.openDialog(row, () => { + this.$refs.deviceEdit.close(); + this.$message({ + showClose: true, + message: "璁惧淇敼鎴愬姛锛岄�氶亾瀛楃闆嗗皢鍦ㄤ笅娆℃洿鏂扮敓鏁�", + type: "success", + }); + setTimeout(this.getDeviceList, 200) + + }) + } + + } +}; </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