‘liusuyi’
2023-09-06 1f7962d0545de446e96ccaa81b33bbf71a69b41b
增加sdk接口getGisInfo
调整ptz的websocket上传增加视场角
已修改17个文件
414 ■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/templates/preview.html 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/mediamtx/mediamtx.exe 补丁 | 查看 | 原始文档 | blame | 历史
lib/mediamtx/mediamtx.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/node_modules/.package-lock.json 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/package-lock.json 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-ui/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -326,4 +326,13 @@
        String path = sdk.record(cmd);
        return toAjaxString(path, "手动录像");
    }
    @ApiOperation("获取相机架设参数")
    @PostMapping("/getCameraSetupCFG")
    @Log(title = "获取相机架设参数", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"})
    public @ResponseBody
    AjaxResult getCameraSetupCFG(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(sdk.getGisInfo(cmd));
    }
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java
@@ -530,9 +530,9 @@
    public static final int NET_DVR_SET_DDNSCFG_EX = 275;//设置扩展DDNS参数
    public static final int NET_DVR_SET_PTZPOS = 292;    //云台设置PTZ位置
    public static final int NET_DVR_GET_PTZPOS = 293;    //云台获取PTZ位置
    public static final int NET_DVR_SET_PTZLOCKCFG=3288;//设置云台锁定信息
    public static final int NET_DVR_GET_PTZLOCKCFG=3287;//获取云台锁定信息
    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL=3283;//零方位角控制
    public static final int NET_DVR_SET_PTZLOCKCFG = 3288;//设置云台锁定信息
    public static final int NET_DVR_GET_PTZLOCKCFG = 3287;//获取云台锁定信息
    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL = 3283;//零方位角控制
    public static final int NET_DVR_GET_PTZSCOPE = 294;//云台获取PTZ范围
    public static final int NET_DVR_SET_BASICPARAMCFG = 3271;//设置PTZ基本参数信息
    public static final int NET_DVR_COMPLETE_RESTORE_CTRL = 3420;    //设置完全恢复出厂值
@@ -717,6 +717,7 @@
    public static final int NET_DVR_GET_CURTRIGGERMODE = 3130;   //获取设备当前触发模式
    public static final int NET_ITC_GET_TRIGGERCFG = 3003;  //获取触发参数
    public static final int NET_ITC_SET_TRIGGERCFG = 3004;  //设置触发参数
    public static final int NET_DVR_CAMERA_SETUPCFG = 3007;  //获取相机架设参数
    public static final int NET_ITC_GET_VIDEO_TRIGGERCFG = 3017;  //获取视频电警触发参数
    public static final int NET_ITC_SET_VIDEO_TRIGGERCFG = 3018;  //设置视频电警触发参数
@@ -3781,19 +3782,43 @@
        public short wTiltPos;//垂直参数
        public short wZoomPos;//变倍参数
    }
    //PTZ锁定信息
    public static class NET_DVR_PTZ_LOCKCFG extends HIKSDKStructure {
        public int dwSize;//结构体大小
        public byte byWorkMode;//云台锁定控制:0- 解锁,1- 锁定
        public byte[] byRes = new byte[127];
    }
    //相机架设信息
    public static class NET_DVR_GET_CAMERA_SETUPCFG extends HIKSDKStructure {
        public int dwSize;//结构体大小
        public short wSetupHeight;//架设高度,取值范围:[0,20]
        public byte byLensType;//镜头焦距类型:0- 未知,1- 8mm,2- 12mm,3- 16mm,4- 25mm,5- 35mm,6- 50mm
        public byte bySetupHeightUnit;//架设高度单位:0- 米(m),1- 厘米(cm)
        public int dwSceneDis;//图像下边缘位置与相机之间的水平距离,单位:厘米
        public float fPitchAngle;//相机俯仰角度,取值范围:[-180, 180],单位:度
        public float fInclineAngle;//相机倾斜角度,取值范围:[-180, 180],单位:度
        public float fRotateAngle;//相机旋转角度,取值范围:[-180, 180],单位:度
        public short wVideoDetCoefficient;//视频测试系数,取值范围:[0,300]
        public byte byErectMethod;//架设方式:0-正装,1-侧装
        public byte byCameraViewAngle;//摄像机安装视野角度:0- 垂直(默认),1- 倾斜
        public int dwHorizontalDistance;//摄像机与出入口水平距离,取值范围:1~1000,默认:30,单位:cm,摄像机角度为倾斜时有效
        public byte byDetailLensType;//镜头类型,取值范围:1~100,默认:28,单位:0.1mm
        public byte[] byRes = new byte[3];
        public float fHorFieldAngle;//摄像机水平视场角角度,取值范围:[0,360],单位:度
        public float fVerFieldAngle;//摄像机垂直视场角角度,取值范围:[0,360],单位:度
        public byte[] byRes1 = new byte[24];
    }
    //零方位角控制信息
    public static class NET_DVR_INITIALPOSITIONCTRL extends HIKSDKStructure {
        public int dwSize ;//结构体大小
        public int dwSize;//结构体大小
        public short dwChan;//设备通道号
        public byte byWorkMode;//工作模式:0- 设置,1- 调用,2- 清除
        public byte[] byRes = new byte[127];
    }
    //球机位置信息
    public static class NET_DVR_PTZ_BASICPARAMCFG extends HIKSDKStructure {
        public short dwSize;//结构体大小
@@ -10243,14 +10268,16 @@
    boolean NET_DVR_InquiryRecordTimeSpan(int lUserID, int dwChannel, NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
    boolean NET_DVR_StartGetDevState(NET_DVR_CHECK_DEV_STATE pParams);
    //强制I帧参数结构体。
    public static class NET_DVR_I_FRAME extends HIKSDKStructure{
    public static class NET_DVR_I_FRAME extends HIKSDKStructure {
        public int dwSize;
        public byte[] sStreamID = new byte[32];  //流IDs    SDK 中对  STREAM_ID_LEN进行了定义,赋值32
        public int dwChannel;//通道号
        public byte byStreamType; //码流类型:0-主码流,1-子码流,2-码流3,3-虚拟码流,以此类推
        public byte[] byRes = new byte[63];  //保留,置为0    按照SDK要求进行对应赋值
    }
    //gps相关结构定义
    public static class TimeSegParam extends HIKSDKStructure {
        //GPS数据查找起始时间
@@ -10521,8 +10548,8 @@
    }
    public static final int NET_DVR_GET_GISINFO = 3711;
    //GIS信息
    //GIS信息
    public static class NET_DVR_GIS_INFO extends HIKSDKStructure {
        public int dwSize;
        public float fAzimuth;
@@ -10544,6 +10571,13 @@
        public float fMinVerticalValue;
        public float fMaxVerticalValue;
        public byte[] byRes = new byte[220];
    }
    public static class NET_DVR_CHANNEL extends HIKSDKStructure {
        public short wDVRPort;
        public byte[] byRes1 = new byte[2];
        public int dwChannel;
        public byte[] byRes2 = new byte[32];
    }
    //GBT28181协议的设备编码通道配置
@@ -10584,6 +10618,7 @@
        public byte[] byRes = new byte[6];
    }
}
//播放库函数声明,PlayCtrl.dll
interface PlayCtrl extends Library {
    public static final int STREAME_REALTIME = 0;
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -109,4 +109,6 @@
    //获取相机通道信息
    public List<ArdChannel> getCameraChannelList(ArdCameras camera);
    //获取GIS信息数据
    public Map<String,Object> getGisInfo(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -385,8 +385,8 @@
        NET_DVR_FOCUSMODE_CFG focusmodeCfg = new NET_DVR_FOCUSMODE_CFG();
        Pointer point = focusmodeCfg.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
        focusmodeCfg.byFocusMode=1;
        focusmodeCfg.byAutoFocusMode=0;
        focusmodeCfg.byFocusMode = 1;
        focusmodeCfg.byAutoFocusMode = 0;
        focusmodeCfg.write();
        boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_FOCUSMODECFG, channelNum, point, focusmodeCfg.size(), ibrBytesReturned);
        if (bool) {
@@ -975,6 +975,7 @@
        log.debug("设置聚焦模式成功");
        return bool;
    }
    /**
     * @描述 获取聚焦模式
     * @参数 [userId, channelNum]
@@ -1343,7 +1344,7 @@
            log.debug("录像停止");
            //存入minio
            String BucketName = cmd.getRecordBucketName();
            String ObjectName = cmd.getRecordObjectName()+".mp4";
            String ObjectName = cmd.getRecordObjectName() + ".mp4";
            FileInputStream stream = new FileInputStream(path);
            boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
            if (b) {
@@ -1409,7 +1410,7 @@
                // 获取通道号
                for (int iChannum = 0; iChannum < chanNum; iChannum++) {
                    ArdChannel ardChannel = new ArdChannel();
                    int channum = iChannum + startDChan+1;
                    int channum = iChannum + startDChan + 1;
                    HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40();
                    strPicCfg.dwSize = strPicCfg.size();
                    strPicCfg.write();
@@ -1433,4 +1434,47 @@
        }
        return channelList;
    }
    /**
     * @描述 获取GIS信息数据
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 0-解锁 1-锁定
     */
    @Override
    public Map<String, Object> getGisInfo(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return new HashMap<>();
        }
        // 获取参数
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG();
        HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO();
        struStdCfg.read();
        IntByReference lchannel = new IntByReference(channelNum);
        struStdCfg.lpCondBuffer = lchannel.getPointer();
        struStdCfg.dwCondSize = 4;
        struStdCfg.lpOutBuffer = struGisInfo.getPointer();
        struStdCfg.dwOutSize = struGisInfo.size();
        struStdCfg.write();//设置前之前要write()
        boolean bool = hCNetSDK.NET_DVR_GetSTDConfig(userId, NET_DVR_GET_GISINFO, struStdCfg);
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
            log.error("获取GIS信息数据失败,请稍后重试" + code);
            return new HashMap<>();
        } else {
            struGisInfo.read();
            Map<String, Object> map = new HashMap<>();
            map.put("p", struGisInfo.struPtzPos.fPanPos);
            map.put("t", struGisInfo.struPtzPos.fTiltPos<0?struGisInfo.struPtzPos.fTiltPos+360:struGisInfo.struPtzPos.fTiltPos);
            map.put("z", struGisInfo.struPtzPos.fZoomPos);
            map.put("fHorFieldAngle", struGisInfo.fHorizontalValue);// 水平视场角
            map.put("fVerFieldAngle", struGisInfo.fVerticalValue);// 垂直视场角
            return map;
        }
    }
}
ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspect.controller;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@@ -42,7 +43,7 @@
    @GetMapping("/listByStartTime")
    public TableDataInfo listByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
        startPage();
        List list = ardVideoInspectRecordService.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
        List<HashMap> list = ardVideoInspectRecordService.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
        return getDataTable(list);
    }
ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspect.mapper;
import java.util.HashMap;
import java.util.List;
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
@@ -26,8 +27,9 @@
     * @return 视频巡检记录集合
     */
    public List<ArdVideoInspectRecord> selectArdVideoInspectRecordList(ArdVideoInspectRecord ardVideoInspectRecord);
    @SuppressWarnings("MybatisXMapperMethodInspection")
    public List selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord);
    public List<HashMap> selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord);
    /**
     * 新增视频巡检记录
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java
@@ -1,13 +1,12 @@
package com.ruoyi.inspect.service.impl;
import java.util.HashMap;
import java.util.List;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
import com.ruoyi.inspect.service.IArdVideoInspectRecordService;
import javax.annotation.Resource;
/**
 * 视频巡检记录Service业务层处理
@@ -17,7 +16,7 @@
 */
@Service
public class ArdVideoInspectRecordServiceImpl implements IArdVideoInspectRecordService {
    @Autowired
    @Resource
    private ArdVideoInspectRecordMapper ardVideoInspectRecordMapper;
    /**
@@ -43,7 +42,7 @@
    }
    @Override
    public List selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
    public List<HashMap>  selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
        return ardVideoInspectRecordMapper.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
    }
ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
@@ -8,19 +8,10 @@
 * @Version: 1.0
 **/
import com.ruoyi.common.utils.ConfigUtils;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.file.ImageUtils;
import com.sun.imageio.plugins.common.ImageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.sql.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j
@Component
ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
@@ -12,13 +12,13 @@
    public static String IP = "http://112.98.126.2:7030/";
    @Get(IP + "${url}")
    String GET(@DataVariable("url") String url, @Header("x-auth-token") String token, @JSONBody String body);
    String GET(@Var("url") String url, @Header("x-auth-token") String token, @JSONBody String body);
    @Post(IP + "${url}")
    String POST(@DataVariable("url") String url,  @Header("x-auth-token")  String token, @JSONBody String body);
    String POST(@Var("url") String url,  @Header("x-auth-token")  String token, @JSONBody String body);
    @Delete(IP + "${url}")
    String DELETE(@DataVariable("url") String url,  @Header("x-auth-token") String token, @JSONBody String body);
    String DELETE(@Var("url") String url,  @Header("x-auth-token") String token, @JSONBody String body);
ard-work/src/main/resources/templates/preview.html
@@ -132,11 +132,11 @@
            video.addEventListener('loadedmetadata', function () {
                adjustGridItemSize(gridItem, gridItem.videoWidth, gridItem.videoHeight);
            });
            video.addEventListener("click", function() {
            video.addEventListener("click", function () {
                loadingMessage.style.display = "block";
                video.play().then(function() {
                video.play().then(function () {
                    loadingMessage.style.display = "none";
                }).catch(function(error) {
                }).catch(function (error) {
                    console.error("Error playing the video:", error);
                    loadingMessage.style.display = "none";
                });
@@ -148,18 +148,19 @@
    }
    let mediamtxHost = "192.168.1.12"
    var chanMap = new Map();
    window.onload = function () {
        changeGrid(2, 2);
        chanMap.set("video1", "http://127.0.0.1:8889/164/");
        chanMap.set("video2", "http://127.0.0.1:8889/165/");
        chanMap.set("video3", "http://127.0.0.1:8889/245/");
        chanMap.set("video4", "http://127.0.0.1:8889/164/");
        chanMap.set("video5", "http://127.0.0.1:8889/165/");
        chanMap.set("video6", "http://127.0.0.1:8889/245/");
        chanMap.set("video7", "http://127.0.0.1:8889/164/");
        chanMap.set("video8", "http://127.0.0.1:8889/165/");
        chanMap.set("video9", "http://127.0.0.1:8889/245/");
        chanMap.set("video1", "http://" + mediamtxHost + ":8889/164/");
        chanMap.set("video2", "http://" + mediamtxHost + ":8889/165/");
        chanMap.set("video3", "http://" + mediamtxHost + ":8889/245/");
        chanMap.set("video4", "http://" + mediamtxHost + ":8889/164/");
        chanMap.set("video5", "http://" + mediamtxHost + ":8889/165/");
        chanMap.set("video6", "http://" + mediamtxHost + ":8889/245/");
        chanMap.set("video7", "http://" + mediamtxHost + ":8889/164/");
        chanMap.set("video8", "http://" + mediamtxHost + ":8889/165/");
        chanMap.set("video9", "http://" + mediamtxHost + ":8889/245/");
        console.log(chanMap);
    }
    const linkToIceServers = (links) => (
@@ -421,6 +422,7 @@
        })
    }
</script>
</body>
</html>
lib/mediamtx/mediamtx.exe
Binary files differ
lib/mediamtx/mediamtx.yml
@@ -207,7 +207,7 @@
  # needed when server and clients are on different LANs.
  # TURN/TURNS servers are needed when a direct connection between server and
  # clients is not possible. All traffic is routed through them. stun:stun.l.google.com:19302
- url: stun:stun.l.google.com:19302
- url: stun:192.168.1.15:3478
  # if user is "AUTH_SECRET", then authentication is secret based.
  # the secret must be inserted into the password field.
  username: ''
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
@@ -39,12 +39,16 @@
            List<SysUser> SysUserList = sysUserService.selectAllAppUserList(new SysUser());
            if (SysUserList.size() > 0) {
                for (SysUser sysUser : SysUserList) {
                    Boolean appOnlineState = sysUser.getAppOnlineState().equals("1");
                    Boolean online = rongCloudService.checkOnline(sysUser.getUserId());
                    if (!appOnlineState.equals(online)) {
                        sysUser.setAppOnlineState(online ? "1" : "0");
                        sysUserService.updateUserProfile(sysUser);
                    String state = sysUser.getAppOnlineState();//获取当前用户的在线状态
                    Boolean online = rongCloudService.checkOnline(sysUser.getUserId());//从融云获取在线状态
                    if (state != null) {
                        Boolean appOnlineState = state.equals("1");
                        if (appOnlineState == online) {
                            continue;
                        }
                    }
                    sysUser.setAppOnlineState(online ? "1" : "0");
                    sysUserService.updateUserProfile(sysUser);
                }
            }
        } catch (Exception ex) {
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
@@ -41,12 +41,14 @@
            RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
            IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class);
            List<Map<String, Object>> list = new ArrayList<>();
            ArdCameras ardCameras = new ArdCameras();
            ardCameras.setGdtype("1");
            List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
            if (Objects.size() > 0) {
                for (Object obj : Objects) {
                    ArdCameras camera = (ArdCameras) obj;
                    if(!"1".equals(camera.getGdtype()))
                    {
                        continue;
                    }
                    CameraCmd cmd = new CameraCmd();
                    cmd.setCameraId(camera.getId());
                    cmd.setChannelNum(1);
@@ -55,7 +57,7 @@
                    {
                        continue;
                    }
                    Map<String, Object> ptz = hikClientService.getPtz(cmd);
                    Map<String, Object> ptz = hikClientService.getGisInfo(cmd);
                    if (StringUtils.isNull(ptz)) {
                        continue;
                    }
ruoyi-ui/node_modules/.package-lock.json
@@ -1750,6 +1750,25 @@
        "node": ">=6.9.0"
      }
    },
    "node_modules/@dailymotion/vast-client": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
      "dependencies": {
        "@xmldom/xmldom": "^0.8.3"
      },
      "engines": {
        "node": ">=12.22.1"
      }
    },
    "node_modules/@dailymotion/vmap": {
      "version": "3.3.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ==",
      "engines": {
        "node": ">=12.22.1"
      }
    },
    "node_modules/@eslint/eslintrc": {
      "version": "0.2.2",
      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -1813,6 +1832,53 @@
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@eyevinn/csai-manager": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
      "dependencies": {
        "@dailymotion/vast-client": "^4.0.0",
        "@dailymotion/vmap": "^3.3.0",
        "@eyevinn/video-event-filter": "^2.0.0",
        "mitt": "^3.0.0"
      }
    },
    "node_modules/@eyevinn/csai-manager/node_modules/mitt": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
    },
    "node_modules/@eyevinn/video-event-filter": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
      "dependencies": {
        "mitt": "^2.1.0"
      }
    },
    "node_modules/@eyevinn/video-event-filter/node_modules/mitt": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
      "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
    },
    "node_modules/@eyevinn/webrtc-player": {
      "version": "0.12.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
      "dependencies": {
        "@eyevinn/csai-manager": "^0.1.2",
        "@eyevinn/whpp-client": "^0.1.2",
        "events": "^3.3.0"
      },
      "engines": {
        "node": ">=18.15.0"
      }
    },
    "node_modules/@eyevinn/whpp-client": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
    },
    "node_modules/@gar/promisify": {
      "version": "1.1.3",
@@ -3004,6 +3070,14 @@
        "@webassemblyjs/ast": "1.9.0",
        "@webassemblyjs/wast-parser": "1.9.0",
        "@xtuc/long": "4.2.2"
      }
    },
    "node_modules/@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
      "engines": {
        "node": ">=10.0.0"
      }
    },
    "node_modules/@xtuc/ieee754": {
@@ -6883,7 +6957,6 @@
      "version": "3.3.0",
      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
      "dev": true,
      "engines": {
        "node": ">=0.8.x"
      }
ruoyi-ui/package-lock.json
@@ -9,6 +9,7 @@
      "version": "3.8.5",
      "license": "MIT",
      "dependencies": {
        "@eyevinn/webrtc-player": "^0.12.0",
        "@riophae/vue-treeselect": "0.4.0",
        "axios": "0.24.0",
        "clipboard": "2.0.8",
@@ -1803,6 +1804,25 @@
        "node": ">=6.9.0"
      }
    },
    "node_modules/@dailymotion/vast-client": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
      "dependencies": {
        "@xmldom/xmldom": "^0.8.3"
      },
      "engines": {
        "node": ">=12.22.1"
      }
    },
    "node_modules/@dailymotion/vmap": {
      "version": "3.3.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ==",
      "engines": {
        "node": ">=12.22.1"
      }
    },
    "node_modules/@eslint/eslintrc": {
      "version": "0.2.2",
      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -1866,6 +1886,53 @@
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/@eyevinn/csai-manager": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
      "dependencies": {
        "@dailymotion/vast-client": "^4.0.0",
        "@dailymotion/vmap": "^3.3.0",
        "@eyevinn/video-event-filter": "^2.0.0",
        "mitt": "^3.0.0"
      }
    },
    "node_modules/@eyevinn/csai-manager/node_modules/mitt": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
    },
    "node_modules/@eyevinn/video-event-filter": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
      "dependencies": {
        "mitt": "^2.1.0"
      }
    },
    "node_modules/@eyevinn/video-event-filter/node_modules/mitt": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
      "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
    },
    "node_modules/@eyevinn/webrtc-player": {
      "version": "0.12.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
      "dependencies": {
        "@eyevinn/csai-manager": "^0.1.2",
        "@eyevinn/whpp-client": "^0.1.2",
        "events": "^3.3.0"
      },
      "engines": {
        "node": ">=18.15.0"
      }
    },
    "node_modules/@eyevinn/whpp-client": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
    },
    "node_modules/@gar/promisify": {
      "version": "1.1.3",
@@ -3057,6 +3124,14 @@
        "@webassemblyjs/ast": "1.9.0",
        "@webassemblyjs/wast-parser": "1.9.0",
        "@xtuc/long": "4.2.2"
      }
    },
    "node_modules/@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
      "engines": {
        "node": ">=10.0.0"
      }
    },
    "node_modules/@xtuc/ieee754": {
@@ -6936,7 +7011,6 @@
      "version": "3.3.0",
      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
      "dev": true,
      "engines": {
        "node": ">=0.8.x"
      }
@@ -19138,6 +19212,19 @@
        "to-fast-properties": "^2.0.0"
      }
    },
    "@dailymotion/vast-client": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
      "requires": {
        "@xmldom/xmldom": "^0.8.3"
      }
    },
    "@dailymotion/vmap": {
      "version": "3.3.1",
      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ=="
    },
    "@eslint/eslintrc": {
      "version": "0.2.2",
      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -19188,6 +19275,54 @@
          "dev": true
        }
      }
    },
    "@eyevinn/csai-manager": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
      "requires": {
        "@dailymotion/vast-client": "^4.0.0",
        "@dailymotion/vmap": "^3.3.0",
        "@eyevinn/video-event-filter": "^2.0.0",
        "mitt": "^3.0.0"
      },
      "dependencies": {
        "mitt": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
          "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
        }
      }
    },
    "@eyevinn/video-event-filter": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
      "requires": {
        "mitt": "^2.1.0"
      },
      "dependencies": {
        "mitt": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
          "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
        }
      }
    },
    "@eyevinn/webrtc-player": {
      "version": "0.12.0",
      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
      "requires": {
        "@eyevinn/csai-manager": "^0.1.2",
        "@eyevinn/whpp-client": "^0.1.2",
        "events": "^3.3.0"
      }
    },
    "@eyevinn/whpp-client": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
    },
    "@gar/promisify": {
      "version": "1.1.3",
@@ -20196,6 +20331,11 @@
        "@webassemblyjs/wast-parser": "1.9.0",
        "@xtuc/long": "4.2.2"
      }
    },
    "@xmldom/xmldom": {
      "version": "0.8.10",
      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
    },
    "@xtuc/ieee754": {
      "version": "1.2.0",
@@ -23435,8 +23575,7 @@
    "events": {
      "version": "3.3.0",
      "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
      "dev": true
      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
    },
    "eventsource": {
      "version": "2.0.2",
ruoyi-ui/package.json
@@ -36,6 +36,7 @@
    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
  },
  "dependencies": {
    "@eyevinn/webrtc-player": "^0.12.0",
    "@riophae/vue-treeselect": "0.4.0",
    "axios": "0.24.0",
    "clipboard": "2.0.8",