From cadd0ee0387c7c4af4b6d8eb10641ef006174837 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 04 三月 2022 15:29:56 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/wvp-pro-record' into wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java | 43 ++++++++ src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 15 ++- src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java | 6 + src/main/resources/all-application.yml | 2 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 6 + src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 2 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 3 src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEvent.java | 32 ++++++ src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java | 5 + src/main/java/com/genersoft/iot/vmp/storager/dao/dto/ChannelSourceInfo.java | 22 ++++ src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 2 web_src/src/components/control.vue | 26 ++-- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java | 2 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java | 113 ++++++++++++++++++++++ 14 files changed, 257 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEvent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEvent.java new file mode 100644 index 0000000..cfd2985 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEvent.java @@ -0,0 +1,32 @@ +package com.genersoft.iot.vmp.gb28181.event.record; + +import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; +import org.springframework.context.ApplicationEvent; + +/** + * @description: 褰曞儚鏌ヨ缁撴潫鏃堕棿 + * @author: pan + * @data: 2022-02-23 + */ + +public class RecordEndEvent extends ApplicationEvent { + /** + * + */ + private static final long serialVersionUID = 1L; + + public RecordEndEvent(Object source) { + super(source); + } + + private RecordInfo recordInfo; + + public RecordInfo getRecordInfo() { + return recordInfo; + } + + public void setRecordInfo(RecordInfo recordInfo) { + this.recordInfo = recordInfo; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java new file mode 100644 index 0000000..d7b33f2 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -0,0 +1,43 @@ +package com.genersoft.iot.vmp.gb28181.event.record; + +import com.genersoft.iot.vmp.gb28181.bean.RecordItem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.*; + +/** + * @description: 褰曞儚鏌ヨ缁撴潫鏃堕棿 + * @author: pan + * @data: 2022-02-23 + */ + +@Component +public class RecordEndEventListener implements ApplicationListener<RecordEndEvent> { + + private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class); + + private static Map<String, SseEmitter> sseEmitters = new Hashtable<>(); + + public void addSseEmitters(String browserId, SseEmitter sseEmitter) { + sseEmitters.put(browserId, sseEmitter); + } + + public interface RecordEndEventHandler{ + void handler(List<RecordItem> recordItems); + } + + private Map<String, RecordEndEventHandler> handlerMap = new HashMap<>(); + @Override + public void onApplicationEvent(RecordEndEvent event) { + if (logger.isDebugEnabled()) { + logger.debug("褰曞儚鏌ヨ瀹屾垚浜嬩欢瑙﹀彂锛宒eviceId锛歿}, channelId: {}, 褰曞儚鏁伴噺{}鏉�", event.getRecordInfo().getDeviceId(), + event.getRecordInfo().getChannelId(), event.getRecordInfo().getRecordList().size() ); + } + + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java index 5859d65..67be247 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java @@ -258,7 +258,7 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss * @param sn */ - boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, SipSubscribe.Event errorEvent); + boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer Secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent); /** * 鏌ヨ鎶ヨ淇℃伅 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 734fe23..7af5c51 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -1196,8 +1196,13 @@ * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss */ @Override - public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, SipSubscribe.Event errorEvent) { - + public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, Integer secrecy, String type, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) { + if (secrecy == null) { + secrecy = 0; + } + if (type == null) { + type = "all"; + } try { StringBuffer recordInfoXml = new StringBuffer(200); @@ -1208,9 +1213,9 @@ recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); - recordInfoXml.append("<Secrecy>0</Secrecy>\r\n"); + recordInfoXml.append("<Secrecy> "+ secrecy + " </Secrecy>\r\n"); // 澶у崕NVR瑕佹眰蹇呴』澧炲姞涓�涓�间负all鐨勬枃鏈厓绱犺妭鐐筎ype - recordInfoXml.append("<Type>all</Type>\r\n"); + recordInfoXml.append("<Type>" + type+"</Type>\r\n"); recordInfoXml.append("</Query>\r\n"); String tm = Long.toString(System.currentTimeMillis()); @@ -1221,7 +1226,7 @@ Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "z9hG4bK-ViaRecordInfo-" + tm, "fromRec" + tm, null, callIdHeader); - transmitRequest(device, request, errorEvent); + transmitRequest(device, request, errorEvent, okEvent); } catch (SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); return false; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index 5dcffe7..caa5cab 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -91,7 +91,7 @@ sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (event)->{ if (event != null) { - logger.info("鍚戜笂绾у钩鍙� [ {} ] 娉ㄥ唽鍙戠敓閿欒锛� {} ", + logger.info("鍚戜笂绾у钩鍙� [ {} ] 娉ㄥ唽鍙戜笂閿欒锛� {} ", parentPlatform.getServerGBId(), event.msg); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java new file mode 100644 index 0000000..08a5d77 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/RecordInfoQueryMessageHandler.java @@ -0,0 +1,113 @@ +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.cmd; + +import com.genersoft.iot.vmp.conf.SipConfig; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.gb28181.event.EventPublisher; +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.query.QueryMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.DateUtil; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; +import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; +import org.dom4j.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.sip.InvalidArgumentException; +import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.header.FromHeader; +import javax.sip.message.Response; +import java.text.ParseException; +import java.util.List; + +@Component +public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { + + private Logger logger = LoggerFactory.getLogger(RecordInfoQueryMessageHandler.class); + private final String cmdType = "RecordInfo"; + + @Autowired + private QueryMessageHandler queryMessageHandler; + + @Autowired + private IVideoManagerStorager storager; + + @Autowired + private SIPCommanderFroPlatform cmderFroPlatform; + + @Autowired + private SIPCommander commander; + + @Autowired + private SipConfig config; + + @Autowired + private EventPublisher publisher; + + @Override + public void afterPropertiesSet() throws Exception { + queryMessageHandler.addHandler(cmdType, this); + } + + @Override + public void handForDevice(RequestEvent evt, Device device, Element element) { + + } + + @Override + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { + + String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + parentPlatform.getServerGBId(); + FromHeader fromHeader = (FromHeader) evt.getRequest().getHeader(FromHeader.NAME); + try { + // 鍥炲200 OK + responseAck(evt, Response.OK); + Element snElement = rootElement.element("SN"); + int sn = Integer.parseInt(snElement.getText()); + Element deviceIDElement = rootElement.element("DeviceID"); + String channelId = deviceIDElement.getText(); + Element startTimeElement = rootElement.element("StartTime"); + String startTime = startTimeElement.getText(); + Element endTimeElement = rootElement.element("EndTime"); + String endTime = endTimeElement.getText(); + Element secrecyElement = rootElement.element("Secrecy"); + int secrecy = Integer.parseInt(secrecyElement.getText()); + Element typeElement = rootElement.element("Type"); + String type = typeElement.getText(); + // 纭鏄洿鎾繕鏄浗鏍囷紝 鍥芥爣鐩存帴璇锋眰涓嬬骇锛岀洿鎾姹傚綍鍍忕鐞嗘湇鍔� + List<ChannelSourceInfo> channelSources = storager.getChannelSource(parentPlatform.getServerGBId(), channelId); + if (channelSources.get(0).getCount() > 0) { // 鍥芥爣 + // 鍚戝浗鏍囪澶囪姹傚綍鍍忔暟鎹� + Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(parentPlatform.getServerGBId(), channelId); + commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> { + // 鏌ヨ鎴愬姛 + + }),(eventResult -> { + // 鏌ヨ澶辫触 + + })); + + }else if (channelSources.get(0).getCount() > 0) { // 鐩存挱娴� + // TODO + }else { // 閿欒鐨勮姹� + + } + } catch (SipException e) { + e.printStackTrace(); + } catch (InvalidArgumentException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index 723e9f1..710219e 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageInfo; @@ -475,4 +476,6 @@ void delRelationByPlatformId(String serverGBId); PlatformCatalog queryDefaultCatalogInPlatform(String platformId); + + List<ChannelSourceInfo> getChannelSource(String platformId, String gbId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java index ca8a72b..bb44325 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -86,4 +87,9 @@ "WHERE serverGBId=#{platformId}"+ "</script>"}) int setDefaultCatalog(String platformId, String catalogId); + + @Select("select 'channel' as name, count(pgc.platformId) count from platform_gb_channel pgc where pgc.platformId=#{platformId} and pgc.channelId =#{gbId} " + + "union " + + "select 'stream' as name, count(pgs.platformId) count from platform_gb_stream pgs left join gb_stream gs on pgs.gbStreamId = gs.id where pgs.platformId=#{platformId} and gs.gbId = #{gbId}") + List<ChannelSourceInfo> getChannelSource(String platformId, String gbId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/ChannelSourceInfo.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/ChannelSourceInfo.java new file mode 100644 index 0000000..e8b91e7 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/dto/ChannelSourceInfo.java @@ -0,0 +1,22 @@ +package com.genersoft.iot.vmp.storager.dao.dto; + +public class ChannelSourceInfo { + private String name; + private int count; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index 08f4b26..464b788 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; import com.genersoft.iot.vmp.storager.dao.*; +import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; import com.genersoft.iot.vmp.utils.node.ForestNodeMerger; import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; @@ -1104,4 +1105,9 @@ public PlatformCatalog queryDefaultCatalogInPlatform(String platformId) { return catalogMapper.selectDefaultByPlatFormId(platformId); } + + @Override + public List<ChannelSourceInfo> getChannelSource(String platformId, String gbId) { + return platformMapper.getChannelSource(platformId, gbId); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java index 78b5d53..8fed6dd 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java @@ -137,6 +137,11 @@ wvpResult.setMsg("missing parameters"); return new ResponseEntity<>(wvpResult, HttpStatus.BAD_REQUEST); } + if (parentPlatform.getServerPort()< 0 || parentPlatform.getServerPort() > 65535){ + wvpResult.setCode(-1); + wvpResult.setMsg("error severPort"); + return new ResponseEntity<>(wvpResult, HttpStatus.BAD_REQUEST); + } ParentPlatform parentPlatformOld = storager.queryParentPlatByServerGBId(parentPlatform.getServerGBId()); if (parentPlatformOld != null) { diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java index a8675e8..e565981 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java @@ -64,7 +64,7 @@ RequestMessage msg = new RequestMessage(); msg.setId(uuid); msg.setKey(key); - cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, (eventResult -> { + cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, null, null, null, (eventResult -> { msg.setData("鏌ヨ褰曞儚澶辫触, status: " + eventResult.statusCode + ", message: " + eventResult.msg ); resultHolder.invokeResult(msg); })); diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml index f383629..f3f1fb3 100644 --- a/src/main/resources/all-application.yml +++ b/src/main/resources/all-application.yml @@ -1,7 +1,7 @@ -# 姝ら厤缃枃浠跺彧鏄敤浣滃睍绀烘墍鏈夐厤缃」锛� 涓嶅彲涓嶇洿鎺ヤ娇鐢� +# 姝ら厤缃枃浠跺彧鏄敤浣滃睍绀烘墍鏈夐厤缃」锛� 涓嶅彲鐩存帴浣跨敤 spring: diff --git a/web_src/src/components/control.vue b/web_src/src/components/control.vue index 4928077..3651593 100644 --- a/web_src/src/components/control.vue +++ b/web_src/src/components/control.vue @@ -37,8 +37,20 @@ </el-popover> <el-popover placement="bottom" width="900" height="300" trigger="click"> <div style="height: 600px;overflow:auto; padding: 20px"> + <el-descriptions title="鍥芥爣閰嶇疆" border column="1"> + <template slot="extra"> + <el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="JSON.stringify(wvpServerConfig.sip)" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></el-button> + </template> + <el-descriptions-item v-for="(value, key, index) in wvpServerConfig.sip"> + <template slot="label"> + {{ getNameFromKey(key) }} + </template> + {{ value }} + </el-descriptions-item> + </el-descriptions> - <el-descriptions title="鍩虹閰嶇疆" border column="1"> + <div style="margin-top: 1rem"> + <el-descriptions title="鍩虹閰嶇疆" border column="1"> <template slot="extra"> <el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="JSON.stringify(wvpServerConfig.base)" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></el-button> </template> @@ -68,18 +80,6 @@ </div> </div> - </el-descriptions-item> - </el-descriptions> - <div style="margin-top: 1rem"> - <el-descriptions title="鍥芥爣閰嶇疆" border column="1"> - <template slot="extra"> - <el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="JSON.stringify(wvpServerConfig.sip)" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></el-button> - </template> - <el-descriptions-item v-for="(value, key, index) in wvpServerConfig.sip" :key="key"> - <template slot="label"> - {{ getNameFromKey(key) }} - </template> - {{ value }} </el-descriptions-item> </el-descriptions> </div> -- Gitblit v1.8.0