v1.2.0
41
README.md
@@ -26,7 +26,7 @@ ruoyi-wvp是基于ruoyi-vue和wvp框架的全部开源的GB/T 28181-2016标准
|
|||||||
## 内置功能
|
## 内置功能
|
||||||
|
|
||||||
1. 原若依全部功能:原若依全部功能,包含用户管理、角色管理、部门管理及系统监控等。
|
1. 原若依全部功能:原若依全部功能,包含用户管理、角色管理、部门管理及系统监控等。
|
||||||
2. 国标设备:国标设备完成注册后,平台自动展示设备详情,支持查看设备通道、云台控制及便捷点播视频等多样化功能。
|
2. 国标设备:国标设备完成注册后,平台自动展示设备详情,支持查看设备通道及便捷点播视频等多样化功能。
|
||||||
3. 云端录像:用户可轻松查看或下载国标设备所存储的云端录像视频内容。
|
3. 云端录像:用户可轻松查看或下载国标设备所存储的云端录像视频内容。
|
||||||
4. 推流列表:清晰呈现推流及可推流设备通道信息,支持一键播放视频与便捷国标通道配置等操作。
|
4. 推流列表:清晰呈现推流及可推流设备通道信息,支持一键播放视频与便捷国标通道配置等操作。
|
||||||
5. 拉流列表:清晰呈现拉流及可拉流设备通道信息,支持一键播放视频与便捷国标通道配置等操作。
|
5. 拉流列表:清晰呈现拉流及可拉流设备通道信息,支持一键播放视频与便捷国标通道配置等操作。
|
||||||
@@ -36,22 +36,12 @@ ruoyi-wvp是基于ruoyi-vue和wvp框架的全部开源的GB/T 28181-2016标准
|
|||||||
9. 通道管理:与行政分组和业务分组深度关联,实现通道精细化和高效化管理,形成多维度的管理逻辑。
|
9. 通道管理:与行政分组和业务分组深度关联,实现通道精细化和高效化管理,形成多维度的管理逻辑。
|
||||||
10. 节点管理:实时查看ZLMediaKit节点的状态、负载及资源分配详情。
|
10. 节点管理:实时查看ZLMediaKit节点的状态、负载及资源分配详情。
|
||||||
11. 分屏监控:支持4/6/9分屏自由切换,实时掌控多区域画面,提升安防巡查效率。
|
11. 分屏监控:支持4/6/9分屏自由切换,实时掌控多区域画面,提升安防巡查效率。
|
||||||
12. 设备录像:支持点播设备录像和下载功能。
|
|
||||||
|
|
||||||
## 非开源功能-onvif协议
|
## 非开源功能
|
||||||
|
|
||||||
1. onvif设备发现:内网环境下可一键扫描并查看所有开启ONVIF协议的设备信息,实现高效集中管控。
|
1. onvif设备发现:内网环境下可一键扫描并查看所有开启ONVIF协议的设备信息,实现高效集中管控。
|
||||||
2. onvif设备嗅探:通过IP地址与账号密码自动探测设备,快速获取设备信息并启用实时直播功能。
|
2. onvif设备嗅探:通过IP地址与账号密码自动探测设备,快速获取设备信息并启用实时直播功能。
|
||||||
3. onvif设备管理:实现参数配置及实时视频点播,简化多品牌设备管控。
|
3. onvif设备管理:实现参数配置及实时视频点播,简化多品牌设备管控。
|
||||||
4. onvif云台功能:实现绝对位置移动和连续移动。
|
|
||||||
|
|
||||||
## 非开源功能-ISUP协议
|
|
||||||
|
|
||||||
1. 设备管理、视频点播、云台控制。
|
|
||||||
|
|
||||||
## 非开源功能-rtsp协议
|
|
||||||
|
|
||||||
1. 设备管理、视频点播。
|
|
||||||
|
|
||||||
## 前端源码
|
## 前端源码
|
||||||
|
|
||||||
@@ -82,15 +72,7 @@ ruoyi-wvp是基于ruoyi-vue和wvp框架的全部开源的GB/T 28181-2016标准
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/350dcf28536448349a8ab4927a9e192e.png"/></td>
|
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/350dcf28536448349a8ab4927a9e192e.png"/></td>
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/aba0df58f83144b4aa9ccf9f444a0238.png"/></td>
|
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/a383b8369edb421080168fea74e4e4f2.png"/></td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/37be5453cecb4fe78346ce9e9e468708.png"/></td>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/a98953be2b1b4058a81b1a8d524fda11.png"/></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/0a83d0787a824e528b21425951f4fd0b.png"/></td>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/9fc317f4c6b44623938e5b0a95f5a86f.png"/></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/34c300506ce74302be2f5bd63fca270f.png"/></td>
|
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/34c300506ce74302be2f5bd63fca270f.png"/></td>
|
||||||
@@ -119,22 +101,7 @@ ruoyi-wvp是基于ruoyi-vue和wvp框架的全部开源的GB/T 28181-2016标准
|
|||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/84687cc86b934b70a5940ab44d3f1122.png"/></td>
|
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/84687cc86b934b70a5940ab44d3f1122.png"/></td>
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/ae974591674c4580ba9e695108a58e9b.png"/></td>
|
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/17/fe10bf8264e3489299e9d26950a2ad24.png"/></td>
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## isup播放示例图
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/8ac1339ac5584a2090f529f61da50093.png"/></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## rtsp播放示例图
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td><img src="https://gdhxkj.oss-cn-guangzhou.aliyuncs.com/2025/04/24/e35fc83314c54b9a91eb6ddbe2185e7b.png"/></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import com.ruoyi.system.domain.SysCache;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存监控
|
* 缓存监控
|
||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@@ -43,6 +43,7 @@ public class CacheController
|
|||||||
caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
|
caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
|
||||||
caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
|
caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
|
||||||
caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
|
caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
|
||||||
|
caches.add(new SysCache(CacheConstants.SYS_WORK_LIST, "工作台数据"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
@PreAuthorize("@ss.hasPermi('monitor:cache:list')")
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.ruoyi.common.constant;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存的key 常量
|
* 缓存的key 常量
|
||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
public class CacheConstants
|
public class CacheConstants
|
||||||
@@ -41,4 +41,9 @@ public class CacheConstants
|
|||||||
* 登录账户密码错误次数 redis key
|
* 登录账户密码错误次数 redis key
|
||||||
*/
|
*/
|
||||||
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
|
public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工作台数据 redis key
|
||||||
|
*/
|
||||||
|
public static final String SYS_WORK_LIST = "sys_work_list:";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,4 +21,14 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 通用工具-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -17,4 +17,13 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!-- 通用工具-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -17,4 +17,14 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- 通用工具-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ruoyi</groupId>
|
||||||
|
<artifactId>ruoyi-common</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -85,6 +85,19 @@ public class DeviceQueryController extends BaseController {
|
|||||||
return success(deviceService.getDeviceByDeviceId(deviceId));
|
return success(deviceService.getDeviceByDeviceId(deviceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询全部国标设备
|
||||||
|
*
|
||||||
|
* @param device 设备
|
||||||
|
* @return 国标列表
|
||||||
|
*/
|
||||||
|
@PreAuthorize("@ss.hasPermi('wvp:device:list')")
|
||||||
|
@GetMapping("/deviceList")
|
||||||
|
public AjaxResult deviceList(Device device) {
|
||||||
|
List<Device> list = deviceService.getAll(device);
|
||||||
|
return success(list);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询国标设备
|
* 分页查询国标设备
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.ruoyi.wvp.controller;
|
package com.ruoyi.wvp.controller;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.wvp.common.StreamInfo;
|
import com.ruoyi.wvp.common.StreamInfo;
|
||||||
import com.ruoyi.wvp.conf.UserSetting;
|
import com.ruoyi.wvp.conf.UserSetting;
|
||||||
import com.ruoyi.wvp.conf.exception.ControllerException;
|
import com.ruoyi.wvp.conf.exception.ControllerException;
|
||||||
@@ -39,7 +41,7 @@ import java.util.UUID;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/gb_record")
|
@RequestMapping("/api/gb_record")
|
||||||
public class GBRecordController {
|
public class GBRecordController extends BaseController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SIPCommander cmder;
|
private SIPCommander cmder;
|
||||||
@@ -213,7 +215,7 @@ public class GBRecordController {
|
|||||||
@Parameter(name = "channelId", description = "通道国标编号", required = true)
|
@Parameter(name = "channelId", description = "通道国标编号", required = true)
|
||||||
@Parameter(name = "stream", description = "流ID", required = true)
|
@Parameter(name = "stream", description = "流ID", required = true)
|
||||||
@GetMapping("/download/progress/{deviceId}/{channelId}/{stream}")
|
@GetMapping("/download/progress/{deviceId}/{channelId}/{stream}")
|
||||||
public StreamContent getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) {
|
public AjaxResult getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) {
|
||||||
Device device = deviceService.getDeviceByDeviceId(deviceId);
|
Device device = deviceService.getDeviceByDeviceId(deviceId);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
log.warn("[获取历史媒体下载进度] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId);
|
log.warn("[获取历史媒体下载进度] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId);
|
||||||
@@ -229,6 +231,6 @@ public class GBRecordController {
|
|||||||
if (downLoadInfo == null) {
|
if (downLoadInfo == null) {
|
||||||
throw new ControllerException(ErrorCode.ERROR404);
|
throw new ControllerException(ErrorCode.ERROR404);
|
||||||
}
|
}
|
||||||
return new StreamContent(downLoadInfo);
|
return success(new StreamContent(downLoadInfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -262,6 +262,12 @@ public class PlayController extends BaseController {
|
|||||||
return jsonObject;
|
return jsonObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建快照 - 抓拍
|
||||||
|
* @param deviceId
|
||||||
|
* @param channelId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Parameter(name = "deviceId", description = "设备国标编号", required = true)
|
@Parameter(name = "deviceId", description = "设备国标编号", required = true)
|
||||||
@Parameter(name = "channelId", description = "通道国标编号", required = true)
|
@Parameter(name = "channelId", description = "通道国标编号", required = true)
|
||||||
@GetMapping("/snap")
|
@GetMapping("/snap")
|
||||||
|
|||||||
@@ -253,10 +253,10 @@ public class WvpServerController extends BaseController {
|
|||||||
|
|
||||||
@GetMapping(value = "/system/info")
|
@GetMapping(value = "/system/info")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public SystemAllInfo getSystemInfo() {
|
public AjaxResult getSystemInfo() {
|
||||||
SystemAllInfo systemAllInfo = redisCatchStorage.getSystemInfo();
|
SystemAllInfo systemAllInfo = redisCatchStorage.getSystemInfo();
|
||||||
|
|
||||||
return systemAllInfo;
|
return success(systemAllInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "/media_server/load")
|
@GetMapping(value = "/media_server/load")
|
||||||
|
|||||||
@@ -424,7 +424,6 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
content.append("a=connection:new\r\n");
|
content.append("a=connection:new\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//ssrc
|
//ssrc
|
||||||
content.append("y=" + ssrcInfo.getSsrc() + "\r\n");
|
content.append("y=" + ssrcInfo.getSsrc() + "\r\n");
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 31 KiB |