Browse Source

人脸设备业务接口代码上传。

Arison 7 years ago
parent
commit
e485989752
41 changed files with 2790 additions and 579 deletions
  1. 1 1
      .idea/modules.xml
  2. 412 555
      .idea/workspace.xml
  3. 2 0
      applications/school/school-server/school-server.iml
  4. 71 1
      applications/websocket/websocket-server/pom.xml
  5. 5 1
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/WebsocketApplication.java
  6. 28 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/FeignBeanFactoryPostProcessor.java
  7. 67 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/MybatisConfigurer.java
  8. 33 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/SwaggerConfig.java
  9. 16 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/WebSocketConfigurer.java
  10. 30 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/IndexController.java
  11. 349 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/WebSocketController.java
  12. 76 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/AbstractService.java
  13. 17 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Mapper.java
  14. 16 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ProjectConstant.java
  15. 44 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Result.java
  16. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultCode.java
  17. 27 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultGenerator.java
  18. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Service.java
  19. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ServiceException.java
  20. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/DeviceDOMapper.java
  21. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/OutInRecordDOMapper.java
  22. 8 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/StudentDOMapper.java
  23. 56 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/Command.java
  24. 310 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/DeviceDO.java
  25. 200 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/OutInRecordDO.java
  26. 344 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/StudentDO.java
  27. 233 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/server/WebSocket.java
  28. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/DeviceDOService.java
  29. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/OutInRecordDOService.java
  30. 12 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/StudentDOService.java
  31. 24 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/DeviceDOServiceImpl.java
  32. 24 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/OutInRecordDOServiceImpl.java
  33. 22 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/StudentDOServiceImpl.java
  34. 53 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/ImgUtil.java
  35. 77 0
      applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/WebSocketUtil.java
  36. 4 1
      applications/websocket/websocket-server/src/main/resources/application.yml
  37. 22 0
      applications/websocket/websocket-server/src/main/resources/mapper/DeviceDOMapper.xml
  38. 17 0
      applications/websocket/websocket-server/src/main/resources/mapper/OutInRecordDOMapper.xml
  39. 23 0
      applications/websocket/websocket-server/src/main/resources/mapper/StudentDOMapper.xml
  40. 58 20
      applications/websocket/websocket-server/websocket-server.iml
  41. 3 0
      applications/wechat/wechat-api/wechat-api.iml

+ 1 - 1
.idea/modules.xml

@@ -16,7 +16,7 @@
       <module fileurl="file://$PROJECT_DIR$/applications/school/school.iml" filepath="$PROJECT_DIR$/applications/school/school.iml" />
       <module fileurl="file://$PROJECT_DIR$/applications/school/school-api/school-api.iml" filepath="$PROJECT_DIR$/applications/school/school-api/school-api.iml" />
       <module fileurl="file://$PROJECT_DIR$/applications/school/school-dto/school-dto.iml" filepath="$PROJECT_DIR$/applications/school/school-dto/school-dto.iml" />
-      <module fileurl="file://$PROJECT_DIR$/applications/school/school-dto/school-dto.iml" filepath="$PROJECT_DIR$/applications/school/school-dto/school-dto.iml" />
+      <module fileurl="file://C:\Project\server\smartschool-platform\applications\school\school-dto\school-dto.iml" filepath="C:\Project\server\smartschool-platform\applications\school\school-dto\school-dto.iml" />
       <module fileurl="file://$PROJECT_DIR$/applications/school/school-server/school-server.iml" filepath="$PROJECT_DIR$/applications/school/school-server/school-server.iml" />
       <module fileurl="file://$PROJECT_DIR$/framework/server-starter/server-starter.iml" filepath="$PROJECT_DIR$/framework/server-starter/server-starter.iml" />
       <module fileurl="file://$PROJECT_DIR$/smartschool-platform.iml" filepath="$PROJECT_DIR$/smartschool-platform.iml" />

File diff suppressed because it is too large
+ 412 - 555
.idea/workspace.xml


+ 2 - 0
applications/school/school-server/school-server.iml

@@ -209,5 +209,7 @@
     <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.10" level="project" />
     <orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
     <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
+    <orderEntry type="module" module-name="school-dto" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.44" level="project" />
   </component>
 </module>

+ 71 - 1
applications/websocket/websocket-server/pom.xml

@@ -34,10 +34,31 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-        <dependency>
+    <!--    <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>-->
+
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-spring</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis</artifactId>
+            <version>3.4.5</version>
+        </dependency>
+        <dependency>
+            <groupId>tk.mybatis</groupId>
+            <artifactId>mapper</artifactId>
+            <version>3.4.2</version>
         </dependency>
+      <!--  <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <version>4.2.1</version>
+        </dependency>-->
         <!-- sleuth -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -69,6 +90,52 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
+
+        <!--websocket-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <!--lang3-->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.6</version>
+        </dependency>
+
+        <!--集成swagger2 管理接口文档 -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+
+        <!--spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!--阿里 FastJson依赖 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.44</version>
+        </dependency>
+        <!--单元测试-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -76,6 +143,9 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+                </configuration>
             </plugin>
             <plugin>
                 <groupId>com.spotify</groupId>

+ 5 - 1
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/WebsocketApplication.java

@@ -1,10 +1,12 @@
 package com.usoftchina.smartschool.websocket;
 
+import com.usoftchina.smartschool.websocket.server.WebSocket;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.ComponentScan;
 
 /**
@@ -18,6 +20,8 @@ import org.springframework.context.annotation.ComponentScan;
 @ComponentScan(basePackages = {"com.usoftchina.smartschool"})
 public class WebsocketApplication {
     public static void main(String[] args) {
-        SpringApplication.run(WebsocketApplication.class, args);
+        SpringApplication sa = new SpringApplication(WebsocketApplication.class);
+        ConfigurableApplicationContext configurableApplicationContext =  sa.run(args);
+        WebSocket.setApplicationContext(configurableApplicationContext);
     }
 }

+ 28 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/FeignBeanFactoryPostProcessor.java

@@ -0,0 +1,28 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+
+/**
+ * Created by Arison on 2019/1/23.
+ */
+@Component
+public class FeignBeanFactoryPostProcessor  implements BeanFactoryPostProcessor {
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
+        if (containsBeanDefinition(beanFactory, "feignContext", "eurekaAutoServiceRegistration")) {
+            BeanDefinition bd = beanFactory.getBeanDefinition("feignContext");
+            bd.setDependsOn("eurekaAutoServiceRegistration");
+        }
+    }
+
+    private boolean containsBeanDefinition(ConfigurableListableBeanFactory beanFactory, String... beans) {
+        return Arrays.stream(beans).allMatch(b -> beanFactory.containsBeanDefinition(b));
+    }
+}

+ 67 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/MybatisConfigurer.java

@@ -0,0 +1,67 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import com.github.pagehelper.PageHelper;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import tk.mybatis.spring.mapper.MapperScannerConfigurer;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MAPPER_INTERFACE_REFERENCE;
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MAPPER_PACKAGE;
+import static com.usoftchina.smartschool.websocket.core.ProjectConstant.MODEL_PACKAGE;
+
+
+/**
+ * Mybatis & Mapper & PageHelper 配置
+ */
+@Configuration
+public class MybatisConfigurer {
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
+        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
+        factory.setDataSource(dataSource);
+        factory.setTypeAliasesPackage(MODEL_PACKAGE);
+
+        //配置分页插件,详情请查阅官方文档
+//        PageHelper pageHelper = new PageHelper();
+//        Properties properties = new Properties();
+//        properties.setProperty("pageSizeZero", "true");//分页尺寸为0时查询所有纪录不再执行分页
+//        properties.setProperty("reasonable", "true");//页码<=0 查询第一页,页码>=总页数查询最后一页
+//        properties.setProperty("supportMethodsArguments", "true");//支持通过 Mapper 接口参数来传递分页参数
+//        pageHelper.setProperties(properties);
+//
+//        //添加插件
+//        factory.setPlugins(new Interceptor[]{pageHelper});
+
+        //添加XML目录
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        factory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
+        return factory.getObject();
+    }
+
+    @Bean
+    public MapperScannerConfigurer mapperScannerConfigurer() {
+        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
+        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
+        mapperScannerConfigurer.setBasePackage(MAPPER_PACKAGE);
+
+        //配置通用Mapper,详情请查阅官方文档
+        Properties properties = new Properties();
+        properties.setProperty("mappers", MAPPER_INTERFACE_REFERENCE);
+        properties.setProperty("notEmpty", "false");//insert、update是否判断字符串类型!='' 即 test="str != null"表达式内是否追加 and str != ''
+        properties.setProperty("IDENTITY", "MYSQL");
+        mapperScannerConfigurer.setProperties(properties);
+
+        return mapperScannerConfigurer;
+    }
+
+}
+

+ 33 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/SwaggerConfig.java

@@ -0,0 +1,33 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+	@Bean
+    public Docket createRestApi(){
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.usoftchina.smartschool.websocket"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+        		.title("接口文档")     
+                .version("1.0")
+                .build();
+    }
+}

+ 16 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/configurer/WebSocketConfigurer.java

@@ -0,0 +1,16 @@
+package com.usoftchina.smartschool.websocket.configurer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+
+
+@Configuration
+public class WebSocketConfigurer {
+	
+	  @Bean  
+      public ServerEndpointExporter serverEndpointExporter() {  
+          return new ServerEndpointExporter();  
+	  }  
+}

+ 30 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/IndexController.java

@@ -0,0 +1,30 @@
+package com.usoftchina.smartschool.websocket.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * Created by Arison on 2019/1/23.
+ */
+@RestController
+public class IndexController {
+
+    @Resource
+    public DeviceDOMapper deviceDOMapper;
+
+    @RequestMapping("/index")
+    public String index() {
+        return "index";
+    }
+
+    @RequestMapping("/")
+    public String home() {
+
+        return JSON.toJSONString( deviceDOMapper.selectAll());
+    }
+
+}

+ 349 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/controller/WebSocketController.java

@@ -0,0 +1,349 @@
+package com.usoftchina.smartschool.websocket.controller;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import com.usoftchina.smartschool.websocket.core.Result;
+import com.usoftchina.smartschool.websocket.core.ResultGenerator;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.dao.StudentDOMapper;
+import com.usoftchina.smartschool.websocket.model.Command;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+import com.usoftchina.smartschool.websocket.server.WebSocket;
+import com.usoftchina.smartschool.websocket.utils.ImgUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+@RestController
+@Api(value = "设备业务接口", description = "设备业务接口")
+@RequestMapping("/websocket")
+public class WebSocketController {
+
+	@Autowired
+	private WebSocket webSocketServer;
+	@Resource
+	public DeviceDOMapper deviceDOMapper;
+	@Resource
+	public StudentDOMapper studentDOMapper;
+	@Resource
+	public OutInRecordDOMapper outInRecordDOMapper;
+
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "向设备发送指令", notes = "")
+	@RequestMapping(value = "/send", method = RequestMethod.GET)
+	public Result send(@RequestParam String message, @RequestParam String ip) {
+		try {
+			webSocketServer.sendMessage(message, ip);
+		} catch (Exception e) {
+			return ResultGenerator.genFailResult("发送异常:" + e.toString());
+		}
+
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "查看已连接设备列表", notes = "")
+	@GetMapping("/list")
+	public Result list() {
+		String[] data = webSocketServer
+				.getSessionIP(webSocketServer.getSessionPool());
+		return ResultGenerator.genSuccessResult(data);
+	}
+
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "设置单个设备超时时间", notes = "")
+	@GetMapping("/wsSetTimeOut")
+	public Result setTimeOut(@RequestParam long time, @RequestParam String ip) {
+		try {
+			webSocketServer.setSessionTimeOut(time, ip);
+		} catch (Exception e) {
+			return ResultGenerator.genFailResult("发生异常:" + e.toString());
+		}
+		return ResultGenerator.genSuccessResult("设置成功!");
+	}
+
+	@ApiOperation(value = "设备设置授权码", notes = "设备只有设置好授权码才能正常使用")
+	@SuppressWarnings("static-access")
+	@RequestMapping(value = "/wsSendAuthCode", method = RequestMethod.GET)
+	public Result sendAuthCode(@RequestParam String ip) {
+		String authCode = "{\"cmd\":\"16\",\"data\":\"cDjkGSV8arRqR92ZJOCRQBWU3qShbug2pw9vPb3fgHzJbd7Ka2jFaHXJgeXs8KHhCUaN3AVzjLeF\\nVU79aes8DEVtPUaQJ/2j/gFzWzPeN9nN7OtW4QElN4EHB44jnrH+N4PAhwsEKEtw3XRn5phwUABU\\nmclAmzm83osxyEUCMVM=\"}";
+		webSocketServer.sendMessage(authCode, ip);
+		return ResultGenerator.genSuccessResult("设置成功!");
+	}
+
+	@ApiOperation(value = "设备启动", notes = "设备UDP启动广播")
+	@GetMapping("/setUdp")
+	public Result sendUdp(@RequestParam(required = false) String message) {
+		String host = "255.255.255.255";
+		int port = 10085;
+		if (StringUtils.isEmpty(message)) {
+			// 本服务的ws服务地址
+			message = "10.1.80.196:9620";
+		}
+		try {
+			InetAddress adds = InetAddress.getByName(host);
+			@SuppressWarnings("resource")
+			DatagramSocket ds = new DatagramSocket();
+			DatagramPacket dp = new DatagramPacket(message.getBytes(),
+					message.length(), adds, port);
+			ds.send(dp);
+			return ResultGenerator.genSuccessResult("发送成功!");
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		} catch (SocketException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+
+		}
+		return null;
+	}
+
+	/**
+	 * 断开ws连接
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "断开设备连接", notes = "断开websocket连接")
+	@GetMapping("/wsClose")
+	public Result closeDevice(@RequestParam String ip) {
+		webSocketServer.close(ip);
+		return ResultGenerator.genSuccessResult("关闭成功!");
+	}
+
+	/**
+	 * 
+	 * 上传白名单
+	 * 
+	 * @return
+	 */
+	@ApiOperation(value = "上传学生头像", notes = "上传和更新学生头像")
+	@SuppressWarnings("static-access")
+	@RequestMapping(value = "/wsUploadPerson", method = RequestMethod.POST)
+	public Result wsUploadPerson(@RequestParam String studId,
+			@RequestParam String ip, @RequestParam MultipartFile file) {
+		FileOutputStream fos;
+		FileInputStream fs;
+		System.out.println("文件名:" + file.getOriginalFilename());
+		String filePath = "C://Users//Arison//Desktop//upload//"
+				+ file.getOriginalFilename();
+		try {
+			fos = new FileOutputStream(new File(filePath));
+			fs = (FileInputStream) file.getInputStream();
+			byte[] buffer = new byte[1024];
+			int len = 0;
+			while ((len = fs.read(buffer)) != -1) {
+				fos.write(buffer, 0, len);
+			}
+			fos.close();
+			fs.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		StudentDO stuDao = new StudentDO();
+		stuDao.setStuId(Long.valueOf(studId));
+		stuDao = studentDOMapper.selectOne(stuDao);
+		stuDao.setStuPhoto(filePath);
+		Condition condition = new Condition(DeviceDO.class);
+		Criteria c1 = condition.createCriteria();
+		c1.andCondition("stu_id=", studId);
+		studentDOMapper.updateByCondition(stuDao, condition);
+
+		String stuPhoto = filePath;
+
+		DeviceDO dModel = new DeviceDO();
+		dModel.setDeviceip(ip);
+		DeviceDO fModel = deviceDOMapper.selectOne(dModel);
+
+		System.out.println("存入头像:" + stuPhoto);
+
+		String serialnum = fModel.getSerialnumber();// 设备的序列号
+		String base64 = ImgUtil.imgToBaseStr(stuPhoto);// 图片的Base64图片
+		Map<String, Object> map = new HashMap<>();
+		map.put("code", stuDao.getStuId()); // 工号
+		map.put("name", stuDao.getStuName()); // 姓名
+		map.put("identity", String.valueOf(stuDao.getStuId())); // 身份证号
+		map.put("cardNum", stuDao.getStuId()); // IC卡编号
+		map.put("type", "1"); // 类型(1白名单,2黑名单)
+		map.put("image", base64); // 头像图片(Base64)
+		map.put("photoname", stuDao.getStuName()); // 入库相片名称
+		map.put("sex", "1"); // 性别(男,女)
+		map.put("organization", String.valueOf(stuDao.getSchoolId())); // 所属组织
+		map.put("position", "学生"); // 职位名称
+		map.put("mail", "784602719@qq.com"); // 邮箱
+		map.put("hiredate", stuDao.getStuEnrollDate().toString()); // 入校日期
+		map.put("entrancenum", "01"); // 门禁编号
+		map.put("serialNo", serialnum); // 序列号
+		map.put("time", String.valueOf(new Date().getTime())); // 创建时间
+
+		if (fModel.getIsonline() == 1 && fModel.getIsauthorized() == 1) {
+			webSocketServer.sendMessage(new Command<>("3", map).toJsonStr(),
+					fModel.getDeviceip());
+			return ResultGenerator.genSuccessResult("发送成功!");
+		} else {
+			return ResultGenerator.genSuccessResult("没有上线");
+		}
+
+	}
+
+	/**
+	 * 删除设备注册人员
+	 * 
+	 * @param ip
+	 * @param stuId
+	 * @return
+	 */
+	@ApiOperation(value = "删除设备学生人脸照", notes = "删除设备注册是白名单和黑名单人员")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeletePerson")
+	public Result wsDeletePerson(@RequestParam String ip,
+			@RequestParam String stuId) {
+		webSocketServer.sendMessage(new Command<>("9", stuId).toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 刷新 设备的上传识别记录
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "获取设备识别记录", notes = "获取设备识别记录")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsGetPhotoHistory")
+	public Result wsGetPhotoHistory(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("11").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 查询设备是否是手动还是自动
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "查询设备开闸模式", notes = "在设备表中更新开闸状态")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsGetDeviceModel")
+	public Result wsGetDeviceModel(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("18").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 设置设备开闸模式
+	 * 
+	 * @param ip
+	 * @param auto
+	 * @return
+	 */
+	@SuppressWarnings("static-access")
+	@ApiOperation(value = "设置设备开闸模式", notes = "自动开闸yes  手动开闸no")
+	@GetMapping("/wsSetDeviceModel")
+	public Result wsSetDeviceModel(@RequestParam String ip,
+			@RequestParam String auto) {
+		Map<String, String> map = new HashMap<>();
+		DeviceDO dModel = new DeviceDO();
+		dModel.setDeviceip(ip);
+		DeviceDO fModel = deviceDOMapper.selectOne(dModel);
+		map.put("auto", auto); // 工号
+		map.put("serialNumber", String.valueOf(fModel.getSerialnumber())); // 设备唯一序列号
+		map.put("url", ""); // 办公检测接口
+		map.put("way", "0"); // 1 进,0 出
+		webSocketServer.sendMessage(new Command<>("17", map).toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备开门
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备开门", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceOpen")
+	public Result wsDeviceOpen(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("12").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备关机
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备关机", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceShutdown")
+	public Result wsDeviceShutdown(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("13").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 远程设备重启
+	 * 
+	 * @param ip
+	 * @return
+	 */
+	@ApiOperation(value = "远程设备重启", notes = "")
+	@SuppressWarnings("static-access")
+	@GetMapping("/wsDeviceRestart")
+	public Result wsDeviceRestart(@RequestParam String ip) {
+		webSocketServer.sendMessage(new Command<>("14").toJsonStr(), ip);
+		return ResultGenerator.genSuccessResult("发送成功!");
+	}
+
+	/**
+	 * 手工添加设备
+	 * 
+	 * @return
+	 */
+	@ApiOperation(value = "添加设备", notes = "")
+	@PostMapping("/addDevice")
+	public Result addDevice(@RequestParam String devicename,
+			@RequestParam String serialnumber, @RequestParam String secretkey,
+			@RequestParam int schoolid) {
+		DeviceDO deviceDO = new DeviceDO();
+		deviceDO.setDevicename(devicename);
+		deviceDO.setSerialnumber(serialnumber);
+		deviceDO.setSecretkey(secretkey);
+		deviceDO.setIsonline(0);
+		deviceDO.setIsauthorized(0);
+		deviceDO.setIsautomatic(0);
+		deviceDO.setSchoolid(schoolid);
+		deviceDOMapper.insert(deviceDO);
+		return ResultGenerator.genSuccessResult("添加成功!");
+	}
+}

+ 76 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/AbstractService.java

@@ -0,0 +1,76 @@
+package com.usoftchina.smartschool.websocket.core;
+
+
+import org.apache.ibatis.exceptions.TooManyResultsException;
+import org.springframework.beans.factory.annotation.Autowired;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.util.List;
+
+/**
+ * 基于通用MyBatis Mapper插件的Service接口的实现
+ */
+public abstract class AbstractService<T> implements Service<T> {
+
+    @Autowired
+    protected Mapper<T> mapper;
+
+    private Class<T> modelClass;    // 当前泛型真实类型的Class
+
+    @SuppressWarnings("unchecked")
+	public AbstractService() {
+        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
+        modelClass = (Class<T>) pt.getActualTypeArguments()[0];
+    }
+
+    public void save(T model) {
+        mapper.insertSelective(model);
+    }
+
+    public void save(List<T> models) {
+        mapper.insertList(models);
+    }
+
+    public void deleteById(Integer id) {
+        mapper.deleteByPrimaryKey(id);
+    }
+
+    public void deleteByIds(String ids) {
+        mapper.deleteByIds(ids);
+    }
+
+    public void update(T model) {
+        mapper.updateByPrimaryKeySelective(model);
+    }
+
+    public T findById(Integer id) {
+        return mapper.selectByPrimaryKey(id);
+    }
+
+    @Override
+    public T findBy(String fieldName, Object value) throws TooManyResultsException {
+        try {
+            T model = modelClass.newInstance();
+            Field field = modelClass.getDeclaredField(fieldName);
+            field.setAccessible(true);
+            field.set(model, value);
+            return mapper.selectOne(model);
+        } catch (ReflectiveOperationException e) {
+            throw new ServiceException(e.getMessage(), e);
+        }
+    }
+
+    public List<T> findByIds(String ids) {
+        return mapper.selectByIds(ids);
+    }
+
+    public List<T> findByCondition(Condition condition) {
+        return mapper.selectByCondition(condition);
+    }
+
+    public List<T> findAll() {
+        return mapper.selectAll();
+    }
+}

+ 17 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Mapper.java

@@ -0,0 +1,17 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import tk.mybatis.mapper.common.BaseMapper;
+import tk.mybatis.mapper.common.ConditionMapper;
+import tk.mybatis.mapper.common.IdsMapper;
+import tk.mybatis.mapper.common.special.InsertListMapper;
+
+/**
+ * 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加。
+ */
+public interface Mapper<T>
+        extends
+        BaseMapper<T>,
+        ConditionMapper<T>,
+        IdsMapper<T>,
+        InsertListMapper<T> {
+}

+ 16 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ProjectConstant.java

@@ -0,0 +1,16 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 项目常量
+ */
+public final class ProjectConstant {
+    public static final String BASE_PACKAGE = "com.usoftchina.smartschool.websocket";//项目基础包名称,根据自己公司的项目修改
+
+    public static final String MODEL_PACKAGE = BASE_PACKAGE + ".model";//Model所在包
+    public static final String MAPPER_PACKAGE = BASE_PACKAGE + ".dao";//Mapper所在包
+    public static final String SERVICE_PACKAGE = BASE_PACKAGE + ".service";//Service所在包
+    public static final String SERVICE_IMPL_PACKAGE = SERVICE_PACKAGE + ".impl";//ServiceImpl所在包
+    public static final String CONTROLLER_PACKAGE = BASE_PACKAGE + ".web";//Controller所在包
+
+    public static final String MAPPER_INTERFACE_REFERENCE = BASE_PACKAGE + ".core.Mapper";//Mapper插件基础接口的完全限定名
+}

+ 44 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Result.java

@@ -0,0 +1,44 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * 统一API响应结果封装
+ */
+public class Result {
+    private int code;
+    private String message;
+    private Object data;
+
+    public Result setCode(ResultCode resultCode) {
+        this.code = resultCode.code();
+        return this;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Result setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public Result setData(Object data) {
+        this.data = data;
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return JSON.toJSONString(this);
+    }
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultCode.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 响应码枚举,参考HTTP状态码的语义
+ */
+public enum ResultCode {
+    SUCCESS(200),//成功
+    FAIL(400),//失败
+    UNAUTHORIZED(401),//未认证(签名错误)
+    NOT_FOUND(404),//接口不存在
+    INTERNAL_SERVER_ERROR(500);//服务器内部错误
+
+    private final int code;
+
+    ResultCode(int code) {
+        this.code = code;
+    }
+
+    public int code() {
+        return code;
+    }
+}

+ 27 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ResultGenerator.java

@@ -0,0 +1,27 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 响应结果生成工具
+ */
+public class ResultGenerator {
+    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";
+
+    public static Result genSuccessResult() {
+        return new Result()
+                .setCode(ResultCode.SUCCESS)
+                .setMessage(DEFAULT_SUCCESS_MESSAGE);
+    }
+
+    public static Result genSuccessResult(Object data) {
+        return new Result()
+                .setCode(ResultCode.SUCCESS)
+                .setMessage(DEFAULT_SUCCESS_MESSAGE)
+                .setData(data);
+    }
+
+    public static Result genFailResult(String message) {
+        return new Result()
+                .setCode(ResultCode.FAIL)
+                .setMessage(message);
+    }
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/Service.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+import org.apache.ibatis.exceptions.TooManyResultsException;
+import tk.mybatis.mapper.entity.Condition;
+
+import java.util.List;
+
+/**
+ * Service 层 基础接口,其他Service 接口 请继承该接口
+ */
+public interface Service<T> {
+    void save(T model);//持久化
+    void save(List<T> models);//批量持久化
+    void deleteById(Integer id);//通过主鍵刪除
+    void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”
+    void update(T model);//更新
+    T findById(Integer id);//通过ID查找
+    T findBy(String fieldName, Object value) throws TooManyResultsException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束
+    List<T> findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”
+    List<T> findByCondition(Condition condition);//根据条件查找
+    List<T> findAll();//获取所有
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/core/ServiceException.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.core;
+
+/**
+ * 服务(业务)异常如“ 账号或密码错误 ”,该异常只做INFO级别的日志记录 @see WebMvcConfigurer
+ */
+public class ServiceException extends RuntimeException {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public ServiceException() {
+    }
+
+    public ServiceException(String message) {
+        super(message);
+    }
+
+    public ServiceException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/DeviceDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+
+public interface DeviceDOMapper extends Mapper<DeviceDO> {
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/OutInRecordDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+
+public interface OutInRecordDOMapper extends Mapper<OutInRecordDO> {
+}

+ 8 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/dao/StudentDOMapper.java

@@ -0,0 +1,8 @@
+package com.usoftchina.smartschool.websocket.dao;
+
+
+import com.usoftchina.smartschool.websocket.core.Mapper;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+
+public interface StudentDOMapper extends Mapper<StudentDO> {
+}

+ 56 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/Command.java

@@ -0,0 +1,56 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.alibaba.fastjson.JSONObject;
+
+public class Command<T> {
+    private String cmd;
+    private T data = null;//返回数据
+
+    public Command(String cmd) {
+        this.cmd = cmd;
+    }
+
+    public Command(String cmd, T data) {
+        this.cmd = cmd;
+        this.data = data;
+    }
+
+    /**
+     * List装换Clist
+     *
+     * @param cmd
+     * @param list
+     * @return
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+	public static List<Command> toCommandList(String cmd, List list) {
+        List<Command> commandList = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            commandList.add(new Command(cmd, list.get(i)));
+        }
+        return commandList;
+    }
+
+    public String getCmd() {
+        return cmd;
+    }
+
+    public void setCmd(String cmd) {
+        this.cmd = cmd;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String toJsonStr() {
+        return JSONObject.toJSONString(this);
+    }
+}

+ 310 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/DeviceDO.java

@@ -0,0 +1,310 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import javax.persistence.*;
+
+@Table(name = "device")
+public class DeviceDO {
+    /**
+     * 设备ID,自增长
+     */
+    @Id
+    @Column(name = "deviceId")
+    private Integer deviceid;
+
+    /**
+     * 设备名称
+     */
+    @Column(name = "deviceName")
+    private String devicename;
+
+    /**
+     * 设备型号
+     */
+    @Column(name = "deviceModel")
+    private String devicemodel;
+
+    /**
+     * 设备序列号
+     */
+    @Column(name = "serialNumber")
+    private String serialnumber;
+
+    /**
+     * 设备IP
+     */
+    @Column(name = "deviceIp")
+    private String deviceip;
+
+    /**
+     * 设备版本号
+     */
+    private String version;
+
+    /**
+     * 设备Mac地址
+     */
+    @Column(name = "deviceMac")
+    private String devicemac;
+
+    /**
+     * 设备制造商
+     */
+    @Column(name = "deviceMaker")
+    private String devicemaker;
+
+    /**
+     * 设备秘钥
+     */
+    private String secretkey;
+
+    /**
+     * 是否授权   0 未授权,1 授权
+     */
+    @Column(name = "isAuthorized")
+    private Integer isauthorized;
+
+    /**
+     * 是否在线  0不在线  1在线
+     */
+    @Column(name = "isOnline")
+    private Integer isonline;
+
+    /**
+     * 是否自动开闸模式  0 手动  1 自动
+     */
+    @Column(name = "isAutomatic")
+    private Integer isautomatic;
+
+    @Column(name = "schoolId")
+    private Integer schoolid;
+
+    /**
+     * 获取设备ID,自增长
+     *
+     * @return deviceId - 设备ID,自增长
+     */
+    public Integer getDeviceid() {
+        return deviceid;
+    }
+
+    /**
+     * 设置设备ID,自增长
+     *
+     * @param deviceid 设备ID,自增长
+     */
+    public void setDeviceid(Integer deviceid) {
+        this.deviceid = deviceid;
+    }
+
+    /**
+     * 获取设备名称
+     *
+     * @return deviceName - 设备名称
+     */
+    public String getDevicename() {
+        return devicename;
+    }
+
+    /**
+     * 设置设备名称
+     *
+     * @param devicename 设备名称
+     */
+    public void setDevicename(String devicename) {
+        this.devicename = devicename;
+    }
+
+    /**
+     * 获取设备型号
+     *
+     * @return deviceModel - 设备型号
+     */
+    public String getDevicemodel() {
+        return devicemodel;
+    }
+
+    /**
+     * 设置设备型号
+     *
+     * @param devicemodel 设备型号
+     */
+    public void setDevicemodel(String devicemodel) {
+        this.devicemodel = devicemodel;
+    }
+
+    /**
+     * 获取设备序列号
+     *
+     * @return serialNumber - 设备序列号
+     */
+    public String getSerialnumber() {
+        return serialnumber;
+    }
+
+    /**
+     * 设置设备序列号
+     *
+     * @param serialnumber 设备序列号
+     */
+    public void setSerialnumber(String serialnumber) {
+        this.serialnumber = serialnumber;
+    }
+
+    /**
+     * 获取设备IP
+     *
+     * @return deviceIp - 设备IP
+     */
+    public String getDeviceip() {
+        return deviceip;
+    }
+
+    /**
+     * 设置设备IP
+     *
+     * @param deviceip 设备IP
+     */
+    public void setDeviceip(String deviceip) {
+        this.deviceip = deviceip;
+    }
+
+    /**
+     * 获取设备版本号
+     *
+     * @return version - 设备版本号
+     */
+    public String getVersion() {
+        return version;
+    }
+
+    /**
+     * 设置设备版本号
+     *
+     * @param version 设备版本号
+     */
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    /**
+     * 获取设备Mac地址
+     *
+     * @return deviceMac - 设备Mac地址
+     */
+    public String getDevicemac() {
+        return devicemac;
+    }
+
+    /**
+     * 设置设备Mac地址
+     *
+     * @param devicemac 设备Mac地址
+     */
+    public void setDevicemac(String devicemac) {
+        this.devicemac = devicemac;
+    }
+
+    /**
+     * 获取设备制造商
+     *
+     * @return deviceMaker - 设备制造商
+     */
+    public String getDevicemaker() {
+        return devicemaker;
+    }
+
+    /**
+     * 设置设备制造商
+     *
+     * @param devicemaker 设备制造商
+     */
+    public void setDevicemaker(String devicemaker) {
+        this.devicemaker = devicemaker;
+    }
+
+    /**
+     * 获取设备秘钥
+     *
+     * @return secretkey - 设备秘钥
+     */
+    public String getSecretkey() {
+        return secretkey;
+    }
+
+    /**
+     * 设置设备秘钥
+     *
+     * @param secretkey 设备秘钥
+     */
+    public void setSecretkey(String secretkey) {
+        this.secretkey = secretkey;
+    }
+
+    /**
+     * 获取是否授权   0 未授权,1 授权
+     *
+     * @return isAuthorized - 是否授权   0 未授权,1 授权
+     */
+    public Integer getIsauthorized() {
+        return isauthorized;
+    }
+
+    /**
+     * 设置是否授权   0 未授权,1 授权
+     *
+     * @param isauthorized 是否授权   0 未授权,1 授权
+     */
+    public void setIsauthorized(Integer isauthorized) {
+        this.isauthorized = isauthorized;
+    }
+
+    /**
+     * 获取是否在线  0不在线  1在线
+     *
+     * @return isOnline - 是否在线  0不在线  1在线
+     */
+    public Integer getIsonline() {
+        return isonline;
+    }
+
+    /**
+     * 设置是否在线  0不在线  1在线
+     *
+     * @param isonline 是否在线  0不在线  1在线
+     */
+    public void setIsonline(Integer isonline) {
+        this.isonline = isonline;
+    }
+
+    /**
+     * 获取是否自动开闸模式  0 手动  1 自动
+     *
+     * @return isAutomatic - 是否自动开闸模式  0 手动  1 自动
+     */
+    public Integer getIsautomatic() {
+        return isautomatic;
+    }
+
+    /**
+     * 设置是否自动开闸模式  0 手动  1 自动
+     *
+     * @param isautomatic 是否自动开闸模式  0 手动  1 自动
+     */
+    public void setIsautomatic(Integer isautomatic) {
+        this.isautomatic = isautomatic;
+    }
+
+    /**
+     * @return schoolId
+     */
+    public Integer getSchoolid() {
+        return schoolid;
+    }
+
+    /**
+     * @param schoolid
+     */
+    public void setSchoolid(Integer schoolid) {
+        this.schoolid = schoolid;
+    }
+}

+ 200 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/OutInRecordDO.java

@@ -0,0 +1,200 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "out_in_record")
+public class OutInRecordDO {
+    /**
+     * 编号
+     */
+    @Id
+    @Column(name = "record_id")
+    private Long recordId;
+
+    /**
+     * 记录名
+     */
+    @Column(name = "record_name")
+    private String recordName;
+
+    /**
+     * 出校时间
+     */
+    @Column(name = "out_date")
+    private Date outDate;
+
+    /**
+     * 入校时间
+     */
+    @Column(name = "in_date")
+    private Date inDate;
+
+    /**
+     * 详情
+     */
+    @Column(name = "record_details")
+    private String recordDetails;
+
+    /**
+     * 备注
+     */
+    @Column(name = "record_remarks")
+    private String recordRemarks;
+
+    /**
+     * 学生
+     */
+    @Column(name = "stu_id")
+    private Long stuId;
+
+    /**
+     * 学校
+     */
+    @Column(name = "school_id")
+    private Long schoolId;
+
+    /**
+     * 获取编号
+     *
+     * @return record_id - 编号
+     */
+    public Long getRecordId() {
+        return recordId;
+    }
+
+    /**
+     * 设置编号
+     *
+     * @param recordId 编号
+     */
+    public void setRecordId(Long recordId) {
+        this.recordId = recordId;
+    }
+
+    /**
+     * 获取记录名
+     *
+     * @return record_name - 记录名
+     */
+    public String getRecordName() {
+        return recordName;
+    }
+
+    /**
+     * 设置记录名
+     *
+     * @param recordName 记录名
+     */
+    public void setRecordName(String recordName) {
+        this.recordName = recordName;
+    }
+
+    /**
+     * 获取出校时间
+     *
+     * @return out_date - 出校时间
+     */
+    public Date getOutDate() {
+        return outDate;
+    }
+
+    /**
+     * 设置出校时间
+     *
+     * @param outDate 出校时间
+     */
+    public void setOutDate(Date outDate) {
+        this.outDate = outDate;
+    }
+
+    /**
+     * 获取入校时间
+     *
+     * @return in_date - 入校时间
+     */
+    public Date getInDate() {
+        return inDate;
+    }
+
+    /**
+     * 设置入校时间
+     *
+     * @param inDate 入校时间
+     */
+    public void setInDate(Date inDate) {
+        this.inDate = inDate;
+    }
+
+    /**
+     * 获取详情
+     *
+     * @return record_details - 详情
+     */
+    public String getRecordDetails() {
+        return recordDetails;
+    }
+
+    /**
+     * 设置详情
+     *
+     * @param recordDetails 详情
+     */
+    public void setRecordDetails(String recordDetails) {
+        this.recordDetails = recordDetails;
+    }
+
+    /**
+     * 获取备注
+     *
+     * @return record_remarks - 备注
+     */
+    public String getRecordRemarks() {
+        return recordRemarks;
+    }
+
+    /**
+     * 设置备注
+     *
+     * @param recordRemarks 备注
+     */
+    public void setRecordRemarks(String recordRemarks) {
+        this.recordRemarks = recordRemarks;
+    }
+
+    /**
+     * 获取学生
+     *
+     * @return stu_id - 学生
+     */
+    public Long getStuId() {
+        return stuId;
+    }
+
+    /**
+     * 设置学生
+     *
+     * @param stuId 学生
+     */
+    public void setStuId(Long stuId) {
+        this.stuId = stuId;
+    }
+
+    /**
+     * 获取学校
+     *
+     * @return school_id - 学校
+     */
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    /**
+     * 设置学校
+     *
+     * @param schoolId 学校
+     */
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+}

+ 344 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/model/StudentDO.java

@@ -0,0 +1,344 @@
+package com.usoftchina.smartschool.websocket.model;
+
+import java.util.Date;
+import javax.persistence.*;
+
+@Table(name = "sys_student")
+public class StudentDO {
+    /**
+     * 编号
+     */
+    @Id
+    @Column(name = "stu_id")
+    private Long stuId;
+
+    /**
+     * 学号
+     */
+    @Column(name = "stu_number")
+    private String stuNumber;
+
+    /**
+     * 名字
+     */
+    @Column(name = "stu_name")
+    private String stuName;
+
+    /**
+     * 入学日期
+     */
+    @Column(name = "stu_enroll_date")
+    private Date stuEnrollDate;
+
+    /**
+     * 毕业时间
+     */
+    @Column(name = "stu_graduate_date")
+    private Date stuGraduateDate;
+
+    /**
+     * 生日
+     */
+    @Column(name = "stu_birthday")
+    private Date stuBirthday;
+
+    /**
+     * 年龄
+     */
+    @Column(name = "stu_age")
+    private Integer stuAge;
+
+    /**
+     * 性别   1男  2女
+     */
+    @Column(name = "stu_sex")
+    private Integer stuSex;
+
+    /**
+     * 地址
+     */
+    @Column(name = "stu_address")
+    private String stuAddress;
+
+    /**
+     * 头像
+     */
+    @Column(name = "stu_photo")
+    private String stuPhoto;
+
+    /**
+     * 状态   1正常   2冻结
+     */
+    @Column(name = "stu_status")
+    private Integer stuStatus;
+
+    /**
+     * 备注
+     */
+    @Column(name = "stu_remarks")
+    private String stuRemarks;
+
+    /**
+     * 班级
+     */
+    @Column(name = "clazz_id")
+    private Long clazzId;
+
+    /**
+     * 学校
+     */
+    @Column(name = "school_id")
+    private Long schoolId;
+
+    /**
+     * 获取编号
+     *
+     * @return stu_id - 编号
+     */
+    public Long getStuId() {
+        return stuId;
+    }
+
+    /**
+     * 设置编号
+     *
+     * @param stuId 编号
+     */
+    public void setStuId(Long stuId) {
+        this.stuId = stuId;
+    }
+
+    /**
+     * 获取学号
+     *
+     * @return stu_number - 学号
+     */
+    public String getStuNumber() {
+        return stuNumber;
+    }
+
+    /**
+     * 设置学号
+     *
+     * @param stuNumber 学号
+     */
+    public void setStuNumber(String stuNumber) {
+        this.stuNumber = stuNumber;
+    }
+
+    /**
+     * 获取名字
+     *
+     * @return stu_name - 名字
+     */
+    public String getStuName() {
+        return stuName;
+    }
+
+    /**
+     * 设置名字
+     *
+     * @param stuName 名字
+     */
+    public void setStuName(String stuName) {
+        this.stuName = stuName;
+    }
+
+    /**
+     * 获取入学日期
+     *
+     * @return stu_enroll_date - 入学日期
+     */
+    public Date getStuEnrollDate() {
+        return stuEnrollDate;
+    }
+
+    /**
+     * 设置入学日期
+     *
+     * @param stuEnrollDate 入学日期
+     */
+    public void setStuEnrollDate(Date stuEnrollDate) {
+        this.stuEnrollDate = stuEnrollDate;
+    }
+
+    /**
+     * 获取毕业时间
+     *
+     * @return stu_graduate_date - 毕业时间
+     */
+    public Date getStuGraduateDate() {
+        return stuGraduateDate;
+    }
+
+    /**
+     * 设置毕业时间
+     *
+     * @param stuGraduateDate 毕业时间
+     */
+    public void setStuGraduateDate(Date stuGraduateDate) {
+        this.stuGraduateDate = stuGraduateDate;
+    }
+
+    /**
+     * 获取生日
+     *
+     * @return stu_birthday - 生日
+     */
+    public Date getStuBirthday() {
+        return stuBirthday;
+    }
+
+    /**
+     * 设置生日
+     *
+     * @param stuBirthday 生日
+     */
+    public void setStuBirthday(Date stuBirthday) {
+        this.stuBirthday = stuBirthday;
+    }
+
+    /**
+     * 获取年龄
+     *
+     * @return stu_age - 年龄
+     */
+    public Integer getStuAge() {
+        return stuAge;
+    }
+
+    /**
+     * 设置年龄
+     *
+     * @param stuAge 年龄
+     */
+    public void setStuAge(Integer stuAge) {
+        this.stuAge = stuAge;
+    }
+
+    /**
+     * 获取性别   1男  2女
+     *
+     * @return stu_sex - 性别   1男  2女
+     */
+    public Integer getStuSex() {
+        return stuSex;
+    }
+
+    /**
+     * 设置性别   1男  2女
+     *
+     * @param stuSex 性别   1男  2女
+     */
+    public void setStuSex(Integer stuSex) {
+        this.stuSex = stuSex;
+    }
+
+    /**
+     * 获取地址
+     *
+     * @return stu_address - 地址
+     */
+    public String getStuAddress() {
+        return stuAddress;
+    }
+
+    /**
+     * 设置地址
+     *
+     * @param stuAddress 地址
+     */
+    public void setStuAddress(String stuAddress) {
+        this.stuAddress = stuAddress;
+    }
+
+    /**
+     * 获取头像
+     *
+     * @return stu_photo - 头像
+     */
+    public String getStuPhoto() {
+        return stuPhoto;
+    }
+
+    /**
+     * 设置头像
+     *
+     * @param stuPhoto 头像
+     */
+    public void setStuPhoto(String stuPhoto) {
+        this.stuPhoto = stuPhoto;
+    }
+
+    /**
+     * 获取状态   1正常   2冻结
+     *
+     * @return stu_status - 状态   1正常   2冻结
+     */
+    public Integer getStuStatus() {
+        return stuStatus;
+    }
+
+    /**
+     * 设置状态   1正常   2冻结
+     *
+     * @param stuStatus 状态   1正常   2冻结
+     */
+    public void setStuStatus(Integer stuStatus) {
+        this.stuStatus = stuStatus;
+    }
+
+    /**
+     * 获取备注
+     *
+     * @return stu_remarks - 备注
+     */
+    public String getStuRemarks() {
+        return stuRemarks;
+    }
+
+    /**
+     * 设置备注
+     *
+     * @param stuRemarks 备注
+     */
+    public void setStuRemarks(String stuRemarks) {
+        this.stuRemarks = stuRemarks;
+    }
+
+    /**
+     * 获取班级
+     *
+     * @return clazz_id - 班级
+     */
+    public Long getClazzId() {
+        return clazzId;
+    }
+
+    /**
+     * 设置班级
+     *
+     * @param clazzId 班级
+     */
+    public void setClazzId(Long clazzId) {
+        this.clazzId = clazzId;
+    }
+
+    /**
+     * 获取学校
+     *
+     * @return school_id - 学校
+     */
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    /**
+     * 设置学校
+     *
+     * @param schoolId 学校
+     */
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+}

+ 233 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/server/WebSocket.java

@@ -0,0 +1,233 @@
+package com.usoftchina.smartschool.websocket.server;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.annotation.Resource;
+import javax.websocket.EncodeException;
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.ServerEndpoint;
+
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.model.Command;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+import com.usoftchina.smartschool.websocket.service.impl.DeviceDOServiceImpl;
+import com.usoftchina.smartschool.websocket.utils.ImgUtil;
+import com.usoftchina.smartschool.websocket.utils.WebSocketUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.socket.server.standard.SpringConfigurator;
+
+import com.alibaba.fastjson.JSON;
+
+
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+@SuppressWarnings("unused")
+@ServerEndpoint(value = "/websocket" )
+//,configurator = SpringConfigurator.class
+@Component
+public class WebSocket {
+     
+	
+	//此处是解决无法注入的关键
+	private static ApplicationContext applicationContext;
+	@Autowired
+	public DeviceDOMapper deviceDOMapper;
+	@Autowired
+	public OutInRecordDOMapper outInRecordDOMapper;
+	@Autowired
+	public DeviceDOServiceImpl deviceDOService;
+	private static Map<String, Session> sessionPool = new HashMap<String, Session>();
+	private Session session;
+   
+	public WebSocket() {
+		super();
+	}
+
+	@OnOpen
+	public void onOpen(Session session) {
+		session.setMaxTextMessageBufferSize(10 * 1024 * 1024);
+		session.setMaxBinaryMessageBufferSize(10 * 1024 * 1024);
+		this.session = session;
+		deviceDOMapper= applicationContext.getBean(DeviceDOMapper.class);
+		deviceDOService=applicationContext.getBean(DeviceDOServiceImpl.class);
+		outInRecordDOMapper=applicationContext.getBean(OutInRecordDOMapper.class);
+		System.out.println("设备上线:" + WebSocketUtil.getRemoteAddressStr(session));	
+		sessionPool.put(WebSocketUtil.getRemoteIPAddress(session), session);
+	}
+
+	@OnClose
+	public void onClose() {
+	 System.out.println("设备下线:" + WebSocketUtil.getRemoteAddressStr(session));
+	 sessionPool.remove(WebSocketUtil.getRemoteIPAddress(session));
+	 
+	 DeviceDO dModel=	new DeviceDO();
+   	 dModel.setDeviceip(WebSocketUtil.getRemoteIPAddress(session));
+   	 DeviceDO fModel= deviceDOMapper.selectOne(dModel);
+   	 Condition condition = new Condition(DeviceDO.class);
+     Criteria c1 = condition.createCriteria();
+   	 if(fModel!=null){
+   	     c1.andCondition("serialNumber=",fModel.getSerialnumber());
+   		 fModel.setIsonline(0);//下线
+   		 fModel.setIsauthorized(0);
+   		 deviceDOMapper.updateByCondition(fModel, condition);
+   	 }
+   	 
+	}
+
+	@OnMessage
+	public void onMessage(String message, Session session) {
+		
+		String cmd=JSON.parseObject(message).getString("cmd");
+		switch (cmd) {
+			case "0" ://设备注册
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				 sendMessage(new Command<>("6").toJsonStr(), WebSocketUtil.getRemoteIPAddress(session));
+				
+				 DeviceDO dModel=new DeviceDO();
+			   	 dModel.setSerialnumber(JSON.parseObject(message).getJSONObject("data").getString("serialNumber"));
+			   	 DeviceDO fModel= deviceDOMapper.selectOne(dModel);
+			   	 Condition condition = new Condition(DeviceDO.class);
+			     Criteria c1 = condition.createCriteria();
+			   	 if(fModel!=null){
+			   	     c1.andCondition("serialNumber=",fModel.getSerialnumber());
+			   	     fModel.setDeviceip(WebSocketUtil.getRemoteIPAddress(session));
+			   	     fModel.setDevicemac(JSON.parseObject(message).getJSONObject("data").getString("DeviceMac"));
+			   	     fModel.setDevicemaker(JSON.parseObject(message).getJSONObject("data").getString("DeviceMaker"));
+			   	     fModel.setVersion(JSON.parseObject(message).getJSONObject("data").getString("Version"));
+			   	     fModel.setDevicemodel(JSON.parseObject(message).getJSONObject("data").getString("DeviceModel"));
+			   		 fModel.setIsonline(1);
+			   		 fModel.setIsauthorized(1);
+			   		 deviceDOMapper.updateByCondition(fModel, condition);
+			   	 }
+				break;
+			case "1"://白名单列表
+				String identity=JSON.parseObject(message).getJSONObject("data").getString("identity");
+				String name=JSON.parseObject(message).getJSONObject("data").getString("name");
+				System.out.println("identity:"+identity+"  name:"+name);
+				break;
+			case "19"://进出入校通知
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				 identity=JSON.parseObject(message).getJSONObject("data").getString("identity");
+				 name=JSON.parseObject(message).getJSONObject("data").getString("name");
+				 String photo=JSON.parseObject(message).getJSONObject("data").getString("photo");
+				 String time=JSON.parseObject(message).getJSONObject("data").getString("time");
+				 String serialNumber=JSON.parseObject(message).getJSONObject("data").getString("serialNumber");
+		    	 OutInRecordDO outModel=new OutInRecordDO();
+		    	 //DateUtils.parseDate("2019-08-12 08:00:12", "yyyy-MM-dd HH:mm:ss")
+				 outModel.setInDate(new Date(Long.valueOf(time)));
+				 ImgUtil.baseStrToImg(photo, "C://Users//Arison//Desktop//upload//liuie.jpg");
+		    	 outModel.setRecordDetails("C://Users//Arison//Desktop//upload//liuie.jpg");
+		    	 outModel.setRecordName("进校记录");
+		    	 outModel.setStuId(Long.valueOf(identity));
+		    	 outInRecordDOMapper.insert(outModel);
+				break;
+			case "11"://设备所有的识别记录
+				
+				
+				break;
+			case "100":
+                //{"cmd":"100","data":{"op":"3","serialNumber":"3100-1d17-72be-ed51-cac9","status":"ok"}}
+				String op=JSON.parseObject(message).getJSONObject("data").getString("op");
+			    String status=JSON.parseObject(message).getJSONObject("data").getString("status");
+			    switch (op) {
+					case "3" ://上传白名单设备响应
+						if ("ok".equals(status)) {
+							//更新学生表状态
+							
+							
+						}
+						break;
+
+					default :
+						break;
+				}
+				break;
+			default :
+				System.out.println("来自设备 " + WebSocketUtil.getRemoteAddressStr(session)+ "的消息:\n" + message);
+				break;
+		}
+	}
+
+	@OnError
+	public void onError(Session session, Throwable error) {
+		System.out.println("发生错误:" + WebSocketUtil.getRemoteAddressStr(session));
+	    error.printStackTrace();
+	}
+
+	public static synchronized int getOnlineCount() {
+		return sessionPool.size();
+	}
+
+	public synchronized static void sendMessage(String message, String ip) {
+		Session s = sessionPool.get(ip);
+		synchronized (s) {
+			if (s != null) {
+				try {
+					System.out.println("服务器向" + ip + "发送消息:" + message);
+//					s.getBasicRemote()
+//							.sendBinary(ByteBuffer.wrap(message.getBytes()));
+					s.getBasicRemote().sendText(message);
+
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}
+
+	}
+	
+	public synchronized static  void close( String ip){
+		Session s = sessionPool.get(ip);
+		try {
+			s.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public synchronized static void setSessionTimeOut(long time, String ip) {
+		Session s = sessionPool.get(ip);
+		s.setMaxIdleTimeout(time);
+	}
+
+	public static String[] getSessionIP(Map<String, Session> map) {
+		StringBuilder str = new StringBuilder();
+		for (Entry<String, Session> entry : map.entrySet()) {
+			str.append(entry.getKey() + ",");
+		}
+
+		if (StringUtils.isEmpty(str.toString())) {
+			return new String[]{};
+		}
+		return str.toString().split(",");
+	}
+
+	public static Map<String, Session> getSessionPool() {
+		return sessionPool;
+	}
+
+	public static void setApplicationContext(
+			ApplicationContext applicationContext) {
+		WebSocket.applicationContext = applicationContext;
+	}
+
+	
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/DeviceDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface DeviceDOService extends Service<DeviceDO> {
+
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/OutInRecordDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface OutInRecordDOService extends Service<OutInRecordDO> {
+
+}

+ 12 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/StudentDOService.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.websocket.service;
+
+
+import com.usoftchina.smartschool.websocket.core.Service;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+public interface StudentDOService extends Service<StudentDO> {
+
+}

+ 24 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/DeviceDOServiceImpl.java

@@ -0,0 +1,24 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.DeviceDOMapper;
+import com.usoftchina.smartschool.websocket.model.DeviceDO;
+import com.usoftchina.smartschool.websocket.service.DeviceDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class DeviceDOServiceImpl extends AbstractService<DeviceDO> implements DeviceDOService {
+    @Resource
+    private DeviceDOMapper deviceMapper;
+
+}

+ 24 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/OutInRecordDOServiceImpl.java

@@ -0,0 +1,24 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.OutInRecordDOMapper;
+import com.usoftchina.smartschool.websocket.model.OutInRecordDO;
+import com.usoftchina.smartschool.websocket.service.OutInRecordDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class OutInRecordDOServiceImpl extends AbstractService<OutInRecordDO> implements OutInRecordDOService {
+    @Resource
+    private OutInRecordDOMapper outInRecordMapper;
+
+}

+ 22 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/service/impl/StudentDOServiceImpl.java

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.websocket.service.impl;
+
+import com.usoftchina.smartschool.websocket.core.AbstractService;
+import com.usoftchina.smartschool.websocket.dao.StudentDOMapper;
+import com.usoftchina.smartschool.websocket.model.StudentDO;
+import com.usoftchina.smartschool.websocket.service.StudentDOService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+
+
+/**
+ * Created by CodeGenerator on 2019/01/18.
+ */
+@Service
+@Transactional
+public class StudentDOServiceImpl extends AbstractService<StudentDO> implements StudentDOService {
+    @Resource
+    private StudentDOMapper sysStudentMapper;
+
+}

+ 53 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/ImgUtil.java

@@ -0,0 +1,53 @@
+package com.usoftchina.smartschool.websocket.utils;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Base64;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class ImgUtil {
+
+    public static boolean baseStrToImg(String baseStr, String imgFilePath) {
+        if (StringUtils.isBlank(baseStr)) {// 图像数据为空
+            return false;
+        }
+        try {
+            // Base64解码
+            byte[] bytes = Base64.getMimeDecoder().decode(baseStr);
+            for (int i = 0; i < bytes.length; ++i) {
+                if (bytes[i] < 0) {// 调整异常数据
+                    bytes[i] += 256;
+                }
+            }
+            // 生成jpeg图片
+            OutputStream out = new FileOutputStream(imgFilePath);
+            out.write(bytes);
+            out.flush();
+            out.close();
+            return true;
+        }
+        catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static String imgToBaseStr(String imgFilePath) {
+        InputStream in = null;
+        byte[] data = null;
+        try {
+            in = new FileInputStream(imgFilePath);
+            data = new byte[in.available()];
+            in.read(data);
+            in.close();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+        return Base64.getMimeEncoder().encodeToString(data);
+    }
+}
+
+

+ 77 - 0
applications/websocket/websocket-server/src/main/java/com/usoftchina/smartschool/websocket/utils/WebSocketUtil.java

@@ -0,0 +1,77 @@
+package com.usoftchina.smartschool.websocket.utils;
+
+import java.lang.reflect.Field;
+import java.net.InetSocketAddress;
+
+import javax.websocket.RemoteEndpoint.Async;
+import javax.websocket.Session;
+
+public class WebSocketUtil {
+	
+	public static String getRemoteIPAddress(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr.getHostName();
+	}
+	
+	public static String getRemoteAddressStr(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr.toString().split("/")[1];
+	}
+
+	
+	public static InetSocketAddress getRemoteAddress(Session session) {
+		if (session == null) {
+			return null;
+		}
+		Async async = session.getAsyncRemote();
+		
+		//在Tomcat 8.0.x版本有效
+//		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
+		//在Tomcat 8.5以上版本有效
+		InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
+		return addr;
+	}
+
+	private static Object getFieldInstance(Object obj, String fieldPath) {
+		String fields[] = fieldPath.split("#");
+		for (String field : fields) {
+			obj = getField(obj, obj.getClass(), field);
+			if (obj == null) {
+				return null;
+			}
+		}
+
+		return obj;
+	}
+
+	private static Object getField(Object obj, Class<?> clazz, String fieldName) {
+		for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
+			try {
+				Field field;
+				field = clazz.getDeclaredField(fieldName);
+				field.setAccessible(true);
+				return field.get(obj);
+			} catch (Exception e) {
+			}
+		}
+
+		return null;
+	}
+
+}

+ 4 - 1
applications/websocket/websocket-server/src/main/resources/application.yml

@@ -1,13 +1,16 @@
 spring:
   application:
     name: websocket-server
+  devtools:
+    restart:
+       enabled: false
   security:
     user:
       name: admin
       password: select111***
   datasource:
     driver-class-name: com.mysql.jdbc.Driver
-    url: jdbc:mysql://10.10.100.166:3306/school?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    url: jdbc:mysql://10.10.100.166:3306/smart_campus?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
     username: root
     password: select111***
     hikari:

+ 22 - 0
applications/websocket/websocket-server/src/main/resources/mapper/DeviceDOMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.company.project.dao.DeviceDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.DeviceDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="deviceId" jdbcType="INTEGER" property="deviceid" />
+    <result column="deviceName" jdbcType="VARCHAR" property="devicename" />
+    <result column="deviceModel" jdbcType="VARCHAR" property="devicemodel" />
+    <result column="serialNumber" jdbcType="VARCHAR" property="serialnumber" />
+    <result column="deviceIp" jdbcType="VARCHAR" property="deviceip" />
+    <result column="version" jdbcType="VARCHAR" property="version" />
+    <result column="deviceMac" jdbcType="VARCHAR" property="devicemac" />
+    <result column="deviceMaker" jdbcType="VARCHAR" property="devicemaker" />
+    <result column="secretkey" jdbcType="VARCHAR" property="secretkey" />
+    <result column="isAuthorized" jdbcType="INTEGER" property="isauthorized" />
+    <result column="isOnline" jdbcType="INTEGER" property="isonline" />
+    <result column="isAutomatic" jdbcType="INTEGER" property="isautomatic" />
+    <result column="schoolId" jdbcType="INTEGER" property="schoolid" />
+  </resultMap>
+</mapper>

+ 17 - 0
applications/websocket/websocket-server/src/main/resources/mapper/OutInRecordDOMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.company.project.dao.OutInRecordDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.OutInRecordDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="record_id" jdbcType="BIGINT" property="recordId" />
+    <result column="record_name" jdbcType="VARCHAR" property="recordName" />
+    <result column="out_date" jdbcType="TIMESTAMP" property="outDate" />
+    <result column="in_date" jdbcType="TIMESTAMP" property="inDate" />
+    <result column="record_details" jdbcType="VARCHAR" property="recordDetails" />
+    <result column="record_remarks" jdbcType="VARCHAR" property="recordRemarks" />
+    <result column="stu_id" jdbcType="BIGINT" property="stuId" />
+    <result column="school_id" jdbcType="BIGINT" property="schoolId" />
+  </resultMap>
+</mapper>

+ 23 - 0
applications/websocket/websocket-server/src/main/resources/mapper/StudentDOMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.company.project.dao.StudentDOMapper">
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.websocket.model.StudentDO">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="stu_id" jdbcType="BIGINT" property="stuId" />
+    <result column="stu_number" jdbcType="VARCHAR" property="stuNumber" />
+    <result column="stu_name" jdbcType="VARCHAR" property="stuName" />
+    <result column="stu_enroll_date" jdbcType="DATE" property="stuEnrollDate" />
+    <result column="stu_graduate_date" jdbcType="DATE" property="stuGraduateDate" />
+    <result column="stu_birthday" jdbcType="DATE" property="stuBirthday" />
+    <result column="stu_age" jdbcType="INTEGER" property="stuAge" />
+    <result column="stu_sex" jdbcType="INTEGER" property="stuSex" />
+    <result column="stu_address" jdbcType="VARCHAR" property="stuAddress" />
+    <result column="stu_photo" jdbcType="VARCHAR" property="stuPhoto" />
+    <result column="stu_status" jdbcType="INTEGER" property="stuStatus" />
+    <result column="stu_remarks" jdbcType="VARCHAR" property="stuRemarks" />
+    <result column="clazz_id" jdbcType="BIGINT" property="clazzId" />
+    <result column="school_id" jdbcType="BIGINT" property="schoolId" />
+  </resultMap>
+</mapper>

+ 58 - 20
applications/websocket/websocket-server/websocket-server.iml

@@ -39,7 +39,6 @@
     <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.11.Final" level="project" />
     <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
     <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
-    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
     <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.0.8.RELEASE" level="project" />
     <orderEntry type="module" module-name="core" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-data-redis:2.0.4.RELEASE" level="project" />
@@ -69,7 +68,6 @@
     <orderEntry type="library" scope="RUNTIME" name="Maven: com.fasterxml.jackson.module:jackson-module-afterburner:2.9.6" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-metrics-event-stream:1.5.12" level="project" />
     <orderEntry type="library" name="Maven: com.netflix.hystrix:hystrix-javanica:1.5.12" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
     <orderEntry type="library" scope="RUNTIME" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
     <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.8.13" level="project" />
     <orderEntry type="library" name="Maven: io.reactivex:rxjava-reactive-streams:1.2.1" level="project" />
@@ -79,25 +77,10 @@
     <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
     <orderEntry type="module" module-name="test-starter" scope="TEST" />
     <orderEntry type="library" name="Maven: mysql:mysql-connector-java:6.0.6" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
-    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.0" level="project" />
-    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
-    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.8.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.8.RELEASE" level="project" />
-    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.4.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:2.7.9" level="project" />
-    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.8.RELEASE" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1" level="project" />
-    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.5" level="project" />
     <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.5" level="project" />
+    <orderEntry type="library" name="Maven: tk.mybatis:mapper:3.4.2" level="project" />
+    <orderEntry type="library" name="Maven: javax.persistence:persistence-api:1.0" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-zipkin:2.0.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-sleuth:2.0.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.0.4.RELEASE" level="project" />
@@ -133,6 +116,19 @@
     <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
     <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.22" level="project" />
     <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.10.0" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.19" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:2.7.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.0.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.1" level="project" />
     <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.7" level="project" />
     <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.6" level="project" />
     <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.2" level="project" />
@@ -204,5 +200,47 @@
     <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.10" level="project" />
     <orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />
     <orderEntry type="library" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.0.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.6" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.13" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.reflections:reflections:0.9.11" level="project" />
+    <orderEntry type="library" name="Maven: org.javassist:javassist:3.21.0-GA" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.3.4" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.1.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.7.0" level="project" />
+    <orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.44" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.0.4.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.9.1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:2.15.0" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.7.11" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.7.11" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-library:1.3" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.0.8.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.0.8.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.0.8.RELEASE" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.5.1" level="project" />
   </component>
 </module>

+ 3 - 0
applications/wechat/wechat-api/wechat-api.iml

@@ -13,6 +13,9 @@
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
+    <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.12" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
     <orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.22" level="project" />
     <orderEntry type="library" name="Maven: com.thoughtworks.xstream:xstream:1.4.9" level="project" />
     <orderEntry type="library" name="Maven: xmlpull:xmlpull:1.1.3.1" level="project" />

Some files were not shown because too many files changed in this diff