From c1bc45fe8fc898b451b52d4f9dd2fc7d01e94878 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 06 十一月 2023 15:13:58 +0800
Subject: [PATCH] 修复点播接口状态判断错误
---
web_src/src/components/DeviceList.vue | 638 +++++++++++++++++++++++++++++----------------------------
1 files changed, 329 insertions(+), 309 deletions(-)
diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue
old mode 100644
new mode 100755
index 7922a93..5375e5e
--- a/web_src/src/components/DeviceList.vue
+++ b/web_src/src/components/DeviceList.vue
@@ -1,335 +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%;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-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="450" align="center" fixed="right">
- <template slot-scope="scope">
- <el-button size="mini" :ref="scope.row.deviceId + 'refbtn' " v-if="scope.row.online!=0" 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-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>
- </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'
- import deviceEdit from './dialog/deviceEdit.vue'
- export default {
- name: 'app',
- components: {
- uiHeader,
- deviceEdit
- },
- 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;
- });
-
- },
- 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.log(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 () {
+ 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) {
- 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`);
- },
+ },
+ 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);
- 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.code !==0) {
- that.$message({
- showClose: true,
- message: res.data.msg,
- type: 'error'
- });
- }else{
- that.$message({
- showClose: true,
- message: res.data.msg,
- type: 'success'
- });
- }
- that.initData()
- that.$refs[itemData.deviceId + 'refbtn' ].loading = false;
- }).catch(function(e) {
- console.error(e)
+ //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: e,
+ message: res.data.msg,
type: 'error'
});
- 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) {
+ } 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) {
- console.log(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;
+ },
+ 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