From 9f16b5c553b479ea12fe368a7ecc748872ea8b98 Mon Sep 17 00:00:00 2001 From: zxl <763096477@qq.com> Date: 星期四, 12 六月 2025 11:11:27 +0800 Subject: [PATCH] 修改配置文件 --- web_src/src/components/DeviceList.vue | 601 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 337 insertions(+), 264 deletions(-) diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue old mode 100644 new mode 100755 index cdc25bc..5375e5e --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -1,282 +1,355 @@ <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%" :height="winHeight"> - <el-table-column prop="name" label="鍚嶇О" width="180" align="center"> - </el-table-column> - <el-table-column prop="deviceId" label="璁惧缂栧彿" width="240" 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 prop="model" label="鍥轰欢鐗堟湰" align="center"> - </el-table-column> - <el-table-column label="娴佷紶杈撴ā寮�" align="center" width="160"> - <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="80" 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> + <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-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="add">娣诲姞璁惧 + </el-button> + <el-button icon="el-icon-refresh-right" circle size="mini" :loading="getDeviceListLoading" + @click="getDeviceList()"></el-button> + </div> + </div> + <!--璁惧鍒楄〃--> + <el-table :data="deviceList" style="width: 100%;font-size: 12px;" :height="winHeight" header-row-class-name="table-header"> + <el-table-column prop="name" label="鍚嶇О" min-width="160"> + </el-table-column> + <el-table-column prop="deviceId" label="璁惧缂栧彿" min-width="200" > + </el-table-column> + <el-table-column label="鍦板潃" min-width="160" > + <template slot-scope="scope"> + <div slot="reference" class="name-wrapper"> + <el-tag v-if="scope.row.hostAddress" size="medium">{{ scope.row.hostAddress }}</el-tag> + <el-tag v-if="!scope.row.hostAddress" size="medium">鏈煡</el-tag> + </div> + </template> + </el-table-column> + <el-table-column prop="manufacturer" label="鍘傚" min-width="120" > + </el-table-column> + <el-table-column prop="transport" label="淇′护浼犺緭妯″紡" min-width="120" > + </el-table-column> + <el-table-column label="娴佷紶杈撴ā寮�" min-width="160" > + <template slot-scope="scope"> + <el-select size="mini" @change="transportChange(scope.row)" v-model="scope.row.streamMode" placeholder="璇烽�夋嫨" style="width: 120px"> + <el-option key="UDP" label="UDP" value="UDP"></el-option> + <el-option key="TCP-ACTIVE" label="TCP涓诲姩妯″紡" 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="閫氶亾鏁�" min-width="120" > + </el-table-column> + <el-table-column label="鐘舵��" min-width="120"> + <template slot-scope="scope"> + <div slot="reference" class="name-wrapper"> + <el-tag size="medium" v-if="scope.row.onLine">鍦ㄧ嚎</el-tag> + <el-tag size="medium" type="info" v-if="!scope.row.onLine">绂荤嚎</el-tag> + </div> + </template> + </el-table-column> + <el-table-column prop="keepaliveTime" label="鏈�杩戝績璺�" min-width="160" > + </el-table-column> + <el-table-column prop="registerTime" label="鏈�杩戞敞鍐�" min-width="160"> + </el-table-column> +<!-- <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="140">--> +<!-- </el-table-column>--> +<!-- <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="140">--> +<!-- </el-table-column>--> - <el-table-column label="鎿嶄綔" width="360" align="center" fixed="right"> - <template slot-scope="scope"> - <el-button size="mini" :ref="scope.row.deviceId + 'refbtn' " icon="el-icon-refresh" @click="refDevice(scope.row)">鍒锋柊</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-s-tools" v-bind:disabled="scope.row.online==0" type="primary">鎺у埗</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> - - </el-main> - </el-container> - </div> + <el-table-column label="鎿嶄綔" min-width="450" fixed="right"> + <template slot-scope="scope"> + <el-button type="text" size="medium" v-bind:disabled="scope.row.online==0" icon="el-icon-refresh" @click="refDevice(scope.row)" + @mouseover="getTooltipContent(scope.row.deviceId)">鍒锋柊 + </el-button> + <el-divider direction="vertical"></el-divider> + <el-button type="text" size="medium" icon="el-icon-video-camera" + @click="showChannelList(scope.row)">閫氶亾 + </el-button> + <el-divider direction="vertical"></el-divider> + <el-button size="medium" icon="el-icon-location" type="text" + @click="showDevicePosition(scope.row)">瀹氫綅 + </el-button> + <el-divider direction="vertical"></el-divider> + <el-button size="medium" icon="el-icon-edit" type="text" @click="edit(scope.row)">缂栬緫</el-button> + <el-divider direction="vertical"></el-divider> + <el-button size="medium" icon="el-icon-delete" type="text" @click="deleteDevice(scope.row)" style="color: #f56c6c">鍒犻櫎</el-button> + </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' - export default { - name: 'app', - components: { - uiHeader - }, - 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; - } +export default { + name: 'app', + components: { + uiHeader, + deviceEdit, + syncChannelProgress, + }, + data() { + return { + deviceList: [], //璁惧鍒楄〃 + currentDevice: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 - console.log("鏁版嵁锛�" + JSON.stringify(channels)); - 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) { - console.log(res); - console.log(res.data.list); - that.total = res.data.total; - that.deviceList = res.data.list; - that.getDeviceListLoading = false; - }).catch(function (error) { - console.log(error); - that.getDeviceListLoading = false; - }); - - }, - showChannelList: function(row) { - console.log(JSON.stringify(row)) - this.$router.push(`/channelList/${row.deviceId}/0/15/1`); - }, - showDevicePosition: function(row) { - console.log(JSON.stringify(row)) - this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); - }, - - //gb28181骞冲彴瀵规帴 - //鍒锋柊璁惧淇℃伅 - refDevice: function(itemData) { - console.log("鍒锋柊瀵瑰簲璁惧:" + itemData.deviceId); - var that = this; - that.$refs[itemData.deviceId + 'refbtn' ].loading = true; - this.$axios({ - method: 'post', - url: '/api/device/query/devices/' + itemData.deviceId + '/sync' - }).then(function(res) { - console.log("鍒锋柊璁惧缁撴灉锛�"+JSON.stringify(res)); - if (!res.data.deviceId) { - that.$message({ - showClose: true, - message: res.data, - type: 'error' - }); - }else{ - that.$message({ - showClose: true, - message: '璇锋眰鎴愬姛', - type: 'success' - }); - } - that.initData() - that.$refs[itemData.deviceId + 'refbtn' ].loading = false; - }).catch(function(e) { - console.error(e) - that.$refs[itemData.deviceId + 'refbtn' ].loading = false; - });; - }, - //閫氱煡璁惧涓婁紶濯掍綋娴� - 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); - 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) { + 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 () { + this.getDeviceListLoading = true; + this.$axios({ + method: 'get', + url: `/api/device/query/devices`, + params: { + page: this.currentPage, + count: this.count + } + }).then( (res)=> { + if (res.data.code === 0) { + this.total = res.data.data.total; + this.deviceList = res.data.data.list; + } + this.getDeviceListLoading = false; + }).catch( (error)=> { + console.error(error); + this.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`); + }, + showDevicePosition: function (row) { + this.$router.push(`/map?deviceId=${row.deviceId}`); + }, + + //gb28181骞冲彴瀵规帴 + //鍒锋柊璁惧淇℃伅 + refDevice: function (itemData) { + console.log("鍒锋柊瀵瑰簲璁惧:" + itemData.deviceId); + let that = this; + this.$axios({ + method: 'get', + 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) + that.$message({ + showClose: true, + message: e, + 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; + }, + 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) + + }) + }, + add: function () { + this.$refs.deviceEdit.openDialog(null, () => { + 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