Browse Source

设备代码

guq 6 years ago
parent
commit
36bbd7bd4e
17 changed files with 517 additions and 12 deletions
  1. 18 0
      applications/device/device-server/pom.xml
  2. 22 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/controller/DeviceController.java
  3. 36 3
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/listener/AccessControlListener.java
  4. 8 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/mapper/DeviceMapper.java
  5. 81 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/po/Device.java
  6. 63 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/po/ImageFile.java
  7. 10 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/service/DeviceService.java
  8. 22 0
      applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/service/impl/DeviceServiceImpl.java
  9. 71 1
      applications/device/device-server/src/main/resources/application.yml
  10. 18 0
      applications/device/device-server/src/main/resources/mapper/DeviceMapper.xml
  11. 18 0
      applications/wechat/wechat-auth/pom.xml
  12. 12 0
      applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/annotation/IgnoreOpenApiAuth.java
  13. 6 6
      applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/configuration/OpenApiConfig.java
  14. 13 0
      applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/configuration/OpenApiConfiguration.java
  15. 107 0
      applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/interceptor/OpenApiAuthInterceptor.java
  16. 10 0
      applications/wechat/wechat-dto/src/main/java/com/usoftchina/smartschool/wechat/dto/MessageInfoDTO.java
  17. 2 2
      applications/wechat/wechat-server/src/main/java/com/usoftchina/smartschool/wechat/controller/TransfersController.java

+ 18 - 0
applications/device/device-server/pom.xml

@@ -24,6 +24,24 @@
             <groupId>com.usoftchina.smartschool</groupId>
             <groupId>com.usoftchina.smartschool</groupId>
             <artifactId>file-api</artifactId>
             <artifactId>file-api</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+        <!-- db -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.smartschool</groupId>
+            <artifactId>school-dto</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <version>RELEASE</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 22 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/controller/DeviceController.java

@@ -1,9 +1,31 @@
 package com.usoftchina.smartschool.device.controller;
 package com.usoftchina.smartschool.device.controller;
 
 
+import com.github.pagehelper.PageInfo;
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.device.po.Device;
+import com.usoftchina.smartschool.device.service.DeviceService;
+import com.usoftchina.smartschool.page.PageDefault;
+import com.usoftchina.smartschool.page.PageRequest;
+import com.usoftchina.smartschool.school.dto.ListReqDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 /**
 /**
  * @author yingp
  * @author yingp
  * @date 2019/3/8
  * @date 2019/3/8
  */
  */
+@RestController
+@RequestMapping("/device")
 public class DeviceController {
 public class DeviceController {
 
 
+    @Autowired
+    private DeviceService deviceService;
+
+    @GetMapping("/list")
+    public Result getList(@PageDefault PageRequest page, ListReqDTO listReqDTO) {
+        PageInfo<Device> teacher = deviceService.getListData(page, listReqDTO);
+        return Result.success(teacher);
+    }
 }
 }

+ 36 - 3
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/listener/AccessControlListener.java

@@ -1,15 +1,24 @@
 package com.usoftchina.smartschool.device.listener;
 package com.usoftchina.smartschool.device.listener;
 
 
+import com.usoftchina.smartschool.base.Result;
 import com.usoftchina.smartschool.device.api.DeviceApi;
 import com.usoftchina.smartschool.device.api.DeviceApi;
 import com.usoftchina.smartschool.device.dto.DeviceInfo;
 import com.usoftchina.smartschool.device.dto.DeviceInfo;
 import com.usoftchina.smartschool.device.event.AccessControlEvent;
 import com.usoftchina.smartschool.device.event.AccessControlEvent;
+import com.usoftchina.smartschool.device.po.ImageFile;
 import com.usoftchina.smartschool.file.api.FileApi;
 import com.usoftchina.smartschool.file.api.FileApi;
+import com.usoftchina.smartschool.file.dto.FileInfoDTO;
+import org.aspectj.util.FileUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
 
 
+import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -19,12 +28,15 @@ import java.util.List;
 @Component
 @Component
 public class AccessControlListener implements InitializingBean{
 public class AccessControlListener implements InitializingBean{
 
 
-    @Autowired
-    private FileApi fileApi;
+    /*@Autowired
+    private FileApi fileApi;*/
 
 
     @Autowired
     @Autowired
     private DeviceApi deviceApi;
     private DeviceApi deviceApi;
 
 
+
+    private Logger logger = LoggerFactory.getLogger(AccessControlListener.class);
+
     /**
     /**
      * 门禁事件
      * 门禁事件
      *
      *
@@ -35,14 +47,35 @@ public class AccessControlListener implements InitializingBean{
     public void onAccessControlEvent(AccessControlEvent event) {
     public void onAccessControlEvent(AccessControlEvent event) {
         /**
         /**
          * 1、保存图片文件;
          * 1、保存图片文件;
+         */
+        byte[] imageData = event.getAccessControlInfo().getImageData();
+        MultipartFile file = new ImageFile(imageData, "测试");
+        Result<FileInfoDTO> fileInfo = null;
+        try {
+           // fileInfo = fileApi.upload(0l, file);
+        }catch (Exception ex) {
+        }
+        /**
          * 2、保存门禁出入记录;
          * 2、保存门禁出入记录;
+         */
+        Long fileId = fileInfo.getData().getId();
+
+        logger.info(event.getAccessControlInfo().getCardNo());
+        /**
          * 3、推送消息到消息服务器(微信服务监听此消息发送微信消息)
          * 3、推送消息到消息服务器(微信服务监听此消息发送微信消息)
          */
          */
+
     }
     }
 
 
     @Override
     @Override
     public void afterPropertiesSet() throws Exception {
     public void afterPropertiesSet() throws Exception {
-        List<DeviceInfo> deviceInfos = null;
+        DeviceInfo deviceInfo = new DeviceInfo();
+        deviceInfo.setIp("10.1.80.208");
+        deviceInfo.setPort(37777);
+        deviceInfo.setPassword("A12345678");
+        deviceInfo.setUsername("admin");
+        List<DeviceInfo> deviceInfos = new ArrayList<>();
+        deviceInfos.add(deviceInfo);
         deviceInfos.forEach(deviceApi::add);
         deviceInfos.forEach(deviceApi::add);
     }
     }
 }
 }

+ 8 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/mapper/DeviceMapper.java

@@ -1,8 +1,16 @@
 package com.usoftchina.smartschool.device.mapper;
 package com.usoftchina.smartschool.device.mapper;
 
 
+import com.usoftchina.smartschool.device.po.Device;
+import org.apache.ibatis.annotations.Mapper;
+
+
+import java.util.List;
+
 /**
 /**
  * @author yingp
  * @author yingp
  * @date 2019/3/8
  * @date 2019/3/8
  */
  */
+@Mapper
 public interface DeviceMapper {
 public interface DeviceMapper {
+    List<Device> findAll();
 }
 }

+ 81 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/po/Device.java

@@ -0,0 +1,81 @@
+package com.usoftchina.smartschool.device.po;
+
+import java.io.Serializable;
+
+/**
+ * @author: guq
+ * @create: 2019-03-08 16:53
+ **/
+public class Device implements Serializable{
+
+    private Long deviceId;
+
+    private String deviceName;
+
+    private String deviceIp;
+
+    private String devicePort;
+
+    private String deviceUser;
+
+    private String devicePassword;
+
+    private String deviceRemark;
+
+
+    public String getDeviceIp() {
+        return deviceIp;
+    }
+
+    public void setDeviceIp(String deviceIp) {
+        this.deviceIp = deviceIp;
+    }
+
+    public String getDeviceRemark() {
+        return deviceRemark;
+    }
+
+    public void setDeviceRemark(String deviceRemark) {
+        this.deviceRemark = deviceRemark;
+    }
+
+    public Long getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(Long deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceName() {
+        return deviceName;
+    }
+
+    public void setDeviceName(String deviceName) {
+        this.deviceName = deviceName;
+    }
+
+    public String getDevicePort() {
+        return devicePort;
+    }
+
+    public void setDevicePort(String devicePort) {
+        this.devicePort = devicePort;
+    }
+
+    public String getDeviceUser() {
+        return deviceUser;
+    }
+
+    public void setDeviceUser(String deviceUser) {
+        this.deviceUser = deviceUser;
+    }
+
+    public String getDevicePassword() {
+        return devicePassword;
+    }
+
+    public void setDevicePassword(String devicePassword) {
+        this.devicePassword = devicePassword;
+    }
+}

+ 63 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/po/ImageFile.java

@@ -0,0 +1,63 @@
+package com.usoftchina.smartschool.device.po;
+
+import org.springframework.lang.Nullable;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+/**
+ * @author: guq
+ * @create: 2019-03-08 16:42
+ **/
+public class ImageFile implements MultipartFile{
+
+    private final byte[] imgContent;
+    private final String header;
+
+    public ImageFile(byte[] imgContent, String header) {
+        this.imgContent = imgContent;
+        this.header = header.split(";")[0];
+    }
+
+    @Override
+    public String getName() {
+        return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
+    }
+
+    @Nullable
+    @Override
+    public String getOriginalFilename() {
+        return System.currentTimeMillis() + (int)Math.random() * 10000 + "." + header.split("/")[1];
+    }
+
+    @Nullable
+    @Override
+    public String getContentType() {
+        return header.split(":")[1];
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return imgContent == null || imgContent.length == 0;
+    }
+
+    @Override
+    public long getSize() {
+        return imgContent.length;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return imgContent;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(imgContent);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        new FileOutputStream(dest).write(imgContent);
+    }
+}

+ 10 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/service/DeviceService.java

@@ -0,0 +1,10 @@
+package com.usoftchina.smartschool.device.service;
+
+import com.github.pagehelper.PageInfo;
+import com.usoftchina.smartschool.device.po.Device;
+import com.usoftchina.smartschool.page.PageRequest;
+import com.usoftchina.smartschool.school.dto.ListReqDTO;
+
+public interface DeviceService {
+    PageInfo<Device> getListData(PageRequest page, ListReqDTO listReqDTO);
+}

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

@@ -0,0 +1,22 @@
+package com.usoftchina.smartschool.device.service.impl;
+
+import com.github.pagehelper.PageInfo;
+import com.usoftchina.smartschool.device.po.Device;
+import com.usoftchina.smartschool.device.service.DeviceService;
+import com.usoftchina.smartschool.page.PageRequest;
+import com.usoftchina.smartschool.school.dto.ListReqDTO;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author: guq
+ * @create: 2019-03-08 16:48
+ **/
+@Service
+public class DeviceServiceImpl implements DeviceService{
+
+    @Override
+    public PageInfo<Device> getListData(PageRequest page, ListReqDTO listReqDTO) {
+
+        return null;
+    }
+}

+ 71 - 1
applications/device/device-server/src/main/resources/application.yml

@@ -1,4 +1,74 @@
 device:
 device:
   dahua:
   dahua:
     wait-time: 5000
     wait-time: 5000
-    connect-time: 10000
+    connect-time: 10000
+spring:
+  application:
+    name: device-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  datasource:
+    driver-class-name: com.mysql.jdbc.Driver
+    url: jdbc:mysql://10.10.100.166:3306/smart_campus?characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
+    username: root
+    password: select111***
+    hikari:
+      minimum-idle: 5
+      maximum-pool-size: 50
+      idle-timeout: 30000
+      max-lifetime: 1800000
+      connection-timeout: 30000
+  messages:
+    basename: i18n/messages
+    encoding: UTF-8
+  servlet:
+    multipart:
+      max-file-size: 100Mb
+      max-request-size: 100Mb
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@127.0.0.1:9500/eureka/
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+server:
+  port: 9680
+  tomcat:
+    uri-encoding: UTF-8
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'
+ribbon:
+  ReadTimeout: 10000
+  ConnectTimeout: 10000
+feign:
+  hystrix:
+    enabled: true
+hystrix:
+    command:
+        default:
+            execution:
+              timeout:
+                enabled: true
+              isolation:
+                    thread:
+                        timeoutInMilliseconds: 4000

+ 18 - 0
applications/device/device-server/src/main/resources/mapper/DeviceMapper.xml

@@ -0,0 +1,18 @@
+<?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.usoftchina.smartschool.device.mapper.DeviceMapper" >
+   <resultMap id="CurriculumDetailDTOMap" type="com.usoftchina.smartschool.device.po.Device">
+        <id column="deviceId" property="deviceId" jdbcType="BIGINT" />
+        <result column="deviceName" property="deviceName" jdbcType="VARCHAR" />
+        <result column="deviceIp" property="deviceIp" jdbcType="VARCHAR" />
+        <result column="devicePort" property="devicePort" jdbcType="VARCHAR" />
+        <result column="deviceUser" property="deviceUser" jdbcType="VARCHAR" />
+        <result column="devicePassword" property="devicePassword" jdbcType="VARCHAR"/>
+    </resultMap>
+    <select id="findAll" resultType="com.usoftchina.smartschool.device.po.Device">
+        select * from device
+    </select>
+
+
+
+</mapper>

+ 18 - 0
applications/wechat/wechat-auth/pom.xml

@@ -15,6 +15,24 @@
             <groupId>com.usoftchina.smartschool</groupId>
             <groupId>com.usoftchina.smartschool</groupId>
             <artifactId>core</artifactId>
             <artifactId>core</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-netflix-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-core</artifactId>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
 
 

+ 12 - 0
applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/annotation/IgnoreOpenApiAuth.java

@@ -0,0 +1,12 @@
+package com.usoftchina.smartschool.wechat.auth.annotation;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD,ElementType.TYPE})
+public @interface IgnoreOpenApiAuth {
+}

+ 6 - 6
applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/configuration/OpenApiConfig.java

@@ -10,17 +10,17 @@ public class OpenApiConfig {
     private String signatureParam;
     private String signatureParam;
     @Value("${openapi.timestampParam:_timestamp}")
     @Value("${openapi.timestampParam:_timestamp}")
     private String timestampParam;
     private String timestampParam;
-    @Value("${openaip.companyuu:access_id}")
-    private String companyuu;
+    @Value("${openaip.school:access_id}")
+    private String school;
     @Value("${openapi.timeout:60000}")
     @Value("${openapi.timeout:60000}")
     private int timeout;
     private int timeout;
 
 
-    public String getCompanyuu() {
-        return companyuu;
+    public String getSchool() {
+        return school;
     }
     }
 
 
-    public void setCompanyuu(String companyuu) {
-        this.companyuu = companyuu;
+    public void setSchool(String school) {
+        this.school = school;
     }
     }
 
 
     public String getSignatureParam() {
     public String getSignatureParam() {

+ 13 - 0
applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/configuration/OpenApiConfiguration.java

@@ -0,0 +1,13 @@
+package com.usoftchina.smartschool.wechat.auth.configuration;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author: guq
+ * @create: 2019-03-08 15:52
+ **/
+@Configuration
+public class OpenApiConfiguration {
+
+
+}

+ 107 - 0
applications/wechat/wechat-auth/src/main/java/com/usoftchina/smartschool/wechat/auth/interceptor/OpenApiAuthInterceptor.java

@@ -0,0 +1,107 @@
+package com.usoftchina.smartschool.wechat.auth.interceptor;
+
+
+import com.usoftchina.smartschool.wechat.auth.annotation.IgnoreOpenApiAuth;
+import com.usoftchina.smartschool.wechat.auth.configuration.OpenApiConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author: guq
+ * @create: 2019-01-10 16:05
+ **/
+public class OpenApiAuthInterceptor extends HandlerInterceptorAdapter{
+
+    @Autowired
+    private OpenApiConfig openApiConfig;
+
+    @Autowired
+    private CompanyApi companyApi;
+
+    // 已使用签名
+    private Map<String, Long> signatureCache = new ConcurrentHashMap<>();
+
+    private static Logger logger = LoggerFactory.getLogger(OpenApiAuthInterceptor.class);
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        if (handler instanceof HandlerMethod) {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            // 配置该注解,说明不进行用户拦截
+            IgnoreOpenApiAuth annotation = handlerMethod.getBeanType().getAnnotation(IgnoreOpenApiAuth.class);
+            if (annotation == null) {
+                annotation = handlerMethod.getMethodAnnotation(IgnoreOpenApiAuth.class);
+            }
+            if (annotation != null) {
+                return super.preHandle(request, response, handler);
+            }
+
+            String sign = request.getParameter(openApiConfig.getSignatureParam());
+            String companyuu = request.getParameter(openApiConfig.getSchool());
+            if (!StringUtils.isEmpty(sign) && !StringUtils.isEmpty(companyuu)) {
+                String urlMessage = request.getRequestURI() + "?"
+                        + request.getQueryString().substring(0, request.getQueryString().indexOf(openApiConfig.getSignatureParam()) - 1);
+
+                logger.info("urlMessage:{}", urlMessage);
+                String servletPath = request.getServletPath();
+                logger.info("servletPath:{}", servletPath);
+
+                boolean check = false;
+                //获取密钥
+                Result<CompanyDTO> companyResult = companyApi.getCompanyByUu(Long.valueOf(companyuu));
+                if (companyResult.isSuccess()) {
+                    String localSign = null;
+
+                    TransfersContextHodler.setB2bCompanyId(companyResult.getData().getId());
+
+                    localSign = companyResult.getData().getAccessKey() == null ? HmacUtils.encode(urlMessage) :
+                                HmacUtils.encode(urlMessage, companyResult.getData().getAccessKey());
+
+                    if (servletPath.indexOf("b2b") > -1) {
+                        logger.info("自己生产的sign:{}-----传入的sign:{}", localSign, sign);
+                        check = sign.equals(localSign);
+                    }
+
+                    if (check) {
+                        String timestamp = request.getParameter(openApiConfig.getTimestampParam());
+                        long now = System.currentTimeMillis();
+                        if (!StringUtils.isEmpty(timestamp) && Math.abs(now - Long.parseLong(timestamp)) <= openApiConfig.getTimeout()
+                                && !signatureCache.containsKey(sign)) {
+                            // 加入历史记录
+                            signatureCache.put(sign, now);
+                            return true;
+                        }
+                    }
+                }
+            }
+            response.setStatus(HttpStatus.FORBIDDEN.value());
+            return false;
+        } else {
+        }
+        return super.preHandle(request, response, handler);
+    }
+
+    /**
+     * 清除签名池历史记录
+     */
+    @Scheduled(cron = "0 0/3 * * * ?")
+    public void clearCache() {
+        long now = System.currentTimeMillis();
+        for (String key : signatureCache.keySet()) {
+            long time = signatureCache.get(key);
+            if (now - time > openApiConfig.getTimeout()) {
+                signatureCache.remove(key);
+            }
+        }
+    }
+}

+ 10 - 0
applications/wechat/wechat-dto/src/main/java/com/usoftchina/smartschool/wechat/dto/MessageInfoDTO.java

@@ -42,6 +42,8 @@ public class MessageInfoDTO implements Serializable{
 
 
     private String keyword5;
     private String keyword5;
 
 
+    private String keyword6;
+
     private String remark;
     private String remark;
 
 
     private String url;
     private String url;
@@ -149,4 +151,12 @@ public class MessageInfoDTO implements Serializable{
     public void setMsgId(String msgId) {
     public void setMsgId(String msgId) {
         this.msgId = msgId;
         this.msgId = msgId;
     }
     }
+
+    public String getKeyword6() {
+        return keyword6;
+    }
+
+    public void setKeyword6(String keyword6) {
+        this.keyword6 = keyword6;
+    }
 }
 }

+ 2 - 2
applications/wechat/wechat-server/src/main/java/com/usoftchina/smartschool/wechat/controller/TransfersController.java

@@ -49,13 +49,13 @@ public class TransfersController {
     * @Date: 2019/3/7
     * @Date: 2019/3/7
     */
     */
     @PostMapping("/Messages")
     @PostMapping("/Messages")
-    public Result sendOutMessages(@RequestParam("data")  String data) throws UnsupportedEncodingException {
+    public Result sendOutMessages(String data) throws UnsupportedEncodingException {
         if (StringUtils.isEmpty(data)) {
         if (StringUtils.isEmpty(data)) {
             return Result.error("信息为空");
             return Result.error("信息为空");
         }
         }
         data = URLDecoder.decode(data, "UTF-8");
         data = URLDecoder.decode(data, "UTF-8");
         List<MessageInfoDTO> messages = JsonUtils.fromJsonArray(data, MessageInfoDTO.class);
         List<MessageInfoDTO> messages = JsonUtils.fromJsonArray(data, MessageInfoDTO.class);
-        //sendService.sendOutMessages(messages);
+        sendService.sendOutMessages(messages);
         return Result.success();
         return Result.success();
     }
     }