diff --git a/README.md b/README.md index c23a1b1b7..725a2b0ef 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,6 @@ WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网 wvp使用文档 [https://doc.wvp-pro.cn](https://doc.wvp-pro.cn) ZLM使用文档 [https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit) -# 付费社群 -[![社群](doc/_media/shequ.png "shequ")](https://t.zsxq.com/0d8VAD3Dm) -> 收费是为了提供更好的服务,也是对作者更大的激励。加入星球的用户三天后可以私信我留下微信号,我会拉大家入群。加入三天内不满意可以直接自行推出,星球会直接退款给大家。 - -> 星球还提供了包括闭源的全功能试用包, 会随时更新。 - # gitee仓库 https://gitee.com/pan648540858/wvp-GB28181-pro.git @@ -133,6 +127,12 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git - [X] 支持部标1078+808协议,支持点播,云台控制,录像回放,位置上报,自动点播等。 - [X] 支持国标28181-2022协议,支持巡航轨迹查询,PTZ精准控制,存储卡格式化,设备软件升级,OSD配置,h265+aac,支持辅码流,录像倒放等。 - [X] 支持国网B接口协议。支持注册,获取资源,预览, 云台控制,预置位控制等,可免费定制支持语音对讲、录像回放和抓拍图像。 +- [X] 功能加强版本 + - [X] 支持按权限分配可以使用的通道 + - [X] 支持电子地图。支持展示通道位置,支持在地图上修改通道位置。可扩展接入高德地图API,支持搜索位置,附近设备。 + - [X] 支持表格导出 + - [X] 拉流代理支持按照品牌拼接url。 + - [X] 功能持续扩展,可根据用户需要增加支持。 # 授权协议 @@ -140,6 +140,17 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git # 技术支持 +# 付费社群 + + +> 收费是为了提供更好的服务,也是对作者更大的激励。加入星球的用户三天后可以私信我留下微信号,我会拉大家入群。 +> 加入三天内不满意可以直接自行推出,星球会直接退款给大家。需要发票可以在星球app中直接咨询星球客服获取。 + +> 星球还提供了包括闭源的全功能试用包, 会随时更新。 + +> 付费社群即可以对作者提供支持,也可以为大家更加快速的解决问题。如果暂时无法加入,给项目点个星也是极大的鼓励。 + + [知识星球](https://t.zsxq.com/0d8VAD3Dm)专栏列表:, - [使用入门系列一:WVP-PRO能做什么](https://t.zsxq.com/0dLguVoSp) diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java index 5efede496..245aba36f 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java @@ -39,9 +39,9 @@ public class SpringDocConfig { .info(new Info().title("WVP-PRO 接口文档") .contact(contact) .description("开箱即用的28181协议视频平台。
" + - "1. 打开http://127.0.0.1:18080/doc.html#/1.%20全部/用户管理/login_1" + + "1. 打开登录接口" + " 登录成功后返回AccessToken。
" + - "2. 填写到AccessToken到参数值 http://127.0.0.1:18080/doc.html#/Authorize/1.%20全部
" + + "2. 填写到AccessToken到参数值 Token配置
" + "后续接口就可以直接测试了") .version("v3.1.0") .license(new License().name("Apache 2.0").url("http://springdoc.org"))); diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java index 26130a02b..26302e782 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java @@ -204,6 +204,9 @@ public class UserSetting { */ private boolean sipCacheServerConnections = true; - + /** + * 禁用date头,变相禁用了校时 + */ + private boolean disableDateHeader = false; } 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 ab35ac51a..aee8eaba5 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 @@ -21,6 +21,12 @@ public class DeviceChannel extends CommonGBChannel { @Schema(description = "数据库自增ID") private int id; + @Schema(description = "父设备编码") + private String parentDeviceId; + + @Schema(description = "父设备名称") + private String parentName; + @MessageElementForCatalog("DeviceID") @Schema(description = "编码") private String deviceId; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MessageResponseTask.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MessageResponseTask.java new file mode 100644 index 000000000..cb3dfb0d4 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/MessageResponseTask.java @@ -0,0 +1,43 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +import lombok.Getter; +import lombok.Setter; +import org.dom4j.Element; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.Delayed; +import java.util.concurrent.TimeUnit; + +public class MessageResponseTask implements Delayed { + + @Getter + @Setter + private Element element; + + @Getter + @Setter + private List data; + + @Getter + @Setter + private String key; + + + /** + * 超时时间(单位: 毫秒) + */ + @Getter + @Setter + private long delayTime; + + @Override + public long getDelay(@NotNull TimeUnit unit) { + return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + } + + @Override + public int compareTo(@NotNull Delayed o) { + return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS)); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java index fdde8bf57..c219d9632 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java @@ -148,6 +148,7 @@ public class AlarmController { @Parameter(name = "page",description = "当前页",required = true) @Parameter(name = "count",description = "每页查询数量",required = true) @Parameter(name = "deviceId",description = "设备id") + @Parameter(name = "channelId",description = "通道id") @Parameter(name = "alarmPriority",description = "查询内容") @Parameter(name = "alarmMethod",description = "查询内容") @Parameter(name = "alarmType",description = "每页查询数量") @@ -157,7 +158,8 @@ public class AlarmController { public PageInfo getAll( @RequestParam int page, @RequestParam int count, - @RequestParam(required = false) String deviceId, + @RequestParam(required = false) String deviceId, + @RequestParam(required = false) String channelId, @RequestParam(required = false) String alarmPriority, @RequestParam(required = false) String alarmMethod, @RequestParam(required = false) String alarmType, @@ -186,7 +188,7 @@ public class AlarmController { throw new ControllerException(ErrorCode.ERROR400.getCode(), "endTime格式为" + DateUtil.PATTERN); } - return deviceAlarmService.getAllAlarm(page, count, deviceId, alarmPriority, alarmMethod, + return deviceAlarmService.getAllAlarm(page, count, deviceId, channelId, alarmPriority, alarmMethod, alarmType, startTime, endTime); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java index 9f4cebf3d..63585fb75 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java @@ -113,6 +113,19 @@ public class DeviceQuery { return deviceChannelService.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count); } + @GetMapping("/streams") + @Operation(summary = "分页查询存在流的通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "page", description = "当前页", required = true) + @Parameter(name = "count", description = "每页查询数量", required = true) + @Parameter(name = "query", description = "查询内容") + public PageInfo streamChannels(int page, int count, + @RequestParam(required = false) String query) { + if (ObjectUtils.isEmpty(query)) { + query = null; + } + + return deviceChannelService.queryChannels(query, true, null, null, true, page, count); + } @Operation(summary = "同步设备通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "deviceId", description = "设备国标编号", required = true) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GroupController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GroupController.java index 1284477af..4f9c3bc6a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GroupController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/GroupController.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Group; import com.genersoft.iot.vmp.gb28181.bean.GroupTree; import com.genersoft.iot.vmp.gb28181.service.IGroupService; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import com.github.pagehelper.PageInfo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -33,7 +34,7 @@ public class GroupController { groupService.add(group); } - @Operation(summary = "查询分组") + @Operation(summary = "查询分组节点") @Parameter(name = "query", description = "要搜索的内容", required = true) @Parameter(name = "parent", description = "所属分组编号", required = true) @ResponseBody @@ -49,6 +50,17 @@ public class GroupController { return groupService.queryForTree(query, parent, hasChannel); } + @Operation(summary = "查询分组") + @Parameter(name = "query", description = "要搜索的内容", required = true) + @Parameter(name = "channel", description = "true为查询通道,false为查询节点", required = true) + @ResponseBody + @GetMapping("/tree/query") + public PageInfo queryTree(Integer page, Integer count, + @RequestParam(required = true) String query + ){ + return groupService.queryList(page, count, query); + } + @Operation(summary = "更新分组") @Parameter(name = "group", description = "Group", required = true) @ResponseBody diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MediaController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MediaController.java index af2062b59..a292f58ff 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MediaController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/MediaController.java @@ -7,19 +7,26 @@ import com.genersoft.iot.vmp.conf.security.SecurityUtils; import com.genersoft.iot.vmp.conf.security.dto.LoginUser; import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; +import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.streamProxy.service.IStreamProxyService; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; import javax.servlet.http.HttpServletRequest; +import java.net.MalformedURLException; +import java.net.URL; @Tag(name = "媒体流相关") @@ -52,11 +59,12 @@ public class MediaController { @Parameter(name = "useSourceIpAsStreamIp", description = "是否使用请求IP作为返回的地址IP") @GetMapping(value = "/stream_info_by_app_and_stream") @ResponseBody - public StreamContent getStreamInfoByAppAndStream(HttpServletRequest request, @RequestParam String app, - @RequestParam String stream, - @RequestParam(required = false) String mediaServerId, - @RequestParam(required = false) String callId, - @RequestParam(required = false) Boolean useSourceIpAsStreamIp){ + public DeferredResult> getStreamInfoByAppAndStream(HttpServletRequest request, @RequestParam String app, + @RequestParam String stream, + @RequestParam(required = false) String mediaServerId, + @RequestParam(required = false) String callId, + @RequestParam(required = false) Boolean useSourceIpAsStreamIp){ + DeferredResult> result = new DeferredResult<>(); boolean authority = false; if (callId != null) { // 权限校验 @@ -75,9 +83,7 @@ public class MediaController { authority = true; } } - StreamInfo streamInfo; - if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) { String host = request.getHeader("Host"); String localAddr = host.split(":")[0]; @@ -88,30 +94,37 @@ public class MediaController { } if (streamInfo != null){ - return new StreamContent(streamInfo); + WVPResult wvpResult = WVPResult.success(); + wvpResult.setData(new StreamContent(streamInfo)); + result.setResult(wvpResult); }else { + ErrorCallback callback = (code, msg, streamInfoStoStart) -> { + if (code == InviteErrorCode.SUCCESS.getCode()) { + WVPResult wvpResult = WVPResult.success(); + if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) { + String host; + try { + URL url=new URL(request.getRequestURL().toString()); + host=url.getHost(); + } catch (MalformedURLException e) { + host=request.getLocalAddr(); + } + streamInfoStoStart.changeStreamIp(host); + } + if (!ObjectUtils.isEmpty(streamInfoStoStart.getMediaServer().getTranscodeSuffix()) + && !"null".equalsIgnoreCase(streamInfoStoStart.getMediaServer().getTranscodeSuffix())) { + streamInfoStoStart.setStream(streamInfoStoStart.getStream() + "_" + streamInfoStoStart.getMediaServer().getTranscodeSuffix()); + } + wvpResult.setData(new StreamContent(streamInfoStoStart)); + result.setResult(wvpResult); + }else { + result.setResult(WVPResult.fail(code, msg)); + } + }; //获取流失败,重启拉流后重试一次 - streamProxyService.stopByAppAndStream(app,stream); - boolean start = streamProxyService.startByAppAndStream(app, stream); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - log.error("[线程休眠失败], {}", e.getMessage()); - } - if (useSourceIpAsStreamIp != null && useSourceIpAsStreamIp) { - String host = request.getHeader("Host"); - String localAddr = host.split(":")[0]; - log.info("使用{}作为返回流的ip", localAddr); - streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, localAddr, authority); - }else { - streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); - } - if (streamInfo != null){ - return new StreamContent(streamInfo); - }else { - throw new ControllerException(ErrorCode.ERROR100); - } + streamProxyService.startByAppAndStream(app, stream, callback); } + return result; } /** * 获取推流播放地址 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java index d49c28626..ff415df17 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java @@ -50,20 +50,29 @@ public class RegionController { return regionService.query(query, page, count); } - @Operation(summary = "查询区域") + @Operation(summary = "查询区域节点") @Parameter(name = "query", description = "要搜索的内容", required = true) @Parameter(name = "parent", description = "所属行政区划编号", required = true) + @Parameter(name = "hasChannel", description = "是否查询通道", required = true) @ResponseBody @GetMapping("/tree/list") public List queryForTree( - @RequestParam(required = false) String query, @RequestParam(required = false) Integer parent, @RequestParam(required = false) Boolean hasChannel ){ - if (ObjectUtils.isEmpty(query)) { - query = null; - } - return regionService.queryForTree(query, parent, hasChannel); + return regionService.queryForTree(parent, hasChannel); + } + + + @Operation(summary = "查询区域") + @Parameter(name = "query", description = "要搜索的内容", required = true) + @Parameter(name = "channel", description = "true为查询通道,false为查询节点", required = true) + @ResponseBody + @GetMapping("/tree/query") + public PageInfo queryTree(Integer page, Integer count, + @RequestParam(required = true) String query + ){ + return regionService.queryList(page, count, query); } @Operation(summary = "更新区域") diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java index 33d58ced7..f8e09f2a4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java @@ -275,10 +275,8 @@ public interface CommonGBChannelMapper { " true as is_leaf " + " from wvp_device_channel " + " where coalesce(gb_civil_code, civil_code) = #{parentDeviceId} " + - " AND (coalesce(gb_device_id, device_id) LIKE concat('%',#{query},'%') " + - " OR coalesce(gb_name, name) LIKE concat('%',#{query},'%')) " + " ") - List queryForRegionTreeByCivilCode(@Param("query") String query, @Param("parentDeviceId") String parentDeviceId); + List queryForRegionTreeByCivilCode(@Param("parentDeviceId") String parentDeviceId); @Update(value = {" "}) - List query(@Param("deviceId") String deviceId, @Param("alarmPriority") String alarmPriority, @Param("alarmMethod") String alarmMethod, + List query(@Param("deviceId") String deviceId, @Param("channelId") String channelId, @Param("alarmPriority") String alarmPriority, @Param("alarmMethod") String alarmMethod, @Param("alarmType") String alarmType, @Param("startTime") String startTime, @Param("endTime") String endTime); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java index 8c02a1084..b696e2347 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java @@ -86,10 +86,11 @@ public interface DeviceChannelMapper { int update(DeviceChannel channel); @SelectProvider(type = DeviceChannelProvider.class, method = "queryChannels") - List queryChannels(@Param("dataDeviceId") int dataDeviceId, @Param("civilCode") String civilCode, + List queryChannels(@Param("dataDeviceId") Integer dataDeviceId, @Param("civilCode") String civilCode, @Param("businessGroupId") String businessGroupId, @Param("parentChannelId") String parentChannelId, - @Param("query") String query, @Param("hasSubChannel") Boolean hasSubChannel, - @Param("online") Boolean online, @Param("channelIds") List channelIds); + @Param("query") String query, @Param("queryParent") Boolean queryParent, + @Param("hasSubChannel") Boolean hasSubChannel, @Param("online") Boolean online, + @Param("channelIds") List channelIds, @Param("hasStream") Boolean hasStream); @SelectProvider(type = DeviceChannelProvider.class, method = "queryChannelsByDeviceDbId") List queryChannelsByDeviceDbId(@Param("dataDeviceId") int dataDeviceId); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java index 81ab26f3a..f99f50eeb 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java @@ -346,38 +346,41 @@ public interface DeviceMapper { @Select(" "}) void offlineByList(List offlineDevices); + + + @Update({""}) + void batchUpdate(List devices); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java index c9b9cfac8..8b80afb6f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java @@ -80,9 +80,8 @@ public interface RegionMapper { " where " + " parent_id = #{parentId} " + " parent_id is null " + - " AND (device_id LIKE concat('%',#{query},'%') escape '/' OR name LIKE concat('%',#{query},'%') escape '/') " + " ") - List queryForTree(@Param("query") String query, @Param("parentId") Integer parentId); + List queryForTree(@Param("parentId") Integer parentId); @Delete(" diff --git a/web/src/views/channel/group/index.vue b/web/src/views/channel/group/index.vue index 487c4f7f2..256171cec 100755 --- a/web/src/views/channel/group/index.vue +++ b/web/src/views/channel/group/index.vue @@ -4,7 +4,7 @@ ref="groupTree" :show-header="true" :edit="true" - :click-event="treeNodeClickEvent" + @clickEvent="treeNodeClickEvent" :on-channel-change="onChannelChange" :enable-add-channel="true" :add-channel-to-group="addChannelToGroup" @@ -20,7 +20,7 @@
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + diff --git a/web/src/views/channel/region/index.vue b/web/src/views/channel/region/index.vue index a61c291a4..367b6d335 100755 --- a/web/src/views/channel/region/index.vue +++ b/web/src/views/channel/region/index.vue @@ -4,7 +4,7 @@ ref="regionTree" :show-header="true" :edit="true" - :click-event="treeNodeClickEvent" + @clickEvent="treeNodeClickEvent" :on-channel-change="onChannelChange" :enable-add-channel="true" :add-channel-to-civil-code="addChannelToCivilCode" @@ -20,7 +20,7 @@
-
+
通道列表
@@ -20,7 +20,7 @@ :edit="false" :show-header="false" :has-channel="true" - :click-event="treeNodeClickEvent" + @clickEvent="treeNodeClickEvent" :default-expanded-keys="[]" />
@@ -53,10 +53,6 @@ export default { type: Boolean, default: false }, - clickEvent: { - type: Function, - default: null - }, contextMenuEvent: { type: Function, default: null @@ -137,11 +133,7 @@ export default { }, treeNodeClickEvent: function(data) { if (data.leaf) { - console.log(23111) - console.log(data) - if (this.clickEvent) { - this.clickEvent(data.id) - } + this.$emit('clickEvent', data.id) } } } diff --git a/web/src/views/common/GroupTree.vue b/web/src/views/common/GroupTree.vue index ea9936fc8..2179a81ed 100755 --- a/web/src/views/common/GroupTree.vue +++ b/web/src/views/common/GroupTree.vue @@ -1,24 +1,14 @@