Commit 2a1f979651340fbf9b530ab2d2f9e5857cbeeb1a

Authored by 648540858
1 parent a1398a56

简化zlm节点接入逻辑

src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java 0 → 100644
  1 +package com.genersoft.iot.vmp.conf;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import org.springframework.scheduling.annotation.Scheduled;
  5 +
  6 +/**
  7 + * 定时向zlm同步媒体流状态
  8 + */
  9 +public class MediaStatusTimerTask {
  10 +
  11 +
  12 + @Scheduled(fixedRate = 2 * 1000) //每3秒执行一次
  13 + public void execute(){
  14 +
  15 + }
  16 +}
... ...
src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
... ... @@ -18,6 +18,7 @@ import org.springframework.util.StringUtils;
18 18  
19 19 import javax.servlet.ServletException;
20 20 import javax.servlet.http.HttpServletRequest;
  21 +import javax.servlet.http.HttpServletResponse;
21 22 import java.io.IOException;
22 23 import java.net.ConnectException;
23 24  
... ... @@ -126,7 +127,11 @@ public class ProxyServletConfig {
126 127 MediaServerItem getMediaInfoByUri(String uri){
127 128 String[] split = uri.split("/");
128 129 String mediaServerId = split[2];
129   - return mediaServerService.getOne(mediaServerId);
  130 + if ("default".equals(mediaServerId)) {
  131 + return mediaServerService.getDefaultMediaServer();
  132 + }else {
  133 + return mediaServerService.getOne(mediaServerId);
  134 + }
130 135 }
131 136  
132 137 /**
... ... @@ -140,13 +145,13 @@ public class ProxyServletConfig {
140 145 if (mediaInfo == null) {
141 146 return url;
142 147 }
143   - return url.replace(mediaInfo.getId() + "/", "");
  148 + return url.replace(mediaInfo.getId() + "/", "").replace("default/", "");
144 149 }
145 150 }
146 151  
147 152 @Bean
148 153 public ServletRegistrationBean recordServletRegistrationBean(){
149   - ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxySerlet(),"/record_proxy/*");
  154 + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");
150 155 servletRegistrationBean.setName("record_proxy");
151 156 servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
152 157 servletRegistrationBean.addUrlMappings();
... ... @@ -156,8 +161,22 @@ public class ProxyServletConfig {
156 161 return servletRegistrationBean;
157 162 }
158 163  
159   - class RecordProxySerlet extends ProxyServlet{
  164 + class RecordProxyServlet extends ProxyServlet{
160 165  
  166 + @Override
  167 + protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
  168 + String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
  169 + MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
  170 + String remoteHost = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
  171 + if (mediaInfo != null) {
  172 + if (!StringUtils.isEmpty(queryStr)) {
  173 + queryStr += "&remoteHost=" + remoteHost;
  174 + }else {
  175 + queryStr = "remoteHost=" + remoteHost;
  176 + }
  177 + }
  178 + return queryStr;
  179 + }
161 180  
162 181 /**
163 182 * 异常处理
... ... @@ -222,7 +241,12 @@ public class ProxyServletConfig {
222 241 MediaServerItem getMediaInfoByUri(String uri){
223 242 String[] split = uri.split("/");
224 243 String mediaServerId = split[2];
225   - return mediaServerService.getOne(mediaServerId);
  244 + if ("default".equals(mediaServerId)) {
  245 + return mediaServerService.getDefaultMediaServer();
  246 + }else {
  247 + return mediaServerService.getOne(mediaServerId);
  248 + }
  249 +
226 250 }
227 251  
228 252 /**
... ... @@ -236,7 +260,7 @@ public class ProxyServletConfig {
236 260 if (mediaInfo == null) {
237 261 return url;
238 262 }
239   - return url.replace(mediaInfo.getId() + "/", "");
  263 + return url.replace(mediaInfo.getId() + "/", "").replace("default/", "");
240 264 }
241 265 }
242 266  
... ...
src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java
... ... @@ -38,7 +38,7 @@ public class ThreadPoolTaskConfig {
38 38 /**
39 39 * 线程池名前缀
40 40 */
41   - private static final String threadNamePrefix = "wvp-sip-handle-";
  41 + private static final String threadNamePrefix = "wvp-sip-";
42 42  
43 43 @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名
44 44 public ThreadPoolTaskExecutor taskExecutor() {
... ...
src/main/java/com/genersoft/iot/vmp/conf/SipDeviceRunner.java renamed to src/main/java/com/genersoft/iot/vmp/conf/runner/SipDeviceRunner.java
1   -package com.genersoft.iot.vmp.conf;
  1 +package com.genersoft.iot.vmp.conf.runner;
2 2  
3 3 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
4 4 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
... ... @@ -70,6 +70,7 @@ public class SipLayer{
70 70 try {
71 71 tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP");
72 72 tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
  73 + tcpSipProvider.setDialogErrorsAutomaticallyHandled();
73 74 tcpSipProvider.addSipListener(sipProcessorObserver);
74 75 logger.info("Sip Server TCP 启动成功 port {" + sipConfig.getMonitorIp() + ":" + sipConfig.getPort() + "}");
75 76 } catch (TransportNotSupportedException e) {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
... ... @@ -4,12 +4,11 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
4 4 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
5 5 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor;
6 6 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
  7 +import gov.nist.javax.sip.message.SIPRequest;
7 8 import org.slf4j.Logger;
8 9 import org.slf4j.LoggerFactory;
9 10 import org.springframework.beans.factory.annotation.Autowired;
10   -import org.springframework.beans.factory.annotation.Qualifier;
11 11 import org.springframework.scheduling.annotation.Async;
12   -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
13 12 import org.springframework.stereotype.Component;
14 13  
15 14 import javax.sip.*;
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
... ... @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm;
3 3 import com.alibaba.fastjson.JSON;
4 4 import com.alibaba.fastjson.JSONArray;
5 5 import com.alibaba.fastjson.JSONObject;
  6 +import com.genersoft.iot.vmp.common.VideoManagerConstants;
6 7 import com.genersoft.iot.vmp.conf.MediaConfig;
7 8 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
8 9 import com.genersoft.iot.vmp.service.IMediaServerService;
... ... @@ -12,6 +13,7 @@ import org.slf4j.LoggerFactory;
12 13 import org.springframework.beans.factory.annotation.Autowired;
13 14 import org.springframework.boot.CommandLineRunner;
14 15 import org.springframework.core.annotation.Order;
  16 +import org.springframework.scheduling.annotation.Async;
15 17 import org.springframework.stereotype.Component;
16 18  
17 19 import java.util.*;
... ... @@ -41,22 +43,9 @@ public class ZLMRunner implements CommandLineRunner {
41 43  
42 44 @Override
43 45 public void run(String... strings) throws Exception {
44   - // 清楚redis缓存的在线zlm信息
45   - mediaServerService.clearMediaServerForOnline();
46   -
47   - // 将配置文件的meida配置写入数据库
48   -// MediaServerItem presetMediaServer = mediaServerService.getOneByHostAndPort(
49   -// mediaConfig.getIp(), mediaConfig.getHttpPort());
50   -// if (presetMediaServer != null) {
51   -// MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem();
52   -// mediaSerItem.setId(presetMediaServer.getId());
53   -// mediaServerService.update(mediaSerItem);
54   -// }else {
55   -// if (mediaConfig.getId() != null) {
56   -// MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem();
57   -// mediaServerService.add(mediaSerItem);
58   -// }
59   -// }
  46 + if (mediaServerService.getDefaultMediaServer() == null) {
  47 + mediaServerService.addToDatabase(mediaConfig.getMediaSerItem());
  48 + }
60 49  
61 50 // 订阅 zlm启动事件, 新的zlm也会从这里进入系统
62 51 hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null,
... ... @@ -65,7 +54,6 @@ public class ZLMRunner implements CommandLineRunner {
65 54 if (zlmServerConfig !=null ) {
66 55 startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId());
67 56 mediaServerService.handLeZLMServerConfig(zlmServerConfig);
68   -// zLmRunning(zlmServerConfig);
69 57 }
70 58 });
71 59  
... ... @@ -80,17 +68,7 @@ public class ZLMRunner implements CommandLineRunner {
80 68 for (MediaServerItem mediaServerItem : all) {
81 69 if (startGetMedia == null) startGetMedia = new HashMap<>();
82 70 startGetMedia.put(mediaServerItem.getId(), true);
83   - new Thread(() -> {
84   -
85   - ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem);
86   - if (zlmServerConfig != null) {
87   - zlmServerConfig.setIp(mediaServerItem.getIp());
88   - zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort());
89   - startGetMedia.remove(mediaServerItem.getId());
90   - mediaServerService.handLeZLMServerConfig(zlmServerConfig);
91   - }
92   -
93   - }).start();
  71 + connectZlmServer(mediaServerItem);
94 72 }
95 73 Timer timer = new Timer();
96 74 // 2分钟后未连接到则不再去主动连接, TODO 并对重启前使用此在zlm的通道发送bye
... ... @@ -109,6 +87,17 @@ public class ZLMRunner implements CommandLineRunner {
109 87 }, 60 * 1000 * 2);
110 88 }
111 89  
  90 + @Async
  91 + public void connectZlmServer(MediaServerItem mediaServerItem){
  92 + ZLMServerConfig zlmServerConfig = getMediaServerConfig(mediaServerItem);
  93 + if (zlmServerConfig != null) {
  94 + zlmServerConfig.setIp(mediaServerItem.getIp());
  95 + zlmServerConfig.setHttpPort(mediaServerItem.getHttpPort());
  96 + startGetMedia.remove(mediaServerItem.getId());
  97 + mediaServerService.handLeZLMServerConfig(zlmServerConfig);
  98 + }
  99 + }
  100 +
112 101 public ZLMServerConfig getMediaServerConfig(MediaServerItem mediaServerItem) {
113 102 if (startGetMedia == null) { return null;}
114 103 if (!mediaServerItem.isDefaultServer() && mediaServerService.getOne(mediaServerItem.getId()) == null) {
... ...
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
... ... @@ -54,6 +54,8 @@ public interface IMediaServerService {
54 54  
55 55 WVPResult<String> add(MediaServerItem mediaSerItem);
56 56  
  57 + int addToDatabase(MediaServerItem mediaSerItem);
  58 +
57 59 void resetOnlineServerItem(MediaServerItem serverItem);
58 60  
59 61 WVPResult<MediaServerItem> checkMediaServer(String ip, int port, String secret);
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
... ... @@ -27,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value;
27 27 import org.springframework.boot.CommandLineRunner;
28 28 import org.springframework.core.annotation.Order;
29 29 import org.springframework.stereotype.Service;
  30 +import org.springframework.util.StringUtils;
30 31  
31 32 import java.text.SimpleDateFormat;
32 33 import java.util.*;
... ... @@ -80,6 +81,9 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
80 81 logger.info("Media Server 缓存初始化");
81 82 List<MediaServerItem> mediaServerItemList = mediaServerMapper.queryAll();
82 83 for (MediaServerItem mediaServerItem : mediaServerItemList) {
  84 + if (StringUtils.isEmpty(mediaServerItem.getId())) {
  85 + continue;
  86 + }
83 87 // 更新
84 88 if (mediaServerItem.getSsrcConfig() == null) {
85 89 SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
... ... @@ -283,6 +287,11 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
283 287 return result;
284 288 }
285 289  
  290 + @Override
  291 + public int addToDatabase(MediaServerItem mediaSerItem) {
  292 + return mediaServerMapper.add(mediaSerItem);
  293 + }
  294 +
286 295 /**
287 296 * 处理zlm上线
288 297 * @param zlmServerConfig zlm上线携带的参数
... ... @@ -296,69 +305,84 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
296 305 if (serverItem == null) {
297 306 serverItem = mediaServerMapper.queryOneByHostAndPort(zlmServerConfig.getIp(), zlmServerConfig.getHttpPort());
298 307 }
299   - if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId())
300   - || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) {
301   - // 配置文件的zlm
302   - // 如果是配置文件中的zlm。 也就是默认zlm。 一切以配置文件内容为准
303   - // docker部署不会使用zlm配置的端口号不是默认的则不做更新, 配置修改需要自行修改server配置;
304   - MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem();
305   - serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId());
306   - if (mediaConfig.getHttpPort() == 0) {
307   - serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort());
308   - }
309   - if (mediaConfig.getHttpSSlPort() == 0) {
310   - serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
311   - }
312   - if (mediaConfig.getRtmpPort() == 0) {
313   - serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort());
314   - }
315   - if (mediaConfig.getRtmpSSlPort() == 0) {
316   - serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
317   - }
318   - if (mediaConfig.getRtspPort() == 0) {
319   - serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort());
320   - }
321   - if (mediaConfig.getRtspSSLPort() == 0) {
322   - serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
323   - }
324   - if (mediaConfig.getRtpProxyPort() == 0) {
325   - serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
326   - }
327   - if (serverItem != null){
328   - mediaServerMapper.delDefault();
329   - mediaServerMapper.add(serverItemFromConfig);
330   - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
331   - MediaServerItem serverItemInRedis = (MediaServerItem)redisUtil.get(key);
332   - if (serverItemInRedis != null) {
333   - serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig());
334   - }else {
335   - serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
336   - }
337   - redisUtil.set(key, serverItemFromConfig);
338   - }else {
339   - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
340   - serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
341   - redisUtil.set(key, serverItemFromConfig);
342   - mediaServerMapper.add(serverItemFromConfig);
343   - }
344   - resetOnlineServerItem(serverItemFromConfig);
345   - setZLMConfig(serverItemFromConfig);
346   - }else {
347   - String now = this.format.format(System.currentTimeMillis());
348   - if (serverItem == null){
349   - // 一个新的zlm接入wvp
350   - serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp());
351   - serverItem.setCreateTime(now);
352   - serverItem.setUpdateTime(now);
353   - String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId();
354   - serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()));
355   - redisUtil.set(key, serverItem);
356   - // 存入数据库
357   - mediaServerMapper.add(serverItem);
358   - setZLMConfig(serverItem);
359   - }
360   - resetOnlineServerItem(serverItem);
  308 + if (serverItem == null) {
  309 + logger.warn("[未注册的zlm] 拒接接入:来自{}:{}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() );
  310 + return;
  311 + }
  312 + if (StringUtils.isEmpty(serverItem.getId())) {
  313 + serverItem.setId(zlmServerConfig.getGeneralMediaServerId());
  314 + redisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId(), serverItem);
361 315 }
  316 + serverItem.setStatus(true);
  317 + mediaServerMapper.update(serverItem);
  318 + resetOnlineServerItem(serverItem);
  319 + setZLMConfig(serverItem);
  320 +
  321 +// if (zlmServerConfig.getGeneralMediaServerId().equals(mediaConfig.getId())
  322 +// || (zlmServerConfig.getIp().equals(mediaConfig.getIp()) && zlmServerConfig.getHttpPort() == mediaConfig.getHttpPort())) {
  323 +// // 配置文件的zlm
  324 +// // 如果是配置文件中的zlm。 也就是默认zlm。 一切以配置文件内容为准
  325 +// // wvp互惠修改zlm的端口,需要自行配置。
  326 +// MediaServerItem serverItemFromConfig = mediaConfig.getMediaSerItem();
  327 +// serverItemFromConfig.setId(zlmServerConfig.getGeneralMediaServerId());
  328 +// if (mediaConfig.getHttpPort() == 0) {
  329 +// serverItemFromConfig.setHttpPort(zlmServerConfig.getHttpPort());
  330 +// }
  331 +// if (mediaConfig.getHttpSSlPort() == 0) {
  332 +// serverItemFromConfig.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
  333 +// }
  334 +// if (mediaConfig.getRtmpPort() == 0) {
  335 +// serverItemFromConfig.setRtmpPort(zlmServerConfig.getRtmpPort());
  336 +// }
  337 +// if (mediaConfig.getRtmpSSlPort() == 0) {
  338 +// serverItemFromConfig.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
  339 +// }
  340 +// if (mediaConfig.getRtspPort() == 0) {
  341 +// serverItemFromConfig.setRtspPort(zlmServerConfig.getRtspPort());
  342 +// }
  343 +// if (mediaConfig.getRtspSSLPort() == 0) {
  344 +// serverItemFromConfig.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
  345 +// }
  346 +// if (mediaConfig.getRtpProxyPort() == 0) {
  347 +// serverItemFromConfig.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
  348 +// }
  349 +// if (serverItem != null){
  350 +// mediaServerMapper.delDefault();
  351 +// mediaServerMapper.add(serverItemFromConfig);
  352 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
  353 +// MediaServerItem serverItemInRedis = (MediaServerItem)redisUtil.get(key);
  354 +// if (serverItemInRedis != null) {
  355 +// serverItemFromConfig.setSsrcConfig(serverItemInRedis.getSsrcConfig());
  356 +// }else {
  357 +// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
  358 +// }
  359 +// redisUtil.set(key, serverItemFromConfig);
  360 +// }else {
  361 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItemFromConfig.getId();
  362 +// serverItemFromConfig.setSsrcConfig(new SsrcConfig(serverItemFromConfig.getId(), null, sipConfig.getDomain()));
  363 +// redisUtil.set(key, serverItemFromConfig);
  364 +// mediaServerMapper.add(serverItemFromConfig);
  365 +// }
  366 +// resetOnlineServerItem(serverItemFromConfig);
  367 +// setZLMConfig(serverItemFromConfig);
  368 +// }
  369 + // 移除未添加的zlm的接入,所有的zlm必须先添加后才可以加入使用
  370 +// else {
  371 +// String now = this.format.format(System.currentTimeMillis());
  372 +// if (serverItem == null){
  373 +// // 一个新的zlm接入wvp
  374 +// serverItem = new MediaServerItem(zlmServerConfig, sipConfig.getIp());
  375 +// serverItem.setCreateTime(now);
  376 +// serverItem.setUpdateTime(now);
  377 +// String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + serverItem.getId();
  378 +// serverItem.setSsrcConfig(new SsrcConfig(serverItem.getId(), null, sipConfig.getDomain()));
  379 +// redisUtil.set(key, serverItem);
  380 +// // 存入数据库
  381 +// mediaServerMapper.add(serverItem);
  382 +// setZLMConfig(serverItem);
  383 +// }
  384 +// resetOnlineServerItem(serverItem);
  385 +// }
362 386 }
363 387  
364 388 @Override
... ...
web_src/src/components/MediaServerManger.vue
... ... @@ -18,7 +18,8 @@
18 18 <div class="card-img-zlm"></div>
19 19 <div style="padding: 14px;text-align: left">
20 20 <span style="font-size: 16px">{{item.id}}</span>
21   - <el-button icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">编辑</el-button>
  21 + <el-button v-if="!item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">编辑</el-button>
  22 + <el-button v-if="item.defaultServer" icon="el-icon-edit" style="padding: 0;float: right;" type="text" @click="edit(item)">查看</el-button>
22 23 <el-button icon="el-icon-delete" style="margin-right: 10px;padding: 0;float: right;" type="text" @click="del(item)">移除</el-button>
23 24 <div style="margin-top: 13px; line-height: 12px; ">
24 25 <span style="font-size: 14px; color: #999; margin-top: 5px; ">{{item.ip}}</span>
... ... @@ -27,6 +28,7 @@
27 28 </div>
28 29 <i v-if="item.status" class="iconfont icon-online server-card-status-online" title="在线"></i>
29 30 <i v-if="!item.status" class="iconfont icon-online server-card-status-offline" title="离线"></i>
  31 + <i v-if="item.defaultServer" class="server-card-default" >默认</i>
30 32 </el-card>
31 33 </el-col>
32 34 </el-row>
... ... @@ -173,6 +175,13 @@
173 175 color: #808080;
174 176 font-size: 18px;
175 177 }
  178 + .server-card-default{
  179 + position: absolute;
  180 + left: 20px;
  181 + top: 20px;
  182 + color: #808080;
  183 + font-size: 18px;
  184 + }
176 185 .server-card:hover {
177 186 border: 1px solid #adadad;
178 187 }
... ...
web_src/src/components/dialog/MediaServerEdit.vue
... ... @@ -12,13 +12,13 @@
12 12 <div id="formStep" style="margin-top: 1rem; margin-right: 20px;">
13 13 <el-form v-if="currentStep == 1" ref="mediaServerForm" :rules="rules" :model="mediaServerForm" label-width="140px" >
14 14 <el-form-item label="IP" prop="ip">
15   - <el-input v-model="mediaServerForm.ip" placeholder="媒体服务IP" clearable></el-input>
  15 + <el-input v-model="mediaServerForm.ip" placeholder="媒体服务IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
16 16 </el-form-item>
17 17 <el-form-item label="HTTP端口" prop="httpPort">
18   - <el-input v-model="mediaServerForm.httpPort" placeholder="媒体服务HTTP端口" clearable></el-input>
  18 + <el-input v-model="mediaServerForm.httpPort" placeholder="媒体服务HTTP端口" clearable :disabled="mediaServerForm.defaultServer"></el-input>
19 19 </el-form-item>
20 20 <el-form-item label="SECRET" prop="secret">
21   - <el-input v-model="mediaServerForm.secret" placeholder="媒体服务SECRET" clearable></el-input>
  21 + <el-input v-model="mediaServerForm.secret" placeholder="媒体服务SECRET" clearable :disabled="mediaServerForm.defaultServer"></el-input>
22 22 </el-form-item>
23 23 <el-form-item>
24 24 <div style="float: right;">
... ... @@ -34,34 +34,34 @@
34 34 <el-col :span="12">
35 35 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm1" :rules="rules" :model="mediaServerForm" label-width="140px" >
36 36 <el-form-item label="IP" prop="ip">
37   - <el-input v-if="currentStep === 2" v-model="mediaServerForm.ip" disabled></el-input>
38   - <el-input v-if="currentStep === 3" v-model="mediaServerForm.ip"></el-input>
  37 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.ip" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  38 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.ip" :disabled="mediaServerForm.defaultServer"></el-input>
39 39 </el-form-item>
40 40 <el-form-item label="HTTP端口" prop="httpPort">
41   - <el-input v-if="currentStep === 2" v-model="mediaServerForm.httpPort" disabled></el-input>
42   - <el-input v-if="currentStep === 3" v-model="mediaServerForm.httpPort"></el-input>
  41 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.httpPort" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  42 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.httpPort" :disabled="mediaServerForm.defaultServer"></el-input>
43 43 </el-form-item>
44 44 <el-form-item label="SECRET" prop="secret">
45   - <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled></el-input>
46   - <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret"></el-input>
  45 + <el-input v-if="currentStep === 2" v-model="mediaServerForm.secret" disabled :disabled="mediaServerForm.defaultServer"></el-input>
  46 + <el-input v-if="currentStep === 3" v-model="mediaServerForm.secret" :disabled="mediaServerForm.defaultServer"></el-input>
47 47 </el-form-item>
48 48 <el-form-item label="HOOK IP" prop="ip">
49   - <el-input v-model="mediaServerForm.hookIp" placeholder="媒体服务HOOK_IP" clearable></el-input>
  49 + <el-input v-model="mediaServerForm.hookIp" placeholder="媒体服务HOOK_IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
50 50 </el-form-item>
51 51 <el-form-item label="SDP IP" prop="ip">
52   - <el-input v-model="mediaServerForm.sdpIp" placeholder="媒体服务SDP_IP" clearable></el-input>
  52 + <el-input v-model="mediaServerForm.sdpIp" placeholder="媒体服务SDP_IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
53 53 </el-form-item>
54 54 <el-form-item label="流IP" prop="ip">
55   - <el-input v-model="mediaServerForm.streamIp" placeholder="媒体服务流IP" clearable></el-input>
  55 + <el-input v-model="mediaServerForm.streamIp" placeholder="媒体服务流IP" clearable :disabled="mediaServerForm.defaultServer"></el-input>
56 56 </el-form-item>
57 57 <el-form-item label="HTTPS PORT" prop="httpSSlPort">
58   - <el-input v-model="mediaServerForm.httpSSlPort" placeholder="媒体服务HTTPS_PORT" clearable></el-input>
  58 + <el-input v-model="mediaServerForm.httpSSlPort" placeholder="媒体服务HTTPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
59 59 </el-form-item>
60 60 <el-form-item label="RTSP PORT" prop="rtspPort">
61   - <el-input v-model="mediaServerForm.rtspPort" placeholder="媒体服务RTSP_PORT" clearable></el-input>
  61 + <el-input v-model="mediaServerForm.rtspPort" placeholder="媒体服务RTSP_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
62 62 </el-form-item>
63 63 <el-form-item label="RTSPS PORT" prop="rtspSSLPort">
64   - <el-input v-model="mediaServerForm.rtspSSLPort" placeholder="媒体服务RTSPS_PORT" clearable></el-input>
  64 + <el-input v-model="mediaServerForm.rtspSSLPort" placeholder="媒体服务RTSPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
65 65 </el-form-item>
66 66  
67 67 </el-form>
... ... @@ -69,36 +69,36 @@
69 69 <el-col :span="12">
70 70 <el-form v-if="currentStep === 2 || currentStep === 3" ref="mediaServerForm2" :rules="rules" :model="mediaServerForm" label-width="180px" >
71 71 <el-form-item label="RTMP PORT" prop="rtmpPort">
72   - <el-input v-model="mediaServerForm.rtmpPort" placeholder="媒体服务RTMP_PORT" clearable></el-input>
  72 + <el-input v-model="mediaServerForm.rtmpPort" placeholder="媒体服务RTMP_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
73 73 </el-form-item>
74 74 <el-form-item label="RTMPS PORT" prop="rtmpSSlPort">
75   - <el-input v-model="mediaServerForm.rtmpSSlPort" placeholder="媒体服务RTMPS_PORT" clearable></el-input>
  75 + <el-input v-model="mediaServerForm.rtmpSSlPort" placeholder="媒体服务RTMPS_PORT" clearable :disabled="mediaServerForm.defaultServer"></el-input>
76 76 </el-form-item>
77 77 <el-form-item label="自动配置媒体服务" >
78   - <el-switch v-model="mediaServerForm.autoConfig"></el-switch>
  78 + <el-switch v-model="mediaServerForm.autoConfig" :disabled="mediaServerForm.defaultServer"></el-switch>
79 79 </el-form-item>
80 80 <el-form-item label="收流端口模式" >
81   - <el-switch active-text="多端口" inactive-text="单端口" v-model="mediaServerForm.rtpEnable"></el-switch>
  81 + <el-switch active-text="多端口" inactive-text="单端口" v-model="mediaServerForm.rtpEnable" :disabled="mediaServerForm.defaultServer"></el-switch>
82 82 </el-form-item>
83 83  
84 84 <el-form-item v-if="!mediaServerForm.rtpEnable" label="收流端口" prop="rtpProxyPort">
85   - <el-input v-model.number="mediaServerForm.rtpProxyPort" clearable></el-input>
  85 + <el-input v-model.number="mediaServerForm.rtpProxyPort" clearable :disabled="mediaServerForm.defaultServer"></el-input>
86 86 </el-form-item>
87 87 <el-form-item v-if="mediaServerForm.rtpEnable" label="收流端口" >
88   - <el-input v-model="rtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1"></el-input>
  88 + <el-input v-model="rtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
89 89 -
90   - <el-input v-model="rtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2"></el-input>
  90 + <el-input v-model="rtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="rtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
91 91 </el-form-item>
92 92 <el-form-item label="推流端口" prop="sendRtpPortRange1">
93   - <el-input v-model="sendRtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange1"></el-input>
  93 + <el-input v-model="sendRtpPortRange1" placeholder="起始" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange1" :disabled="mediaServerForm.defaultServer"></el-input>
94 94 -
95   - <el-input v-model="sendRtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange2"></el-input>
  95 + <el-input v-model="sendRtpPortRange2" placeholder="终止" @change="portRangeChange" clearable style="width: 100px" prop="sendRtpPortRange2" :disabled="mediaServerForm.defaultServer"></el-input>
96 96 </el-form-item>
97 97 <el-form-item label="无人观看多久后停止拉流" >
98   - <el-input v-model.number="mediaServerForm.streamNoneReaderDelayMS" clearable></el-input>
  98 + <el-input v-model.number="mediaServerForm.streamNoneReaderDelayMS" clearable :disabled="mediaServerForm.defaultServer"></el-input>
99 99 </el-form-item>
100 100 <el-form-item label="录像管理服务端口" prop="recordAssistPort">
101   - <el-input v-model.number="mediaServerForm.recordAssistPort">
  101 + <el-input v-model.number="mediaServerForm.recordAssistPort" :disabled="mediaServerForm.defaultServer">
102 102 <!-- <el-button v-if="mediaServerForm.recordAssistPort > 0" slot="append" type="primary" @click="checkRecordServer">测试</el-button>-->
103 103 <el-button v-if="mediaServerForm.recordAssistPort > 0" class="el-icon-check" slot="append" type="primary" @click="checkRecordServer"></el-button>
104 104 </el-input>
... ... @@ -108,8 +108,9 @@
108 108 </el-form-item>
109 109 <el-form-item>
110 110 <div style="float: right;">
111   - <el-button type="primary" @click="onSubmit" >提交</el-button>
112   - <el-button @click="close">取消</el-button>
  111 + <el-button v-if="!mediaServerForm.defaultServer" type="primary" @click="onSubmit" >提交</el-button>
  112 + <el-button v-if="!mediaServerForm.defaultServer" @click="close">取消</el-button>
  113 + <el-button v-if="mediaServerForm.defaultServer" @click="close">关闭</el-button>
113 114 </div>
114 115 </el-form-item>
115 116 </el-form>
... ...