From 1179a7ad0297f65ddd82b7324ac619f7800cf5af Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 22 四月 2022 16:58:33 +0800 Subject: [PATCH] Merge branch 'wvp-28181-2.0' into wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java | 13 src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java | 13 web_src/src/components/service/DeviceService.js | 123 ++ web_src/src/components/common/DeviceTree.vue | 160 +++ web_src/src/components/service/MediaServer.js | 4 web_src/static/images/gis/camera3-offline.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java | 13 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 12 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java | 4 web_src/package-lock.json | 597 +++++++++---- web_src/index.html | 20 web_src/static/images/gis/camera1.png | 0 web_src/src/components/devicePosition.vue | 682 +++++++-------- src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java | 14 web_src/src/components/common/MapComponent.vue | 257 +++++ src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java | 2 web_src/src/components/dialog/devicePlayer.vue | 2 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java | 6 web_src/static/images/gis/camera1-offline.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java | 1 web_src/static/images/gis/camera2-offline.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java | 2 web_src/src/components/DeviceList.vue | 2 src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java | 126 ++ web_src/src/components/live.vue | 57 web_src/static/css/iconfont.css | 48 + web_src/package.json | 3 web_src/static/images/gis/camera.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java | 13 README.md | 2 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 5 web_src/static/images/gis/camera3.png | 0 /dev/null | 74 - web_src/static/css/iconfont.woff2 | 0 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java | 11 web_src/static/images/gis/camera-offline.png | 0 web_src/src/components/dialog/channelMapInfobox.vue | 65 + web_src/src/components/common/jessibuca.vue | 0 web_src/src/router/index.js | 33 web_src/src/components/dialog/queryTrace.vue | 100 ++ web_src/src/layout/UiHeader.vue | 2 web_src/static/images/arrow.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java | 24 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java | 18 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 16 web_src/static/images/gis/camera2.png | 0 48 files changed, 1,764 insertions(+), 772 deletions(-) diff --git a/README.md b/README.md index aec9555..ee03012 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,8 @@ QQ缇�: 901799015, ZLM浣跨敤鏂囨。[https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit) QQ绉佷俊涓�鑸笉鍥�, 绮惧姏鏈夐檺.娆㈣繋澶у鍦ㄧ兢閲岃璁�.瑙夊緱椤圭洰瀵逛綘鏈夊府鍔╋紝娆㈣繋star鍜屾彁浜r銆� +# 鎺堟潈鍗忚 +鏈」鐩嚜鏈変唬鐮佷娇鐢ㄥ鏉剧殑MIT鍗忚锛屽湪淇濈暀鐗堟潈淇℃伅鐨勬儏鍐典笅鍙互鑷敱搴旂敤浜庡悇鑷晢鐢ㄣ�侀潪鍟嗕笟鐨勯」鐩�� 浣嗘槸鏈」鐩篃闆剁鐨勪娇鐢ㄤ簡涓�浜涘叾浠栫殑寮�婧愪唬鐮侊紝鍦ㄥ晢鐢ㄧ殑鎯呭喌涓嬭鑷鏇夸唬鎴栧墧闄わ紱 鐢变簬浣跨敤鏈」鐩�屼骇鐢熺殑鍟嗕笟绾犵悍鎴栦镜鏉冭涓轰竴姒備笌鏈」鐩強寮�鍙戣�呮棤鍏筹紝璇疯嚜琛屾壙鎷呮硶寰嬮闄┿�� 鍦ㄤ娇鐢ㄦ湰椤圭洰浠g爜鏃讹紝涔熷簲璇ュ湪鎺堟潈鍗忚涓悓鏃惰〃鏄庢湰椤圭洰渚濊禆鐨勭涓夋柟搴撶殑鍗忚 # 鑷磋阿 鎰熻阿浣滆�匸澶忔](https://github.com/xia-chu) 鎻愪緵杩欎箞妫掔殑寮�婧愭祦濯掍綋鏈嶅姟妗嗘灦,骞跺湪寮�鍙戣繃绋嬩腑缁欎簣鏀寔涓庡府鍔┿�� diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index e1d7c49..ef4492f 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -87,9 +87,12 @@ // 绉诲姩浣嶇疆璁㈤槄閫氱煡 public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition"; - // 鎶ヨ璁㈤槄鐨勯�氱煡 + // 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛� public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm"; + // 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛� + public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive"; + // 璁惧鐘舵�佽闃呯殑閫氱煡 public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device"; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 1e6ef77..95576f3 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -4,7 +4,7 @@ /** - * 鏁版嵁搴撹嚜璧營D + * 鏁版嵁搴撹嚜澧濱D */ private int id; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java index e0e4a27..ef78d37 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java @@ -52,7 +52,6 @@ public void onMessage(Message message, byte[] pattern) { // 鑾峰彇澶辨晥鐨刱ey String expiredKey = message.toString(); - logger.debug(expiredKey); // 骞冲彴蹇冭烦鍒版湡,闇�瑕侀噸鍙�, 鍒ゆ柇鏄惁宸茬粡澶氭鏈敹鍒板績璺冲洖澶�, 澶氭鏈敹鍒�,鍒欓噸鏂板彂璧锋敞鍐�, 娉ㄥ唽灏濊瘯澶氭鏈緱鍒板洖澶�,鍒欒涓哄钩鍙扮绾� String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_"; String PLATFORM_REGISTER_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_"; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java index b7992e4..4633256 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java @@ -57,10 +57,8 @@ @Override public void onApplicationEvent(OfflineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("璁惧绂荤嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("璁惧绂荤嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDeviceId() + ",from:" + event.getFrom()); String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDeviceId(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java index b97457a..1fc1e46 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java @@ -59,10 +59,8 @@ @Override public void onApplicationEvent(OnlineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("璁惧涓婄嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("璁惧涓婄嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); Device device = event.getDevice(); if (device == null) return; String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId(); 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 index b2eb7ea..4965026 100644 --- 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 @@ -31,10 +31,8 @@ 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().getSumNum() ); - } + logger.info("褰曞儚鏌ヨ瀹屾垚浜嬩欢瑙﹀彂锛宒eviceId锛歿}, channelId: {}, 褰曞儚鏁伴噺{}鏉�", event.getRecordInfo().getDeviceId(), + event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); if (handlerMap.size() > 0) { for (RecordEndEventHandler recordEndEventHandler : handlerMap.values()) { recordEndEventHandler.handler(event.getRecordInfo()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index f9ef10c..019baf9 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -64,7 +64,7 @@ subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); if (subscribe == null) { - logger.debug("鍙戦�佽闃呮秷鎭椂鍙戠幇璁㈤槄淇℃伅宸茬粡涓嶅瓨鍦�"); + logger.info("鍙戦�佽闃呮秷鎭椂鍙戠幇璁㈤槄淇℃伅宸茬粡涓嶅瓨鍦�"); return; } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java index 8e03510..420f899 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; @@ -149,11 +150,12 @@ logger.info("[鏀跺埌 绉诲姩浣嶇疆璁㈤槄]锛歿}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), mobilePosition.getLongitude(), mobilePosition.getLatitude()); mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } @@ -223,12 +225,12 @@ mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index 302ceda..8977fc4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -8,6 +8,7 @@ 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.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; @@ -93,12 +94,12 @@ mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java index 471b2d7..2a53a3f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java @@ -8,6 +8,7 @@ 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.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java index 92d0114..910524d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java @@ -12,6 +12,7 @@ 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.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -199,12 +200,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java index dca2866..b070ed5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java @@ -8,6 +8,7 @@ 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.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java new file mode 100644 index 0000000..5c12ff6 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java @@ -0,0 +1,126 @@ +package com.genersoft.iot.vmp.gb28181.utils; + +/** + * 鍧愭爣杞崲 + * 涓�涓彁渚涗簡鐧惧害鍧愭爣锛圔D09锛夈�佸浗娴嬪眬鍧愭爣锛堢伀鏄熷潗鏍囷紝GCJ02锛夈�佸拰WGS84鍧愭爣绯讳箣闂寸殑杞崲鐨勫伐鍏风被 + * 鍙傝�僪ttps://github.com/wandergis/coordtransform 鍐欑殑Java鐗堟湰 + * @author Xinconan + * @date 2016-03-18 + * @url https://github.com/xinconan/coordtransform + */ +public class Coordtransform { + + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private static double PI = 3.1415926535897932384626; + private static double a = 6378245.0; + private static double ee = 0.00669342162296594323; + + /** + * 鐧惧害鍧愭爣绯� (BD-09) 涓� 鐏槦鍧愭爣绯� (GCJ-02)鐨勮浆鎹� + * 鍗� 鐧惧害 杞� 璋锋瓕銆侀珮寰� + * @param bd_lon + * @param bd_lat + * @return Double[lon,lat] + */ + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta); + arr[1] = z * Math.sin(theta); + return arr; + } + + /** + * 鐏槦鍧愭爣绯� (GCJ-02) 涓庣櫨搴﹀潗鏍囩郴 (BD-09) 鐨勮浆鎹� + * 鍗宠胺姝屻�侀珮寰� 杞� 鐧惧害 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta) + 0.0065; + arr[1] = z * Math.sin(theta) + 0.006; + return arr; + } + + /** + * WGS84杞珿CJ02 + * @param wgs_lon + * @param wgs_lat + * @return Double[lon,lat] + */ + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ + if(outOfChina(wgs_lon, wgs_lat)){ + return new Double[]{wgs_lon,wgs_lat}; + } + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); + double radlat = wgs_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + Double[] arr = new Double[2]; + arr[0] = wgs_lon + dlng; + arr[1] = wgs_lat + dlat; + return arr; + } + + /** + * GCJ02杞琖GS84 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ + if(outOfChina(gcj_lon, gcj_lat)){ + return new Double[]{gcj_lon,gcj_lat}; + } + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); + double radlat = gcj_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + double mglat = gcj_lat + dlat; + double mglng = gcj_lon + dlng; + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; + } + + private static Double transformlat(double lng, double lat) { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static Double transformlng(double lng,double lat) { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + + /** + * outOfChina + * @鎻忚堪: 鍒ゆ柇鏄惁鍦ㄥ浗鍐咃紝涓嶅湪鍥藉唴鍒欎笉鍋氬亸绉� + * @param lng + * @param lat + * @return {boolean} + */ + private static boolean outOfChina(Double lng,Double lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); + }; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java index 9d12eb5..d3a9ae9 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java @@ -5,7 +5,6 @@ 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; @@ -94,12 +93,6 @@ public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); - /** - * 鑾峰彇鏌愪釜璁惧鐨勯�氶亾鏍� - * @param deviceId 璁惧ID - * @return - */ - List<DeviceChannelTree> tree(String deviceId); /** * 鑾峰彇鏌愪釜璁惧鐨勯�氶亾鍒楄〃 @@ -180,7 +173,7 @@ * @param count * @return */ - PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count); + PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, Boolean online, int page, int count); /** @@ -285,7 +278,7 @@ * @param startTime * @param endTime */ - public List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime); + public List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); /** * 鏌ヨ鏈�鏂扮Щ鍔ㄤ綅缃� diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index 42e46e1..312d3e0 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -2,7 +2,6 @@ import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannelInPlatform; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -235,21 +234,6 @@ @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") List<DeviceChannel> queryOnlineChannelsByDeviceId(String deviceId); - - @Select(" SELECT\n" + - " id,\n" + - " channelId,\n" + - " deviceId,\n" + - " parentId,\n" + - " status,\n" + - " name as title,\n" + - " channelId as \"value\",\n" + - " channelId as \"key\",\n" + - " longitude,\n" + - " latitude\n" + - " from device_channel\n" + - " where deviceId = #{deviceId}") - List<DeviceChannelTree> tree(String deviceId); @Delete(value = {" <script>" + "DELETE " + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java index f3e4261..51da4a8 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java @@ -16,12 +16,12 @@ @Select(value = {" <script>" + "SELECT * FROM device_mobile_position" + - " WHERE deviceId = #{deviceId} " + + " WHERE deviceId = #{deviceId} and channelId = #{channelId} " + "<if test=\"startTime != null\"> AND time>=#{startTime}</if>" + "<if test=\"endTime != null\"> AND time<=#{endTime}</if>" + " ORDER BY time ASC" + " </script>"}) - List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); + List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String channelId, String startTime, String endTime); @Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + " ORDER BY time DESC LIMIT 1") diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java index fbb6e38..661a69b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java @@ -13,8 +13,6 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 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; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -354,10 +352,6 @@ return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); } - @Override - public List<DeviceChannelTree> tree(String deviceId) { - return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); - } @Override public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { @@ -365,9 +359,9 @@ } @Override - public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { + public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { PageHelper.startPage(page, count); - List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, null, null, null); + List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online); return new PageInfo<>(all); } @@ -504,8 +498,8 @@ * @param endTime */ @Override - public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime) { - return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime); + public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) { + return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java deleted file mode 100644 index 89e35a5..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.util.ArrayList; -import java.util.List; - -/** - * 鑺傜偣鍩虹被 - * - */ -public class BaseNode<T> implements INode<T> { - - private static final long serialVersionUID = 1L; - - /** - * 涓婚敭ID - */ - protected String channelId; - - /** - * 鐖惰妭鐐笽D - */ - protected String parentId; - - /** - * 瀛愬瓩鑺傜偣 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - protected List<T> children = new ArrayList<T>(); - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - * - * @return Boolean - */ - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public String getChannelId() { - return channelId; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public List<T> getChildren() { - return children; - } - - public void setChildren(List<T> children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java deleted file mode 100644 index d983c56..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 妫灄鑺傜偣绫� - * - */ -public class ForestNode extends BaseNode<ForestNode> { - - private static final long serialVersionUID = 1L; - - /** - * 鑺傜偣鍐呭 - */ - private Object content; - - public ForestNode(String id, String parentId, Object content) { - this.channelId = id; - this.parentId = parentId; - this.content = content; - } - - public Object getContent() { - return content; - } - - public void setContent(Object content) { - this.content = content; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java deleted file mode 100644 index affce9d..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 妫灄绠$悊绫� - * - * @author smallchill - */ -public class ForestNodeManager<T extends INode<T>> { - - /** - * 妫灄鐨勬墍鏈夎妭鐐� - */ - private final ImmutableMap<String, T> nodeMap; - - /** - * 妫灄鐨勭埗鑺傜偣ID - */ - private final Map<String, Object> parentIdMap = Maps.newHashMap(); - - public ForestNodeManager(List<T> nodes) { - nodeMap = Maps.uniqueIndex(nodes, INode::getChannelId); - } - - /** - * 鏍规嵁鑺傜偣ID鑾峰彇涓�涓妭鐐� - * - * @param id 鑺傜偣ID - * @return 瀵瑰簲鐨勮妭鐐瑰璞� - */ - public INode<T> getTreeNodeAt(String id) { - if (nodeMap.containsKey(id)) { - return nodeMap.get(id); - } - return null; - } - - /** - * 澧炲姞鐖惰妭鐐笽D - * - * @param parentId 鐖惰妭鐐笽D - */ - public void addParentId(String parentId) { - parentIdMap.put(parentId, ""); - } - - /** - * 鑾峰彇鏍戠殑鏍硅妭鐐�(涓�涓.鏋楀搴斿棰楁爲) - * - * @return 鏍戠殑鏍硅妭鐐归泦鍚� - */ - public List<T> getRoot() { - List<T> roots = new ArrayList<>(); - nodeMap.forEach((key, node) -> { - if (node.getParentId() == null || parentIdMap.containsKey(node.getChannelId())) { - roots.add(node); - } - }); - return roots; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java deleted file mode 100644 index 8df6f50..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.genersoft.iot.vmp.utils.CollectionUtil; - -import java.util.List; - -/** - * 妫灄鑺傜偣褰掑苟绫� - * - */ -public class ForestNodeMerger { - - /** - * 灏嗚妭鐐规暟缁勫綊骞朵负涓�涓.鏋楋紙澶氭5鏍戯級锛堝~鍏呰妭鐐圭殑children鍩燂級 - * 鏃堕棿澶嶆潅搴︿负O(n^2) - * - * @param items 鑺傜偣鍩� - * @return 澶氭5鏍戠殑鏍硅妭鐐归泦鍚� - */ - public static <T extends INode<T>> List<T> merge(List<T> items) { - ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (node != null) { - node.getChildren().add(forestNode); - } else { - forestNodeManager.addParentId(forestNode.getChannelId()); - } - } - }); - return forestNodeManager.getRoot(); - } - - public static <T extends INode<T>> List<T> merge(List<T> items, String[] parentIds) { - ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (CollectionUtil.contains(parentIds, forestNode.getChannelId())){ - forestNodeManager.addParentId(forestNode.getChannelId()); - } else { - if (node != null){ - node.getChildren().add(forestNode); - } - } - } - }); - return forestNodeManager.getRoot(); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java deleted file mode 100644 index 2772747..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import java.io.Serializable; -import java.util.List; - -/** - * - * 鑺傜偣 - */ -public interface INode<T> extends Serializable { - - /** - * 涓婚敭 - * - * @return String - */ - String getChannelId(); - - /** - * 鐖朵富閿� - * - * @return String - */ - String getParentId(); - - /** - * 瀛愬瓩鑺傜偣 - * - * @return List<T> - */ - List<T> getChildren(); - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - * - * @return Boolean - */ - default Boolean getHasChildren() { - return false; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java deleted file mode 100644 index 71f1b2b..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 鏍戝瀷鑺傜偣绫� - * - */ -public class TreeNode extends BaseNode<TreeNode> { - - private static final long serialVersionUID = 1L; - - private String title; - - private String key; - - private String value; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java deleted file mode 100644 index 73928a4..0000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.utils.node.INode; -import io.swagger.annotations.ApiModel; - -import java.util.ArrayList; -import java.util.List; - -@ApiModel(value = "DeviceChannelTree瀵硅薄", description = "DeviceChannelTree瀵硅薄") -public class DeviceChannelTree extends DeviceChannel implements INode<DeviceChannelTree> { - private static final long serialVersionUID = 1L; - - /** - * 涓婚敭ID - */ - private int id; - - /** - * 鐖惰妭鐐笽D - */ - private String parentId; - - private String parentName; - - private String title; - - private String key; - - private String value; - - /** - * 瀛愬瓩鑺傜偣 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List<DeviceChannelTree> children; - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - @Override - public List<DeviceChannelTree> getChildren() { - if (this.children == null) { - this.children = new ArrayList<>(); - } - return this.children; - } - - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public int getId() { - return id; - } - - @Override - public void setId(int id) { - this.id = id; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public void setParentId(String parentId) { - this.parentId = parentId; - } - - public String getParentName() { - return parentName; - } - - public void setParentName(String parentName) { - this.parentName = parentName; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public void setChildren(List<DeviceChannelTree> children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java deleted file mode 100644 index 96577d1..0000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.genersoft.iot.vmp.utils.node.TreeNode; - -public class DeviceChannelTreeNode extends TreeNode { - - private Integer status; - - private String deviceId; - - private String channelId; - - private Double lng; - - private Double lat; - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getChannelId() { - return channelId; - } - - public void setChannelId(String channelId) { - this.channelId = channelId; - } - - public Double getLng() { - return lng; - } - - public void setLng(Double lng) { - this.lng = lng; - } - - public Double getLat() { - return lat; - } - - public void setLat(Double lat) { - this.lat = lat; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java index c360843..7d11b15 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.util.StringUtil; import io.swagger.annotations.Api; @@ -65,10 +66,11 @@ @ApiImplicitParam(name = "start", value = "寮�濮嬫椂闂�", required = true, dataTypeClass = String.class), @ApiImplicitParam(name = "end", value = "缁撴潫鏃堕棿", required = true, dataTypeClass = String.class), }) - @GetMapping("/history/{deviceId}") - public ResponseEntity<List<MobilePosition>> positions(@PathVariable String deviceId, - @RequestParam(required = false) String start, - @RequestParam(required = false) String end) { + @GetMapping("/history/{deviceId}/{channelId}") + public ResponseEntity<WVPResult<List<MobilePosition>>> positions(@PathVariable String deviceId, + @PathVariable String channelId, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { // if (logger.isDebugEnabled()) { // logger.debug("鏌ヨ璁惧" + deviceId + "鐨勫巻鍙茶建杩�"); // } @@ -79,9 +81,11 @@ if (StringUtil.isEmpty(end)) { end = null; } - - List<MobilePosition> result = storager.queryMobilePositions(deviceId, start, end); - return new ResponseEntity<>(result, HttpStatus.OK); + WVPResult<List<MobilePosition>> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + List<MobilePosition> result = storager.queryMobilePositions(deviceId, channelId, start, end); + wvpResult.setData(result); + return new ResponseEntity<>(wvpResult, HttpStatus.OK); } /** diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 95d2843..ab153ad 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; -import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -17,14 +16,12 @@ import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.kxml2.wap.wv.WV; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -235,7 +232,7 @@ @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="count", value = "姣忛〉鏉℃暟", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = String.class), + @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "閫氶亾绫诲瀷锛� 瀛愮洰褰�", dataTypeClass = Boolean.class), }) @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") @@ -244,7 +241,7 @@ int page, int count, @RequestParam(required = false) String query, - @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean online, @RequestParam(required = false) Boolean channelType){ // if (logger.isDebugEnabled()) { @@ -450,11 +447,6 @@ return result; } - @GetMapping("/{deviceId}/tree") - @ApiOperation(value = "閫氶亾鏍戝舰缁撴瀯", notes = "閫氶亾鏍戝舰缁撴瀯") - public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) { - return WVPResult.Data(storager.tree(deviceId)); - } @GetMapping("/{deviceId}/sync_status") @ApiOperation(value = "鑾峰彇閫氶亾鍚屾杩涘害", notes = "鑾峰彇閫氶亾鍚屾杩涘害") diff --git a/web_src/index.html b/web_src/index.html index ca1b842..1ce43e0 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -12,8 +12,26 @@ <script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script> <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script> <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script> - <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=rk73w8dv1rkE4UdZsataG68VarhYQzrx&s=1"></script> <div id="app"></div> <!-- built files will be auto injected --> + <script> + // map缁勪欢鍏ㄥ眬鍙傛暟 + window.mapParam = { + // 鍧愭爣绯� GCJ-02 WGS-84, + coordinateSystem: "GCJ-02", + // 鍦板浘鐡︾墖鍦板潃 + tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", + // 鐡︾墖澶у皬 + tileSize: 256, + // 榛樿灞傜骇 + zoom:10, + // 榛樿鍦板浘涓績鐐� + center:[116.41020, 39.915119], + // 鍦板浘鏈�澶у眰绾� + maxZoom:18, + // 鍦板浘鏈�灏忓眰绾� + minZoom: 3 + } + </script> </body> </html> diff --git a/web_src/package-lock.json b/web_src/package-lock.json index b1da39e..0d4c886 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -14,9 +14,10 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", @@ -57,13 +58,57 @@ "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", - "webpack-dev-server": "^2.11.5", + "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + }, + "bin": { + "gl-style-composite": "bin/gl-style-composite", + "gl-style-format": "bin/gl-style-format", + "gl-style-migrate": "bin/gl-style-migrate", + "gl-style-validate": "bin/gl-style-validate" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "node_modules/@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" }, "node_modules/@types/q": { "version": "1.5.4", @@ -214,6 +259,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1434,34 +1480,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "node_modules/bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "node_modules/bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "node_modules/bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "node_modules/bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "dependencies": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "node_modules/bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "node_modules/bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -2678,6 +2696,11 @@ "engines": { "node": ">=8.0.0" } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -4880,6 +4903,28 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "node_modules/geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "dependencies": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/geotiff/node_modules/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -5428,8 +5473,7 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "node_modules/iferr": { "version": "0.1.5", @@ -6042,6 +6086,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "node_modules/json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -6106,13 +6155,10 @@ "node": ">=0.10.0" } }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dependencies": { - "uc.micro": "^1.0.1" - } + "node_modules/lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "node_modules/load-json-file": { "version": "2.0.0", @@ -6335,25 +6381,10 @@ "node": ">=0.10.0" } }, - "node_modules/markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "node_modules/mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "node_modules/math-expression-evaluator": { "version": "1.3.8", @@ -6377,11 +6408,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "node_modules/media-typer": { "version": "0.3.0", @@ -6783,8 +6809,7 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "node_modules/mississippi": { "version": "2.0.0", @@ -7246,6 +7271,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "node_modules/ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "dependencies": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "node_modules/ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -7512,6 +7558,11 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -7610,6 +7661,18 @@ }, "engines": { "node": ">=4" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" } }, "node_modules/pbkdf2": { @@ -10613,6 +10676,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "node_modules/proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -10745,6 +10813,19 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "node_modules/quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -10786,6 +10867,14 @@ }, "engines": { "node": ">= 0.8" + } + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" } }, "node_modules/read-cache": { @@ -11225,6 +11314,14 @@ "node": ">=4" } }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -11308,6 +11405,11 @@ "dependencies": { "aproba": "^1.1.1" } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -11779,6 +11881,32 @@ "node": ">=0.8.0" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -11786,6 +11914,18 @@ "dev": true, "dependencies": { "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "dependencies": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" }, "engines": { "node": ">=0.10.0" @@ -11983,7 +12123,8 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "node_modules/ssri": { "version": "5.3.0", @@ -12479,11 +12620,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "node_modules/uglify-js": { "version": "3.4.10", "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", @@ -12853,13 +12989,11 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -12897,21 +13031,6 @@ "version": "2.6.12", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" - }, - "node_modules/vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "dependencies": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - }, - "peerDependencies": { - "vue": "^2.1.8" - } }, "node_modules/vue-clipboard2": { "version": "0.3.1", @@ -13298,6 +13417,16 @@ "dependencies": { "minimalistic-assert": "^1.0.0" } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" }, "node_modules/webpack": { "version": "3.12.0", @@ -14116,6 +14245,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", @@ -14244,6 +14378,41 @@ } }, "dependencies": { + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -14360,6 +14529,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -15493,34 +15663,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "requires": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -16578,6 +16720,11 @@ "mdn-data": "2.0.4", "source-map": "^0.6.1" } + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" }, "cssesc": { "version": "3.0.0", @@ -18425,6 +18572,27 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "requires": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "dependencies": { + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -18892,8 +19060,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "iferr": { "version": "0.1.5", @@ -19367,6 +19534,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -19419,13 +19591,10 @@ "invert-kv": "^1.0.0" } }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "requires": { - "uc.micro": "^1.0.1" - } + "lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "load-json-file": { "version": "2.0.0", @@ -19604,24 +19773,10 @@ "object-visit": "^1.0.0" } }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } + "mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "math-expression-evaluator": { "version": "1.3.8", @@ -19645,11 +19800,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "media-typer": { "version": "0.3.0", @@ -19976,8 +20126,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "mississippi": { "version": "2.0.0", @@ -20372,6 +20521,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "requires": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -20589,6 +20759,11 @@ "safe-buffer": "^5.1.1" } }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -20666,6 +20841,15 @@ "dev": true, "requires": { "pify": "^3.0.0" + } + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" } }, "pbkdf2": { @@ -23119,6 +23303,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -23230,6 +23419,16 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -23265,6 +23464,14 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + } + }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" } }, "read-cache": { @@ -23648,6 +23855,14 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -23718,6 +23933,11 @@ "requires": { "aproba": "^1.1.1" } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "safe-buffer": { "version": "5.1.2", @@ -24097,6 +24317,14 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -24124,6 +24352,16 @@ } } }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -24131,6 +24369,15 @@ "dev": true, "requires": { "is-plain-obj": "^1.0.0" + } + }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" } }, "source-list-map": { @@ -24296,7 +24543,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "5.3.0", @@ -24703,11 +24951,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", @@ -25034,10 +25277,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -25071,18 +25313,6 @@ "version": "2.6.12", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" - }, - "vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "requires": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - } }, "vue-clipboard2": { "version": "0.3.1", @@ -25420,6 +25650,16 @@ "requires": { "minimalistic-assert": "^1.0.0" } + }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" }, "webpack": { "version": "3.12.0", @@ -26091,6 +26331,11 @@ "safe-buffer": "~5.1.0" } }, + "xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", diff --git a/web_src/package.json b/web_src/package.json index 20fc3a2..1e7f043 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -16,9 +16,10 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", diff --git a/web_src/src/api/deviceApi.js b/web_src/src/api/deviceApi.js deleted file mode 100644 index 830164f..0000000 --- a/web_src/src/api/deviceApi.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; - -export const tree = (deviceId) => { - return axios({ - url: `/api/device/query/${deviceId}/tree`, - method: 'get' - }) -} - -export const deviceList = (page, count) => { - return axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page, - count - } - }) -} \ No newline at end of file diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue index d934fe6..62cba31 100644 --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -194,7 +194,7 @@ this.$router.push(`/channelList/${row.deviceId}/0/15/1`); }, showDevicePosition: function (row) { - this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); + this.$router.push(`/map?deviceId=${row.deviceId}`); }, //gb28181骞冲彴瀵规帴 diff --git a/web_src/src/components/channelTree.vue b/web_src/src/components/channelTree.vue deleted file mode 100644 index ae9eac7..0000000 --- a/web_src/src/components/channelTree.vue +++ /dev/null @@ -1,70 +0,0 @@ -<template> - <div> - <el-tree :data="channelList" :props="props" @node-click="sendDevicePush"> - <span slot-scope="{ node }"> - <span v-if="node.isLeaf"> - <i class="el-icon-video-camera" :style="{color:node.disabled==1?'#67C23A':'#F56C6C'}"></i> - </span> - <span v-else> - <i class="el-icon-folder"></i> - </span> - <span> - {{ node.label }} - </span> - </span> - </el-tree> - </div> -</template> -<script> -import ChannelTreeItem from "@/components/channelTreeItem" -import {tree} from '@/api/deviceApi' - -export default { - components: { - ChannelTreeItem, - }, - props:{ - device: { - type: Object, - required: true - } - }, - data() { - return { - loading: false, - channelList: [], - props: { - label: 'title', - children: 'children', - isLeaf: 'hasChildren', - disabled: 'status' - }, - } - }, - computed: { - - }, - mounted() { - this.leafs = [] - this.getTree() - }, - methods: { - getTree() { - this.loading = true - var that = this - tree(this.device.deviceId).then(function (res) { - console.log(res.data.data); - that.channelList = res.data.data; - that.loading = false; - }).catch(function (error) { - console.log(error); - that.loading = false; - }); - }, - sendDevicePush(c) { - if(c.hasChildren) return - this.$emit('sendDevicePush',c) - } - } -} -</script> \ No newline at end of file diff --git a/web_src/src/components/channelTreeItem.vue b/web_src/src/components/channelTreeItem.vue deleted file mode 100644 index 7f2a2a5..0000000 --- a/web_src/src/components/channelTreeItem.vue +++ /dev/null @@ -1,74 +0,0 @@ -<template> - <div> - <!-- <div :index="item.key" v-for="(item,i) in list" :key="i+'-'"> - <el-submenu v-if="item.hasChildren"> - <template slot="title"> - <i class="el-icon-video-camera"></i> - <span slot="title">{{item.title || item.deviceId}}</span> - </template> - <channel-list :list="item.children" @sendDevicePush="sendDevicePush"></channel-list> - </el-submenu> - <el-menu-item v-else :index="item.key" @click="sendDevicePush(item)"> - <template slot="title" > - <i class="el-icon-switch-button" :style="{color:item.status==1?'#67C23A':'#F56C6C'}"></i> - <span slot="title">{{item.title}}</span> - </template> - </el-menu-item> - </div> --> - <div > - <template v-if="!item.hasChildren"> - <el-menu-item :index="item.key" @click="sendDevicePush(item)"> - <i class="el-icon-video-camera" :style="{color:item.status==1?'#67C23A':'#F56C6C'}"></i> - {{item.title}} - </el-menu-item> - </template> - - <el-submenu v-else :index="item.key"> - <template slot="title" > - <i class="el-icon-location-outline"></i> - {{item.title}} - </template> - - <template v-for="child in item.children"> - <channel-item - v-if="child.hasChildren" - :item="child" - :key="child.key" - @sendDevicePush="sendDevicePush"/> - <el-menu-item v-else :key="child.key" :index="child.key" @click="sendDevicePush(child)"> - <i class="el-icon-video-camera" :style="{color:child.status==1?'#67C23A':'#F56C6C'}"></i> - {{child.title}} - </el-menu-item> - </template> - </el-submenu> - </div> - </div> -</template> -<script> -export default { - name:'ChannelItem', - props:{ - list:Array, - channelId: String, - item: { - type: Object, - required: true - } - }, - data () { - return { - - } - }, - watch: { - channelId(val) { - console.log(val); - } - }, - methods: { - sendDevicePush(c) { - this.$emit('sendDevicePush',c) - } - } -} -</script> diff --git a/web_src/src/components/common/DeviceTree.vue b/web_src/src/components/common/DeviceTree.vue new file mode 100644 index 0000000..fab895f --- /dev/null +++ b/web_src/src/components/common/DeviceTree.vue @@ -0,0 +1,160 @@ +<template> + <div id="DeviceTree" style="width: 100%;height: 100%; background-color: #FFFFFF; overflow: auto"> + <el-container> + <el-header>璁惧鍒楄〃</el-header> + <el-main style="background-color: #ffffff;"> + <div class="device-tree-main-box"> + <el-tree :props="defaultProps" :load="loadNode" lazy @node-click="handleNodeClick"@node-contextmenu="handleContextMenu" style="min-width: 100%; display:inline-block !important;"> + <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%"> + <span v-if="node.data.type === 0 && node.data.online" title="鍦ㄧ嚎璁惧" class="device-online iconfont icon-jiedianleizhukongzhongxin2"></span> + <span v-if="node.data.type === 0 && !node.data.online " title="绂荤嚎璁惧" class="device-offline iconfont icon-jiedianleizhukongzhongxin2"></span> + <span v-if="node.data.type === 2 && node.data.online" title="鐩綍" class="device-online iconfont icon-jiedianleilianjipingtai"></span> + <span v-if="node.data.type === 2 && !node.data.online" title="鐩綍" class="device-offline iconfont icon-jiedianleilianjipingtai"></span> + <span v-if="node.data.type === 3 && node.data.online " title="鍦ㄧ嚎閫氶亾" class="device-online iconfont icon-shebeileijiankongdian"></span> + <span v-if="node.data.type === 3 && !node.data.online" title="鍦ㄧ嚎閫氶亾" class="device-offline iconfont icon-shebeileijiankongdian"></span> + <span v-if="node.data.type === 4 && node.data.online " title="鍦ㄧ嚎閫氶亾-鐞冩満" class="device-online iconfont icon-shebeileiqiuji"></span> + <span v-if="node.data.type === 4 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鐞冩満" class="device-offline iconfont icon-shebeileiqiuji"></span> + <span v-if="node.data.type === 5 && node.data.online " title="鍦ㄧ嚎閫氶亾-鍗婄悆" class="device-online iconfont icon-shebeileibanqiu"></span> + <span v-if="node.data.type === 5 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鍗婄悆" class="device-offline iconfont icon-shebeileibanqiu"></span> + <span v-if="node.data.type === 6 && node.data.online " title="鍦ㄧ嚎閫氶亾-鏋満" class="device-online iconfont icon-shebeileiqiangjitongdao"></span> + <span v-if="node.data.type === 6 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鏋満" class="device-offline iconfont icon-shebeileiqiangjitongdao"></span> + <span v-if="node.data.online" style="padding-left: 1px" class="device-online">{{ node.label }}</span> + <span v-if="!node.data.online" style="padding-left: 1px" class="device-offline">{{ node.label }}</span> + <span> + <i v-if="node.data.hasGPS && node.data.online" style="color: #9d9d9d" class="device-online iconfont icon-dizhi"></i> + <i v-if="node.data.hasGPS && !node.data.online" style="color: #9d9d9d" class="device-offline iconfont icon-dizhi"></i> + </span> + </span> + </el-tree> + </div> + </el-main> + </el-container> + </div> +</template> + +<script> +import DeviceService from "../service/DeviceService.js"; + +export default { + name: 'DeviceTree', + data() { + return { + deviceService: new DeviceService(), + defaultProps: { + children: 'children', + label: 'name', + isLeaf: 'isLeaf' + } + }; + }, + props: ['clickEvent', 'contextMenuEvent'], + methods: { + handleNodeClick(data,node,element) { + console.log("鐐瑰嚮浜嬩欢") + console.log(data) + if(typeof (this.clickEvent) == "function") { + this.clickEvent(data.userData) + } + }, + handleContextMenu(event,data,node,element) { + console.log("鍙抽敭鐐瑰嚮浜嬩欢") + if(typeof (this.contextMenuEvent) == "function") { + this.contextMenuEvent(event, data.userData) + } + }, + loadNode: function(node, resolve){ + if (node.level === 0) { + this.deviceService.getAllDeviceList((data)=>{ + console.log(data) + if (data.length > 0) { + let nodeList = [] + for (let i = 0; i < data.length; i++) { + console.log(data[i].name) + let node = { + name: data[i].name || data[i].deviceId, + isLeaf: false, + id: data[i].deviceId, + type: data[i].online, + online: data[i].online === 1, + userData: data[i] + } + nodeList.push(node); + } + resolve(nodeList) + }else { + resolve([]) + } + }, (error)=>{ + + }) + } + if (node.level === 1) { + this.deviceService.getAllChannel(true, node.data.id, (catalogData) => { + this.deviceService.getAllChannel(false, node.data.id, (channelData) => { + let data = catalogData.concat(channelData) + this.channelDataHandler(data, resolve) + }) + }) + }else if (node.level > 1){ + this.deviceService.getAllSubChannel(true, node.data.deviceId, node.data.id, (catalogData)=>{ + this.deviceService.getAllSubChannel(false, node.data.deviceId, node.data.id, (channelData)=>{ + let data = catalogData.concat(channelData) + this.channelDataHandler(data, resolve) + }) + }) + } + }, + channelDataHandler: function (data, resolve) { + if (data.length > 0) { + let nodeList = [] + for (let i = 0; i < data.length; i++) { + let type = 3; + if (data[i].subCount > 0) { + type = 2; + }else if (data[i].ptztype === 1 ) { // 1-鐞冩満;2-鍗婄悆;3-鍥哄畾鏋満;4-閬ユ帶鏋満 + type = 4; + }else if (data[i].ptztype === 2) { + type = 5; + }else if (data[i].ptztype === 3 || data[i].ptztype === 4) { + type = 6; + } + let node = { + name: data[i].name || data[i].channelId, + isLeaf: data[i].subCount === 0, + id: data[i].channelId, + deviceId: data[i].deviceId, + type: type, + online: data[i].status === 1, + hasGPS: data[i].longitude*data[i].latitude !== 0, + userData: data[i] + } + nodeList.push(node); + } + resolve(nodeList) + }else { + resolve([]) + } + } + }, + destroyed() { + // if (this.jessibuca) { + // this.jessibuca.destroy(); + // } + // this.playing = false; + // this.loaded = false; + // this.performance = ""; + }, +} +</script> + +<style> +.device-tree-main-box{ + text-align: left; +} +.device-online{ + color: #252525; +} +.device-offline{ + color: #727272; +} +</style> diff --git a/web_src/src/components/common/MapComponent.vue b/web_src/src/components/common/MapComponent.vue new file mode 100644 index 0000000..2d8600d --- /dev/null +++ b/web_src/src/components/common/MapComponent.vue @@ -0,0 +1,257 @@ +<template> + <div id="mapContainer" ref="mapContainer" style="width: 100%;height: 100%;"></div> +</template> + +<script> +import 'ol/ol.css'; +import Map from 'ol/Map'; +import OSM from 'ol/source/OSM'; +import XYZ from 'ol/source/XYZ'; +import VectorSource from 'ol/source/Vector'; +import Tile from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import Style from 'ol/style/Style'; +import Icon from 'ol/style/Icon'; +import View from 'ol/View'; +import Feature from 'ol/Feature'; +import Overlay from 'ol/Overlay'; +import {Point, LineString} from 'ol/geom'; +import {get as getProj, fromLonLat} from 'ol/proj'; +import {ZoomSlider, Zoom} from 'ol/control'; +import {containsCoordinate} from 'ol/extent'; + +import {v4} from 'uuid' + +let olMap = null; + +export default { + name: 'MapComponent', + data() { + return { + + + }; + }, + created(){ + this.$nextTick(() => { + setTimeout(()=>{ + this.init() + }, 100) + }) + + }, + props: [], + mounted () { + + }, + methods: { + init(){ + + let center = fromLonLat([116.41020, 39.915119]); + if (mapParam.center) { + center = fromLonLat(mapParam.center); + } + const view = new View({ + center: center, + zoom: mapParam.zoom || 10, + projection: this.projection, + maxZoom: mapParam.maxZoom || 19, + minZoom: mapParam.minZoom || 1, + }); + let tileLayer = null; + if (mapParam.tilesUrl) { + tileLayer = new Tile({ + source: new XYZ({ + projection: getProj("EPSG:3857"), + wrapX: false, + tileSize: 256 || mapParam.tileSize, + url: mapParam.tilesUrl + }) + }) + }else { + tileLayer = new Tile({ + preload: 4, + source: new OSM(), + }) + } + olMap = new Map({ + target: this.$refs.mapContainer, // 瀹瑰櫒ID + layers: [tileLayer], // 榛樿鍥惧眰 + view: view, // 瑙嗗浘 + controls:[ // 鎺т欢 + // new ZoomSlider(), + new Zoom(), + ] , + }) + console.log(3222) + }, + setCenter(point){ + + }, + zoomIn(zoom){ + + }, + zoomOut(zoom){ + + }, + centerAndZoom(point,zoom,callback){ + var zoom_ = olMap.getView().getZoom(); + zoom = zoom|| zoom_; + var duration = 600; + olMap.getView().setCenter(fromLonLat(point)) + olMap.getView().animate({ + zoom: zoom , + duration: duration + }); + }, + panTo(point, zoom){ + let duration = 800; + + olMap.getView().cancelAnimations() + olMap.getView().animate({ + center: fromLonLat(point), + duration: duration + }); + if (!containsCoordinate(olMap.getView().calculateExtent(), fromLonLat(point))) { + olMap.getView().animate({ + zoom: olMap.getView().getZoom() - 1, + duration: duration / 2 + }, { + zoom: zoom || olMap.getView().getZoom(), + duration: duration / 2 + }); + } + + }, + fit(layer){ + let extent = layer.getSource().getExtent(); + if (extent) { + olMap.getView().fit(extent,{ + duration : 600, + padding: [100, 100, 100, 100] + }); + } + + + }, + openInfoBox(position, content, offset){ + let id = v4() + // let infoBox = document.createElement("div"); + // infoBox.innerHTML = content ; + // infoBox.setAttribute("infoBoxId", id) + let overlay = new Overlay({ + id:id, + autoPan:true, + autoPanAnimation:{ + duration: 250 + }, + element: content, + positioning:"bottom-center", + offset:offset, + // className:overlayStyle.className + }); + olMap.addOverlay(overlay); + overlay.setPosition(fromLonLat(position)); + return id; + }, + closeInfoBox(id){ + olMap.getOverlayById(id).setPosition(undefined) + // olMap.removeOverlay(olMap.getOverlayById(id)) + }, + /** + * 娣诲姞鍥惧眰 + * @param data + * [ + * { + * + * position: [119.1212,45,122], + * image: { + * src:"/images/123.png", + * anchor: [0.5, 0.5] + * + * } + * } + * + * ] + */ + addLayer(data, clickEvent){ + let style = new Style(); + if (data.length > 0) { + let features = []; + for (let i = 0; i < data.length; i++) { + let feature = new Feature(new Point(fromLonLat(data[i].position))); + feature.customData = data[i].data; + let cloneStyle = style.clone() + cloneStyle.setImage(new Icon({ + anchor: data[i].image.anchor, + crossOrigin: 'Anonymous', + src: data[i].image.src, + })) + feature.setStyle(cloneStyle) + features.push(feature); + } + let source = new VectorSource(); + source.addFeatures(features); + let vectorLayer = new VectorLayer({ + source:source, + style:style, + renderMode:"image", + declutter: false + }) + olMap.addLayer(vectorLayer) + if (typeof clickEvent == "function") { + olMap.on("click", (event)=>{ + vectorLayer.getFeatures(event.pixel).then((features)=>{ + if (features.length > 0) { + let items = [] + for (let i = 0; i < features.length; i++) { + items.push(features[i].customData) + } + clickEvent(items) + } + }) + + + }) + } + + return vectorLayer; + } + }, + removeLayer(layer){ + olMap.removeLayer(layer) + }, + + addLineLayer(positions) { + if (positions.length > 0) { + let points = []; + for (let i = 0; i < positions.length; i++) { + points.push(fromLonLat(positions[i])); + } + let line = new LineString(points) + let lineFeature = new Feature(line); + + let source = new VectorSource(); + source.addFeature(lineFeature); + let vectorLayer = new VectorLayer({ + source: source, + }) + olMap.addLayer(vectorLayer) + return vectorLayer; + } + } + }, + destroyed() { + // if (this.jessibuca) { + // this.jessibuca.destroy(); + // } + // this.playing = false; + // this.loaded = false; + // this.performance = ""; + }, +} +</script> + +<style> + +</style> diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/common/jessibuca.vue similarity index 100% rename from web_src/src/components/dialog/jessibuca.vue rename to web_src/src/components/common/jessibuca.vue diff --git a/web_src/src/components/devicePosition.vue b/web_src/src/components/devicePosition.vue index 0ffd5fa..a807363 100644 --- a/web_src/src/components/devicePosition.vue +++ b/web_src/src/components/devicePosition.vue @@ -1,383 +1,357 @@ <template> - <div id="devicePosition" style="height: 100%"> - <div style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center;"> - <span style="font-size: 1rem; font-weight: 500">璁惧瀹氫綅 ({{ parentChannelId == 0 ? deviceId : parentChannelId }})</span> + <div id="devicePosition" style="width: 100vw; height: 91vh;"> + <el-container v-if="onOff" style="height: 91vh;" v-loading="isLoging"> + <el-aside width="auto" style="background-color: #ffffff"> + <DeviceTree ref="deviceTree" :clickEvent="clickEvent" :contextMenuEvent="contextmenuEventHandler" ></DeviceTree> + </el-aside> + <el-main style="height: 91vh; padding: 0"> + <MapComponent ref="map"></MapComponent> + </el-main> + </el-container> + <div v-if="!onOff" style="width: 100%; height:100%; text-align: center; line-height: 5rem"> + <p>鍦板浘鍔熻兘宸插叧闂�</p> </div> - <div style="background-color: #ffffff; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left; font-size: 14px;"> - <el-button icon="el-icon-arrow-left" size="mini" style="margin-right: 1rem" type="primary" @click="showDevice">杩斿洖</el-button> - <!-- <span class="demonstration">浠�</span> --> - <el-date-picker v-model="searchFrom" type="datetime" placeholder="閫夋嫨寮�濮嬫棩鏈熸椂闂�" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> - <el-date-picker v-model="searchTo" type="datetime" placeholder="閫夋嫨缁撴潫鏃ユ湡鏃堕棿" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> - <el-button-group> - <el-button icon="el-icon-search" size="mini" type="primary" @click="showHistoryPath">鍘嗗彶杞ㄨ抗</el-button> - <el-button icon="el-icon-search" size="mini" style="margin-right: 1rem" type="primary" @click="showLatestPosition">鏈�鏂颁綅缃�</el-button> - </el-button-group> - <el-tag style="width: 5rem; text-align: center" size="medium">杩囨湡鏃堕棿</el-tag> - <el-input-number size="mini" v-model="expired" :min="300" :controls="false" style="width: 4rem;"></el-input-number> - <el-tag style="width: 5rem; text-align: center" size="medium">涓婃姤鍛ㄦ湡</el-tag> - <el-input-number size="mini" v-model="interval" :min="1" :controls="false" style="width: 4rem;"></el-input-number> - <el-button-group> - <el-button icon="el-icon-search" size="mini" type="primary" @click="subscribeMobilePosition">浣嶇疆璁㈤槄</el-button> - <el-button icon="el-icon-search" size="mini" type="primary" @click="unSubscribeMobilePosition">鍙栨秷璁㈤槄</el-button> - </el-button-group> - <el-checkbox size="mini" style="margin-right: 1rem; float: right" v-model="autoList" @change="autoListChange" >鑷姩鍒锋柊</el-checkbox> + <div ref="infobox" v-if="channel != null " > + <div v-if="channel != null" class="infobox-content"> + <el-descriptions class="margin-top" :title="channel.name" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" > + <el-descriptions-item label="鐢熶骇鍘傚晢">{{channel.manufacture}}</el-descriptions-item> + <el-descriptions-item label="鍨嬪彿">{{channel.model}}</el-descriptions-item> + <el-descriptions-item label="璁惧褰掑睘" >{{channel.owner}}</el-descriptions-item> + <el-descriptions-item label="琛屾斂鍖哄煙" >{{channel.civilCode}}</el-descriptions-item> + <el-descriptions-item label="瀹夎鍦板潃" >{{channel.address == null?'鏈煡': channel.address}}</el-descriptions-item> + <el-descriptions-item label="浜戝彴绫诲瀷" >{{channel.ptztypeText}}</el-descriptions-item> + <el-descriptions-item label="缁忕含搴�" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> + <el-descriptions-item label="鐘舵��"> + <el-tag size="small" v-if="channel.status === 1">鍦ㄧ嚎</el-tag> + <el-tag size="small" type="info" v-if="channel.status === 0">绂荤嚎</el-tag> + </el-descriptions-item> + </el-descriptions> + <div style="padding-top: 10px"> + <el-button type="primary" size="small" title="鎾斁" icon="el-icon-video-play" @click="play(channel)"></el-button> + <el-button type="primary" size="small" title="缂栬緫浣嶇疆" icon="el-icon-edit" @click="edit(channel)"></el-button> + <el-button type="primary" size="small" title="杞ㄨ抗鏌ヨ" icon="el-icon-map-location" @click="getTrace(channel)"></el-button> + </div> + <span class="infobox-close el-icon-close" @click="closeInfoBox()"></span> + </div> </div> - <div class="mapContainer" style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center; height: calc(100% - 10rem);"> - <div class="baidumap" id="allmap"></div> - </div> + <devicePlayer ref="devicePlayer" ></devicePlayer> + <queryTrace ref="queryTrace" ></queryTrace> </div> </template> <script> -import uiHeader from "../layout/UiHeader.vue"; -import geoTools from "./GeoConvertTools.js"; +import MapComponent from "./common/MapComponent.vue"; +import DeviceService from "./service/DeviceService"; +import DeviceTree from "./common/DeviceTree"; +import channelMapInfobox from "./dialog/channelMapInfobox"; +import devicePlayer from './dialog/devicePlayer.vue' +import queryTrace from './dialog/queryTrace.vue' + export default { - name: "devicePosition", - components: { - uiHeader, - }, - data() { - return { - pickerOptions: { - shortcuts: [{ - text: '浠婂ぉ', - onClick(picker) { - picker.$emit('pick', new Date()); - } - }, { - text: '鏄ㄥぉ', - onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24); - picker.$emit('pick', date); - } - }, { - text: '涓�鍛ㄥ墠', - onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); - picker.$emit('pick', date); - } - }] + name: "devicePosition", + components: { + MapComponent, + DeviceTree, + channelMapInfobox, + devicePlayer, + queryTrace, + }, + data() { + return { + onOff: typeof window.mapParam !== "undefined", + deviceService: new DeviceService(), + layer: null, + lineLayer: null, + channel: null, + infoBoxId: null, + labelStyle: { + width: "56px" + }, + isLoging: false, + }; + }, + created() { + if (this.$route.query.deviceId) { + console.log(this.$route.query.deviceId) + // this.$refs.deviceTree.openByDeivceId(this.$route.query.deivceId) + setTimeout(()=>{ // 寤惰繜浠ョ瓑寰呭湴鍥惧姞杞藉畬鎴� TODO 鍚庣画淇敼涓洪�氳繃鏄疄闄呰繖锛涚姸鎬佸姞鍥炶皟瀹屾垚 + this.deviceService.getAllChannel(false, this.$route.query.deviceId, this.channelsHandler) + }, 1000) + + } + }, + destroyed() { + + }, + methods: { + clickEvent: function (data) { + if (data.channelId && data.subCount == 0) { + // 鐐瑰嚮閫氶亾 + if (data.longitude * data.latitude === 0) { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } else { + if (this.layer != null) { + this.$refs.map.removeLayer(this.layer); + } + this.closeInfoBox() + this.layer = this.$refs.map.addLayer([{ + position: [data.longitude, data.latitude], + image: { + src: this.getImageByChannel(data), + anchor: [0.5, 1] }, - deviceId: this.$route.params.deviceId, - showHistoryPosition: false, //鏄剧ず鍘嗗彶杞ㄨ抗 - startTime: null, - endTime: null, - searchFrom: null, - searchTo: null, - expired: 600, - interval: 5, - mobilePositionList: [], - mapPointList: [], - parentChannelId: this.$route.params.parentChannelId, - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - total: 0, - beforeUrl: "/deviceList", - isLoging: false, - autoList: false, - }; - }, - mounted() { - this.initData(); - this.initBaiduMap(); - if (this.autoList) { - this.updateLooper = setInterval(this.initData, 5000); + data: data + }], this.featureClickEvent) + this.$refs.map.panTo([data.longitude, data.latitude], mapParam.maxZoom) } + } }, - destroyed() { - // this.$destroy("videojs"); - clearTimeout(this.updateLooper); + contextmenuEventHandler: function (event, data) { + if (data.channelId && data.subCount == 0) { + // 鐐瑰嚮閫氶亾 + this.$contextmenu({ + items: [ + { + label: "鎾斁", + icon: "el-icon-video-play", + disabled: false, + onClick: () => { + this.play(data); + } + }, + { + label: "缂栬緫浣嶇疆", + icon: "el-icon-edit", + disabled: false, + onClick: () => { + this.edit(data) + } + }, + { + label: "杞ㄨ抗鏌ヨ", + icon: "el-icon-map-location", + disabled: false, + onClick: () => { + this.getTrace(data) + } + } + ], + event, // 榧犳爣浜嬩欢淇℃伅 + customClass: "custom-class", // 鑷畾涔夎彍鍗� class + zIndex: 3000, // 鑿滃崟鏍峰紡 z-index + }); + } else { + this.deviceOrSubChannelMenu(event, data) + } + }, - methods: { - initData: function () { - // if (this.parentChannelId == "" || this.parentChannelId == 0) { - // this.getDeviceChannelList(); - // } else { - // this.showSubchannels(); - // } - }, - initParam: function () { - // this.deviceId = this.$route.params.deviceId; - // this.parentChannelId = this.$route.params.parentChannelId; - // this.currentPage = parseInt(this.$route.params.page); - // this.count = parseInt(this.$route.params.count); - // if (this.parentChannelId == "" || this.parentChannelId == 0) { - // this.beforeUrl = "/deviceList"; - // } - }, - initBaiduMap() { - this.map = new BMap.Map("allmap"); // 鍒涘缓鍦板浘瀹炰緥 - let points = []; - let point = new BMap.Point(116.231398, 39.567445); // 鍒涘缓鐐瑰潗鏍� - this.map.centerAndZoom(point, 5); // 鍒濆鍖栧湴鍥撅紝璁剧疆涓績鐐瑰潗鏍囧拰鍦板浘绾у埆 - this.map.enableScrollWheelZoom(true); //寮�鍚紶鏍囨粴杞缉鏀� - this.map.addControl(new BMap.NavigationControl()); - this.map.addControl(new BMap.ScaleControl()); - this.map.addControl(new BMap.OverviewMapControl()); - this.map.addControl(new BMap.MapTypeControl()); - //map.setMapStyle({ style: 'midnight' }) //鍦板浘椋庢牸 - }, - currentChange: function (val) { - // var url = `/${this.$router.currentRoute.name}/${this.deviceId}/${this.parentChannelId}/${this.count}/${val}`; - // console.log(url); - // this.$router.push(url).then(() => { - // this.initParam(); - // this.initData(); - // }); - }, - handleSizeChange: function (val) { - // var url = `/${this.$router.currentRoute.name}/${this.$router.params.deviceId}/${this.$router.params.parentChannelId}/${val}/1`; - // this.$router.push(url).then(() => { - // this.initParam(); - // this.initData(); - // }); - }, - showDevice: function () { - this.$router.push(this.beforeUrl).then(() => { - this.initParam(); - this.initData(); - }); - }, - autoListChange: function () { - if (this.autoList) { - this.updateLooper = setInterval(this.initData, 1500); - } else { - window.clearInterval(this.updateLooper); + deviceOrSubChannelMenu: function (event, data) { + // 鐐瑰嚮璁惧 + this.$contextmenu({ + items: [ + { + label: "瀹氫綅", + icon: "el-icon-s-promotion", + disabled: false, + onClick: () => { + if (!data.channelId) { + this.deviceService.getAllChannel(false, data.deviceId, this.channelsHandler) + } + if (data.channelId && data.subCount > 0) { + // 鐐瑰嚮瀛愮洰褰� + this.deviceService.getAllSubChannel(false, data.deviceId, data.channelId, this.channelsHandler) + } } - }, - showHistoryPath: function () { - this.map.clearOverlays(); - this.mapPointList = []; - this.mobilePositionList = []; - if (!!this.searchFrom) { - this.startTime = this.toGBString(this.searchFrom); - console.log(this.startTime); - } else{ - this.startTime = null; - } - if (!!this.searchTo) { - this.endTime = this.toGBString(this.searchTo); - console.log(this.endTime); - } else { - this.endTime = null; - } - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/history/${this.deviceId}`, - params: { - start: self.startTime, - end: self.endTime, - }, - }).then(function (res) { - self.total = res.data.length; - self.mobilePositionList = res.data; - console.log(self.mobilePositionList); - if (self.total == 0) { - self.$message({ - showClose: true, - message: '鏈壘鍒扮鍚堟潯浠剁殑绉诲姩浣嶇疆淇℃伅', - type: 'error' - }); - } else { - self.$nextTick(() => { - self.showMarkPoints(self); - }); - } - }).catch(function (error) { - console.log(error); - }); - }, - showLatestPosition: function() { - this.map.clearOverlays(); - this.mapPointList = []; - this.mobilePositionList = []; - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/latest/${this.deviceId}` - }).then(function (res) { - console.log(res.data); - self.total = res.data.length; - self.mobilePositionList.push(res.data); - console.log(self.mobilePositionList); - if (self.total == 0) { - self.$message({ - showClose: true, - message: '鏈壘鍒扮鍚堟潯浠剁殑绉诲姩浣嶇疆淇℃伅', - type: 'error' - }); - } else { - self.$nextTick(() => { - self.showMarkPoints(self); - }); - } - }).catch(function (error) { - console.log(error); - }); - }, - subscribeMobilePosition: function() { - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/subscribe/${this.deviceId}`, - params: { - expires: self.expired, - interval: self.interval, - }, - }).then(function (res) { - console.log(res.data); - }) - .catch(function (error) { - console.log(error); - }); - }, - unSubscribeMobilePosition: function() { - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/subscribe/${this.deviceId}`, - params: { - expires: 0, - interval: self.interval, - }, - }) - .then(function (res) { - console.log(res.data); - }).catch(function (error) { - console.log(error); - }); - }, - toGBString: function (dateTime) { - return ( - dateTime.getFullYear() + - "-" + this.twoDigits(dateTime.getMonth() + 1) + - "-" + this.twoDigits(dateTime.getDate()) + - "T" + this.twoDigits(dateTime.getHours()) + - ":" + this.twoDigits(dateTime.getMinutes()) + - ":" + this.twoDigits(dateTime.getSeconds()) - ); - }, - twoDigits: function (num) { - if (num < 10) { - return "0" + num; - } else { - return "" + num; - } - }, - showMarkPoints: function(self) { - let that = self; - let npointJ = null; - let npointW = null; - let point = null; - for (let i = 0; i < self.mobilePositionList.length; i++) { - if (self.mobilePositionList[i].geodeticSystem == "BD-09") { - npointJ = self.mobilePositionList[i].cnLng; - npointW = self.mobilePositionList[i].cnLat; - point = new BMap.Point(npointJ, npointW); - } else { - npointJ = self.mobilePositionList[i].longitude; - npointW = self.mobilePositionList[i].latitude; - let bd2 = geoTools.GPSToBaidu(npointJ, npointW); - point = new BMap.Point(bd2.lat, bd2.lng); - } - self.mapPointList.push(point); - let marker = new BMap.Marker(point); // 鍒涘缓鏍囨敞 - self.map.addOverlay(marker); // 灏嗘爣娉ㄦ坊鍔犲埌鍦板浘涓� - //鎻愮ず淇℃伅 鍙互瑙f瀽 HTML鏍囩浠ュ強CSS - let infoWindow = new BMap.InfoWindow(`<p style='text-align:left;font-weight:800'>璁惧: ${self.mobilePositionList[i].deviceId}</p> - <p style='text-align:left;font-weight:0'>鏃堕棿: ${self.mobilePositionList[i].time}</p>`); - // 榧犳爣绉讳笂鏍囨敞鐐硅鍙戠敓鐨勪簨 - marker.addEventListener("mouseover", function () { - this.openInfoWindow(infoWindow); - }); - // 榧犳爣绉诲紑鏍囨敞鐐硅鍙戠敓鐨勪簨 - marker.addEventListener("mouseout", function () { - this.closeInfoWindow(infoWindow); - }); - // 榧犳爣鐐瑰嚮鏍囨敞鐐硅鍙戠敓鐨勪簨鎯� - marker.addEventListener("click", function () { - alert("鐐瑰嚮"); - }); - } - let view = that.map.getViewport(eval(self.mapPointList)); - that.map.centerAndZoom(view.center, view.zoom); - }, + } + ], + event, // 榧犳爣浜嬩欢淇℃伅 + customClass: "custom-class", // 鑷畾涔夎彍鍗� class + zIndex: 3000, // 鑿滃崟鏍峰紡 z-index + }); + }, + channelsHandler: function (channels) { + console.log(2) + if (channels.length > 0) { + this.clean() + this.closeInfoBox() + let params = []; + for (let i = 0; i < channels.length; i++) { + if (channels[i].longitude * channels[i].latitude === 0) { + continue; + } + let item = { + position: [channels[i].longitude, channels[i].latitude], + image: { + src: this.getImageByChannel(channels[i]), + anchor: [0.5, 1] + }, + data: channels[i] + } + params.push(item); + } + console.log(3) + + this.layer = this.$refs.map.addLayer(params, this.featureClickEvent) + console.log(4) + if (params.length === 1) { + this.$refs.map.panTo([channels[0].longitude, channels[0].latitude], mapParam.maxZoom) + } else if (params.length > 1) { + this.$refs.map.fit(this.layer) + } else { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } + } else { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } + }, + getImageByChannel: function (channel) { + let src = "static/images/gis/camera.png" + switch (channel.ptztype) { + case 1: + if (channel.status === 1) { + src = "static/images/gis/camera1.png" + } else { + src = "static/images/gis/camera1-offline.png" + } + break; + case 2: + if (channel.status === 1) { + src = "static/images/gis/camera2.png" + } else { + src = "static/images/gis/camera2-offline.png" + } + break; + case 3: + if (channel.status === 1) { + src = "static/images/gis/camera3.png" + } else { + src = "static/images/gis/camera3-offline.png" + } + break; + default: + if (channel.status === 1) { + src = "static/images/gis/camera.png" + } else { + src = "static/images/gis/camera-offline.png" + } + } + return src; + }, + featureClickEvent: function (channels) { + this.closeInfoBox() + if (channels.length > 0) { + this.channel = channels[0] + } + this.$nextTick(() => { + this.infoBoxId = this.$refs.map.openInfoBox([this.channel.longitude, this.channel.latitude], this.$refs.infobox, [0, -50]) + }) + }, + closeInfoBox: function () { + if (this.infoBoxId != null) { + this.$refs.map.closeInfoBox(this.infoBoxId) + } + }, + play: function (channel) { + + let deviceId = channel.deviceId; + this.isLoging = true; + let channelId = channel.channelId; + console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + let that = this; + this.$axios({ + method: 'get', + url: '/api/play/start/' + deviceId + '/' + channelId + }).then(function (res) { + that.isLoging = false; + if (res.data.code === 0) { + + that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { + streamInfo: res.data.data, + hasAudio: channel.hasAudio + }); + + } else { + that.$message.error(res.data.msg); + } + }).catch(function (e) { + }); + }, + edit: function (data) { + this.$message.warning('鏆備笉鏀寔'); + }, + getTrace: function (data) { + // this.$message.warning('鏆備笉鏀寔'); + this.clean() + this.$refs.queryTrace.openDialog(data, (channelPositions) => { + console.log("getTrace") + console.log(channelPositions) + if (channelPositions.length === 0) { + this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅'); + } else { + let positions = []; + for (let i = 0; i < channelPositions.length; i++) { + if (channelPositions[i].cnLng * channelPositions[i].cnLat > 0) { + positions.push([channelPositions[i].cnLng, channelPositions[i].cnLat]) + } + + } + if (positions.length === 0) { + this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅'); + return; + } + this.lineLayer = this.$refs.map.addLineLayer(positions) + this.$refs.map.fit(this.lineLayer) + } + }) + }, + clean: function (){ + if (this.lineLayer != null) { + this.$refs.map.removeLayer(this.lineLayer) + } + if (this.infoBoxId != null) { + this.$refs.map.closeInfoBox(this.infoBoxId) + } + if (this.layer != null) { + this.$refs.map.removeLayer(this.layer) + } + } + }, + }; </script> <style> -.videoList { - display: flex; - flex-wrap: wrap; - align-content: flex-start; +.infobox-content{ + width: 260px; + background-color: #FFFFFF; + padding: 10px; + border-radius: 10px; + border: 1px solid #e2e2e2; } -.video-item { - position: relative; - width: 15rem; - height: 10rem; - margin-right: 1rem; - background-color: #000000; -} - -.video-item-img { +.infobox-content::after { position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - width: 100%; - height: 100%; -} - -.video-item-img:after { + bottom: -11px; + left: 130px; + display: block; 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; + width: 16px; + height: 16px; + background: url('~@static/images/arrow.png') no-repeat center; } - -.video-item-title { +.infobox-close { position: absolute; - bottom: 0; + right: 1rem; + top: 1rem; color: #000000; - background-color: #ffffff; - line-height: 1.5rem; - padding: 0.3rem; - width: 14.4rem; + cursor:pointer } - -.baidumap { +.el-descriptions__title { + font-size: 1rem; + font-weight: 700; + padding: 20px 20px 0px 23px; + text-align: center; width: 100%; - height: 100%; - border: none; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; -} - -/* 鍘婚櫎鐧惧害鍦板浘鐗堟潈閭h瀛� 鍜� 鐧惧害logo */ -.baidumap > .BMap_cpyCtrl { - display: none !important; -} -.baidumap > .anchorBL { - display: none !important; } </style> diff --git a/web_src/src/components/dialog/channelMapInfobox.vue b/web_src/src/components/dialog/channelMapInfobox.vue new file mode 100644 index 0000000..2ef0e52 --- /dev/null +++ b/web_src/src/components/dialog/channelMapInfobox.vue @@ -0,0 +1,65 @@ +<template> + <div id="channelMapInfobox" style="display: none"> + <div > + <el-descriptions class="margin-top" title="channel.name" :column="4" direction="vertical"> + <el-descriptions-item label="鐢熶骇鍘傚晢">{{channel.manufacture}}</el-descriptions-item> + <el-descriptions-item label="鍨嬪彿">{{channel.model}}</el-descriptions-item> + <el-descriptions-item label="璁惧褰掑睘" >{{channel.owner}}</el-descriptions-item> + <el-descriptions-item label="琛屾斂鍖哄煙" >{{channel.civilCode}}</el-descriptions-item> + <el-descriptions-item label="瀹夎鍦板潃" >{{channel.address}}</el-descriptions-item> + <el-descriptions-item label="浜戝彴绫诲瀷" >{{channel.ptztypeText}}</el-descriptions-item> + <el-descriptions-item label="缁忕含搴�" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> + <el-descriptions-item label="鐘舵��"> + <el-tag size="small" v-if="channel.status === 1">鍦ㄧ嚎</el-tag> + <el-tag size="small" v-if="channel.status === 0">绂荤嚎</el-tag> + </el-descriptions-item> + </el-descriptions> + </div> + + <devicePlayer ref="devicePlayer" v-loading="isLoging"></devicePlayer> + </div> +</template> + +<script> +import devicePlayer from '../dialog/devicePlayer.vue' + +export default { + name: "channelMapInfobox", + props: ['channel'], + computed: {devicePlayer}, + created() {}, + data() { + return { + showDialog: false, + isLoging: false + }; + }, + methods: { + + play: function (){ + let deviceId = this.channel.deviceId; + this.isLoging = true; + let channelId = this.channel.channelId; + console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + let that = this; + this.$axios({ + method: 'get', + url: '/api/play/start/' + deviceId + '/' + channelId + }).then(function (res) { + that.isLoging = false; + if (res.data.code === 0) { + that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { + streamInfo: res.data.data, + hasAudio: this.channel.hasAudio + }); + } else { + that.$message.error(res.data.msg); + } + }).catch(function (e) { + }); + }, + close: function () { + }, + }, +}; +</script> diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index 2eb3acb..d3056ce 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -185,7 +185,7 @@ // import player from '../dialog/rtcPlayer.vue' // import LivePlayer from '@liveqing/liveplayer' // import player from '../dialog/easyPlayer.vue' -import player from '../dialog/jessibuca.vue' +import player from '../common/jessibuca.vue' import recordDownload from '../dialog/recordDownload.vue' export default { name: 'devicePlayer', diff --git a/web_src/src/components/dialog/queryTrace.vue b/web_src/src/components/dialog/queryTrace.vue new file mode 100644 index 0000000..bb12765 --- /dev/null +++ b/web_src/src/components/dialog/queryTrace.vue @@ -0,0 +1,100 @@ +<template> + <div id="queryTrace" > + <el-dialog + title="鏌ヨ杞ㄨ抗" + width="40%" + top="2rem" + :close-on-click-modal="false" + :visible.sync="showDialog" + :destroy-on-close="true" + @close="close()" + > + <div v-loading="isLoging"> + <el-date-picker v-model="searchFrom" type="datetime" placeholder="閫夋嫨寮�濮嬫棩鏈熸椂闂�" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> + <el-date-picker v-model="searchTo" type="datetime" placeholder="閫夋嫨缁撴潫鏃ユ湡鏃堕棿" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> + <el-button icon="el-icon-search" size="mini" type="primary" @click="onSubmit">鏌ヨ</el-button> + </div> + + </el-dialog> + </div> +</template> + +<script> +import DeviceService from '../service/DeviceService' + +export default { + name: "deviceEdit", + props: [], + computed: {}, + created() {}, + data() { + return { + deviceService: new DeviceService(), + pickerOptions: { + shortcuts: [{ + text: '浠婂ぉ', + onClick(picker) { + picker.$emit('pick', new Date()); + } + }, { + text: '鏄ㄥぉ', + onClick(picker) { + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24); + picker.$emit('pick', date); + } + }, { + text: '涓�鍛ㄥ墠', + onClick(picker) { + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', date); + } + }] + }, + searchFrom: null, + searchTo: null, + listChangeCallback: null, + showDialog: false, + isLoging: false, + channel: null, + callback: null, + }; + }, + methods: { + openDialog: function (channel, callback) { + console.log(channel) + this.showDialog = true; + this.callback = callback; + this.channel = channel; + }, + + onSubmit: function () { + console.log("onSubmit"); + this.isLoging = true; + this.$axios.get(`/api/position/history/${this.channel.deviceId}/${this.channel.channelId}`, { + }).then((res)=> { + this.isLoging = false; + if (typeof this.callback == "function") { + if (res.data.code == 0) { + this.callback(res.data.data) + this.close() + }else { + this.$message.error(res.data.msg); + } + + } + }).catch(function (error) { + this.isLoging = false; + console.error(error); + }) + }, + close: function () { + this.showDialog = false; + this.isLoging = false; + this.callback = null; + this.channel = null; + }, + }, +}; +</script> diff --git a/web_src/src/components/live.vue b/web_src/src/components/live.vue index 366672d..adf434e 100644 --- a/web_src/src/components/live.vue +++ b/web_src/src/components/live.vue @@ -1,28 +1,18 @@ <template> - <div id="devicePosition" style="height: 100%;width: 100%"> - <el-container v-loading="loading" element-loading-text="鎷煎懡鍔犺浇涓�"> + <div id="devicePosition" style="width:100vw; height: 91vh"> + <el-container v-loading="loading" style="height: 91vh;" element-loading-text="鎷煎懡鍔犺浇涓�" > <el-aside width="300px" style="background-color: #ffffff"> - <div style="text-align: center;padding-top: 20px;">璁惧鍒楄〃</div> - <el-menu v-loading="loading"> - <el-submenu v-for="device in deviceList" :key="device.deviceId" :index="device.deviceId" @click="sendDevicePush(item)"> - <template slot="title" > - <i class="el-icon-location-outline"></i> - {{device.name}} - </template> - <ChannelTree :device="device" @sendDevicePush="sendDevicePush"></ChannelTree> - </el-submenu> - </el-menu> + <DeviceTree :clickEvent="clickEvent" :contextMenuEvent="contextMenuEvent" ></DeviceTree> </el-aside> <el-container> - <!-- <LivePlay></LivePlay> --> - <el-header height="40px" style="text-align: left;font-size: 17px;line-height: 40px;"> + <el-header height="5vh" style="text-align: left;font-size: 17px;line-height:5vh"> 鍒嗗睆: <i class="el-icon-full-screen btn" :class="{active:spilt==1}" @click="spilt=1"/> <i class="el-icon-menu btn" :class="{active:spilt==4}" @click="spilt=4"/> <i class="el-icon-s-grid btn" :class="{active:spilt==9}" @click="spilt=9"/> </el-header> - <el-main> - <div style="width: 100%;height: calc( 100vh - 150px );display: flex;flex-wrap: wrap;background-color: #000;"> + <el-main style="padding: 0;"> + <div style="width: 99%;height: 85vh;display: flex;flex-wrap: wrap;background-color: #000;"> <div v-for="i in spilt" :key="i" class="play-box" :style="liveStyle" :class="{redborder:playerIdx == (i-1)}" @click="playerIdx = (i-1)" @@ -30,7 +20,6 @@ <div v-if="!videoUrl[i-1]" style="color: #ffffff;font-size: 30px;font-weight: bold;">{{i}}</div> <player v-else :ref="'player'+i" :videoUrl="videoUrl[i-1]" fluent autoplay :height="true" :containerId="'player'+i" @screenshot="shot" @destroy="destroy"></player> - <!-- <player v-else ref="'player'+i" :idx="'player'+i" :visible.sync="showVideoDialog" :videoUrl="videoUrl[i-1]" :height="true" :hasAudio="hasAudio" fluent autoplay live ></player> --> </div> </div> </el-main> @@ -41,13 +30,13 @@ <script> import uiHeader from "../layout/UiHeader.vue"; - import player from './dialog/jessibuca.vue' - import ChannelTree from './channelTree.vue' + import player from './common/jessibuca.vue' + import DeviceTree from './common/DeviceTree.vue' export default { name: "live", components: { - uiHeader, player, ChannelTree + uiHeader, player, DeviceTree }, data() { return { @@ -122,33 +111,17 @@ clearTimeout(this.updateLooper); }, methods: { - initData: function () { - this.getDeviceList(); - - }, destroy(idx) { console.log(idx); this.clear(idx.substring(idx.length-1)) }, - getDeviceList: function() { - let that = this; - this.$axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page: that.currentPage, - count: that.count - } - }).then(function (res) { - console.log(res.data.list); - that.total = res.data.total; + clickEvent: function (data) { + if (data.channelId && data.subCount == 0) { + this.sendDevicePush(data) + } + }, + contextMenuEvent: function (data) { - that.deviceList = res.data.list.map(item=>{return {deviceChannelList:[],...item}}); - that.getDeviceListLoading = false; - }).catch(function (error) { - console.log(error); - that.getDeviceListLoading = false; - }); }, //閫氱煡璁惧涓婁紶濯掍綋娴� sendDevicePush: function (itemData) { diff --git a/web_src/src/components/service/DeviceService.js b/web_src/src/components/service/DeviceService.js new file mode 100644 index 0000000..6149579 --- /dev/null +++ b/web_src/src/components/service/DeviceService.js @@ -0,0 +1,123 @@ +import axios from 'axios'; + +class DeviceService{ + + constructor() { + this.$axios = axios; + } + + getDeviceList(currentPage, count, callback, errorCallback){ + this.$axios({ + method: 'get', + url:`/api/device/query/devices`, + params: { + page: currentPage, + count: count + } + }).then((res) => { + if (typeof (callback) == "function") callback(res.data) + }).catch((error) => { + console.log(error); + if (typeof (errorCallback) == "function") errorCallback(error) + }); + } + getAllDeviceList(callback, errorCallback) { + let currentPage = 1; + let count = 100; + let deviceList = [] + this.getAllDeviceListIteration(deviceList, currentPage, count, (data) => { + if (typeof (callback) == "function") callback(data) + }, errorCallback) + } + + getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) { + this.getDeviceList(currentPage, count, (data) => { + if (data.list) { + deviceList = deviceList.concat(data.list); + if (deviceList.length < data.total) { + currentPage ++ + this.getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(deviceList) + } + } + }, errorCallback) + } + + + getAllChannel(isCatalog, deviceId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) { + this.getChanel(isCatalog, deviceId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) + }else { + console.log(1) + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getChanel(isCatalog, deviceId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/devices/${deviceId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } + + + getAllSubChannel(isCatalog, deviceId, channelId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { + this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } +} + +export default DeviceService; diff --git a/web_src/src/components/service/MediaServer.js b/web_src/src/components/service/MediaServer.js index 36474ea..d4446f0 100644 --- a/web_src/src/components/service/MediaServer.js +++ b/web_src/src/components/service/MediaServer.js @@ -10,9 +10,9 @@ this.$axios({ method: 'get', url:`/api/server/media_server/online/list`, - }).then(function (res) { + }).then((res) => { if (typeof (callback) == "function") callback(res.data) - }).catch(function (error) { + }).catch((error) => { console.log(error); }); } diff --git a/web_src/src/layout/UiHeader.vue b/web_src/src/layout/UiHeader.vue index 10410bd..a0a252c 100644 --- a/web_src/src/layout/UiHeader.vue +++ b/web_src/src/layout/UiHeader.vue @@ -5,6 +5,7 @@ <el-menu-item index="/control">鎺у埗鍙�</el-menu-item> <el-menu-item index="/live">瀹炴椂鐩戞帶</el-menu-item> <el-menu-item index="/deviceList">鍥芥爣璁惧</el-menu-item> + <el-menu-item index="/map">鐢靛瓙鍦板浘</el-menu-item> <el-menu-item index="/pushVideoList">鎺ㄦ祦鍒楄〃</el-menu-item> <el-menu-item index="/streamProxyList">鎷夋祦浠g悊</el-menu-item> <el-menu-item index="/cloudRecord">浜戠褰曞儚</el-menu-item> @@ -47,7 +48,6 @@ if (this.$route.path.startsWith("/channelList")) { this.activeIndex = "/deviceList" } - }, mounted() { window.addEventListener('beforeunload', e => this.beforeunloadHandler(e)) diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js index 414987b..5a1d964 100644 --- a/web_src/src/router/index.js +++ b/web_src/src/router/index.js @@ -16,8 +16,9 @@ import sip from '../components/setting/Sip.vue' import media from '../components/setting/Media.vue' import live from '../components/live.vue' +import deviceTree from '../components/common/DeviceTree.vue' -import wasmPlayer from '../components/dialog/jessibuca.vue' +import wasmPlayer from '../components/common/jessibuca.vue' import rtcPlayer from '../components/dialog/rtcPlayer.vue' const originalPush = VueRouter.prototype.push @@ -97,22 +98,32 @@ name: 'media', component: media, }, + { + path: '/play/wasm/:url', + name: 'wasmPlayer', + component: wasmPlayer, + }, + { + path: '/play/rtc/:url', + name: 'rtcPlayer', + component: rtcPlayer, + }, + { + path: '/map', + name: 'devicePosition', + component: devicePosition, + }, ] - }, - { - path: '/play/wasm/:url', - name: 'wasmPlayer', - component: wasmPlayer, - }, - { - path: '/play/rtc/:url', - name: 'rtcPlayer', - component: rtcPlayer, }, { path: '/login', name: '鐧诲綍', component: login, }, + { + path: '/test', + name: 'deviceTree', + component: deviceTree, + }, ] }) diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css index 0698271..2a08b07 100644 --- a/web_src/static/css/iconfont.css +++ b/web_src/static/css/iconfont.css @@ -1,8 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 1291092 */ - src: url('iconfont.woff2?t=1647245982270') format('woff2'), - url('iconfont.woff?t=1647245982270') format('woff'), - url('iconfont.ttf?t=1647245982270') format('truetype'); + src: url('iconfont.woff2?t=1650436696596') format('woff2'); } .iconfont { @@ -13,6 +11,50 @@ -moz-osx-font-smoothing: grayscale; } +.icon-jiedianleizhukongzhongxin1:before { + content: "\e9d0"; +} + +.icon-jiedianleizhukongzhongxin2:before { + content: "\e9d1"; +} + +.icon-jiedianleilianjipingtai:before { + content: "\e9d3"; +} + +.icon-jiedianleiquyu:before { + content: "\e9d4"; +} + +.icon-shebeileigis:before { + content: "\e9ec"; +} + +.icon-shebeileibanqiu:before { + content: "\e9f5"; +} + +.icon-shebeileibanqiugis:before { + content: "\e9f6"; +} + +.icon-shebeileijiankongdian:before { + content: "\ea07"; +} + +.icon-shebeileiqiangjitongdao:before { + content: "\ea15"; +} + +.icon-shebeileiqiuji:before { + content: "\ea17"; +} + +.icon-shebeileiqiujigis:before { + content: "\ea18"; +} + .icon-xitongxinxi:before { content: "\e7d6"; } diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2 index 4833708..7204137 100644 --- a/web_src/static/css/iconfont.woff2 +++ b/web_src/static/css/iconfont.woff2 Binary files differ diff --git a/web_src/static/images/arrow.png b/web_src/static/images/arrow.png new file mode 100644 index 0000000..4d8df46 --- /dev/null +++ b/web_src/static/images/arrow.png Binary files differ diff --git a/web_src/static/images/gis/camera-offline.png b/web_src/static/images/gis/camera-offline.png new file mode 100644 index 0000000..67eb0fc --- /dev/null +++ b/web_src/static/images/gis/camera-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera.png b/web_src/static/images/gis/camera.png new file mode 100644 index 0000000..a93bd55 --- /dev/null +++ b/web_src/static/images/gis/camera.png Binary files differ diff --git a/web_src/static/images/gis/camera1-offline.png b/web_src/static/images/gis/camera1-offline.png new file mode 100644 index 0000000..597209b --- /dev/null +++ b/web_src/static/images/gis/camera1-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera1.png b/web_src/static/images/gis/camera1.png new file mode 100644 index 0000000..e5f2b5f --- /dev/null +++ b/web_src/static/images/gis/camera1.png Binary files differ diff --git a/web_src/static/images/gis/camera2-offline.png b/web_src/static/images/gis/camera2-offline.png new file mode 100644 index 0000000..4ddae23 --- /dev/null +++ b/web_src/static/images/gis/camera2-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera2.png b/web_src/static/images/gis/camera2.png new file mode 100644 index 0000000..073bceb --- /dev/null +++ b/web_src/static/images/gis/camera2.png Binary files differ diff --git a/web_src/static/images/gis/camera3-offline.png b/web_src/static/images/gis/camera3-offline.png new file mode 100644 index 0000000..f05c2a3 --- /dev/null +++ b/web_src/static/images/gis/camera3-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera3.png b/web_src/static/images/gis/camera3.png new file mode 100644 index 0000000..b40f67b --- /dev/null +++ b/web_src/static/images/gis/camera3.png Binary files differ -- Gitblit v1.8.0