Commit d4ae8194eb87271423aba24bab0f0d815d5ffdc1

Authored by 648540858
1 parent c6e959eb

离在线状态样式修改

修复未回复200ok导致catalog一直发送的bug
修改点播接口未收到视频后回复
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
... ... @@ -3,11 +3,13 @@ package com.genersoft.iot.vmp.common;
3 3 public class StreamInfo {
4 4  
5 5 private String ssrc;
  6 + private String deviceID;
  7 + private String cahnnelId;
6 8 private String flv;
7   - private String WS_FLV;
8   - private String RTMP;
9   - private String HLS;
10   - private String RTSP;
  9 + private String ws_flv;
  10 + private String rtmp;
  11 + private String hls;
  12 + private String rtsp;
11 13  
12 14 public String getSsrc() {
13 15 return ssrc;
... ... @@ -25,35 +27,51 @@ public class StreamInfo {
25 27 this.flv = flv;
26 28 }
27 29  
28   - public String getWS_FLV() {
29   - return WS_FLV;
  30 + public String getWs_flv() {
  31 + return ws_flv;
30 32 }
31 33  
32   - public void setWS_FLV(String WS_FLV) {
33   - this.WS_FLV = WS_FLV;
  34 + public void setWs_flv(String ws_flv) {
  35 + this.ws_flv = ws_flv;
34 36 }
35 37  
36   - public String getRTMP() {
37   - return RTMP;
  38 + public String getRtmp() {
  39 + return rtmp;
38 40 }
39 41  
40   - public void setRTMP(String RTMP) {
41   - this.RTMP = RTMP;
  42 + public void setRtmp(String rtmp) {
  43 + this.rtmp = rtmp;
42 44 }
43 45  
44   - public String getHLS() {
45   - return HLS;
  46 + public String getHls() {
  47 + return hls;
46 48 }
47 49  
48   - public void setHLS(String HLS) {
49   - this.HLS = HLS;
  50 + public void setHls(String hls) {
  51 + this.hls = hls;
50 52 }
51 53  
52   - public String getRTSP() {
53   - return RTSP;
  54 + public String getRtsp() {
  55 + return rtsp;
54 56 }
55 57  
56   - public void setRTSP(String RTSP) {
57   - this.RTSP = RTSP;
  58 + public void setRtsp(String rtsp) {
  59 + this.rtsp = rtsp;
  60 + }
  61 +
  62 + public String getDeviceID() {
  63 + return deviceID;
  64 + }
  65 +
  66 + public void setDeviceID(String deviceID) {
  67 + this.deviceID = deviceID;
  68 + }
  69 +
  70 + public String getCahnnelId() {
  71 + return cahnnelId;
  72 + }
  73 +
  74 + public void setCahnnelId(String cahnnelId) {
  75 + this.cahnnelId = cahnnelId;
58 76 }
59 77 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
... ... @@ -242,14 +242,15 @@ public class SIPCommander implements ISIPCommander {
242 242 StreamInfo streamInfo = new StreamInfo();
243 243 streamInfo.setSsrc(ssrc);
244 244 // String streamId = Integer.toHexString(Integer.parseInt(streamInfo.getSsrc()));
245   - String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); // ZLM 要求大写且首位补零
246   - streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
247   - streamInfo.setWS_FLV(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
248   - streamInfo.setRTMP(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtmpPort(), streamId));
249   - streamInfo.setHLS(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
250   - streamInfo.setRTSP(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtspPort(), streamId));
251   -
252   - storager.startPlay(device.getDeviceId(), channelId, streamInfo);
  245 +// String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); // ZLM 要求大写且首位补零
  246 +// streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  247 +// streamInfo.setWS_FLV(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  248 +// streamInfo.setRTMP(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtmpPort(), streamId));
  249 +// streamInfo.setHLS(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  250 +// streamInfo.setRTSP(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtspPort(), streamId));
  251 + streamInfo.setCahnnelId(channelId);
  252 + streamInfo.setDeviceID(device.getDeviceId());
  253 + storager.startPlay(streamInfo);
253 254 return streamInfo;
254 255 } catch ( SipException | ParseException | InvalidArgumentException e) {
255 256 e.printStackTrace();
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
... ... @@ -210,8 +210,11 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
210 210 msg.setType(DeferredResultHolder.CALLBACK_CMD_CATALOG);
211 211 msg.setData(device);
212 212 deferredResultHolder.invokeResult(msg);
  213 +
  214 + // 回复200
  215 + responseAck(evt);
213 216 }
214   - } catch (DocumentException e) {
  217 + } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
215 218 e.printStackTrace();
216 219 }
217 220 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
1 1 package com.genersoft.iot.vmp.media.zlm;
2 2  
3 3 import java.math.BigInteger;
  4 +import java.text.DecimalFormat;
4 5 import java.util.ArrayList;
5 6 import java.util.List;
6 7  
7 8 import com.alibaba.fastjson.JSON;
8 9 import com.alibaba.fastjson.JSONArray;
  10 +import com.genersoft.iot.vmp.common.StreamInfo;
9 11 import com.genersoft.iot.vmp.conf.MediaServerConfig;
10 12 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
11 13 import com.genersoft.iot.vmp.utils.IpUtil;
... ... @@ -35,7 +37,8 @@ import javax.servlet.http.HttpServletRequest;
35 37 public class ZLMHttpHookListener {
36 38  
37 39 private final static Logger logger = LoggerFactory.getLogger(ZLMHttpHookListener.class);
38   -
  40 +
  41 +
39 42 @Autowired
40 43 private SIPCommander cmder;
41 44  
... ... @@ -54,7 +57,7 @@ public class ZLMHttpHookListener {
54 57 logger.debug("ZLM HOOK on_flow_report API调用,参数:" + json.toString());
55 58 }
56 59 // TODO Auto-generated method stub
57   -
  60 +
58 61  
59 62 JSONObject ret = new JSONObject();
60 63 ret.put("code", 0);
... ... @@ -113,6 +116,21 @@ public class ZLMHttpHookListener {
113 116 if (logger.isDebugEnabled()) {
114 117 logger.debug("ZLM HOOK on_publish API调用,参数:" + json.toString());
115 118 }
  119 + String app = json.getString("app");
  120 + String streamId = json.getString("id");
  121 +// String ssrc = String.format("%10d", Integer.parseInt(streamId, 16)); // ZLM 要求大写且首位补零
  122 + String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
  123 + StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
  124 + if ("rtp".equals(app) && streamInfo != null ) {
  125 + MediaServerConfig mediaInfo = storager.getMediaInfo();
  126 + streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  127 + streamInfo.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  128 + streamInfo.setRtmp(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtmpPort(), streamId));
  129 + streamInfo.setHls(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId));
  130 + streamInfo.setRtsp(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtspPort(), streamId));
  131 + storager.startPlay(streamInfo);
  132 + }
  133 +
116 134 // TODO Auto-generated method stub
117 135  
118 136 JSONObject ret = new JSONObject();
... ... @@ -213,8 +231,18 @@ public class ZLMHttpHookListener {
213 231 if (logger.isDebugEnabled()) {
214 232 logger.debug("ZLM HOOK on_stream_changed API调用,参数:" + json.toString());
215 233 }
216   - // TODO Auto-generated method stub
217   -
  234 + // 流消失移除redis play
  235 + String app = json.getString("app");
  236 + String streamId = json.getString("stream");
  237 + boolean regist = json.getBoolean("regist");
  238 +// String ssrc = String.format("%10d", Integer.parseInt(streamId, 16)); // ZLM 要求大写且首位补零
  239 + String ssrc = new DecimalFormat("0000000000").format(Integer.parseInt(streamId, 16));
  240 + StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
  241 + if ("rtp".equals(app) && !regist ) {
  242 + storager.stopPlay(streamInfo);
  243 + }
  244 +
  245 +
218 246 JSONObject ret = new JSONObject();
219 247 ret.put("code", 0);
220 248 ret.put("msg", "success");
... ...
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
... ... @@ -136,30 +136,24 @@ public interface IVideoManagerStorager {
136 136 /**
137 137 * 开始播放时将流存入
138 138 *
139   - * @param deviceId 设备ID
140   - * @param channelId 通道ID
141 139 * @param stream 流信息
142 140 * @return
143 141 */
144   - public boolean startPlay(String deviceId, String channelId, StreamInfo stream);
  142 + public boolean startPlay(StreamInfo stream);
145 143  
146 144 /**
147 145 * 停止播放时删除
148 146 *
149   - * @param deviceId 设备ID
150   - * @param channelId 通道ID
151 147 * @return
152 148 */
153   - public boolean stopPlay(String deviceId, String channelId);
  149 + public boolean stopPlay(StreamInfo streamInfo);
154 150  
155 151 /**
156 152 * 查找视频流
157 153 *
158   - * @param deviceId 设备ID
159   - * @param channelId 通道ID
160 154 * @return
161 155 */
162   - public StreamInfo queryPlay(String deviceId, String channelId);
  156 + public StreamInfo queryPlay(StreamInfo streamInfo);
163 157  
164 158 /**
165 159 * 查询子设备
... ... @@ -182,4 +176,8 @@ public interface IVideoManagerStorager {
182 176 * @param deviceId
183 177 */
184 178 void cleanChannelsForDevice(String deviceId);
  179 +
  180 + StreamInfo queryPlayBySSRC(String ssrc);
  181 +
  182 + StreamInfo queryPlayByDevice(String deviceId, String code);
185 183 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java
... ... @@ -148,17 +148,12 @@ public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
148 148 }
149 149  
150 150 @Override
151   - public boolean startPlay(String deviceId, String channelId, StreamInfo stream) {
  151 + public boolean stopPlay(StreamInfo streamInfo) {
152 152 return false;
153 153 }
154 154  
155 155 @Override
156   - public boolean stopPlay(String deviceId, String channelId) {
157   - return false;
158   - }
159   -
160   - @Override
161   - public StreamInfo queryPlay(String deviceId, String channelId) {
  156 + public StreamInfo queryPlay(StreamInfo streamInfo) {
162 157 return null;
163 158 }
164 159  
... ... @@ -176,4 +171,19 @@ public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
176 171 public void cleanChannelsForDevice(String deviceId) {
177 172  
178 173 }
  174 +
  175 + @Override
  176 + public boolean startPlay(StreamInfo stream) {
  177 + return false;
  178 + }
  179 +
  180 + @Override
  181 + public StreamInfo queryPlayBySSRC(String ssrc) {
  182 + return null;
  183 + }
  184 +
  185 + @Override
  186 + public StreamInfo queryPlayByDevice(String deviceId, String code) {
  187 + return null;
  188 + }
179 189 }
... ...
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
... ... @@ -329,40 +329,53 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
329 329 /**
330 330 * 开始播放时将流存入redis
331 331 *
332   - * @param deviceId 设备ID
333   - * @param channelId 通道ID
334 332 * @return
335 333 */
336 334 @Override
337   - public boolean startPlay(String deviceId, String channelId, StreamInfo stream) {
338   - return redis.set(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId),
  335 + public boolean startPlay(StreamInfo stream) {
  336 + return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getSsrc(),stream.getDeviceID(), stream.getCahnnelId()),
339 337 stream);
340 338 }
341 339  
342 340 /**
343 341 * 停止播放时从redis删除
344 342 *
345   - * @param deviceId 设备ID
346   - * @param channelId 通道ID
347 343 * @return
348 344 */
349 345 @Override
350   - public boolean stopPlay(String deviceId, String channelId) {
351   - return redis.del(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
  346 + public boolean stopPlay(StreamInfo streamInfo) {
  347 + return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
  348 + streamInfo.getSsrc(),
  349 + streamInfo.getDeviceID(),
  350 + streamInfo.getCahnnelId()));
352 351 }
353 352  
354 353 /**
355 354 * 查询播放列表
356   - * @param deviceId 设备ID
357   - * @param channelId 通道ID
358 355 * @return
359 356 */
360 357 @Override
361   - public StreamInfo queryPlay(String deviceId, String channelId) {
362   - return (StreamInfo)redis.get(String.format("%S_%s_%s", VideoManagerConstants.PLAYER_PREFIX, deviceId, channelId));
  358 + public StreamInfo queryPlay(StreamInfo streamInfo) {
  359 + return (StreamInfo)redis.get(String.format("%S_%s_%s_%s",
  360 + VideoManagerConstants.PLAYER_PREFIX,
  361 + streamInfo.getSsrc(),
  362 + streamInfo.getDeviceID(),
  363 + streamInfo.getCahnnelId()));
  364 + }
  365 + @Override
  366 + public StreamInfo queryPlayBySSRC(String ssrc) {
  367 + List<Object> playLeys = redis.keys(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, ssrc));
  368 + if (playLeys.size() == 0) return null;
  369 + return (StreamInfo)redis.get(playLeys.get(0).toString());
363 370 }
364 371  
365   -
  372 + @Override
  373 + public StreamInfo queryPlayByDevice(String deviceId, String code) {
  374 + List<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
  375 + deviceId,
  376 + code));
  377 + return (StreamInfo)redis.get(playLeys.get(0).toString());
  378 + }
366 379  
367 380 /**
368 381 * 更新流媒体信息
... ... @@ -423,4 +436,7 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
423 436 }
424 437 }
425 438 }
  439 +
  440 +
  441 +
426 442 }
... ...
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
... ... @@ -37,7 +37,18 @@ public class PlayController {
37 37  
38 38 Device device = storager.queryVideoDevice(deviceId);
39 39 StreamInfo streamInfo = cmder.playStreamCmd(device, channelId);
40   -
  40 + // 等待推流, TODO 默认超时15s
  41 +
  42 + long startTime = System.currentTimeMillis();
  43 + while (storager.queryPlay(streamInfo) == null || storager.queryPlay(streamInfo).getFlv() == null) {
  44 + try {
  45 + if (System.currentTimeMillis() - startTime > 15 * 1000)
  46 + Thread.sleep(200);
  47 + } catch (InterruptedException e) {
  48 + e.printStackTrace();
  49 + }
  50 + }
  51 + streamInfo = storager.queryPlay(streamInfo);
41 52 if (logger.isDebugEnabled()) {
42 53 logger.debug(String.format("设备预览 API调用,deviceId:%s ,channelId:%s",deviceId, channelId));
43 54 logger.debug("设备预览 API调用,ssrc:"+streamInfo.getSsrc()+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(streamInfo.getSsrc())));
... ... @@ -55,7 +66,8 @@ public class PlayController {
55 66 public ResponseEntity<String> playStop(@PathVariable String ssrc){
56 67  
57 68 cmder.streamByeCmd(ssrc);
58   -
  69 + StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
  70 + storager.stopPlay(streamInfo);
59 71 if (logger.isDebugEnabled()) {
60 72 logger.debug(String.format("设备预览停止API调用,ssrc:%s", ssrc));
61 73 }
... ...
src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
... ... @@ -70,7 +70,7 @@ public class ApiStreamController {
70 70 return result;
71 71 }
72 72 // 查询是否已经在播放
73   - StreamInfo streamInfo = storager.queryPlay(device.getDeviceId(), code);
  73 + StreamInfo streamInfo = storager.queryPlayByDevice(device.getDeviceId(), code);
74 74 if (streamInfo == null) streamInfo = cmder.playStreamCmd(device, code);
75 75  
76 76 if (logger.isDebugEnabled()) {
... ... @@ -86,10 +86,10 @@ public class ApiStreamController {
86 86 result.put("ChannelName", deviceChannel.getName());
87 87 result.put("ChannelCustomName ", "");
88 88 result.put("FLV ", streamInfo.getFlv());
89   - result.put("WS_FLV ", streamInfo.getWS_FLV());
90   - result.put("RTMP", streamInfo.getRTMP());
91   - result.put("HLS", streamInfo.getHLS());
92   - result.put("RTSP", streamInfo.getRTSP());
  89 + result.put("WS_FLV ", streamInfo.getWs_flv());
  90 + result.put("RTMP", streamInfo.getRtmp());
  91 + result.put("HLS", streamInfo.getHls());
  92 + result.put("RTSP", streamInfo.getRtsp());
93 93 result.put("CDN", "");
94 94 result.put("SnapURL", "");
95 95 result.put("Transport", device.getTransport());
... ... @@ -135,14 +135,14 @@ public class ApiStreamController {
135 135 @RequestParam(required = false)String check_outputs
136 136  
137 137 ){
138   - StreamInfo streamInfo = storager.queryPlay(serial, code);
  138 + StreamInfo streamInfo = storager.queryPlayByDevice(serial, code);
139 139 if (streamInfo == null) {
140 140 JSONObject result = new JSONObject();
141 141 result.put("error","未找到流信息");
142 142 return result;
143 143 }
144 144 cmder.streamByeCmd(streamInfo.getSsrc());
145   - storager.stopPlay(serial, code);
  145 + storager.stopPlay(streamInfo);
146 146 return null;
147 147 }
148 148  
... ... @@ -151,7 +151,6 @@ public class ApiStreamController {
151 151 * @param serial 设备编号
152 152 * @param channel 通道序号
153 153 * @param code 通道国标编号
154   - * @param check_outputs
155 154 * @return
156 155 */
157 156 @RequestMapping(value = "/touch")
... ...
web_src/src/components/channelList.vue
... ... @@ -35,8 +35,16 @@
35 35 </el-table-column>
36 36 <el-table-column prop="subCount" label="子节点数">
37 37 </el-table-column>
38   - <el-table-column prop="ptztypeText" label="云台类型">
39   - </el-table-column>
  38 + <el-table-column label="状态" width="180" align="center">
  39 + <template slot-scope="scope">
  40 + <div slot="reference" class="name-wrapper">
  41 + <el-tag size="medium" v-if="scope.row.status == 1">在线</el-tag>
  42 + <el-tag size="medium" type="info" v-if="scope.row.status == 0">离线</el-tag>
  43 + </div>
  44 + </template>
  45 + </el-table-column>
  46 + <el-table-column prop="ptztypeText" label="云台类型">
  47 + </el-table-column>
40 48 <el-table-column label="操作" width="240" align="center" fixed="right">
41 49 <template slot-scope="scope">
42 50 <el-button size="mini" icon="el-icon-video-play" v-if="scope.row.parental == 0" @click="sendDevicePush(scope.row)">预览视频</el-button>
... ... @@ -58,17 +66,20 @@
58 66  
59 67 </el-main>
60 68 </el-container>
  69 + <Loading v-if="isLoging" marginTop="-50%"></Loading>
61 70 </div>
62 71 </template>
63 72  
64 73 <script>
65 74 import devicePlayer from './gb28181/devicePlayer.vue'
66 75 import uiHeader from './UiHeader.vue'
  76 + import Loading from './Loading.vue'
67 77 export default {
68 78 name: 'channelList',
69 79 components: {
70 80 devicePlayer,
71   - uiHeader
  81 + uiHeader,
  82 + Loading
72 83 },
73 84 data() {
74 85 return {
... ... @@ -85,7 +96,8 @@
85 96 currentPage: parseInt(this.$route.params.page),
86 97 count: parseInt(this.$route.params.count),
87 98 total:0,
88   - beforeUrl:"/videoList"
  99 + beforeUrl:"/videoList",
  100 + isLoging: false
89 101 };
90 102 },
91 103  
... ... @@ -182,7 +194,7 @@
182 194 //通知设备上传媒体流
183 195 sendDevicePush: function(itemData) {
184 196 let deviceId = this.deviceId;
185   -
  197 + this.isLoging = true;
186 198 let channelId = itemData.channelId;
187 199 console.log("通知设备推流1:" + deviceId + " : " + channelId);
188 200 let that = this;
... ... @@ -191,6 +203,7 @@
191 203 url: '/api/play/' + deviceId + '/' + channelId
192 204 }).then(function(res) {
193 205 let ssrc = res.data.ssrc;
  206 + that.isLoging = false
194 207 that.$refs.devicePlayer.play(res.data,deviceId,channelId);
195 208 }).catch(function(e) {
196 209 });
... ...
web_src/src/components/gb28181/devicePlayer.vue
... ... @@ -115,6 +115,7 @@
115 115 deviceId: '',
116 116 channelId: '',
117 117 tabActiveName: 'media'
  118 +
118 119 };
119 120 },
120 121 methods: {
... ...
web_src/src/components/videoList.vue
1 1 <template>
2 2 <div id="app">
3 3 <el-container>
4   -
5 4 <el-header>
6 5 <uiHeader></uiHeader>
7 6 </el-header>
... ... @@ -37,14 +36,15 @@
37 36 <el-table-column label="状态" width="180" align="center">
38 37 <template slot-scope="scope">
39 38 <div slot="reference" class="name-wrapper">
40   - <el-tag size="medium">{{ scope.row.online==1?'在线' :'离线'}}</el-tag>
  39 + <el-tag size="medium" v-if="scope.row.online == 1">在线</el-tag>
  40 + <el-tag size="medium" type="info" v-if="scope.row.online == 0">离线</el-tag>
41 41 </div>
42 42 </template>
43 43 </el-table-column>
44 44  
45 45 <el-table-column label="操作" width="240" align="center" fixed="right">
46 46 <template slot-scope="scope">
47   - <el-button size="mini" icon="el-icon-refresh" @click="refDevice(scope.row)">刷新</el-button>
  47 + <el-button size="mini" icon="el-icon-refresh" @click="refDevice(scope.row)">刷新通道</el-button>
48 48 <el-button size="mini" icon="el-icon-s-open" type="primary" @click="showChannelList(scope.row)">查看通道</el-button>
49 49 </template>
50 50 </el-table-column>
... ...