laowo 4 anni fa
parent
commit
04dd865fb2

BIN
WebRoot/WEB-INF/lib/commons-codec-1.10.jar


BIN
WebRoot/WEB-INF/lib/joda-time-2.10.1.jar


+ 1114 - 1079
WebRoot/WEB-INF/spring-servlet.xml

@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
-	xmlns:task="http://www.springframework.org/schema/task" 
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:mvc="http://www.springframework.org/schema/mvc"
-    
-    xsi:schemaLocation="
+       xmlns:task="http://www.springframework.org/schema/task"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+
+       xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
@@ -15,1311 +15,1346 @@
     http://www.springframework.org/schema/mvc  
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
     <!-- 默认的注解映射的支持 -->
-    <mvc:annotation-driven />
+    <mvc:annotation-driven/>
     <!--启用自动扫描  -->
-    <context:component-scan base-package="cn.com.usky.iot.controller" />
+    <context:component-scan base-package="cn.com.usky.iot.controller"/>
     <!-- 后台任务 -->
 
-    <context:component-scan base-package="cn.com.usky.iot.task" />
-    <task:annotation-driven scheduler="qbScheduler" mode="proxy"/> 
-    <task:scheduler id="qbScheduler" pool-size="10"/>  
+    <context:component-scan base-package="cn.com.usky.iot.task"/>
+    <task:annotation-driven scheduler="qbScheduler" mode="proxy"/>
+    <task:scheduler id="qbScheduler" pool-size="10"/>
 
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
-        <property name="prefix" value="/opt/" />
-        <property name="suffix" value=".jsp" />
-    </bean>
-	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
-		<property name="configLocation" value="WEB-INF/hibernate.cfg.xml" />
-	</bean>
-	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
-		<property name="sessionFactory">
-			<ref bean="sessionFactory"/>
-		</property>
-	</bean>
-	<bean id="daoQuery" class="cn.com.usky.utils.DaoQuery">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-	</bean>
-	<bean id="ytiotTOrderDao" class="cn.com.usky.iot.order.dao.YtiotTOrderDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAdminVerDao" class="cn.com.usky.iot.admin.dao.YtiotTAdminVerDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAdminDao" class="cn.com.usky.iot.admin.dao.YtiotTAdminDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-		<property name="ytiotTAdminVerDao">
-			<ref bean="ytiotTAdminVerDao"/>
-		</property>
-		<property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAdminService" class="cn.com.usky.iot.admin.service.YtiotTAdminServicesImpl">
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotTAdminVerDao">
-			<ref bean="ytiotTAdminVerDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTCompanyVerDao" class="cn.com.usky.iot.company.dao.YtiotTCompanyVerDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-	</bean>
-	<bean id="ytiotTCompanyDao" class="cn.com.usky.iot.company.dao.YtiotTCompanyDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-		<property name="ytiotTCompanyVerDao">
-			<ref bean="ytiotTCompanyVerDao"/>
-		</property>
-		<property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTCompanyService" class="cn.com.usky.iot.company.service.YtiotTCompanyServicesImpl">
-		<property name="ytiotTCompanyDao">
-			<ref bean="ytiotTCompanyDao"/>
-		</property>
-		<property name="ytiotTCompanyVerDao">
-			<ref bean="ytiotTCompanyVerDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAreaverDao" class="cn.com.usky.iot.area.dao.YtiotTAreaverDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAreaDao" class="cn.com.usky.iot.area.dao.YtiotTAreaDaoImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-		<property name="ytiotTAreaverDao">
-			<ref bean="ytiotTAreaverDao"/>
-		</property>
-		<property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTAreaService" class="cn.com.usky.iot.area.service.YtiotTAreaServicesImpl">
-		<property name="ytiotTAreaDao">
-			<ref bean="ytiotTAreaDao"/>
-		</property>
-		<property name="ytiotTAreaverDao">
-			<ref bean="ytiotTAreaverDao"/>
-		</property>
-	</bean>
+        <property name="prefix" value="/opt/"/>
+        <property name="suffix" value=".jsp"/>
+    </bean>
+    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+        <property name="configLocation" value="WEB-INF/hibernate.cfg.xml"/>
+    </bean>
+    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
+        <property name="sessionFactory">
+            <ref bean="sessionFactory"/>
+        </property>
+    </bean>
+    <bean id="daoQuery" class="cn.com.usky.utils.DaoQuery">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+    </bean>
+    <bean id="ytiotTOrderDao" class="cn.com.usky.iot.order.dao.YtiotTOrderDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAdminVerDao" class="cn.com.usky.iot.admin.dao.YtiotTAdminVerDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAdminDao" class="cn.com.usky.iot.admin.dao.YtiotTAdminDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+        <property name="ytiotTAdminVerDao">
+            <ref bean="ytiotTAdminVerDao"/>
+        </property>
+        <property name="ytiotTOrderDao">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAdminService" class="cn.com.usky.iot.admin.service.YtiotTAdminServicesImpl">
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotTAdminVerDao">
+            <ref bean="ytiotTAdminVerDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTCompanyVerDao" class="cn.com.usky.iot.company.dao.YtiotTCompanyVerDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotTCompanyDao" class="cn.com.usky.iot.company.dao.YtiotTCompanyDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+        <property name="ytiotTCompanyVerDao">
+            <ref bean="ytiotTCompanyVerDao"/>
+        </property>
+        <property name="ytiotTOrderDao">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTCompanyService" class="cn.com.usky.iot.company.service.YtiotTCompanyServicesImpl">
+        <property name="ytiotTCompanyDao">
+            <ref bean="ytiotTCompanyDao"/>
+        </property>
+        <property name="ytiotTCompanyVerDao">
+            <ref bean="ytiotTCompanyVerDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAreaverDao" class="cn.com.usky.iot.area.dao.YtiotTAreaverDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAreaDao" class="cn.com.usky.iot.area.dao.YtiotTAreaDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+        <property name="ytiotTAreaverDao">
+            <ref bean="ytiotTAreaverDao"/>
+        </property>
+        <property name="ytiotTOrderDao">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAreaService" class="cn.com.usky.iot.area.service.YtiotTAreaServicesImpl">
+        <property name="ytiotTAreaDao">
+            <ref bean="ytiotTAreaDao"/>
+        </property>
+        <property name="ytiotTAreaverDao">
+            <ref bean="ytiotTAreaverDao"/>
+        </property>
+    </bean>
     <bean id="ytiotTBuildingverDao" class="cn.com.usky.iot.building.dao.YtiotTBuildingverDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotTBuildingDao" class="cn.com.usky.iot.building.dao.YtiotTBuildingDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTBuildingverDao">
-			<ref bean="ytiotTBuildingverDao"/>
-		</property>
-		<property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTBuildingverDao"/>
+        </property>
+        <property name="ytiotTOrderDao">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTBuildingService" class="cn.com.usky.iot.building.service.YtiotTBuildingServicesImpl">
         <property name="ytiotTAreaDao">
-			<ref bean="ytiotTAreaDao"/>
-		</property>
+            <ref bean="ytiotTAreaDao"/>
+        </property>
         <property name="ytiotTBuildingDao">
-			<ref bean="ytiotTBuildingDao"/>
-		</property>
-		<property name="ytiotTBuildingverDao">
-			<ref bean="ytiotTBuildingverDao"/>
-		</property>
+            <ref bean="ytiotTBuildingDao"/>
+        </property>
+        <property name="ytiotTBuildingverDao">
+            <ref bean="ytiotTBuildingverDao"/>
+        </property>
     </bean>
     <bean id="ytiotTPointVerDao" class="cn.com.usky.iot.point.dao.YtiotTPointVerDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotTPointDao" class="cn.com.usky.iot.point.dao.YtiotTPointDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTPointVerDao">
-			<ref bean="ytiotTPointVerDao"/>
-		</property>
+            <ref bean="ytiotTPointVerDao"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTPointService" class="cn.com.usky.iot.point.service.YtiotTPointServicesImpl">
         <property name="ytiotTPointDao">
-			<ref bean="ytiotTPointDao"/>
-		</property>
-		<property name="ytiotTPointVerDao">
-			<ref bean="ytiotTPointVerDao"/>
-		</property>
+            <ref bean="ytiotTPointDao"/>
+        </property>
+        <property name="ytiotTPointVerDao">
+            <ref bean="ytiotTPointVerDao"/>
+        </property>
     </bean>
     <bean id="ytiotTUnitVerDao" class="cn.com.usky.iot.unit.dao.YtiotTUnitVerDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotVUserCompanyDao" class="cn.com.usky.iot.admin.dao.YtiotVUserCompanyDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotTUnitDao" class="cn.com.usky.iot.unit.dao.YtiotTUnitDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTUnitVerDao">
-			<ref bean="ytiotTUnitVerDao"/>
-		</property>
+            <ref bean="ytiotTUnitVerDao"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTUnitService" class="cn.com.usky.iot.unit.service.YtiotTUnitServicesImpl">
         <property name="ytiotTUnitDao">
-			<ref bean="ytiotTUnitDao"/>
-		</property>
-		<property name="ytiotTUnitVerDao">
-			<ref bean="ytiotTUnitVerDao"/>
-		</property>
+            <ref bean="ytiotTUnitDao"/>
+        </property>
+        <property name="ytiotTUnitVerDao">
+            <ref bean="ytiotTUnitVerDao"/>
+        </property>
     </bean>
     <bean id="ytiotVCompanyDao" class="cn.com.usky.iot.company.dao.YtiotVCompanyDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
-       
+
     <bean id="ytiotVCompanyService" class="cn.com.usky.iot.company.service.YtiotVCompanyServiceImpl">
         <property name="ytiotVCompanyDao">
-			<ref bean="ytiotVCompanyDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-		<property name="ytiotVDataDao">
-			<ref bean="ytiotVDataDao"/>
-		</property>
+            <ref bean="ytiotVCompanyDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVDataDao">
+            <ref bean="ytiotVDataDao"/>
+        </property>
     </bean>
     <bean id="ytiotVUserphoneDao" class="cn.com.usky.iot.admin.dao.YtiotVUserphoneDaoImpl">
-    	<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotVAlarmDao" class="cn.com.usky.iot.alarm.dao.YtiotVAlarmDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotVAlarmService" class="cn.com.usky.iot.alarm.service.YtiotVAlarmServiceImpl">
         <property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-		<property name="ytiotVUserphoneDao">
-			<ref bean="ytiotVUserphoneDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property> 
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVUserphoneDao">
+            <ref bean="ytiotVUserphoneDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotVDataDao" class="cn.com.usky.iot.data.dao.YtiotVDataDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotVDataService" class="cn.com.usky.iot.data.service.YtiotVDataServiceImpl">
         <property name="ytiotVCompanyDao">
-			<ref bean="ytiotVCompanyDao"/>
-		</property>
+            <ref bean="ytiotVCompanyDao"/>
+        </property>
         <property name="ytiotVDataDao">
-			<ref bean="ytiotVDataDao"/>
-		</property>
+            <ref bean="ytiotVDataDao"/>
+        </property>
         <property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property> 
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property> 
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property> 
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
     </bean>
     <bean id="ytiotVUserCompanyService" class="cn.com.usky.iot.admin.service.YtiotVUserCompanyServiceImpl">
         <property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property> 
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="excelService" class="cn.com.usky.iot.excel.service.ExcelServiceImpl">
-		<property name="ytiotVDataService">
-			<ref bean="ytiotVDataService"/>
-		</property>
-		<property name="ytiotVAlarmService">
-			<ref bean="ytiotVAlarmService"/>
-		</property>
-		<property name="ytiotTPatrolPlanService">
-			<ref bean="ytiotTPatrolPlanService"/>
-		</property>
-		<property name="ytiotTInspectionRecordService">
-			<ref bean="ytiotTInspectionRecordService"/>
-		</property>
-		<property name="ytiotTRouteService">
-			<ref bean="ytiotTRouteService"/>
-		</property>
-		<property name="ytiotTInspectorsService">
-			<ref bean="ytiotTInspectorsService"/>
-		</property>
-		<property name="ytiotTPatrolPointService">
-			<ref bean="ytiotTPatrolPointService"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysisService">
-			<ref bean="ytiotTQrcodeAnalysisService"/>
-		</property>
-		<property name="ytiotTMaintenancePlanService">
-			<ref bean="ytiotTMaintenancePlanService"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysis2Service">
-			<ref bean="ytiotTQrcodeAnalysis2Service"/>
-		</property>
-		<property name="ytiotTMaintenanceRecordService">
-			<ref bean="ytiotTMaintenanceRecordService"/>
-		</property>
-		<property name="ytiotTRoute2Service">
-			<ref bean="ytiotTRoute2Service"/>
-		</property>
-		<property name="ytiotTMaintenanceService">
-			<ref bean="ytiotTMaintenanceService"/>
-		</property>
-		<property name="ytiotTMaintenancePersonService">
-			<ref bean="ytiotTMaintenancePersonService"/>
-		</property>
-		<property name="ytiotXjInspectionPointsService">
-			<ref bean="ytiotXjInspectionPointsService"/>
-		</property>
-		<property name="ytiotXjInspectorsService">
-			<ref bean="ytiotXjInspectorsService"/>
-		</property>
-		<property name="ytiotXjPlanMasterService">
-			<ref bean="ytiotXjPlanMasterService"/>
-		</property>
-		<property name="ytiotXjSpotOperationRecordService">
-			<ref bean="ytiotXjSpotOperationRecordService"/>
-		</property>
-		<property name="ytiotXjEventProcessingService">
-			<ref bean="ytiotXjEventProcessingService"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotTPatrolPlanDao" class="cn.com.usky.iot.patrolplan.dao.YtiotTPatrolPlanDaoImpl">
+        <property name="ytiotVDataService">
+            <ref bean="ytiotVDataService"/>
+        </property>
+        <property name="ytiotVAlarmService">
+            <ref bean="ytiotVAlarmService"/>
+        </property>
+        <property name="ytiotTPatrolPlanService">
+            <ref bean="ytiotTPatrolPlanService"/>
+        </property>
+        <property name="ytiotTInspectionRecordService">
+            <ref bean="ytiotTInspectionRecordService"/>
+        </property>
+        <property name="ytiotTRouteService">
+            <ref bean="ytiotTRouteService"/>
+        </property>
+        <property name="ytiotTInspectorsService">
+            <ref bean="ytiotTInspectorsService"/>
+        </property>
+        <property name="ytiotTPatrolPointService">
+            <ref bean="ytiotTPatrolPointService"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysisService">
+            <ref bean="ytiotTQrcodeAnalysisService"/>
+        </property>
+        <property name="ytiotTMaintenancePlanService">
+            <ref bean="ytiotTMaintenancePlanService"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysis2Service">
+            <ref bean="ytiotTQrcodeAnalysis2Service"/>
+        </property>
+        <property name="ytiotTMaintenanceRecordService">
+            <ref bean="ytiotTMaintenanceRecordService"/>
+        </property>
+        <property name="ytiotTRoute2Service">
+            <ref bean="ytiotTRoute2Service"/>
+        </property>
+        <property name="ytiotTMaintenanceService">
+            <ref bean="ytiotTMaintenanceService"/>
+        </property>
+        <property name="ytiotTMaintenancePersonService">
+            <ref bean="ytiotTMaintenancePersonService"/>
+        </property>
+        <property name="ytiotXjInspectionPointsService">
+            <ref bean="ytiotXjInspectionPointsService"/>
+        </property>
+        <property name="ytiotXjInspectorsService">
+            <ref bean="ytiotXjInspectorsService"/>
+        </property>
+        <property name="ytiotXjPlanMasterService">
+            <ref bean="ytiotXjPlanMasterService"/>
+        </property>
+        <property name="ytiotXjSpotOperationRecordService">
+            <ref bean="ytiotXjSpotOperationRecordService"/>
+        </property>
+        <property name="ytiotXjEventProcessingService">
+            <ref bean="ytiotXjEventProcessingService"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTPatrolPlanDao" class="cn.com.usky.iot.patrolplan.dao.YtiotTPatrolPlanDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTPatrolPlanService" class="cn.com.usky.iot.patrolplan.service.YtiotTPatrolPlanServicesImpl">
         <property name="ytiotTPatrolPlanDao">
-			<ref bean="ytiotTPatrolPlanDao"/>
-		</property>
-		<property name="ytiotTInspectorsDao">
-			<ref bean="ytiotTInspectorsDao"/>
-		</property>
-		<property name="ytiotTRouteDao">
-			<ref bean="ytiotTRouteDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-    </bean>
-    
+            <ref bean="ytiotTPatrolPlanDao"/>
+        </property>
+        <property name="ytiotTInspectorsDao">
+            <ref bean="ytiotTInspectorsDao"/>
+        </property>
+        <property name="ytiotTRouteDao">
+            <ref bean="ytiotTRouteDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+    </bean>
+
     <bean id="ytiotTInspectorsDao" class="cn.com.usky.iot.inspectors.dao.YtiotTInspectorsDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTInspectorsService" class="cn.com.usky.iot.inspectors.service.YtiotTInspectorsServicesImpl">
         <property name="ytiotTInspectorsDao">
-			<ref bean="ytiotTInspectorsDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTInspectorsDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTRouteDao" class="cn.com.usky.iot.route.dao.YtiotTRouteDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTRouteService" class="cn.com.usky.iot.route.service.YtiotTRouteServicesImpl">
         <property name="ytiotTRouteDao">
-			<ref bean="ytiotTRouteDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTRouteDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTQrcodeAnalysisDao" class="cn.com.usky.iot.qrcodeanalysis.dao.YtiotTQrcodeAnalysisDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTQrcodeAnalysisService" class="cn.com.usky.iot.qrcodeanalysis.service.YtiotTQrcodeAnalysisServicesImpl">
+    <bean id="ytiotTQrcodeAnalysisService"
+          class="cn.com.usky.iot.qrcodeanalysis.service.YtiotTQrcodeAnalysisServicesImpl">
         <property name="ytiotTQrcodeAnalysisDao">
-			<ref bean="ytiotTQrcodeAnalysisDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTQrcodeAnalysisDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
-    
+
     <bean id="ytiotTQrcodeAnalysis2Dao" class="cn.com.usky.iot.qrcodeanalysis2.dao.YtiotTQrcodeAnalysis2DaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTQrcodeAnalysis2Service" class="cn.com.usky.iot.qrcodeanalysis2.service.YtiotTQrcodeAnalysis2ServicesImpl">
+    <bean id="ytiotTQrcodeAnalysis2Service"
+          class="cn.com.usky.iot.qrcodeanalysis2.service.YtiotTQrcodeAnalysis2ServicesImpl">
         <property name="ytiotTQrcodeAnalysis2Dao">
-			<ref bean="ytiotTQrcodeAnalysis2Dao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTQrcodeAnalysis2Dao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTMaintenanceDao" class="cn.com.usky.iot.maintenance.dao.YtiotTMaintenanceDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTMaintenanceService" class="cn.com.usky.iot.maintenance.service.YtiotTMaintenanceServicesImpl">
         <property name="ytiotTMaintenanceDao">
-			<ref bean="ytiotTMaintenanceDao"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysis2Dao">
-			<ref bean="ytiotTQrcodeAnalysis2Dao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-    </bean>
-     <bean id="ytiotTRoute2Dao" class="cn.com.usky.iot.route2.dao.YtiotTRoute2DaoImpl">
+            <ref bean="ytiotTMaintenanceDao"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysis2Dao">
+            <ref bean="ytiotTQrcodeAnalysis2Dao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotTRoute2Dao" class="cn.com.usky.iot.route2.dao.YtiotTRoute2DaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTRoute2Service" class="cn.com.usky.iot.route2.service.YtiotTRoute2ServicesImpl">
         <property name="ytiotTRoute2Dao">
-			<ref bean="ytiotTRoute2Dao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTRoute2Dao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTMaintenancePersonDao" class="cn.com.usky.iot.maintenanceperson.dao.YtiotTMaintenancePersonDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTMaintenancePersonService" class="cn.com.usky.iot.maintenanceperson.service.YtiotTMaintenancePersonServicesImpl">
+    <bean id="ytiotTMaintenancePersonService"
+          class="cn.com.usky.iot.maintenanceperson.service.YtiotTMaintenancePersonServicesImpl">
         <property name="ytiotTMaintenancePersonDao">
-			<ref bean="ytiotTMaintenancePersonDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTMaintenancePersonDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTMaintenancePlanDao" class="cn.com.usky.iot.maintenanceplan.dao.YtiotTMaintenancePlanDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTMaintenancePlanService" class="cn.com.usky.iot.maintenanceplan.service.YtiotTMaintenancePlanServicesImpl">
+    <bean id="ytiotTMaintenancePlanService"
+          class="cn.com.usky.iot.maintenanceplan.service.YtiotTMaintenancePlanServicesImpl">
         <property name="ytiotTMaintenancePlanDao">
-			<ref bean="ytiotTMaintenancePlanDao"/>
-		</property>
-		<property name="ytiotTMaintenancePersonDao">
-			<ref bean="ytiotTMaintenancePersonDao"/>
-		</property>
-		<property name="ytiotTRoute2Dao">
-			<ref bean="ytiotTRoute2Dao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTMaintenancePlanDao"/>
+        </property>
+        <property name="ytiotTMaintenancePersonDao">
+            <ref bean="ytiotTMaintenancePersonDao"/>
+        </property>
+        <property name="ytiotTRoute2Dao">
+            <ref bean="ytiotTRoute2Dao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTMaintenanceRecordDao" class="cn.com.usky.iot.maintenancerecord.dao.YtiotTMaintenanceRecordDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTMaintenanceRecordService" class="cn.com.usky.iot.maintenancerecord.service.YtiotTMaintenanceRecordServicesImpl">
+    <bean id="ytiotTMaintenanceRecordService"
+          class="cn.com.usky.iot.maintenancerecord.service.YtiotTMaintenanceRecordServicesImpl">
         <property name="ytiotTMaintenanceRecordDao">
-			<ref bean="ytiotTMaintenanceRecordDao"/>
-		</property>
-		<property name="ytiotTMaintenanceDao">
-			<ref bean="ytiotTMaintenanceDao"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysis2Dao">
-			<ref bean="ytiotTQrcodeAnalysis2Dao"/>
-		</property>
-		<property name="ytiotTRoute2Dao">
-			<ref bean="ytiotTRoute2Dao"/>
-		</property>
-		<property name="ytiotTMaintenancePersonDao">
-			<ref bean="ytiotTMaintenancePersonDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-    </bean>
-    
-    
+            <ref bean="ytiotTMaintenanceRecordDao"/>
+        </property>
+        <property name="ytiotTMaintenanceDao">
+            <ref bean="ytiotTMaintenanceDao"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysis2Dao">
+            <ref bean="ytiotTQrcodeAnalysis2Dao"/>
+        </property>
+        <property name="ytiotTRoute2Dao">
+            <ref bean="ytiotTRoute2Dao"/>
+        </property>
+        <property name="ytiotTMaintenancePersonDao">
+            <ref bean="ytiotTMaintenancePersonDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+    </bean>
+
+
     <bean id="ytiotTPatrolPointDao" class="cn.com.usky.iot.patrolpoint.dao.YtiotTPatrolPointDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTPatrolPointService" class="cn.com.usky.iot.patrolpoint.service.YtiotTPatrolPointServicesImpl">
         <property name="ytiotTPatrolPointDao">
-			<ref bean="ytiotTPatrolPointDao"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysisDao">
-			<ref bean="ytiotTQrcodeAnalysisDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+            <ref bean="ytiotTPatrolPointDao"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysisDao">
+            <ref bean="ytiotTQrcodeAnalysisDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
     </bean>
     <bean id="ytiotTInspectionRecordDao" class="cn.com.usky.iot.inspectionrecord.dao.YtiotTInspectionRecordDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotTInspectionRecordService" class="cn.com.usky.iot.inspectionrecord.service.YtiotTInspectionRecordServicesImpl">
+    <bean id="ytiotTInspectionRecordService"
+          class="cn.com.usky.iot.inspectionrecord.service.YtiotTInspectionRecordServicesImpl">
         <property name="ytiotTInspectionRecordDao">
-			<ref bean="ytiotTInspectionRecordDao"/>
-		</property>
-		<property name="ytiotTPatrolPointDao">
-			<ref bean="ytiotTPatrolPointDao"/>
-		</property>
-		<property name="ytiotTQrcodeAnalysisDao">
-			<ref bean="ytiotTQrcodeAnalysisDao"/>
-		</property>
-		<property name="ytiotTRouteDao">
-			<ref bean="ytiotTRouteDao"/>
-		</property>
-		<property name="ytiotTInspectorsDao">
-			<ref bean="ytiotTInspectorsDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-    </bean>
-        <bean id="ytiotQueryService" class="cn.com.usky.iot.query.service.YtiotQueryServiceImpl">
-    	<property name="ytiotVAlarmDao">
-    		<ref bean="ytiotVAlarmDao"/>
-    	</property>
-    	<property name="ytiotVDataDao">
-    		<ref bean="ytiotVDataDao"/>
-    	</property>
-    	<property name="ytiotVUserphoneDao">
-    		<ref bean="ytiotVUserphoneDao"/>
-    	</property>
-    	<property name="ytiotTAdminDao">
-    		<ref bean="ytiotTAdminDao"/>
-    	</property>
-    	<property name="ytiotVUserCompanyDao">
-    		<ref bean="ytiotVUserCompanyDao"/>
-    	</property>
-    	<property name="ytiotQueryDao">
-    		<ref bean="ytiotQueryDao"/>
-    	</property>
-    </bean>
-    <bean id="ytiotQueryDao"  class="cn.com.usky.iot.query.dao.YtiotQueryDaoImpl">
-    	<property name="daoQuery">
-    		<ref bean="daoQuery" />
-    	</property>
+            <ref bean="ytiotTInspectionRecordDao"/>
+        </property>
+        <property name="ytiotTPatrolPointDao">
+            <ref bean="ytiotTPatrolPointDao"/>
+        </property>
+        <property name="ytiotTQrcodeAnalysisDao">
+            <ref bean="ytiotTQrcodeAnalysisDao"/>
+        </property>
+        <property name="ytiotTRouteDao">
+            <ref bean="ytiotTRouteDao"/>
+        </property>
+        <property name="ytiotTInspectorsDao">
+            <ref bean="ytiotTInspectorsDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotQueryService" class="cn.com.usky.iot.query.service.YtiotQueryServiceImpl">
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVDataDao">
+            <ref bean="ytiotVDataDao"/>
+        </property>
+        <property name="ytiotVUserphoneDao">
+            <ref bean="ytiotVUserphoneDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotQueryDao">
+            <ref bean="ytiotQueryDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotQueryDao" class="cn.com.usky.iot.query.dao.YtiotQueryDaoImpl">
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotVVideoAlarmService" class="cn.com.usky.iot.video.service.YtiotVVideoAlarmServiceImpl">
-    	<property name="ytiotVAlarmDao">
-    		<ref bean="ytiotVAlarmDao"/>
-    	</property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
     </bean>
-    
+
     <bean id="ytiotTcAlarmPackagesDao" class="cn.com.usky.iot.alarmpackages.dao.YtiotTcAlarmPackagesDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotTcAlarmPackagesZbDao" class="cn.com.usky.iot.alarmpackageszb.dao.YtiotTcAlarmPackagesZbDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-       <bean id="ytiotTOutcryPackageService" class="cn.com.usky.iot.outcrypackage.service.YtiotTOutcryPackageServicesImpl">
+    <bean id="ytiotTOutcryPackageService" class="cn.com.usky.iot.outcrypackage.service.YtiotTOutcryPackageServicesImpl">
         <property name="ytiotTcAlarmPackagesDao">
-			<ref bean="ytiotTcAlarmPackagesDao"/>
-		</property>
-		<property name="ytiotTcAlarmPackagesZbDao">
-			<ref bean="ytiotTcAlarmPackagesZbDao"/>
-		</property>
-		<property name="ytiotVCompanyDao">
-			<ref bean="ytiotVCompanyDao"/>
-		</property>
+            <ref bean="ytiotTcAlarmPackagesDao"/>
+        </property>
+        <property name="ytiotTcAlarmPackagesZbDao">
+            <ref bean="ytiotTcAlarmPackagesZbDao"/>
+        </property>
+        <property name="ytiotVCompanyDao">
+            <ref bean="ytiotVCompanyDao"/>
+        </property>
     </bean>
     <!-- 东方明珠-杨浦项目首页 -->
-   	<bean id="ytiotVObjectDao" class="cn.com.usky.iot.object.dao.YtiotVObjectDaoImpl">
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-	</bean>
-	<bean id="ytiotFrontpageQueryService" class="cn.com.usky.iot.frontpage.service.YtiotFrontpageQueryServiceImpl">
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotVCompanyDao">
-			<ref bean="ytiotVCompanyDao"/>
-		</property>
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-		<property name="ytiotVObjectDao">
-			<ref bean="ytiotVObjectDao"/>
-		</property>
-		<property name="ytiotVUserphoneDao">
-			<ref bean="ytiotVUserphoneDao"/>
-		</property>
-	</bean>
-	<!-- 东方明珠-杨浦项目首页结束 -->
-			<!-- 巡检、维保开始 -->
-	<bean id="ytiotXjInspectionPointsDao" class="cn.com.usky.iot.xjinspectionpoints.dao.YtiotXjInspectionPointsDaoImpl">
+    <bean id="ytiotVObjectDao" class="cn.com.usky.iot.object.dao.YtiotVObjectDaoImpl">
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotFrontpageQueryService" class="cn.com.usky.iot.frontpage.service.YtiotFrontpageQueryServiceImpl">
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotVCompanyDao">
+            <ref bean="ytiotVCompanyDao"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVObjectDao">
+            <ref bean="ytiotVObjectDao"/>
+        </property>
+        <property name="ytiotVUserphoneDao">
+            <ref bean="ytiotVUserphoneDao"/>
+        </property>
+    </bean>
+    <!-- 东方明珠-杨浦项目首页结束 -->
+    <!-- 巡检、维保开始 -->
+    <bean id="ytiotXjInspectionPointsDao" class="cn.com.usky.iot.xjinspectionpoints.dao.YtiotXjInspectionPointsDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotXjSpotEquipmentDao">
-			<ref bean="ytiotXjSpotEquipmentDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotXjSpotEquipmentDao">
+            <ref bean="ytiotXjSpotEquipmentDao"/>
+        </property>
     </bean>
     <bean id="ytiotXjInspectorsDao" class="cn.com.usky.iot.xjinspectors.dao.YtiotXjInspectorsDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotXjInspectorsCompanyDao">
-			<ref bean="ytiotXjInspectorsCompanyDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-    </bean>
-    <bean id="ytiotXjInspectorsCompanyDao" class="cn.com.usky.iot.xjinspectorscompany.dao.YtiotXjInspectorsCompanyDaoImpl">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotXjInspectorsCompanyDao">
+            <ref bean="ytiotXjInspectorsCompanyDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjInspectorsCompanyDao"
+          class="cn.com.usky.iot.xjinspectorscompany.dao.YtiotXjInspectorsCompanyDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotXjOperationRecordPhotosDao" class="cn.com.usky.iot.xjoperationrecordphotos.dao.YtiotXjOperationRecordPhotosDaoImpl">
+    <bean id="ytiotXjOperationRecordPhotosDao"
+          class="cn.com.usky.iot.xjoperationrecordphotos.dao.YtiotXjOperationRecordPhotosDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotXjPlanChildDao" class="cn.com.usky.iot.xjplanchild.dao.YtiotXjPlanChildDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotXjSpotOperationRecordDao">
-			<ref bean="ytiotXjSpotOperationRecordDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotXjSpotOperationRecordDao">
+            <ref bean="ytiotXjSpotOperationRecordDao"/>
+        </property>
     </bean>
     <bean id="ytiotXjPlanMasterDao" class="cn.com.usky.iot.xjplanmaster.dao.YtiotXjPlanMasterDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotXjPlanChildDao">
-			<ref bean="ytiotXjPlanChildDao"/>
-		</property>
-		<property name="ytiotXjPlanSpotDao">
-			<ref bean="ytiotXjPlanSpotDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotXjPlanChildDao">
+            <ref bean="ytiotXjPlanChildDao"/>
+        </property>
+        <property name="ytiotXjPlanSpotDao">
+            <ref bean="ytiotXjPlanSpotDao"/>
+        </property>
     </bean>
     <bean id="ytiotXjPlanSpotDao" class="cn.com.usky.iot.xjplanspot.dao.YtiotXjPlanSpotDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotXjPlanTeamDao" class="cn.com.usky.iot.xjplanteam.dao.YtiotXjPlanTeamDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-     <bean id="ytiotXjSpotEquipmentDao" class="cn.com.usky.iot.xjspotequipment.dao.YtiotXjSpotEquipmentDaoImpl">
+    <bean id="ytiotXjSpotEquipmentDao" class="cn.com.usky.iot.xjspotequipment.dao.YtiotXjSpotEquipmentDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-    <bean id="ytiotXjSpotOperationRecordDao" class="cn.com.usky.iot.xjspotoperationrecord.dao.YtiotXjSpotOperationRecordDaoImpl">
+    <bean id="ytiotXjSpotOperationRecordDao"
+          class="cn.com.usky.iot.xjspotoperationrecord.dao.YtiotXjSpotOperationRecordDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-     <bean id="ytiotXjTeamPersonnelDao" class="cn.com.usky.iot.xjteampersonnel.dao.YtiotXjTeamPersonnelDaoImpl">
+    <bean id="ytiotXjTeamPersonnelDao" class="cn.com.usky.iot.xjteampersonnel.dao.YtiotXjTeamPersonnelDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-    </bean>
-	<bean id="ytiotXjInspectorsService" class="cn.com.usky.iot.xjinspectors.service.YtiotXjInspectorsServicesImpl">
-		<property name="ytiotXjInspectorsCompanyDao">
-			<ref bean="ytiotXjInspectorsCompanyDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotXjTeamPersonnelDao">
-			<ref bean="ytiotXjTeamPersonnelDao"/>
-		</property>
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotXjInspectionPointsService" class="cn.com.usky.iot.xjinspectionpoints.service.YtiotXjInspectionPointsServicesImpl">
-    	<property name="ytiotXjInspectionPointsDao">
-			<ref bean="ytiotXjInspectionPointsDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotXjSpotEquipmentDao">
-			<ref bean="ytiotXjSpotEquipmentDao"/>
-		</property>	
-		<property name="ytiotVCompanyDao">
-			<ref bean="ytiotVCompanyDao"/>
-		</property>
-		<property name="ytiotXjSpotOperationRecordDao">
-			<ref bean="ytiotXjSpotOperationRecordDao"/>
-		</property>
-		<property name="ytiotXjPlanSpotDao">
-			<ref bean="ytiotXjPlanSpotDao"/>
-		</property>	
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-		<property name="ytiotVDeviceStatusDao">
-			<ref bean="ytiotVDeviceStatusDao"/>
-		</property>
-		<property name="ytiotXjPlanMasterDao">
-			<ref bean="ytiotXjPlanMasterDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotXjPlanMasterService" class="cn.com.usky.iot.xjplanmaster.service.YtiotXjPlanMasterServicesImpl">
-		<property name="ytiotXjPlanMasterDao">
-			<ref bean="ytiotXjPlanMasterDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotXjInspectionPointsDao">
-			<ref bean="ytiotXjInspectionPointsDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-		<property name="ytiotXjPlanSpotDao">
-			<ref bean="ytiotXjPlanSpotDao"/>
-		</property>
-		<property name="ytiotXjPlanChildDao">
-			<ref bean="ytiotXjPlanChildDao"/>
-		</property>
-		<property name="ytiotXjSpotOperationRecordDao">
-			<ref bean="ytiotXjSpotOperationRecordDao"/>
-		</property>
-	</bean>
-	<bean id="ytiotXjPlanChildService" class="cn.com.usky.iot.xjplanchild.service.YtiotXjPlanChildServicesImpl">
-		<property name="ytiotXjPlanChildDao">
-			<ref bean="ytiotXjPlanChildDao"/>
-		</property>
-		<property name="ytiotXjPlanMasterDao">
-			<ref bean="ytiotXjPlanMasterDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotXjInspectionPointsDao">
-			<ref bean="ytiotXjInspectionPointsDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-		<property name="ytiotXjPlanSpotDao">
-			<ref bean="ytiotXjPlanSpotDao"/>
-		</property>
-	</bean>
-	
-	<bean id="ytiotXjPlanTeamService" class="cn.com.usky.iot.xjplanteam.service.YtiotXjPlanTeamServicesImpl">
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotXjInspectorsCompanyDao">
-			<ref bean="ytiotXjInspectorsCompanyDao"/>
-		</property>
-		<property name="ytiotXjTeamPersonnelDao">
-			<ref bean="ytiotXjTeamPersonnelDao"/>
-		</property>	
-		<property name="ytiotXjPlanMasterDao">
-			<ref bean="ytiotXjPlanMasterDao"/>
-		</property>
-		<property name="ytiotXjPlanChildDao">
-			<ref bean="ytiotXjPlanChildDao"/>
-		</property>	
-	</bean>
-	<bean id="ytiotXjSpotOperationRecordService" class="cn.com.usky.iot.xjspotoperationrecord.service.YtiotXjSpotOperationRecordServicesImpl">
-		<property name="ytiotXjSpotOperationRecordDao">
-			<ref bean="ytiotXjSpotOperationRecordDao"/>
-		</property>
-		<property name="ytiotXjPlanMasterDao">
-			<ref bean="ytiotXjPlanMasterDao"/>
-		</property>
-		<property name="ytiotXjPlanChildDao">
-			<ref bean="ytiotXjPlanChildDao"/>
-		</property>
-		<property name="ytiotXjPlanTeamDao">
-			<ref bean="ytiotXjPlanTeamDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>	
-		<property name="ytiotXjInspectionPointsDao">
-			<ref bean="ytiotXjInspectionPointsDao"/>
-		</property>
-		<property name="ytiotXjOperationRecordPhotosDao">
-			<ref bean="ytiotXjOperationRecordPhotosDao"/>
-		</property>	
-	</bean>
-	<bean id="ytiotVDeviceStatusDao" class="cn.com.usky.iot.devicestatus.dao.YtiotVDeviceStatusDaoImpl">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjInspectorsService" class="cn.com.usky.iot.xjinspectors.service.YtiotXjInspectorsServicesImpl">
+        <property name="ytiotXjInspectorsCompanyDao">
+            <ref bean="ytiotXjInspectorsCompanyDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotXjTeamPersonnelDao">
+            <ref bean="ytiotXjTeamPersonnelDao"/>
+        </property>
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjInspectionPointsService"
+          class="cn.com.usky.iot.xjinspectionpoints.service.YtiotXjInspectionPointsServicesImpl">
+        <property name="ytiotXjInspectionPointsDao">
+            <ref bean="ytiotXjInspectionPointsDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotXjSpotEquipmentDao">
+            <ref bean="ytiotXjSpotEquipmentDao"/>
+        </property>
+        <property name="ytiotVCompanyDao">
+            <ref bean="ytiotVCompanyDao"/>
+        </property>
+        <property name="ytiotXjSpotOperationRecordDao">
+            <ref bean="ytiotXjSpotOperationRecordDao"/>
+        </property>
+        <property name="ytiotXjPlanSpotDao">
+            <ref bean="ytiotXjPlanSpotDao"/>
+        </property>
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+        <property name="ytiotVDeviceStatusDao">
+            <ref bean="ytiotVDeviceStatusDao"/>
+        </property>
+        <property name="ytiotXjPlanMasterDao">
+            <ref bean="ytiotXjPlanMasterDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjPlanMasterService" class="cn.com.usky.iot.xjplanmaster.service.YtiotXjPlanMasterServicesImpl">
+        <property name="ytiotXjPlanMasterDao">
+            <ref bean="ytiotXjPlanMasterDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotXjInspectionPointsDao">
+            <ref bean="ytiotXjInspectionPointsDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+        <property name="ytiotXjPlanSpotDao">
+            <ref bean="ytiotXjPlanSpotDao"/>
+        </property>
+        <property name="ytiotXjPlanChildDao">
+            <ref bean="ytiotXjPlanChildDao"/>
+        </property>
+        <property name="ytiotXjSpotOperationRecordDao">
+            <ref bean="ytiotXjSpotOperationRecordDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjPlanChildService" class="cn.com.usky.iot.xjplanchild.service.YtiotXjPlanChildServicesImpl">
+        <property name="ytiotXjPlanChildDao">
+            <ref bean="ytiotXjPlanChildDao"/>
+        </property>
+        <property name="ytiotXjPlanMasterDao">
+            <ref bean="ytiotXjPlanMasterDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotXjInspectionPointsDao">
+            <ref bean="ytiotXjInspectionPointsDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+        <property name="ytiotXjPlanSpotDao">
+            <ref bean="ytiotXjPlanSpotDao"/>
+        </property>
+    </bean>
+
+    <bean id="ytiotXjPlanTeamService" class="cn.com.usky.iot.xjplanteam.service.YtiotXjPlanTeamServicesImpl">
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotXjInspectorsCompanyDao">
+            <ref bean="ytiotXjInspectorsCompanyDao"/>
+        </property>
+        <property name="ytiotXjTeamPersonnelDao">
+            <ref bean="ytiotXjTeamPersonnelDao"/>
+        </property>
+        <property name="ytiotXjPlanMasterDao">
+            <ref bean="ytiotXjPlanMasterDao"/>
+        </property>
+        <property name="ytiotXjPlanChildDao">
+            <ref bean="ytiotXjPlanChildDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjSpotOperationRecordService"
+          class="cn.com.usky.iot.xjspotoperationrecord.service.YtiotXjSpotOperationRecordServicesImpl">
+        <property name="ytiotXjSpotOperationRecordDao">
+            <ref bean="ytiotXjSpotOperationRecordDao"/>
+        </property>
+        <property name="ytiotXjPlanMasterDao">
+            <ref bean="ytiotXjPlanMasterDao"/>
+        </property>
+        <property name="ytiotXjPlanChildDao">
+            <ref bean="ytiotXjPlanChildDao"/>
+        </property>
+        <property name="ytiotXjPlanTeamDao">
+            <ref bean="ytiotXjPlanTeamDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotXjInspectionPointsDao">
+            <ref bean="ytiotXjInspectionPointsDao"/>
+        </property>
+        <property name="ytiotXjOperationRecordPhotosDao">
+            <ref bean="ytiotXjOperationRecordPhotosDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotVDeviceStatusDao" class="cn.com.usky.iot.devicestatus.dao.YtiotVDeviceStatusDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
     </bean>
     <bean id="ytiotXjEventProcessingDao" class="cn.com.usky.iot.xjeventprocessing.dao.YtiotXjEventProcessingDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotXjToExamine1Dao">
-			<ref bean="ytiotXjToExamine1Dao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotXjToExamine1Dao">
+            <ref bean="ytiotXjToExamine1Dao"/>
+        </property>
     </bean>
     <bean id="ytiotXjToExamineDao" class="cn.com.usky.iot.xjtoexamine.dao.YtiotXjToExamineDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-     <bean id="ytiotXjToExamine1Dao" class="cn.com.usky.iot.xjtoexamine1.dao.YtiotXjToExamine1DaoImpl">
+    <bean id="ytiotXjToExamine1Dao" class="cn.com.usky.iot.xjtoexamine1.dao.YtiotXjToExamine1DaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-    </bean>
-    <bean id="ytiotXjEventProcessingService" class="cn.com.usky.iot.xjeventprocessing.service.YtiotXjEventProcessingServicesImpl">
-		<property name="ytiotXjEventProcessingDao">
-			<ref bean="ytiotXjEventProcessingDao"/>
-		</property>
-		<property name="ytiotXjToExamine1Dao">
-			<ref bean="ytiotXjToExamine1Dao"/>
-		</property>
-		<property name="ytiotXjSpotOperationRecordDao">
-			<ref bean="ytiotXjSpotOperationRecordDao"/>
-		</property>
-		<property name="ytiotXjInspectorsDao">
-			<ref bean="ytiotXjInspectorsDao"/>
-		</property>
-		<property name="ytiotXjOperationRecordPhotosDao">
-			<ref bean="ytiotXjOperationRecordPhotosDao"/>
-		</property>
-		<property name="ytiotXjInspectionPointsDao">
-			<ref bean="ytiotXjInspectionPointsDao"/>
-		</property>	
-	</bean>
-    
-	<!-- 巡检、维保、维修结束 -->
-	<!-- 语音报警配置开始-->
-	 <bean id="ytiotYyPzbDao" class="cn.com.usky.iot.yypzb.dao.YtiotYyPzbDaoImpl">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotXjEventProcessingService"
+          class="cn.com.usky.iot.xjeventprocessing.service.YtiotXjEventProcessingServicesImpl">
+        <property name="ytiotXjEventProcessingDao">
+            <ref bean="ytiotXjEventProcessingDao"/>
+        </property>
+        <property name="ytiotXjToExamine1Dao">
+            <ref bean="ytiotXjToExamine1Dao"/>
+        </property>
+        <property name="ytiotXjSpotOperationRecordDao">
+            <ref bean="ytiotXjSpotOperationRecordDao"/>
+        </property>
+        <property name="ytiotXjInspectorsDao">
+            <ref bean="ytiotXjInspectorsDao"/>
+        </property>
+        <property name="ytiotXjOperationRecordPhotosDao">
+            <ref bean="ytiotXjOperationRecordPhotosDao"/>
+        </property>
+        <property name="ytiotXjInspectionPointsDao">
+            <ref bean="ytiotXjInspectionPointsDao"/>
+        </property>
+    </bean>
+
+    <!-- 巡检、维保、维修结束 -->
+    <!-- 语音报警配置开始-->
+    <bean id="ytiotYyPzbDao" class="cn.com.usky.iot.yypzb.dao.YtiotYyPzbDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-		<property name="ytiotYyCzjlDao">
-			<ref bean="ytiotYyCzjlDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+        <property name="ytiotYyCzjlDao">
+            <ref bean="ytiotYyCzjlDao"/>
+        </property>
     </bean>
     <bean id="ytiotYyPzb2Dao" class="cn.com.usky.iot.yypzb2.dao.YtiotYyPzb2DaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotYySjjlDao" class="cn.com.usky.iot.yysjjl.dao.YtiotYySjjlDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
-    </bean>
-     <bean id="ytiotYyPzbService" class="cn.com.usky.iot.yypzb.service.YtiotYyPzbServicesImpl">
-		<property name="ytiotYyPzbDao">
-			<ref bean="ytiotYyPzbDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotYySjjlDao">
-			<ref bean="ytiotYySjjlDao"/>
-		</property>
-		<property name="ytiotYyCzjlDao">
-			<ref bean="ytiotYyCzjlDao"/>
-		</property>
-		<property name="ytiotYyXhconfigDao">
-			<ref bean="ytiotYyXhconfigDao"/>
-		</property>
-	</bean>
-	
-	 <bean id="ytiotYyCzjlDao" class="cn.com.usky.iot.yyczjl.dao.YtiotYyCzjlDaoImpl">
+            <ref bean="ytiotTOrderDao"/>
+        </property>
+    </bean>
+    <bean id="ytiotYyPzbService" class="cn.com.usky.iot.yypzb.service.YtiotYyPzbServicesImpl">
+        <property name="ytiotYyPzbDao">
+            <ref bean="ytiotYyPzbDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotYySjjlDao">
+            <ref bean="ytiotYySjjlDao"/>
+        </property>
+        <property name="ytiotYyCzjlDao">
+            <ref bean="ytiotYyCzjlDao"/>
+        </property>
+        <property name="ytiotYyXhconfigDao">
+            <ref bean="ytiotYyXhconfigDao"/>
+        </property>
+    </bean>
+
+    <bean id="ytiotYyCzjlDao" class="cn.com.usky.iot.yyczjl.dao.YtiotYyCzjlDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
     <bean id="ytiotYyXhconfigDao" class="cn.com.usky.iot.yyxhconfig.dao.YtiotYyXhconfigDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
         <property name="ytiotTOrderDao">
-			<ref bean="ytiotTOrderDao"/>
-		</property>
+            <ref bean="ytiotTOrderDao"/>
+        </property>
     </bean>
-		 <bean id="simpleclient" class="cn.com.usky.iot.mqtt.MqttClient" init-method="save">
-			 <property name="hibernateTemplate">
-				 <ref bean="hibernateTemplate"/>
-			 </property>
+    <bean id="simpleclient" class="cn.com.usky.iot.mqtt.MqttClient" init-method="save">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
 
     </bean>
-	<bean id="MqttUtil" class="cn.com.usky.iot.mqtt.MqttUtil">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-	</bean>
-	<bean id="fireStationService" class="cn.com.usky.iot.service.fireStationService.FireStationServiceImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-	</bean>
+    <bean id="MqttUtil" class="cn.com.usky.iot.mqtt.MqttUtil">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+    </bean>
+    <bean id="fireStationService" class="cn.com.usky.iot.service.fireStationService.FireStationServiceImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+    </bean>
 
-	<bean id="contractService" class="cn.com.usky.iot.service.contractService.ContractServiceImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-		<property name="ytiotVUserphoneDao">
-			<ref bean="ytiotVUserphoneDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+    <bean id="contractService" class="cn.com.usky.iot.service.contractService.ContractServiceImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVUserphoneDao">
+            <ref bean="ytiotVUserphoneDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
 
 
-	</bean>
-	<bean id="GroupService" class="cn.com.usky.iot.service.groupService.GroupServiceImpl">
-		<property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="ytiotVAlarmDao">
-			<ref bean="ytiotVAlarmDao"/>
-		</property>
-		<property name="ytiotVUserphoneDao">
-			<ref bean="ytiotVUserphoneDao"/>
-		</property>
-		<property name="ytiotTAdminDao">
-			<ref bean="ytiotTAdminDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
+    </bean>
+    <bean id="GroupService" class="cn.com.usky.iot.service.groupService.GroupServiceImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="ytiotVAlarmDao">
+            <ref bean="ytiotVAlarmDao"/>
+        </property>
+        <property name="ytiotVUserphoneDao">
+            <ref bean="ytiotVUserphoneDao"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
 
 
-	</bean>
+    </bean>
+
 
+    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
+        <property name="defaultEncoding">
+            <value>UTF-8</value>
+        </property>
+        <property name="maxUploadSize">
+            <value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
+        </property>
+        <property name="maxInMemorySize">
+            <value>4096</value>
+        </property>
+    </bean>
 
+    <bean id="ytiotTEfAnalysisDao" class="cn.com.usky.iot.EfAnalysis.dao.YtiotTEfAnalysisDaoImpl">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
 
+    <bean id="ytiotTEfAnalysisService" class="cn.com.usky.iot.EfAnalysis.service.YtiotTEfAnalysisServicesImpl">
+        <property name="ytiotTEfAnalysisDao">
+            <ref bean="ytiotTEfAnalysisDao"/>
+        </property>
+    </bean>
 
-	<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
-		<property name="defaultEncoding">
-			<value>UTF-8</value>
-		</property>
-		<property name="maxUploadSize">
-			<value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
-		</property>
-		<property name="maxInMemorySize">
-			<value>4096</value>
-		</property>
-	</bean>
-	
-	<bean id="ytiotTEfAnalysisDao" class="cn.com.usky.iot.EfAnalysis.dao.YtiotTEfAnalysisDaoImpl">
+
+    <bean id="LoginService" class="cn.com.usky.iot.controller.login.LoginServiceImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="ytiotTAdminDao">
+            <ref bean="ytiotTAdminDao"/>
+        </property>
+        <property name="TokenAuthService">
+            <ref bean="TokenAuthService"/>
+        </property>
+
     </bean>
 
-	<bean id="ytiotTEfAnalysisService" class="cn.com.usky.iot.EfAnalysis.service.YtiotTEfAnalysisServicesImpl">
-		<property name="ytiotTEfAnalysisDao">
-			<ref bean="ytiotTEfAnalysisDao"/>
-		</property>
-	</bean>
+    <bean id="TokenAuthService" class="cn.com.usky.iot.auth.TokenAuthService">
+        <property name="hibernateTemplate">
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="LoginService">
+            <ref bean="LoginService"/>
+        </property>
+    </bean>
 
-	 <bean id="ytiotTAdminStateEntityDao" class="cn.com.usky.iot.userstatus.dao.YtiotTAdminStateEntityDaoImpl">
+
+    <bean id="ytiotTAdminStateEntityDao" class="cn.com.usky.iot.userstatus.dao.YtiotTAdminStateEntityDaoImpl">
         <property name="hibernateTemplate">
-			<ref bean="hibernateTemplate"/>
-		</property>
-		<property name="daoQuery">
-			<ref bean="daoQuery"/>
-		</property>
-    </bean>
-	<bean id="ytiotTAdminStateEntityService" class="cn.com.usky.iot.userstatus.service.YtiotTAdminStateEntityServicesImpl">
-		<property name="ytiotTAdminStateEntityDao">
-			<ref bean="ytiotTAdminStateEntityDao"/>
-		</property>
-		<property name="ytiotVUserCompanyDao">
-			<ref bean="ytiotVUserCompanyDao"/>
-		</property>
-		<property name="ytiotTEfAnalysisDao">
-			<ref bean="ytiotTEfAnalysisDao"/>
-		</property>
-	</bean>
+            <ref bean="hibernateTemplate"/>
+        </property>
+        <property name="daoQuery">
+            <ref bean="daoQuery"/>
+        </property>
+    </bean>
+    <bean id="ytiotTAdminStateEntityService"
+          class="cn.com.usky.iot.userstatus.service.YtiotTAdminStateEntityServicesImpl">
+        <property name="ytiotTAdminStateEntityDao">
+            <ref bean="ytiotTAdminStateEntityDao"/>
+        </property>
+        <property name="ytiotVUserCompanyDao">
+            <ref bean="ytiotVUserCompanyDao"/>
+        </property>
+        <property name="ytiotTEfAnalysisDao">
+            <ref bean="ytiotTEfAnalysisDao"/>
+        </property>
+    </bean>
 </beans>

+ 10 - 3
WebRoot/index.jsp

@@ -18,6 +18,8 @@
     <script type="text/javascript" src="<%=basePath+"res/jquery/jquery-3.3.1.min.js" %>"></script>
     <script type="text/javascript" src="<%=basePath+"res/particles/particles.min.js" %>"></script>
     <script type="text/javascript" src="<%=basePath+"res/extjs/ext-all.js" %>"></script>
+    <script type="text/javascript" src="<%=basePath+"js/md5.js" %>"></script>
+    <script type="text/javascript" src="<%=basePath+"js/denglu.js" %>"></script>
     <script type="text/javascript" src="<%=basePath+"res/extjs/locale/ext-lang-zh_CN.js" %>"></script>
     <title>智慧消防管理平台</title>
 </head>
@@ -37,9 +39,12 @@
                     <span>密 码</span>
                     <input type="password" placeholder="请输入密码" id="password" name="password" autocomplete="off">
                 </p>
+                <input id="userCaptcha" name="userCaptcha" type="text" placeholder="请输入验证码"/>
+                <img id="kaptchaImage" src="./login/getCheckNumber" onclick="change();">
                 <p id="btn-submit" onclick="loginSubmit()">
                     登 录
                 </p>
+
             </div>
         </div>
     </div>
@@ -98,15 +103,17 @@
 
     }
     var loginSubmit = function () {
+        var p = $("#password").val()
         var basePath = $("#basePath").val();
         var queryJson = new Object();
         queryJson.V_LOGINNAME = $("#username").val();
-        queryJson.V_PASSWORD = $("#password").val();
+        queryJson.V_PASSWORD = md5(p);
         queryJson.V_COMMAND = "LOGIN";
         var qdata = "queryJson=" + JSON.stringify(queryJson);
         var qurl = basePath + '/cgi-bin/WebAction.cgi';
         if ((basePath.indexOf('localhost') >= 0) || (basePath.indexOf('127.0.0.1') >= 0))
-            qurl = 'http://47.103.74.123:8080/YtIoT/cgi-bin/WebAction.cgi';
+            // qurl = 'http://47.103.74.123:8080/YtIoT/cgi-bin/WebAction.cgi';
+            var qurl = basePath + "login/tolgin";
         $.ajax({
             type: 'POST',
             url: qurl,
@@ -115,7 +122,7 @@
                 var json = eval('(' + result + ')');
                 if (json.login == 'true') {
                     sessionStorage.setItem('V_LOGINNAME', $("#username").val());
-                    sessionStorage.setItem('V_PASSWORD', $("#password").val());
+                    sessionStorage.setItem('V_PASSWORD', md5(p));
                     if ($("#username").val() == "wjzn") {
                         location.href = basePath + "view/frontpage/index.html"
                     } else {

+ 57 - 0
WebRoot/js/denglu.js

@@ -0,0 +1,57 @@
+function denglu() {
+    var userCaptcha = $('#userCaptcha').val();
+    var result= "3333";
+    // var userName ;
+    //做一层验证
+    if (userCaptcha == '') {
+        document.getElementById("showInfo").style.display = "block";
+        document.getElementById("showInfo").innerText = "验证码不能为空!";
+    } else {
+        if(!checkNumber(userCaptcha)){
+            document.getElementById("showInfo").style.display = "block";
+            document.getElementById("showInfo").innerText = "验证码错误!";
+            return ;
+        }
+        // $.ajax({
+        //     type: "post",   //post提交方式默认是get
+        //     dataType: "json",
+        //     url: ""+getRealPath()+"/UserMan/login?userNo="+userNo+"&userPass="+userPass+"",
+        //     async: false,
+        //     success: function (data) {
+        //         if(data.result=="1"){
+        //             window.open(getRealPath()+"/View/Index/index.html?userName="+data.userName+"&userNo="+userNo+"", '_self');
+        //             document.cookie="status=success;path=/";//使cookie在整个网站下可用,可以将cookie_dir指定为根目录
+        //         }else {
+        //             $('#showInfo').css('display','block');
+        //             document.getElementById("showInfo").innerText = data.message;
+        //         }
+        //
+        //     }
+        // });
+    }
+}
+function change() {
+    $('#kaptchaImage').click(function () {
+        $(this).attr('src', './login/getCheckNumber?' + Math.floor(Math.random() * 100));
+    })
+}
+
+function checkNumber(userCaptcha){
+    var flag;
+    $.ajax({
+        type: 'post',
+        url: getRealPath()+'/login/checkNumber/'+userCaptcha,
+        contenType: 'application/json;charset=utf-8',
+        dataType:'json',
+        async: false,//false为异步传输,异步传输才能传全局变量
+        success:function (data) {
+            //这里的code属性是自定义的message类,可以用其他方式代替
+            if(data.code == "200"){
+                flag = true;
+            }else if(data.code == "500"){
+                flag = false;
+            }
+        }
+    });
+    return flag;
+}

+ 280 - 0
WebRoot/js/md5.js

@@ -0,0 +1,280 @@
+/*
+ * JavaScript MD5
+ * https://github.com/blueimp/JavaScript-MD5
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * https://opensource.org/licenses/MIT
+ *
+ * Based on
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/* global define */
+
+;(function ($) {
+    'use strict'
+
+    /*
+    * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+    * to work around bugs in some JS interpreters.
+    */
+    function safeAdd (x, y) {
+        var lsw = (x & 0xffff) + (y & 0xffff)
+        var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
+        return (msw << 16) | (lsw & 0xffff)
+    }
+
+    /*
+    * Bitwise rotate a 32-bit number to the left.
+    */
+    function bitRotateLeft (num, cnt) {
+        return (num << cnt) | (num >>> (32 - cnt))
+    }
+
+    /*
+    * These functions implement the four basic operations the algorithm uses.
+    */
+    function md5cmn (q, a, b, x, s, t) {
+        return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
+    }
+    function md5ff (a, b, c, d, x, s, t) {
+        return md5cmn((b & c) | (~b & d), a, b, x, s, t)
+    }
+    function md5gg (a, b, c, d, x, s, t) {
+        return md5cmn((b & d) | (c & ~d), a, b, x, s, t)
+    }
+    function md5hh (a, b, c, d, x, s, t) {
+        return md5cmn(b ^ c ^ d, a, b, x, s, t)
+    }
+    function md5ii (a, b, c, d, x, s, t) {
+        return md5cmn(c ^ (b | ~d), a, b, x, s, t)
+    }
+
+    /*
+    * Calculate the MD5 of an array of little-endian words, and a bit length.
+    */
+    function binlMD5 (x, len) {
+        /* append padding */
+        x[len >> 5] |= 0x80 << (len % 32)
+        x[((len + 64) >>> 9 << 4) + 14] = len
+
+        var i
+        var olda
+        var oldb
+        var oldc
+        var oldd
+        var a = 1732584193
+        var b = -271733879
+        var c = -1732584194
+        var d = 271733878
+
+        for (i = 0; i < x.length; i += 16) {
+            olda = a
+            oldb = b
+            oldc = c
+            oldd = d
+
+            a = md5ff(a, b, c, d, x[i], 7, -680876936)
+            d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
+            c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
+            b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
+            a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
+            d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
+            c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
+            b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
+            a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
+            d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
+            c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
+            b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
+            a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
+            d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
+            c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
+            b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)
+
+            a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
+            d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
+            c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
+            b = md5gg(b, c, d, a, x[i], 20, -373897302)
+            a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
+            d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
+            c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
+            b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
+            a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
+            d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
+            c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
+            b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
+            a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
+            d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
+            c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
+            b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)
+
+            a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
+            d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
+            c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
+            b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
+            a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
+            d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
+            c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
+            b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
+            a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
+            d = md5hh(d, a, b, c, x[i], 11, -358537222)
+            c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
+            b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
+            a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
+            d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
+            c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
+            b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)
+
+            a = md5ii(a, b, c, d, x[i], 6, -198630844)
+            d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
+            c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
+            b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
+            a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
+            d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
+            c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
+            b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
+            a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
+            d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
+            c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
+            b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
+            a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
+            d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
+            c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
+            b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)
+
+            a = safeAdd(a, olda)
+            b = safeAdd(b, oldb)
+            c = safeAdd(c, oldc)
+            d = safeAdd(d, oldd)
+        }
+        return [a, b, c, d]
+    }
+
+    /*
+    * Convert an array of little-endian words to a string
+    */
+    function binl2rstr (input) {
+        var i
+        var output = ''
+        var length32 = input.length * 32
+        for (i = 0; i < length32; i += 8) {
+            output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)
+        }
+        return output
+    }
+
+    /*
+    * Convert a raw string to an array of little-endian words
+    * Characters >255 have their high-byte silently ignored.
+    */
+    function rstr2binl (input) {
+        var i
+        var output = []
+        output[(input.length >> 2) - 1] = undefined
+        for (i = 0; i < output.length; i += 1) {
+            output[i] = 0
+        }
+        var length8 = input.length * 8
+        for (i = 0; i < length8; i += 8) {
+            output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)
+        }
+        return output
+    }
+
+    /*
+    * Calculate the MD5 of a raw string
+    */
+    function rstrMD5 (s) {
+        return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
+    }
+
+    /*
+    * Calculate the HMAC-MD5, of a key and some data (raw strings)
+    */
+    function rstrHMACMD5 (key, data) {
+        var i
+        var bkey = rstr2binl(key)
+        var ipad = []
+        var opad = []
+        var hash
+        ipad[15] = opad[15] = undefined
+        if (bkey.length > 16) {
+            bkey = binlMD5(bkey, key.length * 8)
+        }
+        for (i = 0; i < 16; i += 1) {
+            ipad[i] = bkey[i] ^ 0x36363636
+            opad[i] = bkey[i] ^ 0x5c5c5c5c
+        }
+        hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
+        return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
+    }
+
+    /*
+    * Convert a raw string to a hex string
+    */
+    function rstr2hex (input) {
+        var hexTab = '0123456789abcdef'
+        var output = ''
+        var x
+        var i
+        for (i = 0; i < input.length; i += 1) {
+            x = input.charCodeAt(i)
+            output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)
+        }
+        return output
+    }
+
+    /*
+    * Encode a string as utf-8
+    */
+    function str2rstrUTF8 (input) {
+        return unescape(encodeURIComponent(input))
+    }
+
+    /*
+    * Take string arguments and return either raw or hex encoded strings
+    */
+    function rawMD5 (s) {
+        return rstrMD5(str2rstrUTF8(s))
+    }
+    function hexMD5 (s) {
+        return rstr2hex(rawMD5(s))
+    }
+    function rawHMACMD5 (k, d) {
+        return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
+    }
+    function hexHMACMD5 (k, d) {
+        return rstr2hex(rawHMACMD5(k, d))
+    }
+
+    function md5 (string, key, raw) {
+        if (!key) {
+            if (!raw) {
+                return hexMD5(string)
+            }
+            return rawMD5(string)
+        }
+        if (!raw) {
+            return hexHMACMD5(key, string)
+        }
+        return rawHMACMD5(key, string)
+    }
+
+    if (typeof define === 'function' && define.amd) {
+        define(function () {
+            return md5
+        })
+    } else if (typeof module === 'object' && module.exports) {
+        module.exports = md5
+    } else {
+        $.md5 = md5
+    }
+})(this)

+ 1956 - 0
WebRoot/js/sockjs.min.js

@@ -0,0 +1,1956 @@
+/* sockjs-client v1.1.1 | http://sockjs.org | MIT license */
+!function (t) {
+    if ("object" == typeof exports && "undefined" != typeof module) module.exports = t(); else if ("function" == typeof define && define.amd) define([], t); else {
+        var e;
+        "undefined" != typeof window ? e = window : "undefined" != typeof global ? e = global : "undefined" != typeof self && (e = self), e.SockJS = t()
+    }
+}(function () {
+    var t;
+    return function e(t, n, r) {
+        function i(s, a) {
+            if (!n[s]) {
+                if (!t[s]) {
+                    var u = "function" == typeof require && require;
+                    if (!a && u) return u(s, !0);
+                    if (o) return o(s, !0);
+                    var l = new Error("Cannot find module '" + s + "'");
+                    throw l.code = "MODULE_NOT_FOUND", l
+                }
+                var c = n[s] = {exports: {}};
+                t[s][0].call(c.exports, function (e) {
+                    var n = t[s][1][e];
+                    return i(n ? n : e)
+                }, c, c.exports, e, t, n, r)
+            }
+            return n[s].exports
+        }
+
+        for (var o = "function" == typeof require && require, s = 0; s < r.length; s++) i(r[s]);
+        return i
+    }({
+        1: [function (t, e) {
+            (function (n) {
+                "use strict";
+                var r = t("./transport-list");
+                e.exports = t("./main")(r), "_sockjs_onload" in n && setTimeout(n._sockjs_onload, 1)
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"./main": 14, "./transport-list": 16}],
+        2: [function (t, e) {
+            "use strict";
+
+            function n() {
+                i.call(this), this.initEvent("close", !1, !1), this.wasClean = !1, this.code = 0, this.reason = ""
+            }
+
+            var r = t("inherits"), i = t("./event");
+            r(n, i), e.exports = n
+        }, {"./event": 4, inherits: 54}],
+        3: [function (t, e) {
+            "use strict";
+
+            function n() {
+                i.call(this)
+            }
+
+            var r = t("inherits"), i = t("./eventtarget");
+            r(n, i), n.prototype.removeAllListeners = function (t) {
+                t ? delete this._listeners[t] : this._listeners = {}
+            }, n.prototype.once = function (t, e) {
+                function n() {
+                    r.removeListener(t, n), i || (i = !0, e.apply(this, arguments))
+                }
+
+                var r = this, i = !1;
+                this.on(t, n)
+            }, n.prototype.emit = function () {
+                var t = arguments[0], e = this._listeners[t];
+                if (e) {
+                    for (var n = arguments.length, r = new Array(n - 1), i = 1; n > i; i++) r[i - 1] = arguments[i];
+                    for (var o = 0; o < e.length; o++) e[o].apply(this, r)
+                }
+            }, n.prototype.on = n.prototype.addListener = i.prototype.addEventListener, n.prototype.removeListener = i.prototype.removeEventListener, e.exports.EventEmitter = n
+        }, {"./eventtarget": 5, inherits: 54}],
+        4: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                this.type = t
+            }
+
+            n.prototype.initEvent = function (t, e, n) {
+                return this.type = t, this.bubbles = e, this.cancelable = n, this.timeStamp = +new Date, this
+            }, n.prototype.stopPropagation = function () {
+            }, n.prototype.preventDefault = function () {
+            }, n.CAPTURING_PHASE = 1, n.AT_TARGET = 2, n.BUBBLING_PHASE = 3, e.exports = n
+        }, {}],
+        5: [function (t, e) {
+            "use strict";
+
+            function n() {
+                this._listeners = {}
+            }
+
+            n.prototype.addEventListener = function (t, e) {
+                t in this._listeners || (this._listeners[t] = []);
+                var n = this._listeners[t];
+                -1 === n.indexOf(e) && (n = n.concat([e])), this._listeners[t] = n
+            }, n.prototype.removeEventListener = function (t, e) {
+                var n = this._listeners[t];
+                if (n) {
+                    var r = n.indexOf(e);
+                    return -1 !== r ? void (n.length > 1 ? this._listeners[t] = n.slice(0, r).concat(n.slice(r + 1)) : delete this._listeners[t]) : void 0
+                }
+            }, n.prototype.dispatchEvent = function () {
+                var t = arguments[0], e = t.type, n = 1 === arguments.length ? [t] : Array.apply(null, arguments);
+                if (this["on" + e] && this["on" + e].apply(this, n), e in this._listeners) for (var r = this._listeners[e], i = 0; i < r.length; i++) r[i].apply(this, n)
+            }, e.exports = n
+        }, {}],
+        6: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                i.call(this), this.initEvent("message", !1, !1), this.data = t
+            }
+
+            var r = t("inherits"), i = t("./event");
+            r(n, i), e.exports = n
+        }, {"./event": 4, inherits: 54}],
+        7: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                this._transport = t, t.on("message", this._transportMessage.bind(this)), t.on("close", this._transportClose.bind(this))
+            }
+
+            var r = t("json3"), i = t("./utils/iframe");
+            n.prototype._transportClose = function (t, e) {
+                i.postMessage("c", r.stringify([t, e]))
+            }, n.prototype._transportMessage = function (t) {
+                i.postMessage("t", t)
+            }, n.prototype._send = function (t) {
+                this._transport.send(t)
+            }, n.prototype._close = function () {
+                this._transport.close(), this._transport.removeAllListeners()
+            }, e.exports = n
+        }, {"./utils/iframe": 47, json3: 55}],
+        8: [function (t, e) {
+            "use strict";
+            var n = t("./utils/url"), r = t("./utils/event"), i = t("json3"), o = t("./facade"),
+                s = t("./info-iframe-receiver"), a = t("./utils/iframe"), u = t("./location");
+            e.exports = function (t, e) {
+                var l = {};
+                e.forEach(function (t) {
+                    t.facadeTransport && (l[t.facadeTransport.transportName] = t.facadeTransport)
+                }), l[s.transportName] = s;
+                var c;
+                t.bootstrap_iframe = function () {
+                    var e;
+                    a.currentWindowId = u.hash.slice(1);
+                    var s = function (r) {
+                        if (r.source === parent && ("undefined" == typeof c && (c = r.origin), r.origin === c)) {
+                            var s;
+                            try {
+                                s = i.parse(r.data)
+                            } catch (f) {
+                                return
+                            }
+                            if (s.windowId === a.currentWindowId) switch (s.type) {
+                                case"s":
+                                    var h;
+                                    try {
+                                        h = i.parse(s.data)
+                                    } catch (f) {
+                                        break
+                                    }
+                                    var d = h[0], p = h[1], v = h[2], m = h[3];
+                                    if (d !== t.version) throw new Error('Incompatible SockJS! Main site uses: "' + d + '", the iframe: "' + t.version + '".');
+                                    if (!n.isOriginEqual(v, u.href) || !n.isOriginEqual(m, u.href)) throw new Error("Can't connect to different domain from within an iframe. (" + u.href + ", " + v + ", " + m + ")");
+                                    e = new o(new l[p](v, m));
+                                    break;
+                                case"m":
+                                    e._send(s.data);
+                                    break;
+                                case"c":
+                                    e && e._close(), e = null
+                            }
+                        }
+                    };
+                    r.attachEvent("message", s), a.postMessage("s")
+                }
+            }
+        }, {
+            "./facade": 7,
+            "./info-iframe-receiver": 10,
+            "./location": 13,
+            "./utils/event": 46,
+            "./utils/iframe": 47,
+            "./utils/url": 52,
+            debug: void 0,
+            json3: 55
+        }],
+        9: [function (t, e) {
+            "use strict";
+
+            function n(t, e) {
+                r.call(this);
+                var n = this, i = +new Date;
+                this.xo = new e("GET", t), this.xo.once("finish", function (t, e) {
+                    var r, a;
+                    if (200 === t) {
+                        if (a = +new Date - i, e) try {
+                            r = o.parse(e)
+                        } catch (u) {
+                        }
+                        s.isObject(r) || (r = {})
+                    }
+                    n.emit("finish", r, a), n.removeAllListeners()
+                })
+            }
+
+            var r = t("events").EventEmitter, i = t("inherits"), o = t("json3"), s = t("./utils/object");
+            i(n, r), n.prototype.close = function () {
+                this.removeAllListeners(), this.xo.close()
+            }, e.exports = n
+        }, {"./utils/object": 49, debug: void 0, events: 3, inherits: 54, json3: 55}],
+        10: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                var e = this;
+                i.call(this), this.ir = new a(t, s), this.ir.once("finish", function (t, n) {
+                    e.ir = null, e.emit("message", o.stringify([t, n]))
+                })
+            }
+
+            var r = t("inherits"), i = t("events").EventEmitter, o = t("json3"), s = t("./transport/sender/xhr-local"),
+                a = t("./info-ajax");
+            r(n, i), n.transportName = "iframe-info-receiver", n.prototype.close = function () {
+                this.ir && (this.ir.close(), this.ir = null), this.removeAllListeners()
+            }, e.exports = n
+        }, {"./info-ajax": 9, "./transport/sender/xhr-local": 37, events: 3, inherits: 54, json3: 55}],
+        11: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t, e) {
+                    var r = this;
+                    i.call(this);
+                    var o = function () {
+                        var n = r.ifr = new u(l.transportName, e, t);
+                        n.once("message", function (t) {
+                            if (t) {
+                                var e;
+                                try {
+                                    e = s.parse(t)
+                                } catch (n) {
+                                    return r.emit("finish"), void r.close()
+                                }
+                                var i = e[0], o = e[1];
+                                r.emit("finish", i, o)
+                            }
+                            r.close()
+                        }), n.once("close", function () {
+                            r.emit("finish"), r.close()
+                        })
+                    };
+                    n.document.body ? o() : a.attachEvent("load", o)
+                }
+
+                var i = t("events").EventEmitter, o = t("inherits"), s = t("json3"), a = t("./utils/event"),
+                    u = t("./transport/iframe"), l = t("./info-iframe-receiver");
+                o(r, i), r.enabled = function () {
+                    return u.enabled()
+                }, r.prototype.close = function () {
+                    this.ifr && this.ifr.close(), this.removeAllListeners(), this.ifr = null
+                }, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "./info-iframe-receiver": 10,
+            "./transport/iframe": 22,
+            "./utils/event": 46,
+            debug: void 0,
+            events: 3,
+            inherits: 54,
+            json3: 55
+        }],
+        12: [function (t, e) {
+            "use strict";
+
+            function n(t, e) {
+                var n = this;
+                r.call(this), setTimeout(function () {
+                    n.doXhr(t, e)
+                }, 0)
+            }
+
+            var r = t("events").EventEmitter, i = t("inherits"), o = t("./utils/url"), s = t("./transport/sender/xdr"),
+                a = t("./transport/sender/xhr-cors"), u = t("./transport/sender/xhr-local"),
+                l = t("./transport/sender/xhr-fake"), c = t("./info-iframe"), f = t("./info-ajax");
+            i(n, r), n._getReceiver = function (t, e, n) {
+                return n.sameOrigin ? new f(e, u) : a.enabled ? new f(e, a) : s.enabled && n.sameScheme ? new f(e, s) : c.enabled() ? new c(t, e) : new f(e, l)
+            }, n.prototype.doXhr = function (t, e) {
+                var r = this, i = o.addPath(t, "/info");
+                this.xo = n._getReceiver(t, i, e), this.timeoutRef = setTimeout(function () {
+                    r._cleanup(!1), r.emit("finish")
+                }, n.timeout), this.xo.once("finish", function (t, e) {
+                    r._cleanup(!0), r.emit("finish", t, e)
+                })
+            }, n.prototype._cleanup = function (t) {
+                clearTimeout(this.timeoutRef), this.timeoutRef = null, !t && this.xo && this.xo.close(), this.xo = null
+            }, n.prototype.close = function () {
+                this.removeAllListeners(), this._cleanup(!1)
+            }, n.timeout = 8e3, e.exports = n
+        }, {
+            "./info-ajax": 9,
+            "./info-iframe": 11,
+            "./transport/sender/xdr": 34,
+            "./transport/sender/xhr-cors": 35,
+            "./transport/sender/xhr-fake": 36,
+            "./transport/sender/xhr-local": 37,
+            "./utils/url": 52,
+            debug: void 0,
+            events: 3,
+            inherits: 54
+        }],
+        13: [function (t, e) {
+            (function (t) {
+                "use strict";
+                e.exports = t.location || {
+                    origin: "http://localhost:80",
+                    protocol: "http",
+                    host: "localhost",
+                    port: 80,
+                    href: "http://localhost/",
+                    hash: ""
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        14: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t, e, n) {
+                    if (!(this instanceof r)) return new r(t, e, n);
+                    if (arguments.length < 1) throw new TypeError("Failed to construct 'SockJS: 1 argument required, but only 0 present");
+                    b.call(this), this.readyState = r.CONNECTING, this.extensions = "", this.protocol = "", n = n || {}, n.protocols_whitelist && m.warn("'protocols_whitelist' is DEPRECATED. Use 'transports' instead."), this._transportsWhitelist = n.transports, this._transportOptions = n.transportOptions || {};
+                    var i = n.sessionId || 8;
+                    if ("function" == typeof i) this._generateSessionId = i; else {
+                        if ("number" != typeof i) throw new TypeError("If sessionId is used in the options, it needs to be a number or a function.");
+                        this._generateSessionId = function () {
+                            return l.string(i)
+                        }
+                    }
+                    this._server = n.server || l.numberString(1e3);
+                    var o = new s(t);
+                    if (!o.host || !o.protocol) throw new SyntaxError("The URL '" + t + "' is invalid");
+                    if (o.hash) throw new SyntaxError("The URL must not contain a fragment");
+                    if ("http:" !== o.protocol && "https:" !== o.protocol) throw new SyntaxError("The URL's scheme must be either 'http:' or 'https:'. '" + o.protocol + "' is not allowed.");
+                    var a = "https:" === o.protocol;
+                    if ("https" === g.protocol && !a) throw new Error("SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS");
+                    e ? Array.isArray(e) || (e = [e]) : e = [];
+                    var u = e.sort();
+                    u.forEach(function (t, e) {
+                        if (!t) throw new SyntaxError("The protocols entry '" + t + "' is invalid.");
+                        if (e < u.length - 1 && t === u[e + 1]) throw new SyntaxError("The protocols entry '" + t + "' is duplicated.")
+                    });
+                    var c = f.getOrigin(g.href);
+                    this._origin = c ? c.toLowerCase() : null, o.set("pathname", o.pathname.replace(/\/+$/, "")), this.url = o.href, this._urlInfo = {
+                        nullOrigin: !v.hasDomain(),
+                        sameOrigin: f.isOriginEqual(this.url, g.href),
+                        sameScheme: f.isSchemeEqual(this.url, g.href)
+                    }, this._ir = new _(this.url, this._urlInfo), this._ir.once("finish", this._receiveInfo.bind(this))
+                }
+
+                function i(t) {
+                    return 1e3 === t || t >= 3e3 && 4999 >= t
+                }
+
+                t("./shims");
+                var o, s = t("url-parse"), a = t("inherits"), u = t("json3"), l = t("./utils/random"),
+                    c = t("./utils/escape"), f = t("./utils/url"), h = t("./utils/event"), d = t("./utils/transport"),
+                    p = t("./utils/object"), v = t("./utils/browser"), m = t("./utils/log"), y = t("./event/event"),
+                    b = t("./event/eventtarget"), g = t("./location"), w = t("./event/close"),
+                    x = t("./event/trans-message"), _ = t("./info-receiver");
+                a(r, b), r.prototype.close = function (t, e) {
+                    if (t && !i(t)) throw new Error("InvalidAccessError: Invalid code");
+                    if (e && e.length > 123) throw new SyntaxError("reason argument has an invalid length");
+                    if (this.readyState !== r.CLOSING && this.readyState !== r.CLOSED) {
+                        var n = !0;
+                        this._close(t || 1e3, e || "Normal closure", n)
+                    }
+                }, r.prototype.send = function (t) {
+                    if ("string" != typeof t && (t = "" + t), this.readyState === r.CONNECTING) throw new Error("InvalidStateError: The connection has not been established yet");
+                    this.readyState === r.OPEN && this._transport.send(c.quote(t))
+                }, r.version = t("./version"), r.CONNECTING = 0, r.OPEN = 1, r.CLOSING = 2, r.CLOSED = 3, r.prototype._receiveInfo = function (t, e) {
+                    if (this._ir = null, !t) return void this._close(1002, "Cannot connect to server");
+                    this._rto = this.countRTO(e), this._transUrl = t.base_url ? t.base_url : this.url, t = p.extend(t, this._urlInfo);
+                    var n = o.filterToEnabled(this._transportsWhitelist, t);
+                    this._transports = n.main, this._connect()
+                }, r.prototype._connect = function () {
+                    for (var t = this._transports.shift(); t; t = this._transports.shift()) {
+                        if (t.needBody && (!n.document.body || "undefined" != typeof n.document.readyState && "complete" !== n.document.readyState && "interactive" !== n.document.readyState)) return this._transports.unshift(t), void h.attachEvent("load", this._connect.bind(this));
+                        var e = this._rto * t.roundTrips || 5e3;
+                        this._transportTimeoutId = setTimeout(this._transportTimeout.bind(this), e);
+                        var r = f.addPath(this._transUrl, "/" + this._server + "/" + this._generateSessionId()),
+                            i = this._transportOptions[t.transportName], o = new t(r, this._transUrl, i);
+                        return o.on("message", this._transportMessage.bind(this)), o.once("close", this._transportClose.bind(this)), o.transportName = t.transportName, void (this._transport = o)
+                    }
+                    this._close(2e3, "All transports failed", !1)
+                }, r.prototype._transportTimeout = function () {
+                    this.readyState === r.CONNECTING && this._transportClose(2007, "Transport timed out")
+                }, r.prototype._transportMessage = function (t) {
+                    var e, n = this, r = t.slice(0, 1), i = t.slice(1);
+                    switch (r) {
+                        case"o":
+                            return void this._open();
+                        case"h":
+                            return void this.dispatchEvent(new y("heartbeat"))
+                    }
+                    if (i) try {
+                        e = u.parse(i)
+                    } catch (o) {
+                    }
+                    if ("undefined" != typeof e) switch (r) {
+                        case"a":
+                            Array.isArray(e) && e.forEach(function (t) {
+                                n.dispatchEvent(new x(t))
+                            });
+                            break;
+                        case"m":
+                            this.dispatchEvent(new x(e));
+                            break;
+                        case"c":
+                            Array.isArray(e) && 2 === e.length && this._close(e[0], e[1], !0)
+                    }
+                }, r.prototype._transportClose = function (t, e) {
+                    return this._transport && (this._transport.removeAllListeners(), this._transport = null, this.transport = null), i(t) || 2e3 === t || this.readyState !== r.CONNECTING ? void this._close(t, e) : void this._connect()
+                }, r.prototype._open = function () {
+                    this.readyState === r.CONNECTING ? (this._transportTimeoutId && (clearTimeout(this._transportTimeoutId), this._transportTimeoutId = null), this.readyState = r.OPEN, this.transport = this._transport.transportName, this.dispatchEvent(new y("open"))) : this._close(1006, "Server lost session")
+                }, r.prototype._close = function (t, e, n) {
+                    var i = !1;
+                    if (this._ir && (i = !0, this._ir.close(), this._ir = null), this._transport && (this._transport.close(), this._transport = null, this.transport = null), this.readyState === r.CLOSED) throw new Error("InvalidStateError: SockJS has already been closed");
+                    this.readyState = r.CLOSING, setTimeout(function () {
+                        this.readyState = r.CLOSED, i && this.dispatchEvent(new y("error"));
+                        var o = new w("close");
+                        o.wasClean = n || !1, o.code = t || 1e3, o.reason = e, this.dispatchEvent(o), this.onmessage = this.onclose = this.onerror = null
+                    }.bind(this), 0)
+                }, r.prototype.countRTO = function (t) {
+                    return t > 100 ? 4 * t : 300 + t
+                }, e.exports = function (e) {
+                    return o = d(e), t("./iframe-bootstrap")(r, e), r
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "./event/close": 2,
+            "./event/event": 4,
+            "./event/eventtarget": 5,
+            "./event/trans-message": 6,
+            "./iframe-bootstrap": 8,
+            "./info-receiver": 12,
+            "./location": 13,
+            "./shims": 15,
+            "./utils/browser": 44,
+            "./utils/escape": 45,
+            "./utils/event": 46,
+            "./utils/log": 48,
+            "./utils/object": 49,
+            "./utils/random": 50,
+            "./utils/transport": 51,
+            "./utils/url": 52,
+            "./version": 53,
+            debug: void 0,
+            inherits: 54,
+            json3: 55,
+            "url-parse": 56
+        }],
+        15: [function () {
+            "use strict";
+
+            function t(t) {
+                var e = +t;
+                return e !== e ? e = 0 : 0 !== e && e !== 1 / 0 && e !== -(1 / 0) && (e = (e > 0 || -1) * Math.floor(Math.abs(e))), e
+            }
+
+            function e(t) {
+                return t >>> 0
+            }
+
+            function n() {
+            }
+
+            var r, i = Array.prototype, o = Object.prototype, s = Function.prototype, a = String.prototype, u = i.slice,
+                l = o.toString, c = function (t) {
+                    return "[object Function]" === o.toString.call(t)
+                }, f = function (t) {
+                    return "[object Array]" === l.call(t)
+                }, h = function (t) {
+                    return "[object String]" === l.call(t)
+                }, d = Object.defineProperty && function () {
+                    try {
+                        return Object.defineProperty({}, "x", {}), !0
+                    } catch (t) {
+                        return !1
+                    }
+                }();
+            r = d ? function (t, e, n, r) {
+                !r && e in t || Object.defineProperty(t, e, {configurable: !0, enumerable: !1, writable: !0, value: n})
+            } : function (t, e, n, r) {
+                !r && e in t || (t[e] = n)
+            };
+            var p = function (t, e, n) {
+                for (var i in e) o.hasOwnProperty.call(e, i) && r(t, i, e[i], n)
+            }, v = function (t) {
+                if (null == t) throw new TypeError("can't convert " + t + " to object");
+                return Object(t)
+            };
+            p(s, {
+                bind: function (t) {
+                    var e = this;
+                    if (!c(e)) throw new TypeError("Function.prototype.bind called on incompatible " + e);
+                    for (var r = u.call(arguments, 1), i = function () {
+                        if (this instanceof l) {
+                            var n = e.apply(this, r.concat(u.call(arguments)));
+                            return Object(n) === n ? n : this
+                        }
+                        return e.apply(t, r.concat(u.call(arguments)))
+                    }, o = Math.max(0, e.length - r.length), s = [], a = 0; o > a; a++) s.push("$" + a);
+                    var l = Function("binder", "return function (" + s.join(",") + "){ return binder.apply(this, arguments); }")(i);
+                    return e.prototype && (n.prototype = e.prototype, l.prototype = new n, n.prototype = null), l
+                }
+            }), p(Array, {isArray: f});
+            var m = Object("a"), y = "a" !== m[0] || !(0 in m), b = function (t) {
+                var e = !0, n = !0;
+                return t && (t.call("foo", function (t, n, r) {
+                    "object" != typeof r && (e = !1)
+                }), t.call([1], function () {
+                    n = "string" == typeof this
+                }, "x")), !!t && e && n
+            };
+            p(i, {
+                forEach: function (t) {
+                    var e = v(this), n = y && h(this) ? this.split("") : e, r = arguments[1], i = -1,
+                        o = n.length >>> 0;
+                    if (!c(t)) throw new TypeError;
+                    for (; ++i < o;) i in n && t.call(r, n[i], i, e)
+                }
+            }, !b(i.forEach));
+            var g = Array.prototype.indexOf && -1 !== [0, 1].indexOf(1, 2);
+            p(i, {
+                indexOf: function (e) {
+                    var n = y && h(this) ? this.split("") : v(this), r = n.length >>> 0;
+                    if (!r) return -1;
+                    var i = 0;
+                    for (arguments.length > 1 && (i = t(arguments[1])), i = i >= 0 ? i : Math.max(0, r + i); r > i; i++) if (i in n && n[i] === e) return i;
+                    return -1
+                }
+            }, g);
+            var w = a.split;
+            2 !== "ab".split(/(?:ab)*/).length || 4 !== ".".split(/(.?)(.?)/).length || "t" === "tesst".split(/(s)*/)[1] || 4 !== "test".split(/(?:)/, -1).length || "".split(/.?/).length || ".".split(/()()/).length > 1 ? !function () {
+                var t = void 0 === /()??/.exec("")[1];
+                a.split = function (n, r) {
+                    var o = this;
+                    if (void 0 === n && 0 === r) return [];
+                    if ("[object RegExp]" !== l.call(n)) return w.call(this, n, r);
+                    var s, a, u, c, f = [],
+                        h = (n.ignoreCase ? "i" : "") + (n.multiline ? "m" : "") + (n.extended ? "x" : "") + (n.sticky ? "y" : ""),
+                        d = 0;
+                    for (n = new RegExp(n.source, h + "g"), o += "", t || (s = new RegExp("^" + n.source + "$(?!\\s)", h)), r = void 0 === r ? -1 >>> 0 : e(r); (a = n.exec(o)) && (u = a.index + a[0].length, !(u > d && (f.push(o.slice(d, a.index)), !t && a.length > 1 && a[0].replace(s, function () {
+                        for (var t = 1; t < arguments.length - 2; t++) void 0 === arguments[t] && (a[t] = void 0)
+                    }), a.length > 1 && a.index < o.length && i.push.apply(f, a.slice(1)), c = a[0].length, d = u, f.length >= r)));) n.lastIndex === a.index && n.lastIndex++;
+                    return d === o.length ? (c || !n.test("")) && f.push("") : f.push(o.slice(d)), f.length > r ? f.slice(0, r) : f
+                }
+            }() : "0".split(void 0, 0).length && (a.split = function (t, e) {
+                return void 0 === t && 0 === e ? [] : w.call(this, t, e)
+            });
+            var x = "	\n\f\r   ᠎              \u2028\u2029", _ = "​", E = "[" + x + "]",
+                j = new RegExp("^" + E + E + "*"), T = new RegExp(E + E + "*$"), S = a.trim && (x.trim() || !_.trim());
+            p(a, {
+                trim: function () {
+                    if (void 0 === this || null === this) throw new TypeError("can't convert " + this + " to object");
+                    return String(this).replace(j, "").replace(T, "")
+                }
+            }, S);
+            var O = a.substr, C = "".substr && "b" !== "0b".substr(-1);
+            p(a, {
+                substr: function (t, e) {
+                    return O.call(this, 0 > t && (t = this.length + t) < 0 ? 0 : t, e)
+                }
+            }, C)
+        }, {}],
+        16: [function (t, e) {
+            "use strict";
+            e.exports = [t("./transport/websocket"), t("./transport/xhr-streaming"), t("./transport/xdr-streaming"), t("./transport/eventsource"), t("./transport/lib/iframe-wrap")(t("./transport/eventsource")), t("./transport/htmlfile"), t("./transport/lib/iframe-wrap")(t("./transport/htmlfile")), t("./transport/xhr-polling"), t("./transport/xdr-polling"), t("./transport/lib/iframe-wrap")(t("./transport/xhr-polling")), t("./transport/jsonp-polling")]
+        }, {
+            "./transport/eventsource": 20,
+            "./transport/htmlfile": 21,
+            "./transport/jsonp-polling": 23,
+            "./transport/lib/iframe-wrap": 26,
+            "./transport/websocket": 38,
+            "./transport/xdr-polling": 39,
+            "./transport/xdr-streaming": 40,
+            "./transport/xhr-polling": 41,
+            "./transport/xhr-streaming": 42
+        }],
+        17: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t, e, n, r) {
+                    var o = this;
+                    i.call(this), setTimeout(function () {
+                        o._start(t, e, n, r)
+                    }, 0)
+                }
+
+                var i = t("events").EventEmitter, o = t("inherits"), s = t("../../utils/event"),
+                    a = t("../../utils/url"), u = n.XMLHttpRequest;
+                o(r, i), r.prototype._start = function (t, e, n, i) {
+                    var o = this;
+                    try {
+                        this.xhr = new u
+                    } catch (l) {
+                    }
+                    if (!this.xhr) return this.emit("finish", 0, "no xhr support"), void this._cleanup();
+                    e = a.addQuery(e, "t=" + +new Date), this.unloadRef = s.unloadAdd(function () {
+                        o._cleanup(!0)
+                    });
+                    try {
+                        this.xhr.open(t, e, !0), this.timeout && "timeout" in this.xhr && (this.xhr.timeout = this.timeout, this.xhr.ontimeout = function () {
+                            o.emit("finish", 0, ""), o._cleanup(!1)
+                        })
+                    } catch (c) {
+                        return this.emit("finish", 0, ""), void this._cleanup(!1)
+                    }
+                    if (i && i.noCredentials || !r.supportsCORS || (this.xhr.withCredentials = "true"), i && i.headers) for (var f in i.headers) this.xhr.setRequestHeader(f, i.headers[f]);
+                    this.xhr.onreadystatechange = function () {
+                        if (o.xhr) {
+                            var t, e, n = o.xhr;
+                            switch (n.readyState) {
+                                case 3:
+                                    try {
+                                        e = n.status, t = n.responseText
+                                    } catch (r) {
+                                    }
+                                    1223 === e && (e = 204), 200 === e && t && t.length > 0 && o.emit("chunk", e, t);
+                                    break;
+                                case 4:
+                                    e = n.status, 1223 === e && (e = 204), (12005 === e || 12029 === e) && (e = 0), o.emit("finish", e, n.responseText), o._cleanup(!1)
+                            }
+                        }
+                    };
+                    try {
+                        o.xhr.send(n)
+                    } catch (c) {
+                        o.emit("finish", 0, ""), o._cleanup(!1)
+                    }
+                }, r.prototype._cleanup = function (t) {
+                    if (this.xhr) {
+                        if (this.removeAllListeners(), s.unloadDel(this.unloadRef), this.xhr.onreadystatechange = function () {
+                        }, this.xhr.ontimeout && (this.xhr.ontimeout = null), t) try {
+                            this.xhr.abort()
+                        } catch (e) {
+                        }
+                        this.unloadRef = this.xhr = null
+                    }
+                }, r.prototype.close = function () {
+                    this._cleanup(!0)
+                }, r.enabled = !!u;
+                var l = ["Active"].concat("Object").join("X");
+                !r.enabled && l in n && (u = function () {
+                    try {
+                        return new n[l]("Microsoft.XMLHTTP")
+                    } catch (t) {
+                        return null
+                    }
+                }, r.enabled = !!new u);
+                var c = !1;
+                try {
+                    c = "withCredentials" in new u
+                } catch (f) {
+                }
+                r.supportsCORS = c, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"../../utils/event": 46, "../../utils/url": 52, debug: void 0, events: 3, inherits: 54}],
+        18: [function (t, e) {
+            (function (t) {
+                e.exports = t.EventSource
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        19: [function (t, e) {
+            (function (t) {
+                "use strict";
+                var n = t.WebSocket || t.MozWebSocket;
+                n && (e.exports = function (t) {
+                    return new n(t)
+                })
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        20: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                if (!n.enabled()) throw new Error("Transport created when disabled");
+                i.call(this, t, "/eventsource", o, s)
+            }
+
+            var r = t("inherits"), i = t("./lib/ajax-based"), o = t("./receiver/eventsource"),
+                s = t("./sender/xhr-cors"), a = t("eventsource");
+            r(n, i), n.enabled = function () {
+                return !!a
+            }, n.transportName = "eventsource", n.roundTrips = 2, e.exports = n
+        }, {
+            "./lib/ajax-based": 24,
+            "./receiver/eventsource": 29,
+            "./sender/xhr-cors": 35,
+            eventsource: 18,
+            inherits: 54
+        }],
+        21: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                if (!i.enabled) throw new Error("Transport created when disabled");
+                s.call(this, t, "/htmlfile", i, o)
+            }
+
+            var r = t("inherits"), i = t("./receiver/htmlfile"), o = t("./sender/xhr-local"), s = t("./lib/ajax-based");
+            r(n, s), n.enabled = function (t) {
+                return i.enabled && t.sameOrigin
+            }, n.transportName = "htmlfile", n.roundTrips = 2, e.exports = n
+        }, {"./lib/ajax-based": 24, "./receiver/htmlfile": 30, "./sender/xhr-local": 37, inherits: 54}],
+        22: [function (t, e) {
+            "use strict";
+
+            function n(t, e, r) {
+                if (!n.enabled()) throw new Error("Transport created when disabled");
+                o.call(this);
+                var i = this;
+                this.origin = a.getOrigin(r), this.baseUrl = r, this.transUrl = e, this.transport = t, this.windowId = c.string(8);
+                var s = a.addPath(r, "/iframe.html") + "#" + this.windowId;
+                this.iframeObj = u.createIframe(s, function (t) {
+                    i.emit("close", 1006, "Unable to load an iframe (" + t + ")"), i.close()
+                }), this.onmessageCallback = this._message.bind(this), l.attachEvent("message", this.onmessageCallback)
+            }
+
+            var r = t("inherits"), i = t("json3"), o = t("events").EventEmitter, s = t("../version"),
+                a = t("../utils/url"), u = t("../utils/iframe"), l = t("../utils/event"), c = t("../utils/random");
+            r(n, o), n.prototype.close = function () {
+                if (this.removeAllListeners(), this.iframeObj) {
+                    l.detachEvent("message", this.onmessageCallback);
+                    try {
+                        this.postMessage("c")
+                    } catch (t) {
+                    }
+                    this.iframeObj.cleanup(), this.iframeObj = null, this.onmessageCallback = this.iframeObj = null
+                }
+            }, n.prototype._message = function (t) {
+                if (a.isOriginEqual(t.origin, this.origin)) {
+                    var e;
+                    try {
+                        e = i.parse(t.data)
+                    } catch (n) {
+                        return
+                    }
+                    if (e.windowId === this.windowId) switch (e.type) {
+                        case"s":
+                            this.iframeObj.loaded(), this.postMessage("s", i.stringify([s, this.transport, this.transUrl, this.baseUrl]));
+                            break;
+                        case"t":
+                            this.emit("message", e.data);
+                            break;
+                        case"c":
+                            var r;
+                            try {
+                                r = i.parse(e.data)
+                            } catch (n) {
+                                return
+                            }
+                            this.emit("close", r[0], r[1]), this.close()
+                    }
+                }
+            }, n.prototype.postMessage = function (t, e) {
+                this.iframeObj.post(i.stringify({windowId: this.windowId, type: t, data: e || ""}), this.origin)
+            }, n.prototype.send = function (t) {
+                this.postMessage("m", t)
+            }, n.enabled = function () {
+                return u.iframeEnabled
+            }, n.transportName = "iframe", n.roundTrips = 2, e.exports = n
+        }, {
+            "../utils/event": 46,
+            "../utils/iframe": 47,
+            "../utils/random": 50,
+            "../utils/url": 52,
+            "../version": 53,
+            debug: void 0,
+            events: 3,
+            inherits: 54,
+            json3: 55
+        }],
+        23: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t) {
+                    if (!r.enabled()) throw new Error("Transport created when disabled");
+                    o.call(this, t, "/jsonp", a, s)
+                }
+
+                var i = t("inherits"), o = t("./lib/sender-receiver"), s = t("./receiver/jsonp"),
+                    a = t("./sender/jsonp");
+                i(r, o), r.enabled = function () {
+                    return !!n.document
+                }, r.transportName = "jsonp-polling", r.roundTrips = 1, r.needBody = !0, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"./lib/sender-receiver": 28, "./receiver/jsonp": 31, "./sender/jsonp": 33, inherits: 54}],
+        24: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                return function (e, n, r) {
+                    var i = {};
+                    "string" == typeof n && (i.headers = {"Content-type": "text/plain"});
+                    var s = o.addPath(e, "/xhr_send"), a = new t("POST", s, n, i);
+                    return a.once("finish", function (t) {
+                        return a = null, 200 !== t && 204 !== t ? r(new Error("http status " + t)) : void r()
+                    }), function () {
+                        a.close(), a = null;
+                        var t = new Error("Aborted");
+                        t.code = 1e3, r(t)
+                    }
+                }
+            }
+
+            function r(t, e, r, i) {
+                s.call(this, t, e, n(i), r, i)
+            }
+
+            var i = t("inherits"), o = t("../../utils/url"), s = t("./sender-receiver");
+            i(r, s), e.exports = r
+        }, {"../../utils/url": 52, "./sender-receiver": 28, debug: void 0, inherits: 54}],
+        25: [function (t, e) {
+            "use strict";
+
+            function n(t, e) {
+                i.call(this), this.sendBuffer = [], this.sender = e, this.url = t
+            }
+
+            var r = t("inherits"), i = t("events").EventEmitter;
+            r(n, i), n.prototype.send = function (t) {
+                this.sendBuffer.push(t), this.sendStop || this.sendSchedule()
+            }, n.prototype.sendScheduleWait = function () {
+                var t, e = this;
+                this.sendStop = function () {
+                    e.sendStop = null, clearTimeout(t)
+                }, t = setTimeout(function () {
+                    e.sendStop = null, e.sendSchedule()
+                }, 25)
+            }, n.prototype.sendSchedule = function () {
+                var t = this;
+                if (this.sendBuffer.length > 0) {
+                    var e = "[" + this.sendBuffer.join(",") + "]";
+                    this.sendStop = this.sender(this.url, e, function (e) {
+                        t.sendStop = null, e ? (t.emit("close", e.code || 1006, "Sending error: " + e), t._cleanup()) : t.sendScheduleWait()
+                    }), this.sendBuffer = []
+                }
+            }, n.prototype._cleanup = function () {
+                this.removeAllListeners()
+            }, n.prototype.stop = function () {
+                this._cleanup(), this.sendStop && (this.sendStop(), this.sendStop = null)
+            }, e.exports = n
+        }, {debug: void 0, events: 3, inherits: 54}],
+        26: [function (t, e) {
+            (function (n) {
+                "use strict";
+                var r = t("inherits"), i = t("../iframe"), o = t("../../utils/object");
+                e.exports = function (t) {
+                    function e(e, n) {
+                        i.call(this, t.transportName, e, n)
+                    }
+
+                    return r(e, i), e.enabled = function (e, r) {
+                        if (!n.document) return !1;
+                        var s = o.extend({}, r);
+                        return s.sameOrigin = !0, t.enabled(s) && i.enabled()
+                    }, e.transportName = "iframe-" + t.transportName, e.needBody = !0, e.roundTrips = i.roundTrips + t.roundTrips - 1, e.facadeTransport = t, e
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"../../utils/object": 49, "../iframe": 22, inherits: 54}],
+        27: [function (t, e) {
+            "use strict";
+
+            function n(t, e, n) {
+                i.call(this), this.Receiver = t, this.receiveUrl = e, this.AjaxObject = n, this._scheduleReceiver()
+            }
+
+            var r = t("inherits"), i = t("events").EventEmitter;
+            r(n, i), n.prototype._scheduleReceiver = function () {
+                var t = this, e = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject);
+                e.on("message", function (e) {
+                    t.emit("message", e)
+                }), e.once("close", function (n, r) {
+                    t.poll = e = null, t.pollIsClosing || ("network" === r ? t._scheduleReceiver() : (t.emit("close", n || 1006, r), t.removeAllListeners()))
+                })
+            }, n.prototype.abort = function () {
+                this.removeAllListeners(), this.pollIsClosing = !0, this.poll && this.poll.abort()
+            }, e.exports = n
+        }, {debug: void 0, events: 3, inherits: 54}],
+        28: [function (t, e) {
+            "use strict";
+
+            function n(t, e, n, r, a) {
+                var u = i.addPath(t, e), l = this;
+                o.call(this, t, n), this.poll = new s(r, u, a), this.poll.on("message", function (t) {
+                    l.emit("message", t)
+                }), this.poll.once("close", function (t, e) {
+                    l.poll = null, l.emit("close", t, e), l.close()
+                })
+            }
+
+            var r = t("inherits"), i = t("../../utils/url"), o = t("./buffered-sender"), s = t("./polling");
+            r(n, o), n.prototype.close = function () {
+                this.removeAllListeners(), this.poll && (this.poll.abort(), this.poll = null), this.stop()
+            }, e.exports = n
+        }, {"../../utils/url": 52, "./buffered-sender": 25, "./polling": 27, debug: void 0, inherits: 54}],
+        29: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                i.call(this);
+                var e = this, n = this.es = new o(t);
+                n.onmessage = function (t) {
+                    e.emit("message", decodeURI(t.data))
+                }, n.onerror = function (t) {
+                    var r = 2 !== n.readyState ? "network" : "permanent";
+                    e._cleanup(), e._close(r)
+                }
+            }
+
+            var r = t("inherits"), i = t("events").EventEmitter, o = t("eventsource");
+            r(n, i), n.prototype.abort = function () {
+                this._cleanup(), this._close("user")
+            }, n.prototype._cleanup = function () {
+                var t = this.es;
+                t && (t.onmessage = t.onerror = null, t.close(), this.es = null)
+            }, n.prototype._close = function (t) {
+                var e = this;
+                setTimeout(function () {
+                    e.emit("close", null, t), e.removeAllListeners()
+                }, 200)
+            }, e.exports = n
+        }, {debug: void 0, events: 3, eventsource: 18, inherits: 54}],
+        30: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t) {
+                    a.call(this);
+                    var e = this;
+                    o.polluteGlobalNamespace(), this.id = "a" + u.string(6), t = s.addQuery(t, "c=" + decodeURIComponent(o.WPrefix + "." + this.id));
+                    var i = r.htmlfileEnabled ? o.createHtmlfile : o.createIframe;
+                    n[o.WPrefix][this.id] = {
+                        start: function () {
+                            e.iframeObj.loaded()
+                        }, message: function (t) {
+                            e.emit("message", t)
+                        }, stop: function () {
+                            e._cleanup(), e._close("network")
+                        }
+                    }, this.iframeObj = i(t, function () {
+                        e._cleanup(), e._close("permanent")
+                    })
+                }
+
+                var i = t("inherits"), o = t("../../utils/iframe"), s = t("../../utils/url"),
+                    a = t("events").EventEmitter, u = t("../../utils/random");
+                i(r, a), r.prototype.abort = function () {
+                    this._cleanup(), this._close("user")
+                }, r.prototype._cleanup = function () {
+                    this.iframeObj && (this.iframeObj.cleanup(), this.iframeObj = null), delete n[o.WPrefix][this.id]
+                }, r.prototype._close = function (t) {
+                    this.emit("close", null, t), this.removeAllListeners()
+                }, r.htmlfileEnabled = !1;
+                var l = ["Active"].concat("Object").join("X");
+                if (l in n) try {
+                    r.htmlfileEnabled = !!new n[l]("htmlfile")
+                } catch (c) {
+                }
+                r.enabled = r.htmlfileEnabled || o.iframeEnabled, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "../../utils/iframe": 47,
+            "../../utils/random": 50,
+            "../../utils/url": 52,
+            debug: void 0,
+            events: 3,
+            inherits: 54
+        }],
+        31: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t) {
+                    var e = this;
+                    l.call(this), i.polluteGlobalNamespace(), this.id = "a" + o.string(6);
+                    var s = a.addQuery(t, "c=" + encodeURIComponent(i.WPrefix + "." + this.id));
+                    n[i.WPrefix][this.id] = this._callback.bind(this), this._createScript(s), this.timeoutId = setTimeout(function () {
+                        e._abort(new Error("JSONP script loaded abnormally (timeout)"))
+                    }, r.timeout)
+                }
+
+                var i = t("../../utils/iframe"), o = t("../../utils/random"), s = t("../../utils/browser"),
+                    a = t("../../utils/url"), u = t("inherits"), l = t("events").EventEmitter;
+                u(r, l), r.prototype.abort = function () {
+                    if (n[i.WPrefix][this.id]) {
+                        var t = new Error("JSONP user aborted read");
+                        t.code = 1e3, this._abort(t)
+                    }
+                }, r.timeout = 35e3, r.scriptErrorTimeout = 1e3, r.prototype._callback = function (t) {
+                    this._cleanup(), this.aborting || (t && this.emit("message", t), this.emit("close", null, "network"), this.removeAllListeners())
+                }, r.prototype._abort = function (t) {
+                    this._cleanup(), this.aborting = !0, this.emit("close", t.code, t.message), this.removeAllListeners()
+                }, r.prototype._cleanup = function () {
+                    if (clearTimeout(this.timeoutId), this.script2 && (this.script2.parentNode.removeChild(this.script2), this.script2 = null), this.script) {
+                        var t = this.script;
+                        t.parentNode.removeChild(t), t.onreadystatechange = t.onerror = t.onload = t.onclick = null, this.script = null
+                    }
+                    delete n[i.WPrefix][this.id]
+                }, r.prototype._scriptError = function () {
+                    var t = this;
+                    this.errorTimer || (this.errorTimer = setTimeout(function () {
+                        t.loadedOkay || t._abort(new Error("JSONP script loaded abnormally (onerror)"))
+                    }, r.scriptErrorTimeout))
+                }, r.prototype._createScript = function (t) {
+                    var e, r = this, i = this.script = n.document.createElement("script");
+                    if (i.id = "a" + o.string(8), i.src = t, i.type = "text/javascript", i.charset = "UTF-8", i.onerror = this._scriptError.bind(this), i.onload = function () {
+                        r._abort(new Error("JSONP script loaded abnormally (onload)"))
+                    }, i.onreadystatechange = function () {
+                        if (/loaded|closed/.test(i.readyState)) {
+                            if (i && i.htmlFor && i.onclick) {
+                                r.loadedOkay = !0;
+                                try {
+                                    i.onclick()
+                                } catch (t) {
+                                }
+                            }
+                            i && r._abort(new Error("JSONP script loaded abnormally (onreadystatechange)"))
+                        }
+                    }, "undefined" == typeof i.async && n.document.attachEvent) if (s.isOpera()) e = this.script2 = n.document.createElement("script"), e.text = "try{var a = document.getElementById('" + i.id + "'); if(a)a.onerror();}catch(x){};", i.async = e.async = !1; else {
+                        try {
+                            i.htmlFor = i.id, i.event = "onclick"
+                        } catch (a) {
+                        }
+                        i.async = !0
+                    }
+                    "undefined" != typeof i.async && (i.async = !0);
+                    var u = n.document.getElementsByTagName("head")[0];
+                    u.insertBefore(i, u.firstChild), e && u.insertBefore(e, u.firstChild)
+                }, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "../../utils/browser": 44,
+            "../../utils/iframe": 47,
+            "../../utils/random": 50,
+            "../../utils/url": 52,
+            debug: void 0,
+            events: 3,
+            inherits: 54
+        }],
+        32: [function (t, e) {
+            "use strict";
+
+            function n(t, e) {
+                i.call(this);
+                var n = this;
+                this.bufferPosition = 0, this.xo = new e("POST", t, null), this.xo.on("chunk", this._chunkHandler.bind(this)), this.xo.once("finish", function (t, e) {
+                    n._chunkHandler(t, e), n.xo = null;
+                    var r = 200 === t ? "network" : "permanent";
+                    n.emit("close", null, r), n._cleanup()
+                })
+            }
+
+            var r = t("inherits"), i = t("events").EventEmitter;
+            r(n, i), n.prototype._chunkHandler = function (t, e) {
+                if (200 === t && e) for (var n = -1; ; this.bufferPosition += n + 1) {
+                    var r = e.slice(this.bufferPosition);
+                    if (n = r.indexOf("\n"), -1 === n) break;
+                    var i = r.slice(0, n);
+                    i && this.emit("message", i)
+                }
+            }, n.prototype._cleanup = function () {
+                this.removeAllListeners()
+            }, n.prototype.abort = function () {
+                this.xo && (this.xo.close(), this.emit("close", null, "user"), this.xo = null), this._cleanup()
+            }, e.exports = n
+        }, {debug: void 0, events: 3, inherits: 54}],
+        33: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t) {
+                    try {
+                        return n.document.createElement('<iframe name="' + t + '">')
+                    } catch (e) {
+                        var r = n.document.createElement("iframe");
+                        return r.name = t, r
+                    }
+                }
+
+                function i() {
+                    o = n.document.createElement("form"), o.style.display = "none", o.style.position = "absolute", o.method = "POST", o.enctype = "application/x-www-form-urlencoded", o.acceptCharset = "UTF-8", s = n.document.createElement("textarea"), s.name = "d", o.appendChild(s), n.document.body.appendChild(o)
+                }
+
+                var o, s, a = t("../../utils/random"), u = t("../../utils/url");
+                e.exports = function (t, e, n) {
+                    o || i();
+                    var l = "a" + a.string(8);
+                    o.target = l, o.action = u.addQuery(u.addPath(t, "/jsonp_send"), "i=" + l);
+                    var c = r(l);
+                    c.id = l, c.style.display = "none", o.appendChild(c);
+                    try {
+                        s.value = e
+                    } catch (f) {
+                    }
+                    o.submit();
+                    var h = function (t) {
+                        c.onerror && (c.onreadystatechange = c.onerror = c.onload = null, setTimeout(function () {
+                            c.parentNode.removeChild(c), c = null
+                        }, 500), s.value = "", n(t))
+                    };
+                    return c.onerror = function () {
+                        h()
+                    }, c.onload = function () {
+                        h()
+                    }, c.onreadystatechange = function (t) {
+                        "complete" === c.readyState && h()
+                    }, function () {
+                        h(new Error("Aborted"))
+                    }
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"../../utils/random": 50, "../../utils/url": 52, debug: void 0}],
+        34: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t, e, n) {
+                    var r = this;
+                    i.call(this), setTimeout(function () {
+                        r._start(t, e, n)
+                    }, 0)
+                }
+
+                var i = t("events").EventEmitter, o = t("inherits"), s = t("../../utils/event"),
+                    a = t("../../utils/browser"), u = t("../../utils/url");
+                o(r, i), r.prototype._start = function (t, e, r) {
+                    var i = this, o = new n.XDomainRequest;
+                    e = u.addQuery(e, "t=" + +new Date), o.onerror = function () {
+                        i._error()
+                    }, o.ontimeout = function () {
+                        i._error()
+                    }, o.onprogress = function () {
+                        i.emit("chunk", 200, o.responseText)
+                    }, o.onload = function () {
+                        i.emit("finish", 200, o.responseText), i._cleanup(!1)
+                    }, this.xdr = o, this.unloadRef = s.unloadAdd(function () {
+                        i._cleanup(!0)
+                    });
+                    try {
+                        this.xdr.open(t, e), this.timeout && (this.xdr.timeout = this.timeout), this.xdr.send(r)
+                    } catch (a) {
+                        this._error()
+                    }
+                }, r.prototype._error = function () {
+                    this.emit("finish", 0, ""), this._cleanup(!1)
+                }, r.prototype._cleanup = function (t) {
+                    if (this.xdr) {
+                        if (this.removeAllListeners(), s.unloadDel(this.unloadRef), this.xdr.ontimeout = this.xdr.onerror = this.xdr.onprogress = this.xdr.onload = null, t) try {
+                            this.xdr.abort()
+                        } catch (e) {
+                        }
+                        this.unloadRef = this.xdr = null
+                    }
+                }, r.prototype.close = function () {
+                    this._cleanup(!0)
+                }, r.enabled = !(!n.XDomainRequest || !a.hasDomain()), e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "../../utils/browser": 44,
+            "../../utils/event": 46,
+            "../../utils/url": 52,
+            debug: void 0,
+            events: 3,
+            inherits: 54
+        }],
+        35: [function (t, e) {
+            "use strict";
+
+            function n(t, e, n, r) {
+                i.call(this, t, e, n, r)
+            }
+
+            var r = t("inherits"), i = t("../driver/xhr");
+            r(n, i), n.enabled = i.enabled && i.supportsCORS, e.exports = n
+        }, {"../driver/xhr": 17, inherits: 54}],
+        36: [function (t, e) {
+            "use strict";
+
+            function n() {
+                var t = this;
+                r.call(this), this.to = setTimeout(function () {
+                    t.emit("finish", 200, "{}")
+                }, n.timeout)
+            }
+
+            var r = t("events").EventEmitter, i = t("inherits");
+            i(n, r), n.prototype.close = function () {
+                clearTimeout(this.to)
+            }, n.timeout = 2e3, e.exports = n
+        }, {events: 3, inherits: 54}],
+        37: [function (t, e) {
+            "use strict";
+
+            function n(t, e, n) {
+                i.call(this, t, e, n, {noCredentials: !0})
+            }
+
+            var r = t("inherits"), i = t("../driver/xhr");
+            r(n, i), n.enabled = i.enabled, e.exports = n
+        }, {"../driver/xhr": 17, inherits: 54}],
+        38: [function (t, e) {
+            "use strict";
+
+            function n(t, e, o) {
+                if (!n.enabled()) throw new Error("Transport created when disabled");
+                s.call(this);
+                var u = this, l = i.addPath(t, "/websocket");
+                l = "https" === l.slice(0, 5) ? "wss" + l.slice(5) : "ws" + l.slice(4), this.url = l, this.ws = new a(this.url, [], o), this.ws.onmessage = function (t) {
+                    u.emit("message", t.data)
+                }, this.unloadRef = r.unloadAdd(function () {
+                    u.ws.close()
+                }), this.ws.onclose = function (t) {
+                    u.emit("close", t.code, t.reason), u._cleanup()
+                }, this.ws.onerror = function (t) {
+                    u.emit("close", 1006, "WebSocket connection broken"), u._cleanup()
+                }
+            }
+
+            var r = t("../utils/event"), i = t("../utils/url"), o = t("inherits"), s = t("events").EventEmitter,
+                a = t("./driver/websocket");
+            o(n, s), n.prototype.send = function (t) {
+                var e = "[" + t + "]";
+                this.ws.send(e)
+            }, n.prototype.close = function () {
+                this.ws && this.ws.close(), this._cleanup()
+            }, n.prototype._cleanup = function () {
+                var t = this.ws;
+                t && (t.onmessage = t.onclose = t.onerror = null), r.unloadDel(this.unloadRef), this.unloadRef = this.ws = null, this.removeAllListeners()
+            }, n.enabled = function () {
+                return !!a
+            }, n.transportName = "websocket", n.roundTrips = 2, e.exports = n
+        }, {
+            "../utils/event": 46,
+            "../utils/url": 52,
+            "./driver/websocket": 19,
+            debug: void 0,
+            events: 3,
+            inherits: 54
+        }],
+        39: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                if (!a.enabled) throw new Error("Transport created when disabled");
+                i.call(this, t, "/xhr", s, a)
+            }
+
+            var r = t("inherits"), i = t("./lib/ajax-based"), o = t("./xdr-streaming"), s = t("./receiver/xhr"),
+                a = t("./sender/xdr");
+            r(n, i), n.enabled = o.enabled, n.transportName = "xdr-polling", n.roundTrips = 2, e.exports = n
+        }, {"./lib/ajax-based": 24, "./receiver/xhr": 32, "./sender/xdr": 34, "./xdr-streaming": 40, inherits: 54}],
+        40: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                if (!s.enabled) throw new Error("Transport created when disabled");
+                i.call(this, t, "/xhr_streaming", o, s)
+            }
+
+            var r = t("inherits"), i = t("./lib/ajax-based"), o = t("./receiver/xhr"), s = t("./sender/xdr");
+            r(n, i), n.enabled = function (t) {
+                return t.cookie_needed || t.nullOrigin ? !1 : s.enabled && t.sameScheme
+            }, n.transportName = "xdr-streaming", n.roundTrips = 2, e.exports = n
+        }, {"./lib/ajax-based": 24, "./receiver/xhr": 32, "./sender/xdr": 34, inherits: 54}],
+        41: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                if (!a.enabled && !s.enabled) throw new Error("Transport created when disabled");
+                i.call(this, t, "/xhr", o, s)
+            }
+
+            var r = t("inherits"), i = t("./lib/ajax-based"), o = t("./receiver/xhr"), s = t("./sender/xhr-cors"),
+                a = t("./sender/xhr-local");
+            r(n, i), n.enabled = function (t) {
+                return t.nullOrigin ? !1 : a.enabled && t.sameOrigin ? !0 : s.enabled
+            }, n.transportName = "xhr-polling", n.roundTrips = 2, e.exports = n
+        }, {
+            "./lib/ajax-based": 24,
+            "./receiver/xhr": 32,
+            "./sender/xhr-cors": 35,
+            "./sender/xhr-local": 37,
+            inherits: 54
+        }],
+        42: [function (t, e) {
+            (function (n) {
+                "use strict";
+
+                function r(t) {
+                    if (!u.enabled && !a.enabled) throw new Error("Transport created when disabled");
+                    o.call(this, t, "/xhr_streaming", s, a)
+                }
+
+                var i = t("inherits"), o = t("./lib/ajax-based"), s = t("./receiver/xhr"), a = t("./sender/xhr-cors"),
+                    u = t("./sender/xhr-local"), l = t("../utils/browser");
+                i(r, o), r.enabled = function (t) {
+                    return t.nullOrigin ? !1 : l.isOpera() ? !1 : a.enabled
+                }, r.transportName = "xhr-streaming", r.roundTrips = 2, r.needBody = !!n.document, e.exports = r
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {
+            "../utils/browser": 44,
+            "./lib/ajax-based": 24,
+            "./receiver/xhr": 32,
+            "./sender/xhr-cors": 35,
+            "./sender/xhr-local": 37,
+            inherits: 54
+        }],
+        43: [function (t, e) {
+            (function (t) {
+                "use strict";
+                e.exports.randomBytes = t.crypto && t.crypto.getRandomValues ? function (e) {
+                    var n = new Uint8Array(e);
+                    return t.crypto.getRandomValues(n), n
+                } : function (t) {
+                    for (var e = new Array(t), n = 0; t > n; n++) e[n] = Math.floor(256 * Math.random());
+                    return e
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        44: [function (t, e) {
+            (function (t) {
+                "use strict";
+                e.exports = {
+                    isOpera: function () {
+                        return t.navigator && /opera/i.test(t.navigator.userAgent)
+                    }, isKonqueror: function () {
+                        return t.navigator && /konqueror/i.test(t.navigator.userAgent)
+                    }, hasDomain: function () {
+                        if (!t.document) return !0;
+                        try {
+                            return !!t.document.domain
+                        } catch (e) {
+                            return !1
+                        }
+                    }
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        45: [function (t, e) {
+            "use strict";
+            var n, r = t("json3"),
+                i = /[\x00-\x1f\ud800-\udfff\ufffe\uffff\u0300-\u0333\u033d-\u0346\u034a-\u034c\u0350-\u0352\u0357-\u0358\u035c-\u0362\u0374\u037e\u0387\u0591-\u05af\u05c4\u0610-\u0617\u0653-\u0654\u0657-\u065b\u065d-\u065e\u06df-\u06e2\u06eb-\u06ec\u0730\u0732-\u0733\u0735-\u0736\u073a\u073d\u073f-\u0741\u0743\u0745\u0747\u07eb-\u07f1\u0951\u0958-\u095f\u09dc-\u09dd\u09df\u0a33\u0a36\u0a59-\u0a5b\u0a5e\u0b5c-\u0b5d\u0e38-\u0e39\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0f69\u0f72-\u0f76\u0f78\u0f80-\u0f83\u0f93\u0f9d\u0fa2\u0fa7\u0fac\u0fb9\u1939-\u193a\u1a17\u1b6b\u1cda-\u1cdb\u1dc0-\u1dcf\u1dfc\u1dfe\u1f71\u1f73\u1f75\u1f77\u1f79\u1f7b\u1f7d\u1fbb\u1fbe\u1fc9\u1fcb\u1fd3\u1fdb\u1fe3\u1feb\u1fee-\u1fef\u1ff9\u1ffb\u1ffd\u2000-\u2001\u20d0-\u20d1\u20d4-\u20d7\u20e7-\u20e9\u2126\u212a-\u212b\u2329-\u232a\u2adc\u302b-\u302c\uaab2-\uaab3\uf900-\ufa0d\ufa10\ufa12\ufa15-\ufa1e\ufa20\ufa22\ufa25-\ufa26\ufa2a-\ufa2d\ufa30-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4e\ufff0-\uffff]/g,
+                o = function (t) {
+                    var e, n = {}, r = [];
+                    for (e = 0; 65536 > e; e++) r.push(String.fromCharCode(e));
+                    return t.lastIndex = 0, r.join("").replace(t, function (t) {
+                        return n[t] = "\\u" + ("0000" + t.charCodeAt(0).toString(16)).slice(-4), ""
+                    }), t.lastIndex = 0, n
+                };
+            e.exports = {
+                quote: function (t) {
+                    var e = r.stringify(t);
+                    return i.lastIndex = 0, i.test(e) ? (n || (n = o(i)), e.replace(i, function (t) {
+                        return n[t]
+                    })) : e
+                }
+            }
+        }, {json3: 55}],
+        46: [function (t, e) {
+            (function (n) {
+                "use strict";
+                var r = t("./random"), i = {}, o = !1, s = n.chrome && n.chrome.app && n.chrome.app.runtime;
+                e.exports = {
+                    attachEvent: function (t, e) {
+                        "undefined" != typeof n.addEventListener ? n.addEventListener(t, e, !1) : n.document && n.attachEvent && (n.document.attachEvent("on" + t, e), n.attachEvent("on" + t, e))
+                    }, detachEvent: function (t, e) {
+                        "undefined" != typeof n.addEventListener ? n.removeEventListener(t, e, !1) : n.document && n.detachEvent && (n.document.detachEvent("on" + t, e), n.detachEvent("on" + t, e))
+                    }, unloadAdd: function (t) {
+                        if (s) return null;
+                        var e = r.string(8);
+                        return i[e] = t, o && setTimeout(this.triggerUnloadCallbacks, 0), e
+                    }, unloadDel: function (t) {
+                        t in i && delete i[t]
+                    }, triggerUnloadCallbacks: function () {
+                        for (var t in i) i[t](), delete i[t]
+                    }
+                };
+                var a = function () {
+                    o || (o = !0, e.exports.triggerUnloadCallbacks())
+                };
+                s || e.exports.attachEvent("unload", a)
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"./random": 50}],
+        47: [function (t, e) {
+            (function (n) {
+                "use strict";
+                var r = t("./event"), i = t("json3"), o = t("./browser");
+                e.exports = {
+                    WPrefix: "_jp", currentWindowId: null, polluteGlobalNamespace: function () {
+                        e.exports.WPrefix in n || (n[e.exports.WPrefix] = {})
+                    }, postMessage: function (t, r) {
+                        n.parent !== n && n.parent.postMessage(i.stringify({
+                            windowId: e.exports.currentWindowId,
+                            type: t,
+                            data: r || ""
+                        }), "*")
+                    }, createIframe: function (t, e) {
+                        var i, o, s = n.document.createElement("iframe"), a = function () {
+                            clearTimeout(i);
+                            try {
+                                s.onload = null
+                            } catch (t) {
+                            }
+                            s.onerror = null
+                        }, u = function () {
+                            s && (a(), setTimeout(function () {
+                                s && s.parentNode.removeChild(s), s = null
+                            }, 0), r.unloadDel(o))
+                        }, l = function (t) {
+                            s && (u(), e(t))
+                        }, c = function (t, e) {
+                            try {
+                                setTimeout(function () {
+                                    s && s.contentWindow && s.contentWindow.postMessage(t, e)
+                                }, 0)
+                            } catch (n) {
+                            }
+                        };
+                        return s.src = t, s.style.display = "none", s.style.position = "absolute", s.onerror = function () {
+                            l("onerror")
+                        }, s.onload = function () {
+                            clearTimeout(i), i = setTimeout(function () {
+                                l("onload timeout")
+                            }, 2e3)
+                        }, n.document.body.appendChild(s), i = setTimeout(function () {
+                            l("timeout")
+                        }, 15e3), o = r.unloadAdd(u), {post: c, cleanup: u, loaded: a}
+                    }, createHtmlfile: function (t, i) {
+                        var o, s, a, u = ["Active"].concat("Object").join("X"), l = new n[u]("htmlfile"),
+                            c = function () {
+                                clearTimeout(o), a.onerror = null
+                            }, f = function () {
+                                l && (c(), r.unloadDel(s), a.parentNode.removeChild(a), a = l = null, CollectGarbage())
+                            }, h = function (t) {
+                                l && (f(), i(t))
+                            }, d = function (t, e) {
+                                try {
+                                    setTimeout(function () {
+                                        a && a.contentWindow && a.contentWindow.postMessage(t, e)
+                                    }, 0)
+                                } catch (n) {
+                                }
+                            };
+                        l.open(), l.write('<html><script>document.domain="' + n.document.domain + '";</script></html>'), l.close(), l.parentWindow[e.exports.WPrefix] = n[e.exports.WPrefix];
+                        var p = l.createElement("div");
+                        return l.body.appendChild(p), a = l.createElement("iframe"), p.appendChild(a), a.src = t, a.onerror = function () {
+                            h("onerror")
+                        }, o = setTimeout(function () {
+                            h("timeout")
+                        }, 15e3), s = r.unloadAdd(f), {post: d, cleanup: f, loaded: c}
+                    }
+                }, e.exports.iframeEnabled = !1, n.document && (e.exports.iframeEnabled = ("function" == typeof n.postMessage || "object" == typeof n.postMessage) && !o.isKonqueror())
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"./browser": 44, "./event": 46, debug: void 0, json3: 55}],
+        48: [function (t, e) {
+            (function (t) {
+                "use strict";
+                var n = {};
+                ["log", "debug", "warn"].forEach(function (e) {
+                    var r;
+                    try {
+                        r = t.console && t.console[e] && t.console[e].apply
+                    } catch (i) {
+                    }
+                    n[e] = r ? function () {
+                        return t.console[e].apply(t.console, arguments)
+                    } : "log" === e ? function () {
+                    } : n.log
+                }), e.exports = n
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        49: [function (t, e) {
+            "use strict";
+            e.exports = {
+                isObject: function (t) {
+                    var e = typeof t;
+                    return "function" === e || "object" === e && !!t
+                }, extend: function (t) {
+                    if (!this.isObject(t)) return t;
+                    for (var e, n, r = 1, i = arguments.length; i > r; r++) {
+                        e = arguments[r];
+                        for (n in e) Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n])
+                    }
+                    return t
+                }
+            }
+        }, {}],
+        50: [function (t, e) {
+            "use strict";
+            var n = t("crypto"), r = "abcdefghijklmnopqrstuvwxyz012345";
+            e.exports = {
+                string: function (t) {
+                    for (var e = r.length, i = n.randomBytes(t), o = [], s = 0; t > s; s++) o.push(r.substr(i[s] % e, 1));
+                    return o.join("")
+                }, number: function (t) {
+                    return Math.floor(Math.random() * t)
+                }, numberString: function (t) {
+                    var e = ("" + (t - 1)).length, n = new Array(e + 1).join("0");
+                    return (n + this.number(t)).slice(-e)
+                }
+            }
+        }, {crypto: 43}],
+        51: [function (t, e) {
+            "use strict";
+            e.exports = function (t) {
+                return {
+                    filterToEnabled: function (e, n) {
+                        var r = {main: [], facade: []};
+                        return e ? "string" == typeof e && (e = [e]) : e = [], t.forEach(function (t) {
+                            t && ("websocket" !== t.transportName || n.websocket !== !1) && (e.length && -1 === e.indexOf(t.transportName) || t.enabled(n) && (r.main.push(t), t.facadeTransport && r.facade.push(t.facadeTransport)))
+                        }), r
+                    }
+                }
+            }
+        }, {debug: void 0}],
+        52: [function (t, e) {
+            "use strict";
+            var n = t("url-parse");
+            e.exports = {
+                getOrigin: function (t) {
+                    if (!t) return null;
+                    var e = new n(t);
+                    if ("file:" === e.protocol) return null;
+                    var r = e.port;
+                    return r || (r = "https:" === e.protocol ? "443" : "80"), e.protocol + "//" + e.hostname + ":" + r
+                }, isOriginEqual: function (t, e) {
+                    var n = this.getOrigin(t) === this.getOrigin(e);
+                    return n
+                }, isSchemeEqual: function (t, e) {
+                    return t.split(":")[0] === e.split(":")[0]
+                }, addPath: function (t, e) {
+                    var n = t.split("?");
+                    return n[0] + e + (n[1] ? "?" + n[1] : "")
+                }, addQuery: function (t, e) {
+                    return t + (-1 === t.indexOf("?") ? "?" + e : "&" + e)
+                }
+            }
+        }, {debug: void 0, "url-parse": 56}],
+        53: [function (t, e) {
+            e.exports = "1.1.1"
+        }, {}],
+        54: [function (t, e) {
+            e.exports = "function" == typeof Object.create ? function (t, e) {
+                t.super_ = e, t.prototype = Object.create(e.prototype, {
+                    constructor: {
+                        value: t,
+                        enumerable: !1,
+                        writable: !0,
+                        configurable: !0
+                    }
+                })
+            } : function (t, e) {
+                t.super_ = e;
+                var n = function () {
+                };
+                n.prototype = e.prototype, t.prototype = new n, t.prototype.constructor = t
+            }
+        }, {}],
+        55: [function (e, n, r) {
+            (function (e) {
+                (function () {
+                    function i(t, e) {
+                        function n(t) {
+                            if (n[t] !== m) return n[t];
+                            var i;
+                            if ("bug-string-char-index" == t) i = "a" != "a"[0]; else if ("json" == t) i = n("json-stringify") && n("json-parse"); else {
+                                var s, a = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
+                                if ("json-stringify" == t) {
+                                    var u = e.stringify, c = "function" == typeof u && g;
+                                    if (c) {
+                                        (s = function () {
+                                            return 1
+                                        }).toJSON = s;
+                                        try {
+                                            c = "0" === u(0) && "0" === u(new r) && '""' == u(new o) && u(b) === m && u(m) === m && u() === m && "1" === u(s) && "[1]" == u([s]) && "[null]" == u([m]) && "null" == u(null) && "[null,null,null]" == u([m, b, null]) && u({a: [s, !0, !1, null, "\x00\b\n\f\r	"]}) == a && "1" === u(null, s) && "[\n 1,\n 2\n]" == u([1, 2], null, 1) && '"-271821-04-20T00:00:00.000Z"' == u(new l(-864e13)) && '"+275760-09-13T00:00:00.000Z"' == u(new l(864e13)) && '"-000001-01-01T00:00:00.000Z"' == u(new l(-621987552e5)) && '"1969-12-31T23:59:59.999Z"' == u(new l(-1))
+                                        } catch (f) {
+                                            c = !1
+                                        }
+                                    }
+                                    i = c
+                                }
+                                if ("json-parse" == t) {
+                                    var h = e.parse;
+                                    if ("function" == typeof h) try {
+                                        if (0 === h("0") && !h(!1)) {
+                                            s = h(a);
+                                            var d = 5 == s.a.length && 1 === s.a[0];
+                                            if (d) {
+                                                try {
+                                                    d = !h('"	"')
+                                                } catch (f) {
+                                                }
+                                                if (d) try {
+                                                    d = 1 !== h("01")
+                                                } catch (f) {
+                                                }
+                                                if (d) try {
+                                                    d = 1 !== h("1.")
+                                                } catch (f) {
+                                                }
+                                            }
+                                        }
+                                    } catch (f) {
+                                        d = !1
+                                    }
+                                    i = d
+                                }
+                            }
+                            return n[t] = !!i
+                        }
+
+                        t || (t = u.Object()), e || (e = u.Object());
+                        var r = t.Number || u.Number, o = t.String || u.String, a = t.Object || u.Object,
+                            l = t.Date || u.Date, c = t.SyntaxError || u.SyntaxError, f = t.TypeError || u.TypeError,
+                            h = t.Math || u.Math, d = t.JSON || u.JSON;
+                        "object" == typeof d && d && (e.stringify = d.stringify, e.parse = d.parse);
+                        var p, v, m, y = a.prototype, b = y.toString, g = new l(-0xc782b5b800cec);
+                        try {
+                            g = -109252 == g.getUTCFullYear() && 0 === g.getUTCMonth() && 1 === g.getUTCDate() && 10 == g.getUTCHours() && 37 == g.getUTCMinutes() && 6 == g.getUTCSeconds() && 708 == g.getUTCMilliseconds()
+                        } catch (w) {
+                        }
+                        if (!n("json")) {
+                            var x = "[object Function]", _ = "[object Date]", E = "[object Number]",
+                                j = "[object String]", T = "[object Array]", S = "[object Boolean]",
+                                O = n("bug-string-char-index");
+                            if (!g) var C = h.floor, A = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
+                                N = function (t, e) {
+                                    return A[e] + 365 * (t - 1970) + C((t - 1969 + (e = +(e > 1))) / 4) - C((t - 1901 + e) / 100) + C((t - 1601 + e) / 400)
+                                };
+                            if ((p = y.hasOwnProperty) || (p = function (t) {
+                                var e, n = {};
+                                return (n.__proto__ = null, n.__proto__ = {toString: 1}, n).toString != b ? p = function (t) {
+                                    var e = this.__proto__, n = t in (this.__proto__ = null, this);
+                                    return this.__proto__ = e, n
+                                } : (e = n.constructor, p = function (t) {
+                                    var n = (this.constructor || e).prototype;
+                                    return t in this && !(t in n && this[t] === n[t])
+                                }), n = null, p.call(this, t)
+                            }), v = function (t, e) {
+                                var n, r, i, o = 0;
+                                (n = function () {
+                                    this.valueOf = 0
+                                }).prototype.valueOf = 0, r = new n;
+                                for (i in r) p.call(r, i) && o++;
+                                return n = r = null, o ? v = 2 == o ? function (t, e) {
+                                    var n, r = {}, i = b.call(t) == x;
+                                    for (n in t) i && "prototype" == n || p.call(r, n) || !(r[n] = 1) || !p.call(t, n) || e(n)
+                                } : function (t, e) {
+                                    var n, r, i = b.call(t) == x;
+                                    for (n in t) i && "prototype" == n || !p.call(t, n) || (r = "constructor" === n) || e(n);
+                                    (r || p.call(t, n = "constructor")) && e(n)
+                                } : (r = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"], v = function (t, e) {
+                                    var n, i, o = b.call(t) == x,
+                                        a = !o && "function" != typeof t.constructor && s[typeof t.hasOwnProperty] && t.hasOwnProperty || p;
+                                    for (n in t) o && "prototype" == n || !a.call(t, n) || e(n);
+                                    for (i = r.length; n = r[--i]; a.call(t, n) && e(n)) ;
+                                }), v(t, e)
+                            }, !n("json-stringify")) {
+                                var k = {92: "\\\\", 34: '\\"', 8: "\\b", 12: "\\f", 10: "\\n", 13: "\\r", 9: "\\t"},
+                                    I = "000000", P = function (t, e) {
+                                        return (I + (e || 0)).slice(-t)
+                                    }, L = "\\u00", R = function (t) {
+                                        for (var e = '"', n = 0, r = t.length, i = !O || r > 10, o = i && (O ? t.split("") : t); r > n; n++) {
+                                            var s = t.charCodeAt(n);
+                                            switch (s) {
+                                                case 8:
+                                                case 9:
+                                                case 10:
+                                                case 12:
+                                                case 13:
+                                                case 34:
+                                                case 92:
+                                                    e += k[s];
+                                                    break;
+                                                default:
+                                                    if (32 > s) {
+                                                        e += L + P(2, s.toString(16));
+                                                        break
+                                                    }
+                                                    e += i ? o[n] : t.charAt(n)
+                                            }
+                                        }
+                                        return e + '"'
+                                    }, U = function (t, e, n, r, i, o, s) {
+                                        var a, u, l, c, h, d, y, g, w, x, O, A, k, I, L, M;
+                                        try {
+                                            a = e[t]
+                                        } catch (q) {
+                                        }
+                                        if ("object" == typeof a && a) if (u = b.call(a), u != _ || p.call(a, "toJSON")) "function" == typeof a.toJSON && (u != E && u != j && u != T || p.call(a, "toJSON")) && (a = a.toJSON(t)); else if (a > -1 / 0 && 1 / 0 > a) {
+                                            if (N) {
+                                                for (h = C(a / 864e5), l = C(h / 365.2425) + 1970 - 1; N(l + 1, 0) <= h; l++) ;
+                                                for (c = C((h - N(l, 0)) / 30.42); N(l, c + 1) <= h; c++) ;
+                                                h = 1 + h - N(l, c), d = (a % 864e5 + 864e5) % 864e5, y = C(d / 36e5) % 24, g = C(d / 6e4) % 60, w = C(d / 1e3) % 60, x = d % 1e3
+                                            } else l = a.getUTCFullYear(), c = a.getUTCMonth(), h = a.getUTCDate(), y = a.getUTCHours(), g = a.getUTCMinutes(), w = a.getUTCSeconds(), x = a.getUTCMilliseconds();
+                                            a = (0 >= l || l >= 1e4 ? (0 > l ? "-" : "+") + P(6, 0 > l ? -l : l) : P(4, l)) + "-" + P(2, c + 1) + "-" + P(2, h) + "T" + P(2, y) + ":" + P(2, g) + ":" + P(2, w) + "." + P(3, x) + "Z"
+                                        } else a = null;
+                                        if (n && (a = n.call(e, t, a)), null === a) return "null";
+                                        if (u = b.call(a), u == S) return "" + a;
+                                        if (u == E) return a > -1 / 0 && 1 / 0 > a ? "" + a : "null";
+                                        if (u == j) return R("" + a);
+                                        if ("object" == typeof a) {
+                                            for (I = s.length; I--;) if (s[I] === a) throw f();
+                                            if (s.push(a), O = [], L = o, o += i, u == T) {
+                                                for (k = 0, I = a.length; I > k; k++) A = U(k, a, n, r, i, o, s), O.push(A === m ? "null" : A);
+                                                M = O.length ? i ? "[\n" + o + O.join(",\n" + o) + "\n" + L + "]" : "[" + O.join(",") + "]" : "[]"
+                                            } else v(r || a, function (t) {
+                                                var e = U(t, a, n, r, i, o, s);
+                                                e !== m && O.push(R(t) + ":" + (i ? " " : "") + e)
+                                            }), M = O.length ? i ? "{\n" + o + O.join(",\n" + o) + "\n" + L + "}" : "{" + O.join(",") + "}" : "{}";
+                                            return s.pop(), M
+                                        }
+                                    };
+                                e.stringify = function (t, e, n) {
+                                    var r, i, o, a;
+                                    if (s[typeof e] && e) if ((a = b.call(e)) == x) i = e; else if (a == T) {
+                                        o = {};
+                                        for (var u, l = 0, c = e.length; c > l; u = e[l++], a = b.call(u), (a == j || a == E) && (o[u] = 1)) ;
+                                    }
+                                    if (n) if ((a = b.call(n)) == E) {
+                                        if ((n -= n % 1) > 0) for (r = "", n > 10 && (n = 10); r.length < n; r += " ") ;
+                                    } else a == j && (r = n.length <= 10 ? n : n.slice(0, 10));
+                                    return U("", (u = {}, u[""] = t, u), i, o, r, "", [])
+                                }
+                            }
+                            if (!n("json-parse")) {
+                                var M, q, D = o.fromCharCode, W = {
+                                    92: "\\",
+                                    34: '"',
+                                    47: "/",
+                                    98: "\b",
+                                    116: "	",
+                                    110: "\n",
+                                    102: "\f",
+                                    114: "\r"
+                                }, J = function () {
+                                    throw M = q = null, c()
+                                }, B = function () {
+                                    for (var t, e, n, r, i, o = q, s = o.length; s > M;) switch (i = o.charCodeAt(M)) {
+                                        case 9:
+                                        case 10:
+                                        case 13:
+                                        case 32:
+                                            M++;
+                                            break;
+                                        case 123:
+                                        case 125:
+                                        case 91:
+                                        case 93:
+                                        case 58:
+                                        case 44:
+                                            return t = O ? o.charAt(M) : o[M], M++, t;
+                                        case 34:
+                                            for (t = "@", M++; s > M;) if (i = o.charCodeAt(M), 32 > i) J(); else if (92 == i) switch (i = o.charCodeAt(++M)) {
+                                                case 92:
+                                                case 34:
+                                                case 47:
+                                                case 98:
+                                                case 116:
+                                                case 110:
+                                                case 102:
+                                                case 114:
+                                                    t += W[i], M++;
+                                                    break;
+                                                case 117:
+                                                    for (e = ++M, n = M + 4; n > M; M++) i = o.charCodeAt(M), i >= 48 && 57 >= i || i >= 97 && 102 >= i || i >= 65 && 70 >= i || J();
+                                                    t += D("0x" + o.slice(e, M));
+                                                    break;
+                                                default:
+                                                    J()
+                                            } else {
+                                                if (34 == i) break;
+                                                for (i = o.charCodeAt(M), e = M; i >= 32 && 92 != i && 34 != i;) i = o.charCodeAt(++M);
+                                                t += o.slice(e, M)
+                                            }
+                                            if (34 == o.charCodeAt(M)) return M++, t;
+                                            J();
+                                        default:
+                                            if (e = M, 45 == i && (r = !0, i = o.charCodeAt(++M)), i >= 48 && 57 >= i) {
+                                                for (48 == i && (i = o.charCodeAt(M + 1), i >= 48 && 57 >= i) && J(), r = !1; s > M && (i = o.charCodeAt(M), i >= 48 && 57 >= i); M++) ;
+                                                if (46 == o.charCodeAt(M)) {
+                                                    for (n = ++M; s > n && (i = o.charCodeAt(n), i >= 48 && 57 >= i); n++) ;
+                                                    n == M && J(), M = n
+                                                }
+                                                if (i = o.charCodeAt(M), 101 == i || 69 == i) {
+                                                    for (i = o.charCodeAt(++M), (43 == i || 45 == i) && M++, n = M; s > n && (i = o.charCodeAt(n), i >= 48 && 57 >= i); n++) ;
+                                                    n == M && J(), M = n
+                                                }
+                                                return +o.slice(e, M)
+                                            }
+                                            if (r && J(), "true" == o.slice(M, M + 4)) return M += 4, !0;
+                                            if ("false" == o.slice(M, M + 5)) return M += 5, !1;
+                                            if ("null" == o.slice(M, M + 4)) return M += 4, null;
+                                            J()
+                                    }
+                                    return "$"
+                                }, G = function (t) {
+                                    var e, n;
+                                    if ("$" == t && J(), "string" == typeof t) {
+                                        if ("@" == (O ? t.charAt(0) : t[0])) return t.slice(1);
+                                        if ("[" == t) {
+                                            for (e = []; t = B(), "]" != t; n || (n = !0)) n && ("," == t ? (t = B(), "]" == t && J()) : J()), "," == t && J(), e.push(G(t));
+                                            return e
+                                        }
+                                        if ("{" == t) {
+                                            for (e = {}; t = B(), "}" != t; n || (n = !0)) n && ("," == t ? (t = B(), "}" == t && J()) : J()), ("," == t || "string" != typeof t || "@" != (O ? t.charAt(0) : t[0]) || ":" != B()) && J(), e[t.slice(1)] = G(B());
+                                            return e
+                                        }
+                                        J()
+                                    }
+                                    return t
+                                }, F = function (t, e, n) {
+                                    var r = H(t, e, n);
+                                    r === m ? delete t[e] : t[e] = r
+                                }, H = function (t, e, n) {
+                                    var r, i = t[e];
+                                    if ("object" == typeof i && i) if (b.call(i) == T) for (r = i.length; r--;) F(i, r, n); else v(i, function (t) {
+                                        F(i, t, n)
+                                    });
+                                    return n.call(t, e, i)
+                                };
+                                e.parse = function (t, e) {
+                                    var n, r;
+                                    return M = 0, q = "" + t, n = G(B()), "$" != B() && J(), M = q = null, e && b.call(e) == x ? H((r = {}, r[""] = n, r), "", e) : n
+                                }
+                            }
+                        }
+                        return e.runInContext = i, e
+                    }
+
+                    var o = "function" == typeof t && t.amd, s = {"function": !0, object: !0},
+                        a = s[typeof r] && r && !r.nodeType && r, u = s[typeof window] && window || this,
+                        l = a && s[typeof n] && n && !n.nodeType && "object" == typeof e && e;
+                    if (!l || l.global !== l && l.window !== l && l.self !== l || (u = l), a && !o) i(u, a); else {
+                        var c = u.JSON, f = u.JSON3, h = !1, d = i(u, u.JSON3 = {
+                            noConflict: function () {
+                                return h || (h = !0, u.JSON = c, u.JSON3 = f, c = f = null), d
+                            }
+                        });
+                        u.JSON = {parse: d.parse, stringify: d.stringify}
+                    }
+                    o && t(function () {
+                        return d
+                    })
+                }).call(this)
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {}],
+        56: [function (t, e) {
+            "use strict";
+
+            function n(t) {
+                var e = u.exec(t);
+                return {protocol: e[1] ? e[1].toLowerCase() : "", slashes: !!e[2], rest: e[3] ? e[3] : ""}
+            }
+
+            function r(t, e, u) {
+                if (!(this instanceof r)) return new r(t, e, u);
+                var c, f, h, d, p = a.test(t), v = typeof e, m = this, y = 0;
+                "object" !== v && "string" !== v && (u = e, e = null), u && "function" != typeof u && (u = s.parse), e = o(e);
+                var b = n(t);
+                for (m.protocol = b.protocol || e.protocol || "", m.slashes = b.slashes || e.slashes, t = b.rest; y < l.length; y++) f = l[y], c = f[0], d = f[1], c !== c ? m[d] = t : "string" == typeof c ? ~(h = t.indexOf(c)) && ("number" == typeof f[2] ? (m[d] = t.slice(0, h), t = t.slice(h + f[2])) : (m[d] = t.slice(h), t = t.slice(0, h))) : (h = c.exec(t)) && (m[d] = h[1], t = t.slice(0, t.length - h[0].length)), m[d] = m[d] || (f[3] || "port" === d && p ? e[d] || "" : ""), f[4] && (m[d] = m[d].toLowerCase());
+                u && (m.query = u(m.query)), i(m.port, m.protocol) || (m.host = m.hostname, m.port = ""), m.username = m.password = "", m.auth && (f = m.auth.split(":"), m.username = f[0] || "", m.password = f[1] || ""), m.href = m.toString()
+            }
+
+            var i = t("requires-port"), o = t("./lolcation"), s = t("querystringify"), a = /^\/(?!\/)/,
+                u = /^([a-z0-9.+-]+:)?(\/\/)?(.*)$/i,
+                l = [["#", "hash"], ["?", "query"], ["/", "pathname"], ["@", "auth", 1], [0 / 0, "host", void 0, 1, 1], [/\:(\d+)$/, "port"], [0 / 0, "hostname", void 0, 1, 1]];
+            r.prototype.set = function (t, e, n) {
+                var r = this;
+                return "query" === t ? ("string" == typeof e && e.length && (e = (n || s.parse)(e)), r[t] = e) : "port" === t ? (r[t] = e, i(e, r.protocol) ? e && (r.host = r.hostname + ":" + e) : (r.host = r.hostname, r[t] = "")) : "hostname" === t ? (r[t] = e, r.port && (e += ":" + r.port), r.host = e) : "host" === t ? (r[t] = e, /\:\d+/.test(e) && (e = e.split(":"), r.hostname = e[0], r.port = e[1])) : "protocol" === t ? (r.protocol = e, r.slashes = !n) : r[t] = e, r.href = r.toString(), r
+            }, r.prototype.toString = function (t) {
+                t && "function" == typeof t || (t = s.stringify);
+                var e, n = this, r = n.protocol;
+                r && ":" !== r.charAt(r.length - 1) && (r += ":");
+                var i = r + (n.slashes ? "//" : "");
+                return n.username && (i += n.username, n.password && (i += ":" + n.password), i += "@"), i += n.hostname, n.port && (i += ":" + n.port), i += n.pathname, e = "object" == typeof n.query ? t(n.query) : n.query, e && (i += "?" !== e.charAt(0) ? "?" + e : e), n.hash && (i += n.hash), i
+            }, r.qs = s, r.location = o, e.exports = r
+        }, {"./lolcation": 57, querystringify: 58, "requires-port": 59}],
+        57: [function (t, e) {
+            (function (n) {
+                "use strict";
+                var r, i = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//, o = {hash: 1, query: 1};
+                e.exports = function (e) {
+                    e = e || n.location || {}, r = r || t("./");
+                    var s, a = {}, u = typeof e;
+                    if ("blob:" === e.protocol) a = new r(unescape(e.pathname), {}); else if ("string" === u) {
+                        a = new r(e, {});
+                        for (s in o) delete a[s]
+                    } else if ("object" === u) {
+                        for (s in e) s in o || (a[s] = e[s]);
+                        void 0 === a.slashes && (a.slashes = i.test(e.href))
+                    }
+                    return a
+                }
+            }).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
+        }, {"./": 56}],
+        58: [function (t, e, n) {
+            "use strict";
+
+            function r(t) {
+                for (var e, n = /([^=?&]+)=([^&]*)/g, r = {}; e = n.exec(t); r[decodeURIComponent(e[1])] = decodeURIComponent(e[2])) ;
+                return r
+            }
+
+            function i(t, e) {
+                e = e || "";
+                var n = [];
+                "string" != typeof e && (e = "?");
+                for (var r in t) o.call(t, r) && n.push(encodeURIComponent(r) + "=" + encodeURIComponent(t[r]));
+                return n.length ? e + n.join("&") : ""
+            }
+
+            var o = Object.prototype.hasOwnProperty;
+            n.stringify = i, n.parse = r
+        }, {}],
+        59: [function (t, e) {
+            "use strict";
+            e.exports = function (t, e) {
+                if (e = e.split(":")[0], t = +t, !t) return !1;
+                switch (e) {
+                    case"http":
+                    case"ws":
+                        return 80 !== t;
+                    case"https":
+                    case"wss":
+                        return 443 !== t;
+                    case"ftp":
+                        return 21 !== t;
+                    case"gopher":
+                        return 70 !== t;
+                    case"file":
+                        return !1
+                }
+                return 0 !== t
+            }
+        }, {}]
+    }, {}, [1])(1)
+});

+ 66 - 0
src/cn/com/usky/iot/auth/TokenAuthBO.java

@@ -0,0 +1,66 @@
+package cn.com.usky.iot.auth;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @author laowo 2019.5.22 token认证结果BO数据模型
+ **/
+public class TokenAuthBO implements Serializable {
+
+	public TokenAuthBO() {
+	}
+
+	public TokenAuthBO(TokenAuthEnum tokenAuth, Map<String, Object> data) {
+		this.authState = tokenAuth.isAuthState();
+		this.code = tokenAuth.getCode();
+		this.comment = tokenAuth.getComment();
+		this.data = new JSONObject(data);
+	}
+
+	private static final long serialVersionUID = 1L;
+
+	private boolean authState;
+
+	private String code;
+
+	private String comment;
+
+	private JSONObject data;
+
+	public boolean isAuthState() {
+		return authState;
+	}
+
+	public void setAuthState(boolean authState) {
+		this.authState = authState;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public String getComment() {
+		return comment;
+	}
+
+	public JSONObject getData() {
+		return data;
+	}
+
+	@Override
+	public String toString() {
+		ToStringBuilder sb = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE);
+		sb.append("authState", this.authState);
+		sb.append("code", this.code);
+		sb.append("comment", this.comment);
+		sb.append("data", data);
+
+		return sb.build();
+	}
+
+}

+ 46 - 0
src/cn/com/usky/iot/auth/TokenAuthEnum.java

@@ -0,0 +1,46 @@
+package cn.com.usky.iot.auth;
+
+/**
+ * @author laowo 2019.5.21 token认证枚举
+ **/
+public enum TokenAuthEnum {
+    /**
+     * 用户认证枚举
+     */
+    SUCCESS(true, "认证成功", "0000"),
+
+    FAIL(false, "认证ERROR", "9999"),
+
+    FAIL_TIMEOUT(false, "认证失败-登录已超时", "0001"),
+
+    FAIL_PWDCHANGE(false, "认证失败-密码已修改,需重新登录", "0002"),
+
+    FAIL_ISNULL(false, "认证失败,token is null", "0003"),
+
+    FAIL_DATA_ERROR(false, "认证失败,token 数据格式不符合要求", "0004");
+
+    TokenAuthEnum(boolean _authState, String _comment, String _code) {
+        this.authState = _authState;
+        this.comment = _comment;
+        this.code = _code;
+    }
+
+    private boolean authState;
+
+    private String code;
+
+    private String comment;
+
+    public boolean isAuthState() {
+        return authState;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+}

+ 187 - 0
src/cn/com/usky/iot/auth/TokenAuthService.java

@@ -0,0 +1,187 @@
+package cn.com.usky.iot.auth;
+import cn.com.usky.iot.controller.login.LoginService;
+import cn.com.usky.utils.DESUtils;
+import cn.com.usky.utils.ListUtil;
+import cn.com.usky.utils.MapUtils;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+import org.joda.time.DateTime;
+import org.springframework.orm.hibernate3.HibernateTemplate;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public final class TokenAuthService {
+
+    private LoginService loginService;
+
+    public LoginService getLoginService() {
+        return loginService;
+    }
+
+    public void setLoginService(LoginService loginService) {
+        this.loginService = loginService;
+    }
+
+    private HibernateTemplate hibernateTemplate;
+
+    public HibernateTemplate getHibernateTemplate() {
+        return hibernateTemplate;
+    }
+
+    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
+        this.hibernateTemplate = hibernateTemplate;
+    }
+
+    private static Logger LOGGER = Logger.getLogger(TokenAuthService.class);
+    /**
+     * token 用户Id
+     **/
+    public static String TOKEN_USERID = "userId";
+
+    /**
+     * token有效期开始时间[登录时间]
+     **/
+    public static String TOKEN_LOGIN_TIME = "loginTime";
+
+    /**
+     * token有效期结束时间[截止时间]
+     **/
+    public static String TOKEN_END_TIME = "endTime";
+
+    /**
+     * token
+     **/
+    public static String TOKEN = "token";
+
+    /**
+     * @param token 认证字符
+     * @return TokenAuthEnum 认证result枚举
+     * @author laowo 验证Token
+     **/
+    public TokenAuthBO verifyToken(String token) {
+        if (StringUtils.isBlank(token)) {
+            LOGGER.warn("token认证开始[end], token is null~");
+            return new TokenAuthBO(TokenAuthEnum.FAIL_ISNULL, Collections.emptyMap());
+        }
+
+        JSONObject tokenJson = null;
+        try {
+            String base64Token = new String(Base64.decodeBase64(token));
+            String decrypt = DESUtils.decrypt(base64Token);
+            tokenJson = JSONObject.parseObject(decrypt);
+            if (MapUtils.isBlank(tokenJson) || tokenJson.isEmpty()) {
+                throw new SecurityException("tokenJson is NULL");
+            }
+            tokenJson.put(TOKEN, token);
+        } catch (SecurityException | JSONException ex) {
+            LOGGER.error("token 解析解密异常,message: " + ex.getMessage());
+            return new TokenAuthBO(TokenAuthEnum.FAIL, Collections.emptyMap());
+        }
+
+        if (MapUtils.isEmptyMap(tokenJson,
+                new String[]{TOKEN_USERID, TOKEN_LOGIN_TIME, TOKEN_END_TIME})) {
+            LOGGER.warn("token缺失数据~");
+            return new TokenAuthBO(TokenAuthEnum.FAIL_DATA_ERROR, tokenJson);
+        }
+
+        if (!StringUtils.isNumeric(tokenJson.getString(TOKEN_USERID))
+                || !StringUtils.isNumeric(tokenJson.getString(TOKEN_LOGIN_TIME))
+                || !StringUtils.isNumeric(tokenJson.getString(TOKEN_END_TIME))) {
+            LOGGER.warn("token数据格式有误~");
+            return new TokenAuthBO(TokenAuthEnum.FAIL_DATA_ERROR, tokenJson);
+        }
+
+        Integer loginTime = Integer.parseInt(tokenJson.getString(TOKEN_LOGIN_TIME));
+        Integer endTime = Integer.parseInt(tokenJson.getString(TOKEN_END_TIME));
+        // 判断token时间有效性
+        long thisTime = System.currentTimeMillis() / 1000;
+        if (!(thisTime >= loginTime && thisTime <= endTime)) {
+            LOGGER.warn("token timeOut, token解析后的数据,tokenJson: " + tokenJson + ", thisTime: " + thisTime);
+            return new TokenAuthBO(TokenAuthEnum.FAIL_TIMEOUT, tokenJson);
+        }
+
+        // 判断userId有效性
+        String userId = tokenJson.getString(TOKEN_USERID);
+        List userInfo = loginService.getObjectByUserId(userId);
+        if (ListUtil.isBlank(userInfo)) {
+            LOGGER.warn("认证失败,非有效用户~");
+            return new TokenAuthBO(TokenAuthEnum.FAIL, tokenJson);
+        }
+
+        LOGGER.info("token认证成功 \n" + "token=" + token + "\n" + "tokenInfo=" + tokenJson);
+        return new TokenAuthBO(TokenAuthEnum.SUCCESS, tokenJson);
+    }
+
+    /**
+     * @param userId 用户Id, loginTime登录时间, changePwdTime密码修改时间
+     * @return TokenAuthEnum 认证result枚举
+     * @author laowo 创建Token
+     **/
+    public String createToken(String userId, Long loginTime) {
+        LOGGER.info("创建Token[start], userId: " + userId + ", loginTime: " + loginTime + "");
+        JSONObject tokenJson = new JSONObject();
+        tokenJson.put(TOKEN_USERID, userId);
+        tokenJson.put(TOKEN_LOGIN_TIME, loginTime);
+        DateTime time = new DateTime(loginTime * 1000);
+        time = time.plusMonths(1);
+        long endTime = time.getMillis() / 1000;
+        tokenJson.put(TOKEN_END_TIME, endTime);
+
+        String encryptToken = DESUtils.encrypt(tokenJson.toJSONString());
+        String token = Base64.encodeBase64URLSafeString(encryptToken.getBytes());
+
+        LOGGER.info("创建Token[end], token: " + token);
+        return token;
+    }
+
+    /**
+     * 登录验证: code: 1,用户登录成功,获取用户userid;2,用户未登录;3,token失效
+     *
+     * @param request
+     * @return
+     * @author shaoxiaowen 2019/6/18
+     */
+    public Map<String, Object> loginChek(HttpServletRequest request) {
+        LOGGER.info("登录验证");
+        Map<String, Object> map = new HashMap<String, Object>();
+        Cookie[] cookies = request.getCookies();
+        if (cookies == null) {
+            map.put("code", "2");
+            return map;
+        } else {
+            for (Cookie cookie : cookies) {
+                if (cookie.getName().equals("authToken")) {
+                    String loginInfo = cookie.getValue();
+                    TokenAuthBO tokenBo = verifyToken(loginInfo);
+                    if (!tokenBo.isAuthState()) {
+                        map.put("code", "3");
+                        return map;
+                    } else {
+                        String userId = tokenBo.getData().getString("userId");
+                        map.put("code", "1");
+                        map.put("userId", userId);
+                        return map;
+                    }
+                }
+            }
+            return map;
+        }
+    }
+
+
+    public static void main(String[] args) {
+        String token = "TC1Yakh3TE45cWtyNXI0S3pXZW53Yms1RXQzSmVMQVFkTDQtek9lMGIxRG13NXVSZ1prRU1SallwOEF1NjRFMWVvV01qeUtJXzI1ZzFaeUFHVTg5bzNIaExZV093Q1o2ZmEzMko5Ulp4aFdpR1BYWm1Bdk4zUQ";
+        String base64Token = new String(Base64.decodeBase64(token));
+        String decrypt = DESUtils.decrypt(base64Token);
+        System.out.println(decrypt);
+
+
+    }
+}

+ 105 - 84
src/cn/com/usky/iot/controller/FrontpageController.java

@@ -2,7 +2,13 @@ package cn.com.usky.iot.controller;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
+import cn.com.usky.iot.auth.TokenAuthBO;
+import cn.com.usky.iot.auth.TokenAuthService;
+import cn.com.usky.utils.HttpServletRequestUtils;
+import org.apache.tools.ant.taskdefs.condition.Http;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -14,90 +20,105 @@ import cn.com.usky.iot.frontpage.service.YtiotFrontpageQueryService;
 @Controller
 @RequestMapping("/iot/frontpage")
 public class FrontpageController {
-	@Resource
-	private YtiotFrontpageQueryService ytiotFrontpageQueryService;
-	private static FrontpageController frontpageController;
-	
-	@PostConstruct
-	 public void init() {
-		frontpageController = this;
-		frontpageController.ytiotFrontpageQueryService = this.ytiotFrontpageQueryService;
-	 }
-	
-	@RequestMapping(value="/getFrontpageQuery",method= {RequestMethod.GET,RequestMethod.POST})
-	public ModelAndView  getFrontpageQuery(@RequestParam(value = "queryJson", required = false) String queryJson) {
-		ModelAndView mav = new ModelAndView();
-		mav.setViewName("return");
-		try {
-			String ret = frontpageController.ytiotFrontpageQueryService.getFrontpageQuery(queryJson);
-			mav.addObject("ret_str", ret);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return mav;
-	}
-	@RequestMapping(value="/getCurrentObjectListByCompanyId",method= {RequestMethod.GET,RequestMethod.POST})
-	public ModelAndView getCurrentObjectListByCompanyId(@RequestParam(value = "queryJson", required = false) String queryJson) {
-		ModelAndView mav = new ModelAndView();
-		mav.setViewName("return");
-		try {
-			String ret = frontpageController.ytiotFrontpageQueryService.getCurrentObjectListByCompanyId(queryJson);
-			mav.addObject("ret_str", ret);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return mav;
-	}
-	//getAlarmList
-	@RequestMapping(value="/getAlarmList",method= {RequestMethod.GET,RequestMethod.POST})
-	public ModelAndView getAlarmList(@RequestParam(value = "queryJson", required = false) String queryJson,
-			@RequestParam(value = "page", required = false) String page,
-			@RequestParam(value = "start", required = false) String start,
-			@RequestParam(value = "limit", required = false) String limit,
-			@RequestParam(value = "sort", required = false) String sort) {
-		ModelAndView mav = new ModelAndView();
-		mav.setViewName("return");
-		try {
-			String ret = frontpageController.ytiotFrontpageQueryService.getAlarmList(queryJson, page, start, limit, sort);
-			mav.addObject("ret_str", ret);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return mav;
-	}
-	
-	@RequestMapping(value="/updateAlarm",method= {RequestMethod.GET,RequestMethod.POST})
-	public static ModelAndView  updateAlarm(@RequestParam(value = "queryJson", required = false) String queryJson) {
-		// TODO Auto-generated constructor stub
-		ModelAndView mav = new ModelAndView();
-		mav.setViewName("return");
+    @Resource
+    private YtiotFrontpageQueryService ytiotFrontpageQueryService;
+    private static FrontpageController frontpageController;
+
+    @PostConstruct
+    public void init() {
+        frontpageController = this;
+        frontpageController.ytiotFrontpageQueryService = this.ytiotFrontpageQueryService;
+    }
+
+    @Autowired
+    private TokenAuthService tokenAuthService;
+
+
+    @RequestMapping(value = "/getFrontpageQuery", method = {RequestMethod.GET, RequestMethod.POST})
+    public ModelAndView getFrontpageQuery(@RequestParam(value = "queryJson", required = false) String queryJson) {
+        ModelAndView mav = new ModelAndView();
+        mav.setViewName("return");
+        try {
+            String ret = frontpageController.ytiotFrontpageQueryService.getFrontpageQuery(queryJson);
+            mav.addObject("ret_str", ret);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return mav;
+    }
+
+    @RequestMapping(value = "/getCurrentObjectListByCompanyId", method = {RequestMethod.GET, RequestMethod.POST})
+    public ModelAndView getCurrentObjectListByCompanyId(
+            @RequestParam(value = "queryJson", required = false) String queryJson,
+            HttpServletRequest request
+    ) {
+        TokenAuthBO tokenAuthBO = HttpServletRequestUtils.tokenAuthForPC(request, tokenAuthService);
+        boolean isAuth = tokenAuthBO.isAuthState();
+        if (!isAuth) {
+
+        }
+
+        ModelAndView mav = new ModelAndView();
+        mav.setViewName("return");
+        try {
+            String ret = frontpageController.ytiotFrontpageQueryService.getCurrentObjectListByCompanyId(queryJson);
+            mav.addObject("ret_str", ret);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return mav;
+    }
+
+    //getAlarmList
+    @RequestMapping(value = "/getAlarmList", method = {RequestMethod.GET, RequestMethod.POST})
+    public ModelAndView getAlarmList(@RequestParam(value = "queryJson", required = false) String queryJson,
+                                     @RequestParam(value = "page", required = false) String page,
+                                     @RequestParam(value = "start", required = false) String start,
+                                     @RequestParam(value = "limit", required = false) String limit,
+                                     @RequestParam(value = "sort", required = false) String sort) {
+        ModelAndView mav = new ModelAndView();
+        mav.setViewName("return");
+        try {
+            String ret = frontpageController.ytiotFrontpageQueryService.getAlarmList(queryJson, page, start, limit, sort);
+            mav.addObject("ret_str", ret);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return mav;
+    }
+
+    @RequestMapping(value = "/updateAlarm", method = {RequestMethod.GET, RequestMethod.POST})
+    public static ModelAndView updateAlarm(@RequestParam(value = "queryJson", required = false) String queryJson) {
+        // TODO Auto-generated constructor stub
+        ModelAndView mav = new ModelAndView();
+        mav.setViewName("return");
 //		System.out.println(queryJson);
-		try {
-			String ret = frontpageController.ytiotFrontpageQueryService.updateAlarm(queryJson);
+        try {
+            String ret = frontpageController.ytiotFrontpageQueryService.updateAlarm(queryJson);
 //			System.out.println(ret);
-			mav.addObject("ret_str", ret);
-			
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return mav;
-	}
-	
-	@RequestMapping(value="/getCurrentStatus",method= {RequestMethod.GET,RequestMethod.POST})
-	public ModelAndView getCurrentStatus(@RequestParam(value = "queryJson", required = false) String queryJson) {
-		ModelAndView mav = new ModelAndView();
-		mav.setViewName("return");
-		try {
-			String ret = frontpageController.ytiotFrontpageQueryService.getCurrentStatus(queryJson);
-			mav.addObject("ret_str", ret);
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return mav;
-	}
+            mav.addObject("ret_str", ret);
+
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return mav;
+    }
+
+    @RequestMapping(value = "/getCurrentStatus", method = {RequestMethod.GET, RequestMethod.POST})
+    public ModelAndView getCurrentStatus(@RequestParam(value = "queryJson", required = false) String queryJson) {
+        ModelAndView mav = new ModelAndView();
+        mav.setViewName("return");
+        try {
+            String ret = frontpageController.ytiotFrontpageQueryService.getCurrentStatus(queryJson);
+            mav.addObject("ret_str", ret);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return mav;
+    }
 }

+ 21 - 0
src/cn/com/usky/iot/controller/login/BaseReController.java

@@ -0,0 +1,21 @@
+package cn.com.usky.iot.controller.login;
+
+import org.springframework.web.bind.annotation.ModelAttribute;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class BaseReController {
+ // 这些对象何以直接被子类使用
+    protected HttpServletRequest request;
+    protected HttpServletResponse response;
+    protected HttpSession session;
+ 
+    @ModelAttribute
+    public void setReqAndRes(HttpServletRequest req, HttpServletResponse res) {
+        this.request = req;
+        this.response = res;
+        this.session = req.getSession();
+    }
+}

+ 9 - 0
src/cn/com/usky/iot/controller/login/Constants.java

@@ -0,0 +1,9 @@
+package cn.com.usky.iot.controller.login;
+
+/**
+ * @author laowo 常量类
+ * **/
+public final class Constants {
+	public static final String RESPONSE_TOKEN = "authToken";
+
+}

+ 100 - 0
src/cn/com/usky/iot/controller/login/LoginController.java

@@ -0,0 +1,100 @@
+package cn.com.usky.iot.controller.login;
+
+import cn.com.usky.iot.auth.TokenAuthBO;
+import cn.com.usky.iot.auth.TokenAuthService;
+import cn.com.usky.utils.CheckNumber;
+import cn.com.usky.utils.HttpServletRequestUtils;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/27 8:59
+ * @description TODO
+ **/
+@Controller
+@RequestMapping("login")
+public class LoginController extends BaseReController {
+
+    @Autowired
+    private LoginService loginService;
+    @Autowired
+    private TokenAuthService tokenAuthService;
+
+    @RequestMapping("tolgin")
+    @ResponseBody
+    public String login(@RequestParam("queryJson") String queryJson) {
+        String sessionCheckNumber = (String) session.getAttribute("checkNumber");
+        JSONObject jsonObject = JSONObject.fromObject(queryJson);
+        String code = jsonObject.has("code") ? jsonObject.getString("code") : null;
+        if (code != null && code.equals(sessionCheckNumber)) {
+            com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
+            result.put("Msg", "CODE WRONG");
+            result.put("ServerName", "www.jd-ioe.com/UskyIoT");
+            result.put("check", "true");
+            result.put("login", "false");
+            return result.toString();
+        }
+        String V_LOGINNAME = jsonObject.has("V_LOGINNAME") ? jsonObject.getString("V_LOGINNAME") : null;
+        String V_PASSWORD = jsonObject.has("V_PASSWORD") ? jsonObject.getString("V_PASSWORD") : null;
+        return loginService.tologin(V_LOGINNAME, V_PASSWORD, response, request);
+    }
+
+    @RequestMapping(value = "getCheckNumber")
+    public void getCheckNumber(HttpServletResponse response, HttpServletRequest request) throws IOException {
+        //创建对象
+        CheckNumber checkNumber = new CheckNumber();
+        //获取图片对象
+        BufferedImage image = checkNumber.getImage();
+        //获得图片的文本内容
+        String text = checkNumber.getText();
+        // 将系统生成的文本内容保存到session中(这里是因为我用的shiro框架,所以使用shiro的session,如果项目没用shiro就用HttpServletRequest来获取session,把验证码文本存入session)
+        HttpSession session = request.getSession();
+        this.session.setAttribute("checkNumber", text);
+        //把图片返回前端
+        ImageIO.write(image, "JPEG", response.getOutputStream());
+    }
+
+
+    //    @RequestMapping("/checkNumber/{userCaptcha}")
+//    @ResponseBody
+//    public Map checkNumber(@PathVariable("userCaptcha") String userCaptcha, HttpServletRequest request) throws IOException{
+//        //获取用户输入的校验码并进行比较
+//        System.out.println("开始校验contl");
+//        Map<String, String> map = new HashMap<>();
+//        HttpSession session = request.getSession();
+//        String sessionCheckNumber = (String) this.session.getAttribute("checkNumber");
+//        System.out.println(userCaptcha +":"+ sessionCheckNumber);
+//        if (sessionCheckNumber.equalsIgnoreCase(userCaptcha)) {
+//            msg.setCode(ResponseMessage.SUCCESS_CODE);
+//            return msg;
+//        }
+//        msg.setCode(ResponseMessage.ERROR_CODE);
+//        msg.setMessage("验证码输入有误!请重新输入!");
+//        return msg;
+//    }
+    @RequestMapping("test")
+    @ResponseBody
+    public void tett() {
+        TokenAuthBO tokenAuthBO = HttpServletRequestUtils.tokenAuthForPC(request, tokenAuthService);
+        boolean isAuth = tokenAuthBO.isAuthState();
+        System.out.println("isAuth = " + isAuth);
+    }
+
+}

+ 17 - 0
src/cn/com/usky/iot/controller/login/LoginService.java

@@ -0,0 +1,17 @@
+package cn.com.usky.iot.controller.login;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface LoginService {
+    String tologin(String loginName, String passWord, HttpServletResponse response, HttpServletRequest request);
+
+    /**
+     * 根据用户登录名查询用户
+     *
+     * @param userId
+     * @return
+     */
+    List getObjectByUserId(String userId);
+}

+ 152 - 0
src/cn/com/usky/iot/controller/login/LoginServiceImpl.java

@@ -0,0 +1,152 @@
+package cn.com.usky.iot.controller.login;
+
+import cn.com.usky.iot.admin.dao.YtiotTAdminDao;
+import cn.com.usky.iot.auth.TokenAuthService;
+import cn.com.usky.utils.ListUtil;
+import cn.com.usky.utils.MD5Util;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.log4j.Logger;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.springframework.orm.hibernate3.HibernateCallback;
+import org.springframework.orm.hibernate3.HibernateTemplate;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.security.NoSuchAlgorithmException;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/11/27 10:00
+ * @description TODO
+ **/
+public class LoginServiceImpl implements LoginService {
+
+    private TokenAuthService tokenAuthService;
+
+    public TokenAuthService getTokenAuthService() {
+        return tokenAuthService;
+    }
+
+    public void setTokenAuthService(TokenAuthService tokenAuthService) {
+        this.tokenAuthService = tokenAuthService;
+    }
+
+    private static final Logger LOGGER = Logger.getLogger(LoginServiceImpl.class);
+    private HibernateTemplate hibernateTemplate;
+
+    public HibernateTemplate getHibernateTemplate() {
+        return hibernateTemplate;
+    }
+
+    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
+        this.hibernateTemplate = hibernateTemplate;
+    }
+
+    private YtiotTAdminDao ytiotTAdminDao;
+
+    public YtiotTAdminDao getYtiotTAdminDao() {
+        return ytiotTAdminDao;
+    }
+
+    public void setYtiotTAdminDao(YtiotTAdminDao ytiotTAdminDao) {
+        this.ytiotTAdminDao = ytiotTAdminDao;
+    }
+
+
+    /**
+     * 登录
+     *
+     * @param loginName
+     * @param passWord
+     * @param response
+     * @param request
+     * @return
+     */
+    @Override
+    public String tologin(String loginName, String passWord, HttpServletResponse response, HttpServletRequest request) {
+        String pwd = null;
+        List userIdList = hibernateTemplate.executeFind(new HibernateCallback() {
+            @Override
+            public Object doInHibernate(Session session)
+                    throws HibernateException, SQLException {
+                String sql = "select UQ_ADMIN_ID from ytiot_t_admin where V_LOGINNAME ='" + loginName + "'";
+                Query query = session.createSQLQuery(sql);
+                return query.list();
+            }
+        });
+        if (ListUtil.isBlank(userIdList)) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("Msg", "LOGIN NAME WRONG");
+            jsonObject.put("ServerName", "www.jd-ioe.com/UskyIoT");
+            jsonObject.put("check", "true");
+            jsonObject.put("login", "false");
+            return jsonObject.toString();
+        }
+        try {
+            pwd = MD5Util.EncoderByMd5(passWord);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        String finalPwd = pwd;
+        List password = hibernateTemplate.executeFind(new HibernateCallback() {
+            @Override
+            public Object doInHibernate(Session session)
+                    throws HibernateException, SQLException {
+                String sql = "select V_ADMIN_NAME,V_PASSWORD from ytiot_t_admin where V_LOGINNAME ='" + loginName + "' and V_PASSWORD='" + finalPwd + "'";
+                Query query = session.createSQLQuery(sql);
+                return query.list();
+            }
+        });
+        if (ListUtil.isBlank(password)) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("Msg", "WRONG PASSWORD!!!");
+            jsonObject.put("ServerName", "www.jd-ioe.com/UskyIoT");
+            jsonObject.put("check", "true");
+            jsonObject.put("login", "false");
+            return jsonObject.toString();
+        }
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("chk", 1);
+        jsonObject.put("href", "view/mainframe.jsp");
+        jsonObject.put("login", "true");
+        jsonObject.put("check", "true");
+        jsonObject.put("ServerName", "www.jd-ioe.com/UskyIoT");
+        //Token生成
+        Long loginTime = System.currentTimeMillis() / 1000;
+        String userId = (String) userIdList.get(0);
+        String token = tokenAuthService.createToken(userId, loginTime);
+        //设置响应token
+        Cookie cookie = new Cookie(Constants.RESPONSE_TOKEN, token);
+        //禁止JS读取cookie
+        cookie.setHttpOnly(true);
+        cookie.setPath(request.getContextPath());
+        //有效期一个月
+        cookie.setMaxAge(60 * 60 * 24 * 30);
+        response.addCookie(cookie);
+        return jsonObject.toString();
+    }
+
+    @Override
+    public List getObjectByUserId(String userId) {
+        return hibernateTemplate.executeFind(new HibernateCallback() {
+            @Override
+            public Object doInHibernate(Session session)
+                    throws HibernateException, SQLException {
+                String sql = "select UQ_ADMIN_ID from ytiot_t_admin where UQ_ADMIN_ID ='" + userId + "'";
+                Query query = session.createSQLQuery(sql);
+                return query.list();
+            }
+        });
+    }
+
+
+}

+ 100 - 0
src/cn/com/usky/utils/CheckNumber.java

@@ -0,0 +1,100 @@
+package cn.com.usky.utils;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Random;
+
+public class CheckNumber {
+    private int w = 70;//验证码图片宽
+    private int h = 35;//验证码图片高
+    private Random r = new Random();//随机对象
+    // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
+    private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
+    // 可选字符
+    private String codes = "0123456789abcdefghjkmnopqrstuvwxyz";
+    // 背景色
+    private Color bgColor = new Color(255, 255, 255);
+    // 验证码上的文本
+    private String text;
+
+    // 生成随机的颜色
+    private Color randomColor() {
+        int red = r.nextInt(150);
+        int green = r.nextInt(150);
+        int blue = r.nextInt(150);
+        return new Color(red, green, blue);
+    }
+
+    // 生成随机的字体
+    private Font randomFont() {
+        int index = r.nextInt(fontNames.length);
+        String fontName = fontNames[index];//生成随机的字体名称
+        int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
+        int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
+        //Font对象的参数:1.字体名称2.字体样式3.字体大小
+        return new Font(fontName, style, size);
+    }
+
+    // 传入一个BufferImage对象,给图片画干扰线
+    private void drawLine(BufferedImage image) {
+        int num = 3;//一共画3条
+        Graphics2D g2 = (Graphics2D) image.getGraphics();
+        for (int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
+            int x1 = r.nextInt(w);
+            int y1 = r.nextInt(h);
+            int x2 = r.nextInt(w);
+            int y2 = r.nextInt(h);
+            g2.setStroke(new BasicStroke(1.5F));
+            g2.setColor(Color.BLUE); //干扰线是蓝色
+            g2.drawLine(x1, y1, x2, y2);//画线
+        }
+    }
+
+    // 随机生成一个字符
+    private char randomChar() {
+        int index = r.nextInt(codes.length());
+        return codes.charAt(index);
+    }
+
+    // 创建BufferedImage
+    private BufferedImage createImage() {
+        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g2 = (Graphics2D) image.getGraphics();
+        g2.setColor(this.bgColor);
+        g2.fillRect(0, 0, w, h);
+        return image;
+    }
+
+    // 调用这个方法得到验证码
+    public BufferedImage getImage() {
+        BufferedImage image = createImage();//创建图片缓冲区
+        Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘制环境
+        StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
+        // 向图片中画4个字符
+        for (int i = 0; i < 4; i++) {//循环四次,每次生成一个字符
+            String s = randomChar() + "";//随机生成一个字母
+            sb.append(s); //把字母添加到sb中
+            float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
+            g2.setFont(randomFont()); //设置随机字体
+            g2.setColor(randomColor()); //设置随机颜色
+            g2.drawString(s, x, h - 5); //画图
+        }
+        this.text = sb.toString(); //把生成的字符串赋给了this.text
+        drawLine(image); //添加干扰线
+        return image;
+    }
+
+    // 返回验证码图片上的文本
+    public String getText() {
+        return text;
+    }
+
+    // 保存图片到指定的输出流
+    public static void output(BufferedImage image, OutputStream out)
+            throws IOException {
+        ImageIO.write(image, "JPEG", out);
+    }
+}

+ 71 - 0
src/cn/com/usky/utils/DESUtils.java

@@ -0,0 +1,71 @@
+package cn.com.usky.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import java.security.SecureRandom;
+
+/**
+ * added by laowo 2019.5.7 
+ * **/
+public final class DESUtils {
+
+	private static byte [] secret = new byte [] {'a','b','z','j','s','t','o','q'}; //DES秘钥, 8位校验位、
+	
+	private static final String ALGORITHM = "DES";  //加密算法
+	
+	private DESUtils(){
+		
+	}
+	
+	/**
+	 *@author laowo DES加密 
+	 *@param encryptStr - 待加密字符
+	 *@return 加密后字符 
+	 * **/
+	public static String encrypt(final String encryptStr){
+		try {
+			DESKeySpec desSpec = new DESKeySpec(secret);
+			SecretKeyFactory secretFactory = SecretKeyFactory.getInstance(ALGORITHM);
+			SecretKey  secretKey = secretFactory.generateSecret(desSpec);
+		    SecureRandom random = new SecureRandom();
+			Cipher cipher = Cipher.getInstance(ALGORITHM);
+			cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);
+			return Base64.encodeBase64URLSafeString(cipher.doFinal(encryptStr.getBytes()));
+		} catch (Exception e) {
+			throw new SecurityException("DES加密异常,message:" + e.getMessage());
+		}
+	}
+	
+	/**
+	 *@author laowo DES解密 
+	 *@param decryptStr - 待解密字符
+	 *@return 解密后字符 
+	 * **/
+	public static String decrypt(final String decryptStr){
+		try{
+			DESKeySpec desSpec = new DESKeySpec(secret); 
+			SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+			SecretKey secretKey = secretKeyFactory.generateSecret(desSpec);
+			SecureRandom random = new SecureRandom();
+			Cipher cipher = Cipher.getInstance(ALGORITHM);
+			cipher.init(Cipher.DECRYPT_MODE, secretKey,random);
+			return new String(cipher.doFinal(Base64.decodeBase64(decryptStr.getBytes())));
+		}catch (Exception e) {
+			throw new SecurityException("DES解密异常,message:" + e.getMessage());
+		}
+	} 
+	
+
+	public static void main(String[] args) {
+		final String demoStr = "我爱中华民族,我家在镇江!A-Z";
+		String encryptStr = DESUtils.encrypt(demoStr);
+		System.out.println("加密字符:"+encryptStr);
+		String decryptStr = DESUtils.decrypt(encryptStr);
+		System.out.println("解密字符:"+decryptStr);
+	}
+
+}

+ 39 - 0
src/cn/com/usky/utils/HttpServletRequestUtils.java

@@ -0,0 +1,39 @@
+package cn.com.usky.utils;
+
+import cn.com.usky.iot.auth.TokenAuthBO;
+import cn.com.usky.iot.auth.TokenAuthService;
+import cn.com.usky.iot.controller.login.Constants;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author laowo PC版本token认证辅助类
+ **/
+public final class HttpServletRequestUtils {
+
+    private HttpServletRequestUtils() {
+    }
+
+    /**
+     * @param request http请求对象, tokenService 认证服务
+     * @return 认证结果
+     * @author laowo token认证辅助方法
+     **/
+    public static TokenAuthBO tokenAuthForPC(HttpServletRequest request, TokenAuthService tokenService) {
+        StringBuilder token = new StringBuilder(256);
+        Cookie[] cookies = request.getCookies();
+        if (cookies == null) {
+            TokenAuthBO tokenBo = tokenService.verifyToken(null);
+            return tokenBo;
+        }
+        for (Cookie c : cookies) {
+            if (Constants.RESPONSE_TOKEN.equals(c.getName())) {
+                token.append(c.getValue());
+                break;
+            }
+        }
+        TokenAuthBO tokenBo = tokenService.verifyToken(token.toString());
+        return tokenBo;
+    }
+}

+ 37 - 0
src/cn/com/usky/utils/ListUtil.java

@@ -0,0 +1,37 @@
+package cn.com.usky.utils;
+
+import java.util.List;
+
+/**
+ * @author laowo
+ * @version v1.0
+ * @date 2020/2/22 15:41
+ * @description 集合判断工具类
+ **/
+public class ListUtil {
+    /**
+     * 判断集合是否为空
+     * @param list
+     * @return
+     */
+    public static boolean isNotBlank(List list) {
+        if (list == null || list.isEmpty()) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     *
+     * @param list
+     * @return
+     */
+    public static boolean isBlank(List list) {
+        if (list == null || list.isEmpty()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+}

+ 89 - 0
src/cn/com/usky/utils/MapUtils.java

@@ -0,0 +1,89 @@
+package cn.com.usky.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+/**
+ * @author laowo 辅助类
+ **/
+public final class MapUtils {
+
+	/**
+	 * @author laowo
+	 * @param Object
+	 *            需要转换的对象
+	 * @return string
+	 **/
+	public static String getStr(Object obj) {
+		if (obj == null) {
+			return null;
+		} else {
+			return StringUtils.trimToEmpty(obj.toString());
+		}
+	}
+
+	/**
+	 * @author laowo 验证map设定非空字段是否为空
+	 * @param params
+	 *            :目标map,args:校验数组
+	 * @return boolean
+	 **/
+	public static boolean isEmptyMap(Map<String, ?> params, String[] args) {
+		if (params == null || args == null || params.isEmpty() || args.length == 0) {
+			return true;
+		}
+
+		boolean bool = false;
+		for (String arg : args) {
+			if (StringUtils.isBlank(getStr(params.get(arg)))) {
+				bool = true;
+				break;
+			}
+		}
+		return bool;
+	}
+	
+	/**
+	 * @author laowo 判断Map是否为非NULL或者非Empty
+	 * @param map
+	 * @return boolean
+	 * **/
+	public static boolean isNotBlank(Map<String,?> map) {
+		if (map != null && !map.isEmpty()) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+	
+	/**
+	 * @author laowo 判断Map是否为NULL或者Empty
+	 * @param map
+	 * @return boolean
+	 * **/
+	public static boolean isBlank(Map<String,?> map) {
+		return !isNotBlank(map);
+	}
+	
+	/**
+	 * @author laowo 验证map设定的value是否全是整形数值
+	 * @param params
+	 *            :目标map,args:校验数组
+	 * @return boolean true 是, false 不是
+	 **/
+	public static boolean isNumericMap(Map<String, ?> params, String[] args) {
+		if (params == null || args == null || params.isEmpty() || args.length == 0) {
+			return false;
+		}
+
+		boolean bool = true;
+		for (String arg : args) {
+			if (!StringUtils.isNumeric(getStr(params.get(arg)))) {
+				bool = false;
+				break;
+			}
+		}
+		return bool;
+	}
+}