Commit 8c60311af437f723737552b0bb8057b962ef3ca9
1 parent
ffe68954
update
Showing
24 changed files
with
383 additions
and
204 deletions
pom.xml
| @@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
| 5 | <groupId>com.bsth</groupId> | 5 | <groupId>com.bsth</groupId> |
| 6 | <artifactId>bsth_control</artifactId> | 6 | <artifactId>bsth_control</artifactId> |
| 7 | <version>0.0.1-SNAPSHOT</version> | 7 | <version>0.0.1-SNAPSHOT</version> |
| 8 | - <packaging>jar</packaging> | 8 | + <packaging>war</packaging> |
| 9 | 9 | ||
| 10 | <parent> | 10 | <parent> |
| 11 | <groupId>org.springframework.boot</groupId> | 11 | <groupId>org.springframework.boot</groupId> |
| @@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
| 22 | <dependency> | 22 | <dependency> |
| 23 | <groupId>org.springframework.boot</groupId> | 23 | <groupId>org.springframework.boot</groupId> |
| 24 | <artifactId>spring-boot-starter-tomcat</artifactId> | 24 | <artifactId>spring-boot-starter-tomcat</artifactId> |
| 25 | - <!--<scope>provided</scope>--> | 25 | + <scope>provided</scope> |
| 26 | </dependency> | 26 | </dependency> |
| 27 | 27 | ||
| 28 | <dependency> | 28 | <dependency> |
src/main/java/com/bsth/StartCommand.java
| @@ -93,7 +93,7 @@ public class StartCommand implements CommandLineRunner{ | @@ -93,7 +93,7 @@ public class StartCommand implements CommandLineRunner{ | ||
| 93 | * 每15秒从数据库抓取到离站信息和班次匹配 | 93 | * 每15秒从数据库抓取到离站信息和班次匹配 |
| 94 | * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性) | 94 | * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性) |
| 95 | */ | 95 | */ |
| 96 | - //scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 35, 1200, TimeUnit.SECONDS); | 96 | + scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 35, 1200, TimeUnit.SECONDS); |
| 97 | 97 | ||
| 98 | /** | 98 | /** |
| 99 | * 首个调度指令下发(2分钟运行一次) | 99 | * 首个调度指令下发(2分钟运行一次) |
src/main/java/com/bsth/controller/realcontrol/ScheduleRealInfoController.java
| @@ -15,6 +15,7 @@ import com.bsth.controller.BaseController; | @@ -15,6 +15,7 @@ import com.bsth.controller.BaseController; | ||
| 15 | import com.bsth.entity.realcontrol.ScheduleRealInfo; | 15 | import com.bsth.entity.realcontrol.ScheduleRealInfo; |
| 16 | import com.bsth.security.util.SecurityUtils; | 16 | import com.bsth.security.util.SecurityUtils; |
| 17 | import com.bsth.service.realcontrol.ScheduleRealInfoService; | 17 | import com.bsth.service.realcontrol.ScheduleRealInfoService; |
| 18 | +import com.bsth.service.realcontrol.buffer.GetSchedulePlanThread; | ||
| 18 | import com.bsth.service.realcontrol.buffer.ScheduleBuffer; | 19 | import com.bsth.service.realcontrol.buffer.ScheduleBuffer; |
| 19 | import com.bsth.vehicle.common.CommonMapped; | 20 | import com.bsth.vehicle.common.CommonMapped; |
| 20 | import com.google.common.base.Splitter; | 21 | import com.google.common.base.Splitter; |
| @@ -24,6 +25,9 @@ import com.google.common.base.Splitter; | @@ -24,6 +25,9 @@ import com.google.common.base.Splitter; | ||
| 24 | public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, Long> { | 25 | public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, Long> { |
| 25 | 26 | ||
| 26 | @Autowired | 27 | @Autowired |
| 28 | + GetSchedulePlanThread getSchedulePlanThread; | ||
| 29 | + | ||
| 30 | + @Autowired | ||
| 27 | ScheduleRealInfoService scheduleRealInfoService; | 31 | ScheduleRealInfoService scheduleRealInfoService; |
| 28 | 32 | ||
| 29 | @RequestMapping(value = "/lines") | 33 | @RequestMapping(value = "/lines") |
| @@ -35,8 +39,9 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, | @@ -35,8 +39,9 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, | ||
| 35 | * | 39 | * |
| 36 | * @Title: registerLine @Description: TODO(注册线路,后续才能收到数据推送) @param @param | 40 | * @Title: registerLine @Description: TODO(注册线路,后续才能收到数据推送) @param @param |
| 37 | * lineCodes @throws | 41 | * lineCodes @throws |
| 42 | + * 用GET 防止监控模式下被拦截 | ||
| 38 | */ | 43 | */ |
| 39 | - @RequestMapping(value = "/registerLine", method = RequestMethod.POST) | 44 | + @RequestMapping(value = "/registerLine", method = RequestMethod.GET) |
| 40 | public int registerLine(@RequestParam String lineCodes) { | 45 | public int registerLine(@RequestParam String lineCodes) { |
| 41 | List<String> list = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(lineCodes); | 46 | List<String> list = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(lineCodes); |
| 42 | String userName = SecurityUtils.getCurrentUser().getUserName(); | 47 | String userName = SecurityUtils.getCurrentUser().getUserName(); |
| @@ -253,6 +258,12 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, | @@ -253,6 +258,12 @@ public class ScheduleRealInfoController extends BaseController<ScheduleRealInfo, | ||
| 253 | public Map<String, Object> findRouteByLine(@RequestParam Integer lineId){ | 258 | public Map<String, Object> findRouteByLine(@RequestParam Integer lineId){ |
| 254 | return scheduleRealInfoService.findRouteByLine(lineId); | 259 | return scheduleRealInfoService.findRouteByLine(lineId); |
| 255 | } | 260 | } |
| 261 | + | ||
| 262 | + @RequestMapping(value = "/test/getSch") | ||
| 263 | + public int getSch(){ | ||
| 264 | + getSchedulePlanThread.start(); | ||
| 265 | + return 1; | ||
| 266 | + } | ||
| 256 | 267 | ||
| 257 | /** | 268 | /** |
| 258 | * | 269 | * |
src/main/java/com/bsth/entity/sys/SessionLog.java
0 → 100644
| 1 | +package com.bsth.entity.sys; | ||
| 2 | + | ||
| 3 | +import java.util.Date; | ||
| 4 | + | ||
| 5 | +import javax.persistence.Column; | ||
| 6 | +import javax.persistence.Entity; | ||
| 7 | +import javax.persistence.GeneratedValue; | ||
| 8 | +import javax.persistence.GenerationType; | ||
| 9 | +import javax.persistence.Id; | ||
| 10 | +import javax.persistence.ManyToOne; | ||
| 11 | +import javax.persistence.Table; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * | ||
| 15 | + * @ClassName: SessionLog | ||
| 16 | + * @Description: TODO(session日志) | ||
| 17 | + * @author PanZhao | ||
| 18 | + * @date 2016年7月20日 下午4:46:27 | ||
| 19 | + * | ||
| 20 | + */ | ||
| 21 | +@Entity | ||
| 22 | +@Table(name = "bsth_c_sys_sessionlog") | ||
| 23 | +public class SessionLog { | ||
| 24 | + | ||
| 25 | + @Id | ||
| 26 | + @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 27 | + private Integer id; | ||
| 28 | + | ||
| 29 | + @ManyToOne | ||
| 30 | + private SysUser user; | ||
| 31 | + | ||
| 32 | + /** 登录时间 */ | ||
| 33 | + private Date loginDate; | ||
| 34 | + | ||
| 35 | + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") | ||
| 36 | + private Date createDate; | ||
| 37 | + | ||
| 38 | + /** 登出时间 */ | ||
| 39 | + private Date logoutDate; | ||
| 40 | + | ||
| 41 | + /** 登出方式 0:主动登出, -1:其他 */ | ||
| 42 | + private int logoutType; | ||
| 43 | + | ||
| 44 | + public Integer getId() { | ||
| 45 | + return id; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + public void setId(Integer id) { | ||
| 49 | + this.id = id; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + public SysUser getUser() { | ||
| 53 | + return user; | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + public void setUser(SysUser user) { | ||
| 57 | + this.user = user; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + public Date getLoginDate() { | ||
| 61 | + return loginDate; | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + public void setLoginDate(Date loginDate) { | ||
| 65 | + this.loginDate = loginDate; | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + public Date getCreateDate() { | ||
| 69 | + return createDate; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + public void setCreateDate(Date createDate) { | ||
| 73 | + this.createDate = createDate; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + public Date getLogoutDate() { | ||
| 77 | + return logoutDate; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + public void setLogoutDate(Date logoutDate) { | ||
| 81 | + this.logoutDate = logoutDate; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + public int getLogoutType() { | ||
| 85 | + return logoutType; | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + public void setLogoutType(int logoutType) { | ||
| 89 | + this.logoutType = logoutType; | ||
| 90 | + } | ||
| 91 | +} |
src/main/java/com/bsth/entity/sys/SignControl.java
0 → 100644
| 1 | +package com.bsth.entity.sys; | ||
| 2 | + | ||
| 3 | +import java.util.Date; | ||
| 4 | + | ||
| 5 | +import javax.persistence.Entity; | ||
| 6 | +import javax.persistence.GeneratedValue; | ||
| 7 | +import javax.persistence.GenerationType; | ||
| 8 | +import javax.persistence.Id; | ||
| 9 | +import javax.persistence.ManyToOne; | ||
| 10 | +import javax.persistence.Table; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * | ||
| 14 | + * @ClassName: SignControl | ||
| 15 | + * @Description: TODO(进出线调记录) | ||
| 16 | + * @author PanZhao | ||
| 17 | + * @date 2016年7月20日 下午4:50:50 | ||
| 18 | + * | ||
| 19 | + */ | ||
| 20 | +@Entity | ||
| 21 | +@Table(name = "bsth_c_sys_sign") | ||
| 22 | +public class SignControl { | ||
| 23 | + | ||
| 24 | + @Id | ||
| 25 | + @GeneratedValue(strategy = GenerationType.IDENTITY) | ||
| 26 | + private Integer id; | ||
| 27 | + | ||
| 28 | + /** 登入线调时间 */ | ||
| 29 | + private Date signDate; | ||
| 30 | + | ||
| 31 | + @ManyToOne | ||
| 32 | + private SessionLog session; | ||
| 33 | + | ||
| 34 | +} |
src/main/java/com/bsth/service/realcontrol/buffer/ScheduleBuffer.java
| @@ -93,7 +93,7 @@ public class ScheduleBuffer { | @@ -93,7 +93,7 @@ public class ScheduleBuffer { | ||
| 93 | schedul.syncTime(); | 93 | schedul.syncTime(); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | - //发车时间排序 | 96 | + //发车顺序号排序 |
| 97 | Collections.sort(list, scheduleComparator); | 97 | Collections.sort(list, scheduleComparator); |
| 98 | 98 | ||
| 99 | String zbh; | 99 | String zbh; |
| @@ -184,7 +184,8 @@ public class ScheduleBuffer { | @@ -184,7 +184,8 @@ public class ScheduleBuffer { | ||
| 184 | 184 | ||
| 185 | @Override | 185 | @Override |
| 186 | public int compare(ScheduleRealInfo o1, ScheduleRealInfo o2) { | 186 | public int compare(ScheduleRealInfo o1, ScheduleRealInfo o2) { |
| 187 | - return (int) (o1.getFcsjT() - o2.getFcsjT()); | 187 | + //return (int) (o1.getFcsjT() - o2.getFcsjT()); |
| 188 | + return o1.getFcno() - o2.getFcno(); | ||
| 188 | } | 189 | } |
| 189 | } | 190 | } |
| 190 | 191 |
src/main/java/com/bsth/vehicle/directive/service/DirectiveServiceImpl.java
| @@ -49,7 +49,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> | @@ -49,7 +49,7 @@ public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> | ||
| 49 | 49 | ||
| 50 | SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH点mm分"); | 50 | SimpleDateFormat sdfHHmm = new SimpleDateFormat("HH点mm分"); |
| 51 | 51 | ||
| 52 | - static Long schDiff = 1000 * 60 * 30L; | 52 | + static Long schDiff = 1000 * 60 * 60L; |
| 53 | 53 | ||
| 54 | //城市代码 | 54 | //城市代码 |
| 55 | static final short cityCode = 22; | 55 | static final short cityCode = 22; |
| @@ -84,9 +84,9 @@ public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> | @@ -84,9 +84,9 @@ public class DirectiveServiceImpl extends BaseServiceImpl<Directive60, Integer> | ||
| 84 | Directive60 directive = null; | 84 | Directive60 directive = null; |
| 85 | try { | 85 | try { |
| 86 | //如果发车时间距当前时间较远,则不发送 | 86 | //如果发车时间距当前时间较远,则不发送 |
| 87 | - /*if(Math.abs(sch.getFcsjT() - System.currentTimeMillis()) > schDiff){ | 87 | + if(Math.abs(sch.getFcsjT() - System.currentTimeMillis()) > schDiff){ |
| 88 | return 0; | 88 | return 0; |
| 89 | - }*/ | 89 | + } |
| 90 | 90 | ||
| 91 | String text = "已完成" + finish + "个班次,下一发车时间" + sdfHHmm.format(new Date(sch.getFcsjT())) | 91 | String text = "已完成" + finish + "个班次,下一发车时间" + sdfHHmm.format(new Date(sch.getFcsjT())) |
| 92 | + ",由" + sch.getQdzName() + "发往" + sch.getZdzName(); | 92 | + ",由" + sch.getQdzName() + "发往" + sch.getZdzName(); |
src/main/java/com/bsth/vehicle/directive/thread/FirstScheduleIssuedThread.java
src/main/java/com/bsth/vehicle/gpsdata/service/GpsDataServiceImpl.java
| @@ -129,11 +129,11 @@ public class GpsDataServiceImpl implements GpsDataService{ | @@ -129,11 +129,11 @@ public class GpsDataServiceImpl implements GpsDataService{ | ||
| 129 | //day_of_year | 129 | //day_of_year |
| 130 | Calendar sCal = Calendar.getInstance(); | 130 | Calendar sCal = Calendar.getInstance(); |
| 131 | sCal.setTime(new Date(st * 1000)); | 131 | sCal.setTime(new Date(st * 1000)); |
| 132 | - int sDayOfYear = /*sCal.get(Calendar.DAY_OF_YEAR)*/200; | 132 | + int sDayOfYear = sCal.get(Calendar.DAY_OF_YEAR)/*200*/; |
| 133 | 133 | ||
| 134 | Calendar eCal = Calendar.getInstance(); | 134 | Calendar eCal = Calendar.getInstance(); |
| 135 | eCal.setTime(new Date(et * 1000)); | 135 | eCal.setTime(new Date(et * 1000)); |
| 136 | - int eDayOfYear = /*eCal.get(Calendar.DAY_OF_YEAR)*/200; | 136 | + int eDayOfYear = eCal.get(Calendar.DAY_OF_YEAR)/*200*/; |
| 137 | 137 | ||
| 138 | Calendar weekCal = Calendar.getInstance(); | 138 | Calendar weekCal = Calendar.getInstance(); |
| 139 | 139 | ||
| @@ -189,7 +189,7 @@ public class GpsDataServiceImpl implements GpsDataService{ | @@ -189,7 +189,7 @@ public class GpsDataServiceImpl implements GpsDataService{ | ||
| 189 | inv = inv.substring(0, inv.length() - 1); | 189 | inv = inv.substring(0, inv.length() - 1); |
| 190 | 190 | ||
| 191 | //查询到离站数据 | 191 | //查询到离站数据 |
| 192 | - Map<String, ArrivalInfo> arrivalMap = findArrivalByTs(/*weekOfYear*/30, st, et, inv); | 192 | + Map<String, ArrivalInfo> arrivalMap = findArrivalByTs(weekOfYear/*30*/, st, et, inv); |
| 193 | 193 | ||
| 194 | String sql = "select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE ,STOP_NO from bsth_c_gps_info where days_year=? and device_id in ("+inv+") and ts > ? and ts < ?"; | 194 | String sql = "select DEVICE_ID,LON,LAT,TS,INOUT_STOP,SERVICE_STATE ,STOP_NO from bsth_c_gps_info where days_year=? and device_id in ("+inv+") and ts > ? and ts < ?"; |
| 195 | try{ | 195 | try{ |
src/main/resources/application-dev.properties
| @@ -8,9 +8,9 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy | @@ -8,9 +8,9 @@ spring.jpa.hibernate.naming_strategy= org.hibernate.cfg.ImprovedNamingStrategy | ||
| 8 | spring.jpa.database= MYSQL | 8 | spring.jpa.database= MYSQL |
| 9 | spring.jpa.show-sql= true | 9 | spring.jpa.show-sql= true |
| 10 | spring.datasource.driver-class-name= com.mysql.jdbc.Driver | 10 | spring.datasource.driver-class-name= com.mysql.jdbc.Driver |
| 11 | -spring.datasource.url= jdbc:mysql://192.168.168.201:3306/control | 11 | +spring.datasource.url= jdbc:mysql://127.0.0.1:3306/control |
| 12 | spring.datasource.username= root | 12 | spring.datasource.username= root |
| 13 | -spring.datasource.password= 123456 | 13 | +spring.datasource.password= panzhao |
| 14 | #DATASOURCE | 14 | #DATASOURCE |
| 15 | spring.datasource.max-active=100 | 15 | spring.datasource.max-active=100 |
| 16 | spring.datasource.max-idle=8 | 16 | spring.datasource.max-idle=8 |
| @@ -25,6 +25,6 @@ spring.datasource.validation-query=select 1 | @@ -25,6 +25,6 @@ spring.datasource.validation-query=select 1 | ||
| 25 | 25 | ||
| 26 | ## | 26 | ## |
| 27 | ##\u5B9E\u65F6gps | 27 | ##\u5B9E\u65F6gps |
| 28 | -http.gps.real.url= http://192.168.168.171:8080/transport_server/rtgps/ | 28 | +http.gps.real.url= http://192.168.168.201:8080/transport_server/rtgps/ |
| 29 | ##\u6D88\u606F\u4E0B\u53D1 | 29 | ##\u6D88\u606F\u4E0B\u53D1 |
| 30 | -http.send.directive = http://192.168.168.171:8080/transport_server/message/ | 30 | +http.send.directive = http://192.168.168.201:8080/transport_server/message/ |
src/main/resources/static/assets/js/common.js
| @@ -24,6 +24,7 @@ function successHandle(json, handle){ | @@ -24,6 +24,7 @@ function successHandle(json, handle){ | ||
| 24 | var status = json.status; | 24 | var status = json.status; |
| 25 | if(status == 407){ | 25 | if(status == 407){ |
| 26 | alert('被注销的登录'); | 26 | alert('被注销的登录'); |
| 27 | + location.reload(true); | ||
| 27 | return; | 28 | return; |
| 28 | } | 29 | } |
| 29 | 30 |
src/main/resources/static/login.html
| @@ -94,7 +94,7 @@ Login page | @@ -94,7 +94,7 @@ Login page | ||
| 94 | 94 | ||
| 95 | <div class="input-icon right" style="display: inline-block;"> | 95 | <div class="input-icon right" style="display: inline-block;"> |
| 96 | <i class="fa fa-key"></i> | 96 | <i class="fa fa-key"></i> |
| 97 | - <input type="password" class="form-control " placeholder="密码" name="password" value="admin"> </div> | 97 | + <input type="password" class="form-control " placeholder="密码" name="password" value="" > </div> |
| 98 | | 98 | |
| 99 | <button type="submit" class="btn blue buttonLogin" style="border-radius: 5px !important; | 99 | <button type="submit" class="btn blue buttonLogin" style="border-radius: 5px !important; |
| 100 | font-family: 微软雅黑;">登 录</button> | 100 | font-family: 微软雅黑;">登 录</button> |
| @@ -112,6 +112,7 @@ Login page | @@ -112,6 +112,7 @@ Login page | ||
| 112 | 112 | ||
| 113 | <script type="text/javascript"> | 113 | <script type="text/javascript"> |
| 114 | $(function() { | 114 | $(function() { |
| 115 | + $('input[name=password]').focus(); | ||
| 115 | /* setCenterCss(); */ | 116 | /* setCenterCss(); */ |
| 116 | if ($.url().param('error')) { | 117 | if ($.url().param('error')) { |
| 117 | //去session里查一下失败信息 | 118 | //去session里查一下失败信息 |
src/main/resources/static/pages/control/line/css/lineControl.css
| 1 | +.portlet.light > .portlet-title.banner{ | ||
| 2 | + padding: 17px 20px 0px 20px; | ||
| 3 | + border-bottom: none; | ||
| 4 | + margin-bottom: 0; | ||
| 5 | + padding-bottom: 5px; | ||
| 6 | +} | ||
| 7 | +.portlet-fullscreen.monitor #top-tabs-wrap .nav-tabs, | ||
| 8 | +.portlet.light.monitor > .portlet-title.banner{ | ||
| 9 | + background: linear-gradient(to right ,#595959, #7b7b7b,#595959); | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +.portlet.light.main > .portlet-title.banner, | ||
| 13 | +.portlet-fullscreen.main #top-tabs-wrap .nav-tabs{ | ||
| 14 | + background: linear-gradient(to right ,#082F4A, #125688,#0a3f64); | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +.portlet-fullscreen.portlet.light.monitor .nav-tabs > li > a:hover{ | ||
| 18 | + background: #656565; | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +.portlet-fullscreen.portlet.light.monitor .nav-tabs>li.active>a{ | ||
| 22 | + background: #FFFFFF; | ||
| 23 | +} | ||
| 24 | + | ||
| 1 | .load-anim{ | 25 | .load-anim{ |
| 2 | position: fixed;z-index: 9999999;width: 100%;height: 100%; | 26 | position: fixed;z-index: 9999999;width: 100%;height: 100%; |
| 3 | background: rgba(8, 47, 74, 0.89);top: 0;left: 0; | 27 | background: rgba(8, 47, 74, 0.89);top: 0;left: 0; |
| @@ -2280,6 +2304,13 @@ tr._tr_active.active-line-no .out-badge{ | @@ -2280,6 +2304,13 @@ tr._tr_active.active-line-no .out-badge{ | ||
| 2280 | background-color: #5d5da9 !important; | 2304 | background-color: #5d5da9 !important; |
| 2281 | } | 2305 | } |
| 2282 | 2306 | ||
| 2307 | + | ||
| 2283 | .pb-table tr.selected.dir_1{ | 2308 | .pb-table tr.selected.dir_1{ |
| 2284 | background-color: #dc5a5a !important; | 2309 | background-color: #dc5a5a !important; |
| 2310 | +} | ||
| 2311 | + | ||
| 2312 | +#tab_home .tab-pane .row.card_wrap:last-child .line_chart, | ||
| 2313 | +#tab_home .tab-pane .row.card_wrap:last-child .col-lg-2 { | ||
| 2314 | + border-bottom: 1px solid #DADADA; | ||
| 2315 | + border-bottom: 1px solid #DADADA; | ||
| 2285 | } | 2316 | } |
| 2286 | \ No newline at end of file | 2317 | \ No newline at end of file |
src/main/resources/static/pages/control/line/index.html
| @@ -8,13 +8,13 @@ | @@ -8,13 +8,13 @@ | ||
| 8 | 8 | ||
| 9 | <div class="portlet light portlet-fullscreen" style="transition: all .5s ease;padding: 0;" oncontextmenu=self.event.returnValue=false> | 9 | <div class="portlet light portlet-fullscreen" style="transition: all .5s ease;padding: 0;" oncontextmenu=self.event.returnValue=false> |
| 10 | 10 | ||
| 11 | - <div class="portlet-title" style="padding: 17px 20px 0px 20px;border-bottom: none;margin-bottom: 0;background: linear-gradient(to right ,#082F4A, #125688,#0a3f64);padding-bottom: 5px;"> | 11 | + <div class="portlet-title banner" > |
| 12 | <div class="caption col_hide_1280" style="color: #FFF;"> | 12 | <div class="caption col_hide_1280" style="color: #FFF;"> |
| 13 | <i class="fa fa-life-ring" style="font-size: 22px;color: #FFF;"></i> <span | 13 | <i class="fa fa-life-ring" style="font-size: 22px;color: #FFF;"></i> <span |
| 14 | class="caption-subject bold" style="font-size: 24px;">闵行公交线路调度系统</span> | 14 | class="caption-subject bold" style="font-size: 24px;">闵行公交线路调度系统</span> |
| 15 | </div> | 15 | </div> |
| 16 | <div class="col_hide_1440" style="color: white;font-size: 18px;position: absolute;right: 25px;top: 75px;"> | 16 | <div class="col_hide_1440" style="color: white;font-size: 18px;position: absolute;right: 25px;top: 75px;"> |
| 17 | - <span class="top_username"></span>,在线! | 17 | + <span class="top_username"></span> <span class="operation_mode_text animated" ></span> |
| 18 | </div> | 18 | </div> |
| 19 | <div class="actions col_hide_1280" > | 19 | <div class="actions col_hide_1280" > |
| 20 | <div class="btn-group"> | 20 | <div class="btn-group"> |
| @@ -64,7 +64,7 @@ | @@ -64,7 +64,7 @@ | ||
| 64 | </div> | 64 | </div> |
| 65 | 65 | ||
| 66 | <button id="exitBtn" type="button" class="btn btn-danger" style="margin-left: 8px;padding: 6.5px 9px !important;" > | 66 | <button id="exitBtn" type="button" class="btn btn-danger" style="margin-left: 8px;padding: 6.5px 9px !important;" > |
| 67 | - <i class="fa fa-close" ></i> 退出系统</button> | 67 | + <!-- <i class="fa fa-close" ></i> -->退出线路调度</button> |
| 68 | </div> | 68 | </div> |
| 69 | </div> | 69 | </div> |
| 70 | </div> | 70 | </div> |
| @@ -237,13 +237,29 @@ var lineCodes = '' //全部线路编码字符串,由data.js初始化 | @@ -237,13 +237,29 @@ var lineCodes = '' //全部线路编码字符串,由data.js初始化 | ||
| 237 | ,animationend = 'webkitAnimationEnd animationend'; | 237 | ,animationend = 'webkitAnimationEnd animationend'; |
| 238 | moment.locale('zh-cn'); | 238 | moment.locale('zh-cn'); |
| 239 | 239 | ||
| 240 | -var cUser; | 240 | +var cUser |
| 241 | + , storage = window.localStorage | ||
| 242 | + , operationMode = storage.getItem('operationMode'); | ||
| 243 | + | ||
| 241 | //当前用户 | 244 | //当前用户 |
| 242 | $.get('/user/currentUser', function(user){ | 245 | $.get('/user/currentUser', function(user){ |
| 243 | cUser = user; | 246 | cUser = user; |
| 244 | - $('.portlet-fullscreen .top_username').text(cUser.userName); | 247 | + $('.portlet-fullscreen .top_username').text(cUser.userName) |
| 248 | + var t = operationMode == 0?',<abbr title="系统将对当前的提交请求进行拦截">监控模式</abbr> 在线' | ||
| 249 | + :',主调模式 在线'; | ||
| 250 | + $('.portlet-fullscreen .operation_mode_text').html(t); | ||
| 245 | }); | 251 | }); |
| 252 | + | ||
| 253 | +//打个标记 | ||
| 254 | +storage.setItem('real_control_flag', 1); | ||
| 255 | + | ||
| 246 | $(function() { | 256 | $(function() { |
| 257 | + //主调和监控模式横幅颜色 | ||
| 258 | + if(operationMode == 0) | ||
| 259 | + $('.portlet-fullscreen').addClass('monitor'); | ||
| 260 | + else | ||
| 261 | + $('.portlet-fullscreen').addClass('main'); | ||
| 262 | + | ||
| 247 | //加载模板文件 | 263 | //加载模板文件 |
| 248 | getTemp('temps/home_tp.html'); | 264 | getTemp('temps/home_tp.html'); |
| 249 | getTemp('temps/tooltip_tp.html'); | 265 | getTemp('temps/tooltip_tp.html'); |
src/main/resources/static/pages/control/line/js/data.js
| @@ -29,7 +29,8 @@ var _data = (function(){ | @@ -29,7 +29,8 @@ var _data = (function(){ | ||
| 29 | var carDeviceIdMapp = {}; | 29 | var carDeviceIdMapp = {}; |
| 30 | 30 | ||
| 31 | var fcsjSort = function(a, b){ | 31 | var fcsjSort = function(a, b){ |
| 32 | - return a.fcsjT - b.fcsjT; | 32 | + //return a.fcsjT - b.fcsjT; |
| 33 | + return a.fcno - b.fcno; | ||
| 33 | } | 34 | } |
| 34 | 35 | ||
| 35 | var dataObject = { | 36 | var dataObject = { |
| @@ -132,7 +133,7 @@ var _data = (function(){ | @@ -132,7 +133,7 @@ var _data = (function(){ | ||
| 132 | } | 133 | } |
| 133 | //查询站点路由 | 134 | //查询站点路由 |
| 134 | ,queryStationRoute : function(lineId,container, cb, width){ | 135 | ,queryStationRoute : function(lineId,container, cb, width){ |
| 135 | - $get('/stationroute/all', {'line.lineCode_eq': lineId}, function(routes){ | 136 | + $get('/stationroute/all', {'line.lineCode_eq': lineId, 'destroy_eq': 0}, function(routes){ |
| 136 | var svgData = analyData(routes); | 137 | var svgData = analyData(routes); |
| 137 | cb && cb(lineId, svgData, container, width); | 138 | cb && cb(lineId, svgData, container, width); |
| 138 | }); | 139 | }); |
| @@ -165,9 +166,7 @@ var _data = (function(){ | @@ -165,9 +166,7 @@ var _data = (function(){ | ||
| 165 | }); | 166 | }); |
| 166 | 167 | ||
| 167 | //按发车时间排序 | 168 | //按发车时间排序 |
| 168 | - list.sort(function(a, b){ | ||
| 169 | - return a.fcsjT - b.fcsjT; | ||
| 170 | - }); | 169 | + list.sort(fcsjSort); |
| 171 | } | 170 | } |
| 172 | cb && cb(rs); | 171 | cb && cb(rs); |
| 173 | }); | 172 | }); |
src/main/resources/static/pages/control/line/js/main.js
| @@ -6,6 +6,10 @@ | @@ -6,6 +6,10 @@ | ||
| 6 | icon : 3, | 6 | icon : 3, |
| 7 | skin : 'layui-layer-cfm-delete' | 7 | skin : 'layui-layer-cfm-delete' |
| 8 | }, function(){ | 8 | }, function(){ |
| 9 | + //清除标记 | ||
| 10 | + storage.removeItem('real_control_flag'); | ||
| 11 | + //解绑事件 | ||
| 12 | + $(document).unbind('ajaxSend', interceptPOST); | ||
| 9 | layer.closeAll(); | 13 | layer.closeAll(); |
| 10 | window.location.href = '/pages/control/lineallot/allot.html'; | 14 | window.location.href = '/pages/control/lineallot/allot.html'; |
| 11 | }); | 15 | }); |
| @@ -112,8 +116,19 @@ setTimeout(function(){ | @@ -112,8 +116,19 @@ setTimeout(function(){ | ||
| 112 | homeObject.init(); | 116 | homeObject.init(); |
| 113 | }); | 117 | }); |
| 114 | 118 | ||
| 119 | + //监控模式下,拦截post请求 | ||
| 120 | + if(operationMode == 0){ | ||
| 121 | + $(document).on('ajaxSend', interceptPOST); | ||
| 122 | + } | ||
| 115 | }, 200) | 123 | }, 200) |
| 116 | 124 | ||
| 125 | + function interceptPOST(e, xhr, t){ | ||
| 126 | + if(t && (t.method == 'POST' || t.type == 'POST')){ | ||
| 127 | + console.log(e, xhr, t); | ||
| 128 | + xhr.abort(); | ||
| 129 | + layer.msg('监控模式!',{offset: 'ct', shift : 6}); | ||
| 130 | + } | ||
| 131 | + } | ||
| 117 | 132 | ||
| 118 | function gpslistToMap(gpslist){ | 133 | function gpslistToMap(gpslist){ |
| 119 | var map = {} | 134 | var map = {} |
src/main/resources/static/pages/control/line/js/webSocketHandle.js
| @@ -5,7 +5,7 @@ var reqCodeMap = {0xA1: '请求æ¢å¤è¿è¥', 0xA2: '申请调档', 0xA3: 'å‡ºåœ | @@ -5,7 +5,7 @@ var reqCodeMap = {0xA1: '请求æ¢å¤è¿è¥', 0xA2: '申请调档', 0xA3: 'å‡ºåœ | ||
| 5 | 5 | ||
| 6 | //将当å‰ç”¨æˆ·å’Œçº¿è·¯ç»‘定到åŽå° | 6 | //将当å‰ç”¨æˆ·å’Œçº¿è·¯ç»‘定到åŽå° |
| 7 | setTimeout(function(){ | 7 | setTimeout(function(){ |
| 8 | - $.post('/realSchedule/registerLine', {lineCodes: lineCodes} | 8 | + $.get('/realSchedule/registerLine', {lineCodes: lineCodes} |
| 9 | ,function(rs){ | 9 | ,function(rs){ |
| 10 | if(rs == 0){ | 10 | if(rs == 0){ |
| 11 | console.log('注册线路æˆåŠŸï¼'); | 11 | console.log('注册线路æˆåŠŸï¼'); |
src/main/resources/static/pages/control/line/temps/home_tp.html
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | <div class="col-lg-2 "> | 8 | <div class="col-lg-2 "> |
| 9 | 9 | ||
| 10 | <div class="title"> | 10 | <div class="title"> |
| 11 | - 发往{{lineObj.startStationName}}方向 <span class="up-number" id="{{lineObj.lineCode}}_0_badge"> 0 </span> | 11 | + 发往{{lineObj.endStationName}}方向 <span class="up-number" id="{{lineObj.lineCode}}_0_badge"> 0 </span> |
| 12 | <div class="help_text dropdown"> | 12 | <div class="help_text dropdown"> |
| 13 | <!--<span class=" blue dropdown-toggle col_hide_1440" | 13 | <!--<span class=" blue dropdown-toggle col_hide_1440" |
| 14 | data-toggle="dropdown" aria-expanded="true" | 14 | data-toggle="dropdown" aria-expanded="true" |
| @@ -59,7 +59,7 @@ | @@ -59,7 +59,7 @@ | ||
| 59 | <div class="col-lg-2 down"> | 59 | <div class="col-lg-2 down"> |
| 60 | 60 | ||
| 61 | <div class="title"> | 61 | <div class="title"> |
| 62 | - 发往{{lineObj.endStationName}}方向 <span class="down-number" id="{{lineObj.lineCode}}_1_badge"> 0 </span> | 62 | + 发往{{lineObj.startStationName}}方向 <span class="down-number" id="{{lineObj.lineCode}}_1_badge"> 0 </span> |
| 63 | <div class="help_text dropdown"> | 63 | <div class="help_text dropdown"> |
| 64 | <!--<span class=" blue dropdown-toggle col_hide_1440" | 64 | <!--<span class=" blue dropdown-toggle col_hide_1440" |
| 65 | data-toggle="dropdown" aria-expanded="true" | 65 | data-toggle="dropdown" aria-expanded="true" |
src/main/resources/static/pages/control/lineallot/allot.html
| @@ -78,12 +78,42 @@ | @@ -78,12 +78,42 @@ | ||
| 78 | font-family: 仿宋; | 78 | font-family: 仿宋; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | -.selected a{ | 81 | +/* .selected a{ |
| 82 | position: absolute; | 82 | position: absolute; |
| 83 | bottom: 20px; | 83 | bottom: 20px; |
| 84 | } | 84 | } |
| 85 | .selected a.btn{ | 85 | .selected a.btn{ |
| 86 | bottom: 10px; | 86 | bottom: 10px; |
| 87 | +} */ | ||
| 88 | + | ||
| 89 | +.lb_panel{ | ||
| 90 | + position: absolute; | ||
| 91 | + bottom: 20px; | ||
| 92 | +} | ||
| 93 | + | ||
| 94 | +.lb_panel a{ | ||
| 95 | + margin-right: 5px; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +.gotoControl.red{ | ||
| 99 | + background: #ec7b7b; | ||
| 100 | + border-color: #ec7b7b; | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +.gotoControl.red:hover{ | ||
| 104 | + background: #d96262; | ||
| 105 | + border-color: #d96262; | ||
| 106 | +} | ||
| 107 | + | ||
| 108 | +#resetBtn,#historyBtn{ | ||
| 109 | + vertical-align: bottom; | ||
| 110 | + display: inline-block; | ||
| 111 | + margin-bottom: 3px; | ||
| 112 | +} | ||
| 113 | + | ||
| 114 | +/** 闵行没有分公司,直接隐藏 */ | ||
| 115 | +.company,.sub-company{ | ||
| 116 | + display: none !important; | ||
| 87 | } | 117 | } |
| 88 | </style> | 118 | </style> |
| 89 | 119 | ||
| @@ -118,9 +148,8 @@ | @@ -118,9 +148,8 @@ | ||
| 118 | <input type="text" id="searchLineInput" class="form-control input-lg" placeholder="搜索线路"> </div> | 148 | <input type="text" id="searchLineInput" class="form-control input-lg" placeholder="搜索线路"> </div> |
| 119 | </div> | 149 | </div> |
| 120 | </div> | 150 | </div> |
| 121 | - | ||
| 122 | <div class="line-select-cont col-md-12" > | 151 | <div class="line-select-cont col-md-12" > |
| 123 | - <div class="line-select-body"> | 152 | + <div class="line-select-body" style="margin-top: 20px;"> |
| 124 | <span class="load-text">加载中...</span> | 153 | <span class="load-text">加载中...</span> |
| 125 | </div> | 154 | </div> |
| 126 | </div> | 155 | </div> |
| @@ -130,15 +159,19 @@ | @@ -130,15 +159,19 @@ | ||
| 130 | <h5 style="font-family: 仿宋; display: block;">已选中线路</h5> | 159 | <h5 style="font-family: 仿宋; display: block;">已选中线路</h5> |
| 131 | <div class="selected-body"></div> | 160 | <div class="selected-body"></div> |
| 132 | 161 | ||
| 133 | - <a href="javascript:;" id="gotoControl" class="btn btn-lg blue" > | ||
| 134 | - <i class="fa fa-check"></i> 确定 </a> | ||
| 135 | - | ||
| 136 | - | ||
| 137 | - <a href="javascript:;" id="resetBtn" style="left: 120px;color: #3598DC;"> | ||
| 138 | - <i class="fa fa-history"></i> 重置</a> | ||
| 139 | - | ||
| 140 | - <a href="javascript:;" id="historyBtn" style="left: 180px;color: #f36a5a;"> | ||
| 141 | - <i class="fa fa-history"></i> 历史纪录 </a> | 162 | + <div class="lb_panel"> |
| 163 | + <a href="javascript:;" class="btn btn-lg blue gotoControl red" data-status=1> | ||
| 164 | + <i class="fa fa-power-off"></i> 主调模式 </a> | ||
| 165 | + | ||
| 166 | + <a href="javascript:;" id="monitor" class="btn btn-lg grey gotoControl" data-status=0> | ||
| 167 | + <i class="fa fa-tv"></i> 监控模式 </a> | ||
| 168 | + | ||
| 169 | + <a href="javascript:;" id="resetBtn" style="left: 120px;color: #3598DC;"> | ||
| 170 | + <i class="fa fa-history"></i> 重置</a> | ||
| 171 | + | ||
| 172 | + <a href="javascript:;" id="historyBtn" style="left: 180px;color: #f36a5a;"> | ||
| 173 | + <i class="fa fa-history"></i> 历史纪录 </a> | ||
| 174 | + </div> | ||
| 142 | </div> | 175 | </div> |
| 143 | </div> | 176 | </div> |
| 144 | </div> | 177 | </div> |
| @@ -254,7 +287,7 @@ $(function(){ | @@ -254,7 +287,7 @@ $(function(){ | ||
| 254 | }); | 287 | }); |
| 255 | 288 | ||
| 256 | //确定 | 289 | //确定 |
| 257 | - $('#gotoControl').on('click', function(){ | 290 | + $('.gotoControl').on('click', function(){ |
| 258 | var lines = $('.selected-body .line'); | 291 | var lines = $('.selected-body .line'); |
| 259 | if(lines.length == 0){ | 292 | if(lines.length == 0){ |
| 260 | layer.alert('你还没有选择线路!',{icon: 3}); | 293 | layer.alert('你还没有选择线路!',{icon: 3}); |
| @@ -268,6 +301,8 @@ $(function(){ | @@ -268,6 +301,8 @@ $(function(){ | ||
| 268 | lsData.push(lineIdMap[$(e).data('id')]); | 301 | lsData.push(lineIdMap[$(e).data('id')]); |
| 269 | }); | 302 | }); |
| 270 | storage.setItem('lineControlItems', JSON.stringify(lsData)); | 303 | storage.setItem('lineControlItems', JSON.stringify(lsData)); |
| 304 | + //监控模式还是主调模式 | ||
| 305 | + storage.setItem('operationMode', $(this).data('status')); | ||
| 271 | //将线路路由缓存到localstorage | 306 | //将线路路由缓存到localstorage |
| 272 | cacheRoute(lsData, function(cacheData){ | 307 | cacheRoute(lsData, function(cacheData){ |
| 273 | for(var lineCode in cacheData){ | 308 | for(var lineCode in cacheData){ |
src/main/resources/static/pages/mapmonitor/real/css/real.css
| @@ -87,11 +87,22 @@ label.BMapLabel{ | @@ -87,11 +87,22 @@ label.BMapLabel{ | ||
| 87 | 87 | ||
| 88 | .mapRightWrap.to_playBack{ | 88 | .mapRightWrap.to_playBack{ |
| 89 | transform:rotateY(180deg); | 89 | transform:rotateY(180deg); |
| 90 | - height: 476px; | ||
| 91 | - width: 390px | 90 | + min-height: 454px; |
| 91 | + width: 390px; | ||
| 92 | + height: auto; | ||
| 92 | } | 93 | } |
| 93 | 94 | ||
| 94 | -.mapRightWrap.to_playBack .alert{ | 95 | +.mapRightWrap.playBack{ |
| 96 | + min-height: 454px; | ||
| 97 | + width: 390px; | ||
| 98 | + height: auto; | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +/* .mapRightWrap.playBack form select{ | ||
| 102 | + width: 100%; | ||
| 103 | +} */ | ||
| 104 | + | ||
| 105 | +.mapRightWrap.playBack .alert{ | ||
| 95 | font-size: 13px; | 106 | font-size: 13px; |
| 96 | margin-top: 1px; | 107 | margin-top: 1px; |
| 97 | width: calc(100% - 2px); | 108 | width: calc(100% - 2px); |
| @@ -107,6 +118,7 @@ label.BMapLabel{ | @@ -107,6 +118,7 @@ label.BMapLabel{ | ||
| 107 | .mapRightWrap.search{ | 118 | .mapRightWrap.search{ |
| 108 | height: 47px; | 119 | height: 47px; |
| 109 | padding-top: 0; | 120 | padding-top: 0; |
| 121 | + background-color: #626775 !important; | ||
| 110 | } | 122 | } |
| 111 | 123 | ||
| 112 | .playBack form{ | 124 | .playBack form{ |
| @@ -631,22 +643,22 @@ html{ | @@ -631,22 +643,22 @@ html{ | ||
| 631 | } | 643 | } |
| 632 | 644 | ||
| 633 | .play-back-list{ | 645 | .play-back-list{ |
| 634 | - display: none; | 646 | +display: none; |
| 635 | position: absolute; | 647 | position: absolute; |
| 636 | width: 295px; | 648 | width: 295px; |
| 637 | right: 5px; | 649 | right: 5px; |
| 638 | - background: linear-gradient(to right ,#0d4770,#0a3f64); | ||
| 639 | z-index: 9999; | 650 | z-index: 9999; |
| 640 | - | ||
| 641 | height: calc(100% - 50px); | 651 | height: calc(100% - 50px); |
| 642 | top: 25px; | 652 | top: 25px; |
| 643 | padding: 15px 7px 3px; | 653 | padding: 15px 7px 3px; |
| 654 | + background: white; | ||
| 655 | + border-radius: 5px !important; | ||
| 644 | } | 656 | } |
| 645 | 657 | ||
| 646 | .progress-wrap{ | 658 | .progress-wrap{ |
| 647 | width: calc(100% - 340px); | 659 | width: calc(100% - 340px); |
| 648 | height: 10px; | 660 | height: 10px; |
| 649 | - bottom: 20px; | 661 | + bottom: 33px; |
| 650 | left: 20px; | 662 | left: 20px; |
| 651 | position: absolute; | 663 | position: absolute; |
| 652 | display: none; | 664 | display: none; |
| @@ -688,7 +700,7 @@ html{ | @@ -688,7 +700,7 @@ html{ | ||
| 688 | height: 44px; | 700 | height: 44px; |
| 689 | position: absolute; | 701 | position: absolute; |
| 690 | right: 320px; | 702 | right: 320px; |
| 691 | - bottom: 40px; | 703 | + bottom: 58px; |
| 692 | padding: 9px 0 0 25px; | 704 | padding: 9px 0 0 25px; |
| 693 | border-radius: 15px !important; | 705 | border-radius: 15px !important; |
| 694 | } | 706 | } |
| @@ -720,13 +732,11 @@ html{ | @@ -720,13 +732,11 @@ html{ | ||
| 720 | } | 732 | } |
| 721 | 733 | ||
| 722 | .pback-logs{ | 734 | .pback-logs{ |
| 723 | - height: 100%; | ||
| 724 | - width: 100%; | ||
| 725 | - color: #e1e1e1; | 735 | + color: #333333; |
| 726 | } | 736 | } |
| 727 | .pback-logs-item{ | 737 | .pback-logs-item{ |
| 728 | padding: 8px 12px; | 738 | padding: 8px 12px; |
| 729 | - border-bottom: 1px dashed #5a5a5a; | 739 | + border-bottom: 1px dashed #d2d2d2; |
| 730 | } | 740 | } |
| 731 | 741 | ||
| 732 | .pback-logs-item-date{ | 742 | .pback-logs-item-date{ |
| @@ -742,19 +752,20 @@ html{ | @@ -742,19 +752,20 @@ html{ | ||
| 742 | } | 752 | } |
| 743 | 753 | ||
| 744 | .progress-mark-info{ | 754 | .progress-mark-info{ |
| 745 | - position: absolute; | 755 | + position: absolute; |
| 746 | width: 62px; | 756 | width: 62px; |
| 747 | - height: 30px; | 757 | + height: 27px; |
| 748 | z-index: 10000; | 758 | z-index: 10000; |
| 749 | background: #1bbc9b; | 759 | background: #1bbc9b; |
| 750 | display: none; | 760 | display: none; |
| 751 | - top: -35px; | ||
| 752 | - padding: 5px 3px; | 761 | + top: -30px; |
| 762 | + padding: 4px 3px; | ||
| 753 | color: white; | 763 | color: white; |
| 754 | } | 764 | } |
| 755 | 765 | ||
| 756 | #progress-mark-time{ | 766 | #progress-mark-time{ |
| 757 | /* transition: all 1s ease; */ | 767 | /* transition: all 1s ease; */ |
| 768 | + top: 12px; | ||
| 758 | } | 769 | } |
| 759 | 770 | ||
| 760 | #progress-mark-time-mouse{ | 771 | #progress-mark-time-mouse{ |
src/main/resources/static/pages/mapmonitor/real/js/playBack.js
| @@ -34,7 +34,6 @@ var playBack = (function() { | @@ -34,7 +34,6 @@ var playBack = (function() { | ||
| 34 | var lineRoute; | 34 | var lineRoute; |
| 35 | //默认以第一辆车为焦点 | 35 | //默认以第一辆车为焦点 |
| 36 | var firstCar; | 36 | var firstCar; |
| 37 | - //S0I-058,S0I-055 ,隧道六线 | ||
| 38 | 37 | ||
| 39 | function getCurrMap(){ | 38 | function getCurrMap(){ |
| 40 | return realMap[realMap.getMap().fName]; | 39 | return realMap[realMap.getMap().fName]; |
| @@ -79,6 +78,7 @@ var playBack = (function() { | @@ -79,6 +78,7 @@ var playBack = (function() { | ||
| 79 | getCurrMap().clear(); | 78 | getCurrMap().clear(); |
| 80 | //坐标归0 | 79 | //坐标归0 |
| 81 | cIndex = 0; | 80 | cIndex = 0; |
| 81 | + $('.pback-logs').html(''); | ||
| 82 | //动画 | 82 | //动画 |
| 83 | $('.play-back-list').removeClass('fadeInRightBig').addClass('fadeOutRightBig'); | 83 | $('.play-back-list').removeClass('fadeInRightBig').addClass('fadeOutRightBig'); |
| 84 | $('.play-back-btns,.progress-wrap').removeClass('fadeInUpBig').addClass('fadeOutDownBig'); | 84 | $('.play-back-btns,.progress-wrap').removeClass('fadeInUpBig').addClass('fadeOutDownBig'); |
| @@ -183,6 +183,10 @@ var playBack = (function() { | @@ -183,6 +183,10 @@ var playBack = (function() { | ||
| 183 | 183 | ||
| 184 | //点击轨迹回放按钮 | 184 | //点击轨迹回放按钮 |
| 185 | $('#playBackBtn').on('click', function(){ | 185 | $('#playBackBtn').on('click', function(){ |
| 186 | + //表单校验 | ||
| 187 | + if(!customFormValidate('#playBackForm')) | ||
| 188 | + return; | ||
| 189 | + | ||
| 186 | var params = $('#playBackForm').serializeJSON(); | 190 | var params = $('#playBackForm').serializeJSON(); |
| 187 | //查询历史gps数据 | 191 | //查询历史gps数据 |
| 188 | var fs = 'YYYY-MM-DDHH:mm' | 192 | var fs = 'YYYY-MM-DDHH:mm' |
| @@ -198,7 +202,7 @@ var playBack = (function() { | @@ -198,7 +202,7 @@ var playBack = (function() { | ||
| 198 | success:function(rs){ | 202 | success:function(rs){ |
| 199 | gpsArray = rs; | 203 | gpsArray = rs; |
| 200 | size = gpsArray.length; | 204 | size = gpsArray.length; |
| 201 | - //layer.closeAll(); | 205 | + layer.closeAll(); |
| 202 | //切出轨迹回放面板 | 206 | //切出轨迹回放面板 |
| 203 | $('.mapRightWrap,.mapTools,.leftUtilsWrap').fadeOut(); | 207 | $('.mapRightWrap,.mapTools,.leftUtilsWrap').fadeOut(); |
| 204 | $('.play-back-list,.play-back-btns,.progress-wrap').show(); | 208 | $('.play-back-list,.play-back-btns,.progress-wrap').show(); |
| @@ -214,23 +218,29 @@ var playBack = (function() { | @@ -214,23 +218,29 @@ var playBack = (function() { | ||
| 214 | getCurrMap().clear(); | 218 | getCurrMap().clear(); |
| 215 | 219 | ||
| 216 | firstCar = params.nbbm[0]; | 220 | firstCar = params.nbbm[0]; |
| 217 | - layer.msg('加载线路图层数据...', {icon: 16, time: 0,shade:0.3}); | ||
| 218 | - $.get('/realSchedule/findRouteByLine', {lineId: $('.mapRightWrap select[name=lineCode]').val()} | 221 | + |
| 222 | + var lineCode = $('.mapRightWrap select[name=lineCode]').val(); | ||
| 223 | + if(lineCode != -1){ | ||
| 224 | + layer.msg('加载线路图层数据...', {icon: 16, time: 0,shade:0.3}); | ||
| 225 | + $.get('/realSchedule/findRouteByLine', {lineId: lineCode} | ||
| 219 | ,function(route){ | 226 | ,function(route){ |
| 220 | lineRoute = route; | 227 | lineRoute = route; |
| 221 | getCurrMap().drawLine(lineRoute); | 228 | getCurrMap().drawLine(lineRoute); |
| 222 | - //开始播放 | 229 | + layer.closeAll(); |
| 223 | play(); | 230 | play(); |
| 224 | - }); | 231 | + }); |
| 232 | + } | ||
| 233 | + else | ||
| 234 | + play(); | ||
| 225 | } | 235 | } |
| 226 | }); | 236 | }); |
| 227 | }); | 237 | }); |
| 228 | 238 | ||
| 229 | //默认值 | 239 | //默认值 |
| 230 | - $('input[name=sDate]').val('2016-04-24'); | 240 | + /* $('input[name=sDate]').val('2016-04-24'); |
| 231 | $('input[name=sTime]').val('04:00'); | 241 | $('input[name=sTime]').val('04:00'); |
| 232 | $('input[name=eDate]').val('2016-04-24'); | 242 | $('input[name=eDate]').val('2016-04-24'); |
| 233 | - $('input[name=eTime]').val('04:40'); | 243 | + $('input[name=eTime]').val('05:40');*/ |
| 234 | } | 244 | } |
| 235 | }; | 245 | }; |
| 236 | 246 | ||
| @@ -283,6 +293,36 @@ var playBack = (function() { | @@ -283,6 +293,36 @@ var playBack = (function() { | ||
| 283 | //$pmk.css('width', w); | 293 | //$pmk.css('width', w); |
| 284 | play(); | 294 | play(); |
| 285 | } | 295 | } |
| 296 | + | ||
| 297 | + /** | ||
| 298 | + * 自定义表单校验 | ||
| 299 | + */ | ||
| 300 | + function customFormValidate(f){ | ||
| 301 | + var rs = true; | ||
| 302 | + //所有可见的项 | ||
| 303 | + var es = $('input,select', f); | ||
| 304 | + | ||
| 305 | + for(var i = 0, e; e = es[i++];){ | ||
| 306 | + if($(e).attr('required') && ( $(e).val() == null || $(e).val() == '')){ | ||
| 307 | + if($(e).hasClass('select2-hidden-accessible')) | ||
| 308 | + $(e).next().find('.select2-selection').addClass('custom-val-error'); | ||
| 309 | + else | ||
| 310 | + $(e).addClass('custom-val-error'); | ||
| 311 | + rs = false; | ||
| 312 | + } | ||
| 313 | + else{ | ||
| 314 | + if($(e).hasClass('select2-hidden-accessible')) | ||
| 315 | + $(e).next().find('.select2-selection').removeClass('custom-val-error'); | ||
| 316 | + else | ||
| 317 | + $(e).removeClass('custom-val-error'); | ||
| 318 | + } | ||
| 319 | + } | ||
| 320 | + | ||
| 321 | + if(!rs){ | ||
| 322 | + layer.alert('数据完整性校验失败,请检查输入项', {icon: 2, title: '操作失败', shift: 5}); | ||
| 323 | + } | ||
| 324 | + return rs; | ||
| 325 | + } | ||
| 286 | 326 | ||
| 287 | return exports; | 327 | return exports; |
| 288 | })(); | 328 | })(); |
| 289 | \ No newline at end of file | 329 | \ No newline at end of file |
src/main/resources/static/pages/mapmonitor/real/js/real.js
| @@ -41,9 +41,9 @@ | @@ -41,9 +41,9 @@ | ||
| 41 | } | 41 | } |
| 42 | var method = $(this).data('click'); | 42 | var method = $(this).data('click'); |
| 43 | 43 | ||
| 44 | - if (!method || playAnimation) | 44 | + /*if (!method || playAnimation) |
| 45 | return; | 45 | return; |
| 46 | - playAnimation = true; | 46 | + playAnimation = true;*/ |
| 47 | 47 | ||
| 48 | $('.mapTools').addClass('disable'); | 48 | $('.mapTools').addClass('disable'); |
| 49 | $('.mapTools div.item.active').removeClass('active'); | 49 | $('.mapTools div.item.active').removeClass('active'); |
| @@ -58,19 +58,25 @@ | @@ -58,19 +58,25 @@ | ||
| 58 | // 车辆 | 58 | // 车辆 |
| 59 | vehicle : function() { | 59 | vehicle : function() { |
| 60 | 60 | ||
| 61 | - mrw.html('').addClass('to_vehicle vehicle'); | ||
| 62 | - resetRotate(null, vehiclePanel.showData); | 61 | + /*mrw.html('').addClass('to_vehicle vehicle'); |
| 62 | + resetRotate(null, vehiclePanel.showData);*/ | ||
| 63 | + mrw.html('').addClass('vehicle'); | ||
| 64 | + vehiclePanel.showData(); | ||
| 63 | }, | 65 | }, |
| 64 | search : function() { | 66 | search : function() { |
| 65 | - mrw.html('').addClass('to_searchPanel search'); | ||
| 66 | - resetRotate(null, searchPanel.init); | 67 | + /*mrw.html('').addClass('to_searchPanel search'); |
| 68 | + resetRotate(null, searchPanel.init);*/ | ||
| 69 | + mrw.html('').addClass('search'); | ||
| 70 | + searchPanel.init(); | ||
| 67 | }, | 71 | }, |
| 68 | notice : function() { | 72 | notice : function() { |
| 69 | alert('notice'); | 73 | alert('notice'); |
| 70 | }, | 74 | }, |
| 71 | playBack : function() { | 75 | playBack : function() { |
| 72 | - mrw.html('').addClass('to_playBack playBack'); | ||
| 73 | - resetRotate(null, playBack.init); | 76 | + /*mrw.html('').addClass('to_playBack playBack'); |
| 77 | + resetRotate(null, playBack.init);*/ | ||
| 78 | + mrw.html('').addClass('playBack'); | ||
| 79 | + playBack.init(); | ||
| 74 | 80 | ||
| 75 | }, | 81 | }, |
| 76 | clearStyle : function() { | 82 | clearStyle : function() { |
src/main/resources/static/pages/mapmonitor/real/real.html
| @@ -26,137 +26,23 @@ | @@ -26,137 +26,23 @@ | ||
| 26 | 26 | ||
| 27 | <div class="mapTools z-depth-3 "> | 27 | <div class="mapTools z-depth-3 "> |
| 28 | <div class="item active" data-click="vehicle"> | 28 | <div class="item active" data-click="vehicle"> |
| 29 | - <i class="fa fa-bus"></i> 线路 | 29 | + <i class="fa fa-bus"></i> 线路 |
| 30 | </div> | 30 | </div> |
| 31 | <div class="item" data-click="search"> | 31 | <div class="item" data-click="search"> |
| 32 | - <i class="fa fa-search"></i> 搜索 | 32 | + <i class="fa fa-search"></i> 搜索 |
| 33 | </div> | 33 | </div> |
| 34 | <!-- <div class="item" data-click="notice"> --> | 34 | <!-- <div class="item" data-click="notice"> --> |
| 35 | <div class="item" > | 35 | <div class="item" > |
| 36 | - <i class="fa fa-bell-o"></i> 安全 | 36 | + <i class="fa fa-bell-o"></i> 安全 |
| 37 | </div> | 37 | </div> |
| 38 | <div class="item" data-click="playBack"> | 38 | <div class="item" data-click="playBack"> |
| 39 | - <i class="fa fa-history"></i> 回放 | 39 | + <i class="fa fa-history"></i> 回放 |
| 40 | </div> | 40 | </div> |
| 41 | </div> | 41 | </div> |
| 42 | 42 | ||
| 43 | <!-- 轨迹回放面板 --> | 43 | <!-- 轨迹回放面板 --> |
| 44 | -<div class="play-back-list animated fadeInRightBig"> | ||
| 45 | - <div class="pback-logs"> | ||
| 46 | - <!-- <div class="pback-logs-item"> | ||
| 47 | - W2B-012 进站 金桥路浦东大道站 | ||
| 48 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 49 | - </div> | ||
| 50 | - <div class="pback-logs-item"> | ||
| 51 | - W2B-012 出站 金桥路浦东大道站 | ||
| 52 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 53 | - </div> | ||
| 54 | - <div class="pback-logs-item"> | ||
| 55 | - W2B-012 进站 金桥路浦东大道站 | ||
| 56 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 57 | - </div> | ||
| 58 | - <div class="pback-logs-item"> | ||
| 59 | - W2B-012 出站 金桥路浦东大道站 | ||
| 60 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 61 | - </div> | ||
| 62 | - <div class="pback-logs-item"> | ||
| 63 | - W2B-012 进站 金桥路浦东大道站 | ||
| 64 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 65 | - </div> | ||
| 66 | - <div class="pback-logs-item"> | ||
| 67 | - W2B-012 出站 金桥路浦东大道站 | ||
| 68 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 69 | - </div> | ||
| 70 | - <div class="pback-logs-item"> | ||
| 71 | - W2B-012 进站 金桥路浦东大道站 | ||
| 72 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 73 | - </div> | ||
| 74 | - <div class="pback-logs-item"> | ||
| 75 | - W2B-012 出站 金桥路浦东大道站 | ||
| 76 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 77 | - </div> | ||
| 78 | - <div class="pback-logs-item"> | ||
| 79 | - W2B-012 进站 金桥路浦东大道站 | ||
| 80 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 81 | - </div> | ||
| 82 | - <div class="pback-logs-item"> | ||
| 83 | - W2B-012 出站 金桥路浦东大道站 | ||
| 84 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 85 | - </div> | ||
| 86 | - <div class="pback-logs-item"> | ||
| 87 | - W2B-012 进站 金桥路浦东大道站 | ||
| 88 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 89 | - </div> | ||
| 90 | - <div class="pback-logs-item"> | ||
| 91 | - W2B-012 出站 金桥路浦东大道站 | ||
| 92 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 93 | - </div> | ||
| 94 | - <div class="pback-logs-item"> | ||
| 95 | - W2B-012 进站 金桥路浦东大道站 | ||
| 96 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 97 | - </div> | ||
| 98 | - <div class="pback-logs-item"> | ||
| 99 | - W2B-012 出站 金桥路浦东大道站 | ||
| 100 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 101 | - </div><div class="pback-logs-item"> | ||
| 102 | - W2B-012 进站 金桥路浦东大道站 | ||
| 103 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 104 | - </div> | ||
| 105 | - <div class="pback-logs-item"> | ||
| 106 | - W2B-012 出站 金桥路浦东大道站 | ||
| 107 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 108 | - </div> | ||
| 109 | - <div class="pback-logs-item"> | ||
| 110 | - W2B-012 进站 金桥路浦东大道站 | ||
| 111 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 112 | - </div> | ||
| 113 | - <div class="pback-logs-item"> | ||
| 114 | - W2B-012 出站 金桥路浦东大道站 | ||
| 115 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 116 | - </div> | ||
| 117 | - <div class="pback-logs-item"> | ||
| 118 | - W2B-012 进站 金桥路浦东大道站 | ||
| 119 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 120 | - </div> | ||
| 121 | - <div class="pback-logs-item"> | ||
| 122 | - W2B-012 出站 金桥路浦东大道站 | ||
| 123 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 124 | - </div> | ||
| 125 | - <div class="pback-logs-item"> | ||
| 126 | - W2B-012 进站 金桥路浦东大道站 | ||
| 127 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 128 | - </div> | ||
| 129 | - <div class="pback-logs-item"> | ||
| 130 | - W2B-012 出站 金桥路浦东大道站 | ||
| 131 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 132 | - </div> | ||
| 133 | - | ||
| 134 | - <div class="pback-logs-item"> | ||
| 135 | - W2B-012 进站 金桥路浦东大道站 | ||
| 136 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 137 | - </div> | ||
| 138 | - <div class="pback-logs-item"> | ||
| 139 | - W2B-012 出站 金桥路浦东大道站 | ||
| 140 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 141 | - </div> | ||
| 142 | - <div class="pback-logs-item"> | ||
| 143 | - W2B-012 进站 金桥路浦东大道站 | ||
| 144 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 145 | - </div> | ||
| 146 | - <div class="pback-logs-item"> | ||
| 147 | - W2B-012 出站 金桥路浦东大道站 | ||
| 148 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 149 | - </div> | ||
| 150 | - <div class="pback-logs-item"> | ||
| 151 | - W2B-012 进站 金桥路浦东大道站 | ||
| 152 | - <span class="pback-logs-item-date">07月17 12:40</span> | ||
| 153 | - </div> | ||
| 154 | - <div class="pback-logs-item"> | ||
| 155 | - W2B-012 出站 金桥路浦东大道站 | ||
| 156 | - <span class="pback-logs-item-date">07月17 12:42</span> | ||
| 157 | - </div> --> | ||
| 158 | - | ||
| 159 | - </div> | 44 | +<div class="play-back-list animated fadeInRightBig z-depth-2"> |
| 45 | + <div class="pback-logs"></div> | ||
| 160 | </div> | 46 | </div> |
| 161 | <div class="play-back-btns z-depth-1 animated fadeInUpBig"> | 47 | <div class="play-back-btns z-depth-1 animated fadeInUpBig"> |
| 162 | <i class="fa fa-play playBtn" data-status=0></i> | 48 | <i class="fa fa-play playBtn" data-status=0></i> |
src/main/resources/static/pages/mapmonitor/real/temps/playBack.html
| 1 | + | ||
| 2 | +<!-- W2B-083 , W2B-084 , W2B-087 85路 --> | ||
| 1 | <script id="play_back_panel_temp" type="text/html"> | 3 | <script id="play_back_panel_temp" type="text/html"> |
| 2 | <div class="alert alert-info animated flipInX"> | 4 | <div class="alert alert-info animated flipInX"> |
| 3 | -<i class="fa fa-exclamation-circle" ></i> 最多跨一天回放,请尽量小范围的查询 W2B-083 , W2B-084 , W2B-087 85路</div> | 5 | +<i class="fa fa-exclamation-circle" ></i> 最多跨一天回放,请尽量小范围的查询</div> |
| 4 | <form class="form-horizontal" role="form" id="playBackForm"> | 6 | <form class="form-horizontal" role="form" id="playBackForm"> |
| 5 | <div class="form-body"> | 7 | <div class="form-body"> |
| 6 | <div class="form-group"> | 8 | <div class="form-group"> |
| 7 | <label class="col-md-3 control-label">车辆编码</label> | 9 | <label class="col-md-3 control-label">车辆编码</label> |
| 8 | <div class="col-md-9"> | 10 | <div class="col-md-9"> |
| 9 | - <select class="form-control" name="nbbm[]" placeholder="车辆编码" multiple="multiple"></select> | 11 | + <select class="form-control" name="nbbm[]" placeholder="车辆编码" multiple="multiple" required=1 style="width:100%;"></select> |
| 10 | </div> | 12 | </div> |
| 11 | </div> | 13 | </div> |
| 12 | 14 | ||
| 13 | <div class="form-group"> | 15 | <div class="form-group"> |
| 14 | <label class="col-md-3 control-label">起始时间</label> | 16 | <label class="col-md-3 control-label">起始时间</label> |
| 15 | <div class="col-md-9"> | 17 | <div class="col-md-9"> |
| 16 | - <input type="date" name="sDate" class="form-control" placeholder="日期"> | ||
| 17 | - <input type="time" name="sTime" class="form-control" placeholder="时间"> | 18 | + <input type="date" name="sDate" class="form-control" placeholder="日期" required=1> |
| 19 | + <input type="time" name="sTime" class="form-control" placeholder="时间" required=1> | ||
| 18 | </div> | 20 | </div> |
| 19 | </div> | 21 | </div> |
| 20 | <div class="form-group"> | 22 | <div class="form-group"> |
| 21 | <label class="col-md-3 control-label">截止时间</label> | 23 | <label class="col-md-3 control-label">截止时间</label> |
| 22 | <div class="col-md-9"> | 24 | <div class="col-md-9"> |
| 23 | - <input type="date" name="eDate" class="form-control" placeholder="截止时间"> | ||
| 24 | - <input type="time" name="eTime" class="form-control" placeholder="时间"> | 25 | + <input type="date" name="eDate" class="form-control" placeholder="截止时间" required=1> |
| 26 | + <input type="time" name="eTime" class="form-control" placeholder="时间" required=1> | ||
| 25 | </div> | 27 | </div> |
| 26 | </div> | 28 | </div> |
| 27 | </div> | 29 | </div> |
| @@ -30,13 +32,13 @@ | @@ -30,13 +32,13 @@ | ||
| 30 | <div class="form-group"> | 32 | <div class="form-group"> |
| 31 | <label class="col-md-3 control-label">线路图层</label> | 33 | <label class="col-md-3 control-label">线路图层</label> |
| 32 | <div class="col-md-9"> | 34 | <div class="col-md-9"> |
| 33 | - <select class="form-control" name="lineCode" ></select> | 35 | + <select class="form-control" name="lineCode" style="width:100%;"></select> |
| 34 | </div> | 36 | </div> |
| 35 | </div> | 37 | </div> |
| 36 | </form> | 38 | </form> |
| 37 | <hr> | 39 | <hr> |
| 38 | <div class="form-actions"> | 40 | <div class="form-actions"> |
| 39 | - <div class="row" style="text-align: center;margin-left: 0;"> | 41 | + <div class="row" style="text-align: center;margin-left: 0;margin-bottom: 20px;"> |
| 40 | <div > | 42 | <div > |
| 41 | <button type="button" class="btn green-meadow btn-lg" id="playBackBtn"> <i class="fa fa-play-circle"> </i> 轨迹回放 </button> | 43 | <button type="button" class="btn green-meadow btn-lg" id="playBackBtn"> <i class="fa fa-play-circle"> </i> 轨迹回放 </button> |
| 42 | </div> | 44 | </div> |