浏览代码

成都智慧城市,德源数据大屏首次提交

wuweihao 4 年之前
当前提交
0599180419
共有 34 个文件被更改,包括 3698 次插入0 次删除
  1. 46 0
      gis_application/pom.xml
  2. 13 0
      gis_application/src/main/java/com/gis/GisApplication.java
  3. 13 0
      gis_application/src/main/java/com/gis/ServletInitializer.java
  4. 16 0
      gis_application/src/main/resources/application-dev.properties
  5. 9 0
      gis_application/src/main/resources/application-sit.properties
  6. 18 0
      gis_application/src/main/resources/application.properties
  7. 156 0
      gis_application/src/main/resources/logback-spring.xml
  8. 119 0
      gis_common/pom.xml
  9. 51 0
      gis_common/src/main/java/com/gis/common/config/CommonInterceptor.java
  10. 87 0
      gis_common/src/main/java/com/gis/common/config/Swagger2.java
  11. 78 0
      gis_common/src/main/java/com/gis/common/config/WebMvcConfig.java
  12. 105 0
      gis_common/src/main/java/com/gis/common/deyuan/TestMain.java
  13. 62 0
      gis_common/src/main/java/com/gis/common/deyuan/entity/ApiKeyGen.java
  14. 28 0
      gis_common/src/main/java/com/gis/common/deyuan/util/CommonUtil.java
  15. 322 0
      gis_common/src/main/java/com/gis/common/deyuan/util/HttpUtils.java
  16. 250 0
      gis_common/src/main/java/com/gis/common/deyuan/util/RSAUtils.java
  17. 162 0
      gis_common/src/main/java/com/gis/common/deyuan/util/ResultUtils.java
  18. 35 0
      gis_common/src/main/java/com/gis/common/exception/BaseRuntimeException.java
  19. 431 0
      gis_common/src/main/java/com/gis/common/util/DoorUtils.java
  20. 140 0
      gis_common/src/main/java/com/gis/common/util/FileUtils.java
  21. 194 0
      gis_common/src/main/java/com/gis/common/util/PasswordUtils.java
  22. 101 0
      gis_common/src/main/java/com/gis/common/util/Result.java
  23. 27 0
      gis_web/pom.xml
  24. 13 0
      gis_web/src/main/java/com/gis/web/aop/WebControllerLog.java
  25. 69 0
      gis_web/src/main/java/com/gis/web/aop/WebLogAspect.java
  26. 41 0
      gis_web/src/main/java/com/gis/web/controller/BaiduWeatherController.java
  27. 142 0
      gis_web/src/main/java/com/gis/web/controller/DoorController.java
  28. 142 0
      gis_web/src/main/java/com/gis/web/controller/ExceptionController.java
  29. 180 0
      gis_web/src/main/java/com/gis/web/controller/ScreenController.java
  30. 29 0
      gis_web/src/main/java/com/gis/web/dto/PageDateDto.java
  31. 26 0
      gis_web/src/main/java/com/gis/web/dto/PageDto.java
  32. 325 0
      gis_web/src/main/java/com/gis/web/test/TestSign.java
  33. 242 0
      pom.xml
  34. 26 0
      remark.md

+ 46 - 0
gis_application/pom.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+
+
+
+    <groupId>com.gis</groupId>
+    <artifactId>gis_application</artifactId>
+    <version>1.0.0</version>
+    <packaging>war</packaging>
+    <name>gis_application</name>
+    <description>项目入口</description>
+
+    <parent>
+        <groupId>com.gis</groupId>
+        <artifactId>cms_chengdu_screen</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>com.gis</groupId>
+            <artifactId>gis_web</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+        <finalName>cmsChengDuScreen</finalName>
+    </build>
+
+
+
+</project>

+ 13 - 0
gis_application/src/main/java/com/gis/GisApplication.java

@@ -0,0 +1,13 @@
+package com.gis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class GisApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(GisApplication.class, args);
+    }
+
+}

+ 13 - 0
gis_application/src/main/java/com/gis/ServletInitializer.java

@@ -0,0 +1,13 @@
+package com.gis;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+public class ServletInitializer extends SpringBootServletInitializer {
+
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+        return application.sources(GisApplication.class);
+    }
+
+}

+ 16 - 0
gis_application/src/main/resources/application-dev.properties

@@ -0,0 +1,16 @@
+
+
+#log
+logging.path=E:/javaProject/cms_chengdu_screen_log
+logging.config=classpath:logback-spring.xml
+logging.level.com.gis=debug
+
+
+## 上传文件保存路径
+## 本地保存路径
+#file.path=F:\\test\\ngin\\cms_fdkanzhan_data\\
+#server.domain =http://192.168.0.135/data/
+#
+#oss.file.path=cms_fdkanzhan/
+#oss.domain=http://ossxiaoan.4dage.com/
+

+ 9 - 0
gis_application/src/main/resources/application-sit.properties

@@ -0,0 +1,9 @@
+
+
+#log
+logging.path=/root/user/cms_chengdu_screen_log
+logging.config=classpath:logback-spring.xml
+logging.level.com.gis=debug
+
+
+

+ 18 - 0
gis_application/src/main/resources/application.properties

@@ -0,0 +1,18 @@
+server.port=8105
+
+spring.profiles.active=dev
+
+# \u8BBF\u95EE\u9759\u6001\u8D44\u6E90\u8BBE\u7F6E
+spring.resources.static-locations=classpath:templates/,classpath:static/,classpath:web/
+
+#\u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.max-file-size=256MB
+spring.servlet.multipart.max-request-size=256MB
+
+
+
+
+
+
+

+ 156 - 0
gis_application/src/main/resources/logback-spring.xml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="LOG_MAX_HISTORY" value="180"/>
+    <springProperty scope="context" name="LOG_PATH" source="logging.path"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>${LOG_PATH}/%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+    </appender>
+    <!-- 按照每天生成日志文件:主项目日志 -->
+    <appender name="file.all" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 追加日志到原文件结尾 -->
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 -->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{500} - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+    </appender>
+
+    <!--info日志统一输出到这里-->
+    <appender name="file.info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 每小时生成日志文件 -->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info/console-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--错误日志统一输出到这里-->
+    <appender name="file.error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/error/console-error.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--warn日志统一输出到这里-->
+    <appender name="file.warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 按小时生成日志-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/warn/console-warn.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <!-- 除按日志记录之外,还配置了日志文件不能超过10M(默认),若超过10M,日志文件会以索引0开始, -->
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!--debug级别日志统一输出到这里-->
+    <appender name="file.debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <Prudent>true</Prudent>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件输出的文件名 按小时生成日志-->
+            <FileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/debug/console-debug.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过5M,若超过5M,日志文件会以索引0开始,命名日志文件,例如console-debug.2018-08-24-09.1.log -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %method 方法名  %L 行数 %msg:日志消息,%n是换行符-->
+            <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56}.%method:%L - %msg%n</pattern>
+            <!--<charset>utf-8</charset>-->
+        </encoder>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY </onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
+    <appender name="file.async" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <includeCallerData>true</includeCallerData>
+        <appender-ref ref="file.all" />
+    </appender>
+
+    <!--  日志输出级别 -->
+    <!-- TRACE\DEBUG\INFO\WARN\ERROR\FATAL\OFF -->
+    <root level="INFO">
+        <appender-ref ref="console" />
+        <appender-ref ref="file.async"/>
+        <appender-ref ref="file.error" />
+        <appender-ref ref="file.info" />
+        <appender-ref ref="file.debug" />
+        <appender-ref ref="file.warn" />
+    </root>
+
+</configuration>

+ 119 - 0
gis_common/pom.xml

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cms_chengdu_screen</artifactId>
+        <groupId>com.gis</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>gis_common</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+
+        <!--springboot-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!--<dependency>-->
+            <!--<groupId>org.springframework</groupId>-->
+            <!--<artifactId>spring-aop</artifactId>-->
+            <!--<version>5.2.8.RELEASE</version>-->
+        <!--</dependency>-->
+
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <!-- fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- httpclient -->
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.12</version>
+        </dependency>
+
+
+        <!-- knife4j aip 包-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- 工具类 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+
+
+        <!-- spring aop -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+
+
+
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+
+
+        <!--门禁接口包, 客户提供的-->
+        <!--
+            mvn install:install-file -Dfile=aes-rsa-java-1.0.0.jar -DgroupId=com.tfsmy -DartifactId=aes-rsa-java -Dversion=1.0.0 -Dpackaging=jar
+        -->
+        <dependency>
+            <groupId>com.tfsmy</groupId>
+            <artifactId>aes-rsa-java</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.5</version>
+        </dependency>
+
+
+
+
+    </dependencies>
+
+
+</project>

+ 51 - 0
gis_common/src/main/java/com/gis/common/config/CommonInterceptor.java

@@ -0,0 +1,51 @@
+package com.gis.common.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+@Component
+public class CommonInterceptor implements HandlerInterceptor {
+
+
+    @Override
+    public boolean preHandle(HttpServletRequest request,
+                             HttpServletResponse response, Object handler) throws Exception {
+        if(!request.getRequestURI().contains("/static/") && !request.getRequestURI().contains("/sendUserInfo")
+                && !request.getRequestURI().contains(".json") && !request.getRequestURI().contains(".png")
+                && !request.getRequestURI().contains(".html") && !request.getRequestURI().contains(".mp3")){
+        }
+
+
+
+        return true;
+    }
+
+    @Override
+    public void postHandle(HttpServletRequest request,
+                           HttpServletResponse response, Object handler,
+                           ModelAndView modelAndView) throws Exception {
+        request.setAttribute("ctx", request.getContextPath());
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request,
+                                HttpServletResponse response, Object handler, Exception ex)
+            throws Exception {
+        if(!request.getRequestURI().contains("/static/") && !request.getRequestURI().contains("/sendUserInfo")
+                && !request.getRequestURI().contains(".json") && !request.getRequestURI().contains(".png")
+                && !request.getRequestURI().contains(".html") && !request.getRequestURI().contains(".mp3")){
+        }
+
+    }
+
+
+
+
+}

+ 87 - 0
gis_common/src/main/java/com/gis/common/config/Swagger2.java

@@ -0,0 +1,87 @@
+package com.gis.common.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import com.google.common.collect.Lists;
+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.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by owen on 2020/2/18
+ *
+ * 集成Swagger有3步:
+ * 1.pom.xml添加依赖
+ * 2.添加Swagger2.class
+ * 3.Application.class 加上注解@EnableSwagger2 表示开启Swagger
+ * 4.http://localhost:8080/doc.html#/
+ *
+ * 2.9.2 不需要字启动类配置注解
+ */
+@Configuration
+@EnableSwagger2
+@EnableKnife4j
+public class Swagger2 {
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.gis.web.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                //添加登录认证,可以使用token
+                .securityContexts(securityContexts())
+                .securitySchemes(securitySchemes())
+                ;
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("德源大屏 APIs")
+                .description("德源大屏 Api接口文档")
+                .version("1.0")
+                .build();
+    }
+
+    private List<ApiKey> securitySchemes() {
+        //设置请求头信息
+        List<ApiKey> result = new ArrayList<>();
+        ApiKey apiKey = new ApiKey("Authorization", "token", "header");
+        result.add(apiKey);
+        return result;
+
+    }
+
+
+    private List<SecurityContext> securityContexts() {
+
+        SecurityContext context = SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .build();
+
+        return Lists.newArrayList(context);
+
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        List<SecurityReference> result = new ArrayList<>();
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        result.add(new SecurityReference("Authorization", authorizationScopes));
+        return result;
+    }
+}

+ 78 - 0
gis_common/src/main/java/com/gis/common/config/WebMvcConfig.java

@@ -0,0 +1,78 @@
+package com.gis.common.config;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by owen on 2020/2/18 0018 12:01
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private CommonInterceptor commonInterceptor;
+
+    /**
+     * 配置全局跨域
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowCredentials(true)
+                .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
+                .maxAge(3600);
+    }
+
+
+    /**
+     * 添加拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(commonInterceptor).addPathPatterns("/**");
+    }
+
+    /**
+     * fastJson相关设置
+     * Dto包含json,需要配置不然会异常
+     * @return
+     */
+    @Bean
+    public HttpMessageConverters customConverters() {
+
+        FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter();
+        // 创建FastJson信息转换对象
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+
+
+        // 设置全程返回时间
+        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 设置返回值为null是时输出,不写的话,null 字段 不返回。也可以设置返回空串, 可以同时设置多个
+        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+
+        fastJson.setFastJsonConfig(fastJsonConfig);
+
+        //3、中文乱码解决方案
+        List<MediaType> mediaTypeList = new ArrayList<>();
+        mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
+        mediaTypeList.add(MediaType.valueOf("text/html;charset=UTF-8"));
+
+        //4、将转换规则应用于转换对象
+        fastJson.setSupportedMediaTypes(mediaTypeList);
+
+        return new HttpMessageConverters(fastJson);
+    }
+}

文件差异内容过多而无法显示
+ 105 - 0
gis_common/src/main/java/com/gis/common/deyuan/TestMain.java


+ 62 - 0
gis_common/src/main/java/com/gis/common/deyuan/entity/ApiKeyGen.java

@@ -0,0 +1,62 @@
+package com.gis.common.deyuan.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户密钥表
+ * </p>
+ *
+ * @author mps
+ * @since 2020-07-27
+ */
+@Data
+public class ApiKeyGen implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    /**
+     * appID
+     */
+    private String appId;
+
+    /**
+     * 参数签名加解密公钥
+     */
+    private String publicKyeSign;
+
+    /**
+     * 参数签名加解密私钥
+     */
+    private String privateKyeSign;
+
+    /**
+     * 请求参数加解密公钥
+     */
+    private String publicKyeReq;
+
+    /**
+     * 请求参数加解密私钥
+     */
+    private String privateKyeReq;
+
+    /**
+     * 返回结果加解密公钥
+     */
+    private String publicKyeRes;
+
+    /**
+     * 返回结果加解密私钥
+     */
+    private String privateKyeRes;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+}

+ 28 - 0
gis_common/src/main/java/com/gis/common/deyuan/util/CommonUtil.java

@@ -0,0 +1,28 @@
+package com.gis.common.deyuan.util;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
+public class CommonUtil {
+
+    public static String generateSignSrcData(Map<String, Object> map) {
+        Set<String> keys = map.keySet();
+        String[] keyArray = keys.toArray(new String[keys.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < keyArray.length; i++) {
+            String key = keyArray[i];
+            if ("sign".equals(key) || "".equals(map.get(key))) {
+                continue;
+            } else {
+                sb.append("&").append(key).append("=").append(map.get(key));
+            }
+        }
+        if (sb.length() > 0) {
+            sb.deleteCharAt(0);
+        }
+        return sb.toString();
+    }
+
+}

+ 322 - 0
gis_common/src/main/java/com/gis/common/deyuan/util/HttpUtils.java

@@ -0,0 +1,322 @@
+package com.gis.common.deyuan.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.*;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class HttpUtils {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(HttpUtils.class);
+
+    /**
+     * get
+     *
+     * @param host
+     * @param path
+     * @param headers
+     * @param querys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doGet(String host, String path,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpGet request = new HttpGet(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * post form
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param bodys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      Map<String, String> bodys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (bodys != null) {
+            List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
+
+            for (String key : bodys.keySet()) {
+                nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+            }
+            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+            formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+            request.setEntity(formEntity);
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Post String
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      String body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+            request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Post stream
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPost(String host, String path, String method,
+                                      Map<String, String> headers,
+                                      Map<String, String> querys,
+                                      byte[] body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPost request = new HttpPost(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+            request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Put String
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPut(String host, String path, String method,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys,
+                                     String body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (StringUtils.isNotBlank(body)) {
+            request.setEntity(new StringEntity(body, "utf-8"));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Put stream
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @param body
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doPut(String host, String path, String method,
+                                     Map<String, String> headers,
+                                     Map<String, String> querys,
+                                     byte[] body)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpPut request = new HttpPut(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        if (body != null) {
+            request.setEntity(new ByteArrayEntity(body));
+        }
+
+        return httpClient.execute(request);
+    }
+
+    /**
+     * Delete
+     *
+     * @param host
+     * @param path
+     * @param method
+     * @param headers
+     * @param querys
+     * @return
+     * @throws Exception
+     */
+    public static HttpResponse doDelete(String host, String path, String method,
+                                        Map<String, String> headers,
+                                        Map<String, String> querys)
+            throws Exception {
+        HttpClient httpClient = wrapClient(host);
+
+        HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
+        for (Map.Entry<String, String> e : headers.entrySet()) {
+            request.addHeader(e.getKey(), e.getValue());
+        }
+
+        return httpClient.execute(request);
+    }
+
+    public static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
+        StringBuilder sbUrl = new StringBuilder();
+        sbUrl.append(host);
+        if (!StringUtils.isBlank(path)) {
+            sbUrl.append(path);
+        }
+        if (null != querys) {
+            StringBuilder sbQuery = new StringBuilder();
+            for (Map.Entry<String, String> query : querys.entrySet()) {
+                if (0 < sbQuery.length()) {
+                    sbQuery.append("&");
+                }
+                if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+                    sbQuery.append(query.getValue());
+                }
+                if (!StringUtils.isBlank(query.getKey())) {
+                    sbQuery.append(query.getKey());
+                    if (!StringUtils.isBlank(query.getValue())) {
+                        sbQuery.append("=");
+                        sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+                    }
+                }
+            }
+            if (0 < sbQuery.length()) {
+                sbUrl.append("?").append(sbQuery);
+            }
+        }
+
+        return sbUrl.toString();
+    }
+
+    private static HttpClient wrapClient(String host) {
+        HttpClient httpClient = new DefaultHttpClient();
+        if (host.startsWith("https://")) {
+            sslClient(httpClient);
+        }
+        return httpClient;
+    }
+
+    private static void sslClient(HttpClient httpClient) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            X509TrustManager tm = new X509TrustManager() {
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+
+                public void checkClientTrusted(X509Certificate[] xcs, String str) {
+
+                }
+
+                public void checkServerTrusted(X509Certificate[] xcs, String str) {
+
+                }
+            };
+            ctx.init(null, new TrustManager[]{tm}, null);
+            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+            ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+            ClientConnectionManager ccm = httpClient.getConnectionManager();
+            SchemeRegistry registry = ccm.getSchemeRegistry();
+            registry.register(new Scheme("https", 443, ssf));
+        } catch (KeyManagementException ex) {
+            throw new RuntimeException(ex);
+        } catch (NoSuchAlgorithmException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+
+
+}

+ 250 - 0
gis_common/src/main/java/com/gis/common/deyuan/util/RSAUtils.java

@@ -0,0 +1,250 @@
+package com.gis.common.deyuan.util;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+/**
+ * RSA算法加密/解密和签名/验签工具类
+ * 生成密钥对(公钥和私钥)
+ * 加密内容与签名内容进行Base64加密解密(有利于HTTP协议下传输)
+ */
+public class RSAUtils {
+    /**
+     * 算法名称
+     */
+    private static final String ALGORITHM = "RSA";
+    /**
+     * 签名算法 MD5withRSA 或 SHA1WithRSA 等
+     */
+    public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
+    /**
+     * 密钥长度默认是1024位:
+     * 加密的明文最大长度 = 密钥长度 - 11(单位是字节,即byte)
+     */
+    private static final int KEY_SIZE = 1024;
+    /**
+     * RSA最大加密明文大小
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+ 
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+ 
+    private RSAUtils() {
+    }
+ 
+    /**
+     * 获取密钥对
+     *
+     * @return 密钥对
+     */
+    public static KeyPair getKeyPair() {
+        KeyPairGenerator generator = null;
+        try {
+            generator = KeyPairGenerator.getInstance(ALGORITHM);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        generator.initialize(KEY_SIZE);
+        return generator.generateKeyPair();
+    }
+ 
+    /**
+     * 私钥字符串转PrivateKey实例
+     *
+     * @param privateKey 私钥字符串
+     * @return
+     */
+    public static PrivateKey getPrivateKey(String privateKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        byte[] decodedKey = Base64.getDecoder().decode(privateKey.getBytes("UTF-8"));// 对私钥进行Base64编码解密
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
+        return keyFactory.generatePrivate(keySpec);
+    }
+ 
+    /**
+     * 公钥字符串转PublicKey实例
+     *
+     * @param publicKey 公钥字符串
+     * @return
+     */
+    public static PublicKey getPublicKey(String publicKey) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        byte[] decodedKey = Base64.getDecoder().decode(publicKey.getBytes("UTF-8")); // 对公钥进行Base64编码解密
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey);
+        return keyFactory.generatePublic(keySpec);
+    }
+ 
+    /**
+     * 公钥加密
+     *
+     * @param data      待加密数据
+     * @param publicKey 公钥
+     * @return
+     */
+    public static String encryptByPublicKey(String data, PublicKey publicKey) {
+        try (
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ) {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+            int inputLen = data.getBytes("UTF-8").length;
+            int offset = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段加密
+            while (inputLen - offset > 0) {
+                if (inputLen - offset > MAX_ENCRYPT_BLOCK) {
+                    cache = cipher.doFinal(data.getBytes("UTF-8"), offset, MAX_ENCRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(data.getBytes("UTF-8"), offset, inputLen - offset);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offset = i * MAX_ENCRYPT_BLOCK;
+            }
+            byte[] encryptedData = out.toByteArray();
+            // 获取加密内容使用Base64进行编码加密,并以UTF-8为标准转化成字符串
+            // 加密后的字符串
+            //return new String(Base64.encodeBase64String(encryptedData));
+            return new String(Base64.getEncoder().encode(encryptedData), "UTF-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+ 
+    /**
+     * 私钥解密
+     *
+     * @param data       待解密数据
+     * @param privateKey 私钥
+     * @return
+     */
+    public static String decryptByPrivateKey(String data, PrivateKey privateKey) {
+        try (
+                ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ) {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+            cipher.init(Cipher.DECRYPT_MODE, privateKey);
+ 
+            // 对待解密数据进行Base64编码解密
+            byte[] dataBytes = Base64.getDecoder().decode(data.getBytes("UTF-8"));
+            int inputLen = dataBytes.length;
+            int offset = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段解密
+            while (inputLen - offset > 0) {
+                if (inputLen - offset > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(dataBytes, offset, inputLen - offset);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offset = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            // 解密后的内容
+            return new String(decryptedData, "UTF-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+ 
+    /**
+     * 私钥签名
+     *
+     * @param data       待签名数据
+     * @param privateKey 私钥
+     * @return 签名
+     */
+    public static String sign(String data, PrivateKey privateKey) throws Exception {
+        byte[] keyBytes = privateKey.getEncoded();
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        PrivateKey key = keyFactory.generatePrivate(keySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(key);
+        signature.update(data.getBytes());
+        return new String(Base64.getEncoder().encode(signature.sign()));  // 对签名内容进行Base64编码加密
+    }
+ 
+    /**
+     * 公钥验签
+     *
+     * @param srcData   原始字符串
+     * @param publicKey 公钥
+     * @param sign      签名
+     * @return 是否验签通过
+     */
+    public static boolean verify(String srcData, PublicKey publicKey, String sign) throws Exception {
+        byte[] keyBytes = publicKey.getEncoded();
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
+        PublicKey key = keyFactory.generatePublic(keySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(key);
+        signature.update(srcData.getBytes());
+        return signature.verify(Base64.getDecoder().decode(sign.getBytes())); // 对验签结果进行Base64编码解密
+    }
+
+    public static String getPublicKey(PublicKey publicKey) {
+        String key = null;
+        try {
+            key = new String(Base64.getEncoder().encode(publicKey.getEncoded()), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return key;
+    }
+
+    public static String getPrivateKey(PrivateKey privateKey) {
+        String key = null;
+        try {
+            key = new String(Base64.getEncoder().encode(privateKey.getEncoded()), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return key;
+    }
+
+    public static void main(String[] args) {
+        try {
+            // 生成密钥对
+            KeyPair keyPair = getKeyPair();
+            String privateKey = new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()), "UTF-8");
+            String publicKey = new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded()), "UTF-8");
+            System.out.println("私钥:" + privateKey);
+            System.out.println("公钥:" + publicKey);
+            // RSA加密
+            String data = "签名算法可以是NIST标准DSA,使用DSA和SHA-1。 使用SHA-1消息摘要算法的DSA算法可以指定为SHA1withDSA 。 在RSA的情况下,\n" +
+                    "存在对消息多个选择摘要算法,所以签名算法可被指定为,例如, MD2withRSA , MD5withRSA ,或SHA1withRSA 。 必须指定算法名称,因为没有默认值。";
+            String encryptData = encryptByPublicKey(data, getPublicKey(publicKey));
+            System.out.println("加密后内容:" + encryptData);
+            // RSA解密
+            String decryptData = decryptByPrivateKey(encryptData, getPrivateKey(privateKey));
+            System.out.println("解密后内容:" + decryptData);
+
+            // RSA签名
+            String sign = sign(data, getPrivateKey(privateKey));
+            System.out.println("签名内容:" + sign);
+            // RSA验签
+            boolean result = verify(data, getPublicKey(publicKey), sign);
+            System.out.print("验签结果:" + result);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.print("加密解密异常");
+        }
+    }
+}

文件差异内容过多而无法显示
+ 162 - 0
gis_common/src/main/java/com/gis/common/deyuan/util/ResultUtils.java


+ 35 - 0
gis_common/src/main/java/com/gis/common/exception/BaseRuntimeException.java

@@ -0,0 +1,35 @@
+package com.gis.common.exception;
+
+public class BaseRuntimeException extends RuntimeException{
+
+    private static final long serialVersionUID = -1518945670203783450L;
+    private Integer code;
+    private String msg;
+
+    public BaseRuntimeException(String msg){
+        super(msg);
+        this.msg = msg;
+    }
+
+    public BaseRuntimeException(Integer code, String msg){
+        super(msg);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 431 - 0
gis_common/src/main/java/com/gis/common/util/DoorUtils.java

@@ -0,0 +1,431 @@
+package com.gis.common.util;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.tfsmy.aesrsa.util.*;
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * @author XiongYu
+ * @version Create at :2020/7/2 14:29
+ */
+
+@Log4j2
+public class DoorUtils {
+    public static final String clientPrivateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMtrddtdI/St1CY4" +
+            "WLLCFVE3KQZoNygGklLe9IngznGOaxiW7Gj+tD3BFaig4yBFxfjxfViz8VIaWUoT" +
+            "kC2vdPL6ETAhyY4NROPOEupNnCXDqMkffkN/PB2o8RnUAJM9CwZCjtnnwSCCblz+" +
+            "BdM5G4GkRdtoqDNZeoOWGJ/A8q2lAgMBAAECgYBpywWMhLBCfHUtO3jF3zJ+/pUT" +
+            "g/fLlT9cYiAD5Sr42/zO2Q8yu+S5iUXeYW4+RotjoRRzoYIMFTAC2pHNcMb8+YPN" +
+            "pQbXkYLsng16TOlyGb2kTPpciE5vP48vL/Fps91sDOkaryWGW/QBFQvfhgdflMa/" +
+            "NybCEw2qldb9Qz28MQJBAO4xSzJhU71EA1CSICp8wfm8fd/9zTYf8Lof1ULQOC5j" +
+            "8jvp4IdrWw79vjZ67HAzzjF4yF3JwkcuCOfyHSWGMjMCQQDaoKjAgXW0qQOS2SUH" +
+            "2Fgyt2b1XVwoZolNKmLT0hjcqr6BPjLY9TNPAnF3UcjglmviRlRnFl+SlgsSmpMd" +
+            "P7jHAkAufgCnfMfTkYr0FxGgOWnDTT9kkS2U+vcJ3VzLBclxhKCrgSMKS7IiYvTV" +
+            "vXiZDgOZNHInnFIHgrzKST/XKzJxAkBN24cdPz1WwBXotvHsEEygixXcbYoDTTi6" +
+            "RUz6mEiIVToQtsDO6MuD6J/V2UdLS+ZRp7ApIhuZDVwWHPwlH2tDAkBjVF/M/cvW" +
+            "VZlh+KbFf+PTRH1xHU0miJ0Mk6669ZTgkh5YIfwjvrMRz5DqaEWwhRmGcXTSOUui" +
+            "zlXFT/cna2O3";
+
+    public static final String clientPublicKey = "";
+
+    public static final String serverPrivateKey = "";
+
+    public static final String serverPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC70qOhdhNm0d9oql+NFKMhm37T" +
+            "id2KeMnqVdoEfpga3oiUzmIBEGdjBKeZVIdSTFJ3yzAVpo4G4ZP5BlQy5MFWKxKM" +
+            "FbLa7eiCxg+yL8P48L/qDFc6NFSoY7IBxwCswBhdnhmfqfH6zaQJ2rbL3826nrA8" +
+            "BBLdBbFlDEJgE4BXVQIDAQAB";
+
+    /** 供应商提供 */
+    public static final String appId = "40288078758d2ccc01758d2d75220000";
+
+    public static void main(String[] args) throws Exception {
+
+//        testbigetAlarmList();
+//        biGetAlarmStat();
+//        biGetDeviceList();
+//        biGetDeviceStat();
+//        biGetPersonCounting();
+//        biGetPersonGatherList();
+//        testPushParams();
+//        testSubmitParams();
+//        testArray();
+//        testAlam();
+//        testPushParams();
+//        testArray();
+//        testbigetAlarmList();
+//        testDiviceType();
+//        testLogPic();
+//        testhourAvgList();
+//        testhourAvgList();
+//        getFaceSnap();
+//        hourAvgDevice();
+        wearher();
+
+    }
+
+    public static void wearher() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+//        params.put("deviceNo", "HDC5550100038");
+        client(params);
+        server();
+    }
+
+
+    public static void hourAvgDevice() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+        params.put("startTime", 1597104650000L);
+        params.put("endTime", System.currentTimeMillis() + 1000000);
+        params.put("deviceNo", "HDC5550100006");
+//        params.put("deviceNo", "HDC5550100038");
+        client(params);
+        server();
+    }
+
+
+    public static void hourAvg() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+        params.put("startTime", 1597104650000L);
+        params.put("endTime", System.currentTimeMillis() + 1000000);
+        params.put("deviceNo", "12");
+        client(params);
+        server();
+    }
+
+    public static void getFaceSnap() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+//        params.put("deviceNo", "HDC5550100038");
+        client(params);
+        server();
+    }
+
+    public static void testLogPic() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+        params.put("deviceNo", "HDC5550100038");
+        client(params);
+        server();
+    }
+
+
+    public static void testhourAvgList() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        ArrayList<String> objects = new ArrayList<>();
+        objects.add("HDC5550100038");
+        objects.add("HDC5550100039");
+        params.put("comNo", "51011500107601");
+        params.put("deviceNos", objects);
+        client(params);
+        server();
+    }
+
+    public static void testDiviceType() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("code", "51011500107601");
+        client(params);
+        server();
+    }
+
+
+    public static void testArray() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("smyComId", "51011500107601");
+        params.put("houseSmyId", "8a69c7ae7393fce501739422671f07ce");
+        params.put("personId", "8a69c60a73a3f5570173a44b944f0025");
+        params.put("arrayTime", "12");
+
+        client(params);
+        server();
+    }
+
+
+    public static void testAlam() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("communityCode", "51011500107601");
+//        params.put("communityCode", "51010701000201");
+        params.put("alarmBizName", "消防栓倾斜告警");
+        params.put("name", "消防栓倾斜告警");
+        params.put("id", "20200727140217_80029_-10202_10583895");
+
+
+        client(params);
+        server();
+    }
+
+    public static void testSubmitParams() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("smyComId", "51011500107601");
+        params.put("personId", "ff808081737b22e601737b48998f0018");
+
+        params.put("passTime", "2020-12-12 18:12:21");
+        params.put("type", 2);
+        params.put("status", 1);
+
+
+        client(params);
+        server();
+    }
+
+    public static void testPushParams() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<String, Object>();
+        params.put("smyComId", "51011500107601");
+        params.put("personId", "8a69c7c573a3f6410173a41a44f7000a");
+
+        params.put("passTime", "1595932780000");
+        params.put("type", 1);
+
+
+        client(params);
+        server();
+    }
+
+
+    private static void testbigetAlarmList() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("pageNo", "1");
+        params.put("pageSize", "10");
+        params.put("code", "51011500107601");
+        params.put("deviceNo", "HDC5550400002");
+        params.put("status", "2");
+        client(params);
+        server();
+    }
+
+    private static void biGetAlarmStat() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("code", "51011500107601");
+        params.put("endMonth", "2020-08");
+        params.put("startMonth", "2020-06");
+        client(params);
+        server();
+    }
+
+
+    private static void biGetDeviceList() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("type", "1");
+        params.put("state", "1");
+        params.put("pageNo", "1");
+        params.put("pageSize", "10");
+        params.put("code", "51011500107601");
+        client(params);
+        server();
+    }
+
+    private static void biGetDeviceStat() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("code", "51011500107601");
+        params.put("startMonth", "2020-07");
+        params.put("endMonth ", "2020-09");
+        client(params);
+        server();
+    }
+
+    private static void biGetPersonCounting() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("pageNo", "1");
+        params.put("pageSize", "10");
+        params.put("code", "51011500107601");
+        client(params);
+        server();
+    }
+
+    private static void biGetPersonGatherList() throws Exception {
+        TreeMap<String, Object> params = new TreeMap<>();
+        params.put("pageNo", "1");
+        params.put("pageSize", "10");
+        params.put("code", "51011500107601");
+        client(params);
+        server();
+    }
+
+
+    /**
+     *  加密算法
+     *  params: 加密参数
+     *
+     */
+    public static void client(TreeMap<String, Object> params) throws Exception {
+        // 生成RSA签名
+        String sign = EncryUtil.handleRSA(params, clientPrivateKey);
+        params.put("sign", sign);
+
+        String info = JSON.toJSONString(params);
+        //随机生成AES密钥
+        String aesKey = SecureRandomUtil.getRandom(16);
+        //AES加密数据
+        String data = AES.encryptToBase64(ConvertUtils.stringToHexString(info), aesKey);
+
+        // 使用RSA算法将自己随机生成的AESKey通过公钥加密
+        String encryptKey = RSA.encrypt(aesKey, serverPublicKey);
+
+        Req.data = data;
+        Req.encryptkey = encryptKey;
+
+        System.out.println("加密后的请求数据:\n" + new Req().toString());
+    }
+
+    public static void server() throws Exception {
+
+        // 验签
+        boolean passSign = EncryUtil.checkDecryptAndSign(Req.data,
+                Req.encryptkey, clientPublicKey, serverPrivateKey);
+
+        if (passSign) {
+            // 验签通过时
+            // server的私钥解密获取AES
+            String aeskey = RSA.decrypt(Req.encryptkey, serverPrivateKey);
+            // AES解密获得Data
+            String data = ConvertUtils.hexStringToString(AES.decryptFromBase64(Req.data,
+                    aeskey));
+
+
+            System.out.println("解密后的明文" + data);
+
+        } else {
+            System.out.println("验签失败");
+        }
+    }
+
+    static class Req {
+        public static String data;
+        public static String encryptkey;
+
+        @Override
+        public String toString() {
+            return "data:" + data + "\nencryptkey:" + encryptkey;
+        }
+    }
+
+    /**
+     * 解密
+     */
+    public static JSONObject decrypt(String str, String aesKey) {
+             String result = ConvertUtils.hexStringToString(AES.decryptFromBase64(str, aesKey));
+        return JSON.parseObject(result);
+    }
+
+
+
+    /**
+     * 加密
+     * @param params 输入参数
+     * @throws Exception
+     */
+    public static Map<String, Object> encrypt(TreeMap<String, Object> params) throws Exception {
+        // 生成RSA签名
+        String sign = EncryUtil.handleRSA(params, clientPrivateKey);
+        params.put("sign", sign);
+
+        String info = JSON.toJSONString(params);
+        //随机生成AES密钥,aes是对称加密
+        String aesKey = SecureRandomUtil.getRandom(16);
+        //AES加密数据
+        String data = AES.encryptToBase64(ConvertUtils.stringToHexString(info), aesKey);
+
+        // 使用RSA算法将自己随机生成的AESKey通过公钥加密
+        String encryptKey = RSA.encrypt(aesKey, serverPublicKey);
+
+        HashMap<String, Object> result = new HashMap<>();
+        result.put("data", data);
+        result.put("encryptKey", encryptKey);
+        result.put("appId", appId);
+        // 解密时使用
+        result.put("aesKey", aesKey);
+        return result;
+
+    }
+
+
+    /**
+     * 涉及敏感信息以及为确保隐私安全,此接口返回值进行了AES加密处理;
+     */
+    public static Result doPostDecrypt(String url, TreeMap<String, Object> param) throws Exception {
+        Map<String, Object> encryptMap = encrypt(param);
+        String result = HttpUtil.post(url, encryptMap);
+        log.info("result: {}", result);
+        JSONObject resultJson = JSON.parseObject(result);
+        int code = resultJson.getInteger("code");
+        if (code == 2000) {
+            // 解密
+            String data = resultJson.get("data").toString();
+            return Result.success(decrypt(data, encryptMap.get("aesKey").toString()));
+        } else {
+            log.error(result);
+            return Result.failure(resultJson.getString("msg"));
+        }
+    }
+
+
+    public static Result doPost(String url, TreeMap<String, Object> param) throws Exception {
+        String result = HttpUtil.post(url, encrypt(param));
+        log.info("result: {}", result);
+        JSONObject resultJson = JSON.parseObject(result);
+        int code = resultJson.getInteger("code");
+        if (code == 2000) {
+            return Result.success(resultJson.get("data"));
+        } else {
+            log.error(result);
+            return Result.failure(resultJson.getString("msg"));
+        }
+    }
+
+
+    public static Result doGet(String url, TreeMap<String, Object> param) throws Exception {
+        String result = HttpUtil.get(url, encrypt(param));
+        log.info("result: {}", result);
+        JSONObject resultJson = JSON.parseObject(result);
+        int code = resultJson.getInteger("code");
+        if (code == 2000) {
+            return Result.success(resultJson.get("data"));
+        } else {
+            log.error(result);
+            return Result.failure(resultJson.getString("msg"));
+        }
+    }
+
+
+    @Test
+    public void getVisitorCount() throws Exception {
+        String api = "https://cdpre.tfsmy.com/intelligence-access-control-api/bi/getVisitorCount";
+        TreeMap<String, Object> param = new TreeMap<>();
+        param.put("code", "510124112006001");
+        doPost(api, param);
+    }
+
+
+    /**
+     * 2.今日进入和外出总数
+     * @throws Exception
+     */
+    @Test
+    public void dailyInOut() throws Exception {
+        String api = "https://cdpre.tfsmy.com/intelligence-access-control-api/bi/dailyInOut";
+
+        TreeMap<String, Object> param = new TreeMap<>();
+        param.put("code", "510124112006001");
+        doGet(api, param);
+    }
+
+    /**
+     * 加密后的参数
+     * @throws Exception
+     */
+    @Test
+    public void testClient() throws Exception {
+        TreeMap<String, Object> param = new TreeMap<>();
+        param.put("code", "510124112006001");
+        client(param);
+    }
+}

+ 140 - 0
gis_common/src/main/java/com/gis/common/util/FileUtils.java

@@ -0,0 +1,140 @@
+package com.gis.common.util;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.URLUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * Created by owen on 2020/5/12 0012 17:21
+ */
+@Slf4j
+public class FileUtils {
+
+
+    /**
+     * 多文件上传
+     * savePath 路径(目录)
+     */
+    public static List<Map<String, String>> uploads(MultipartFile[] files, String savePath) throws IOException {
+        if (files == null) {
+            log.error("文件不能为空");
+            return null;
+        }
+
+        String time = DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS");
+        savePath = savePath + time + File.separator;
+//        FileUtil.mkdir(time);
+
+        ArrayList<Map<String, String>> list = new ArrayList<>();
+
+        String path;
+        int i = 0;
+        for (MultipartFile file : files) {
+            String fileName = file.getOriginalFilename();
+            String suffix = StringUtils.substringAfterLast(fileName, ".");
+            String newName = time + "_" + i + "."  +suffix;
+            path = savePath + newName;
+            FileUtil.writeFromStream(file.getInputStream(), path);
+
+            HashMap<String, String> fileInfo = new HashMap<>();
+            fileInfo.put("path", path);
+            fileInfo.put("name", fileName);
+            fileInfo.put("newName", newName);
+            fileInfo.put("dir", time);
+
+            list.add(fileInfo);
+            ++ i;
+        }
+
+        return list;
+
+    }
+
+
+    /**
+     * 重命名文件上传
+     * @param file
+     * @param savePath
+     * @return
+     * @throws IOException
+     */
+    public static String renameUpload(MultipartFile file, String savePath, String baseUrl)  {
+        if (file == null) {
+            log.error("文件不能为空");
+            return null;
+        }
+
+        String time = DateUtil.format(new Date(), "yyyyMMdd_HHmmssSSS");
+
+        String fileName = file.getOriginalFilename();
+
+
+
+        String suffix = StringUtils.substringAfterLast(fileName, ".");
+        String newName = time  + "."  +suffix;
+        savePath = savePath  + newName;
+
+        try {
+            FileUtil.writeFromStream(file.getInputStream(), savePath);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        String path = StringUtils.substringAfterLast(savePath, "cms_fdkanzhan_data"+ File.separator);
+
+        return baseUrl+"cms_fdkanzhan_data/" +path;
+
+    }
+
+
+    /**
+     * 根据路径写入文件,适合oss
+     * @param inPath 网络输入路径
+     * @param outPath 保存文件路径
+     * @throws IOException
+     */
+    public static void fielWrite(String inPath, String outPath) throws IOException {
+        InputStream in = URLUtil.getStream(new URL(inPath));
+        FileUtil.writeFromStream(in, outPath);
+    }
+
+
+    /**
+     * 获取文件资源路径
+     * 这方法,测试时是用当前类路径,当打包成jar包时时,会变成跟目录下。所以要把资源文件放入口类的资源文件夹
+     * @param filePath 文件路径
+     * @return
+     * @throws IOException
+     */
+    public static String getResourceUrl(String filePath) throws IOException {
+        String path = ResourceUtils.getURL("classpath:").getPath();
+        path = path + filePath;
+        return path;
+    }
+
+
+    @Test
+    public void test(){
+        String a = "F:\\test\\ngin\\cms_fdkanzhan_data\\img/20200903_181544452.jpg";
+        System.out.println(StringUtils.substringAfterLast(a, "cms_fdkanzhan_data"+ File.separator));
+    }
+
+    @Test
+    public void test2(){
+        String a = "F:\\test\\ngin\\cms_fdkanzhan_data\\img/20200903_181544452.jpg";
+        System.out.println(StringUtils.substringBeforeLast(a, "cms_fdkanzhan_data"+ File.separator));
+        System.out.println(StringUtils.substringBefore(a, "cms_fdkanzhan_data"+ File.separator));
+        System.out.println(StringUtils.substringBetween(a, "cms_fdkanzhan_data"+ File.separator));
+    }
+}

+ 194 - 0
gis_common/src/main/java/com/gis/common/util/PasswordUtils.java

@@ -0,0 +1,194 @@
+package com.gis.common.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import java.security.Key;
+import java.security.SecureRandom;
+
+public class PasswordUtils {
+
+
+    /**
+     * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES
+     * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1
+     * */
+
+    /**
+     * 定义使用的算法为:PBEWITHMD5andDES算法
+     */
+    public static final String ALGORITHM = "PBEWithMD5AndDES";//加密算法
+    public static final String Salt = "63293188";//密钥
+
+    /**
+     * 定义迭代次数为1000次
+     */
+    private static final int ITERATIONCOUNT = 1000;
+
+    /**
+     * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节
+     *
+     * @return byte[] 盐值
+     */
+    public static byte[] getSalt() throws Exception {
+        // 实例化安全随机数
+        SecureRandom random = new SecureRandom();
+        // 产出盐
+        return random.generateSeed(8);
+    }
+
+    public static byte[] getStaticSalt() {
+        // 产出盐
+        return Salt.getBytes();
+    }
+
+    /**
+     * 根据PBE密码生成一把密钥
+     *
+     * @param password 生成密钥时所使用的密码
+     * @return Key PBE算法密钥
+     */
+    private static Key getPBEKey(String password) {
+        // 实例化使用的算法
+        SecretKeyFactory keyFactory;
+        SecretKey secretKey = null;
+        try {
+            keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
+            // 设置PBE密钥参数
+            PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
+            // 生成密钥
+            secretKey = keyFactory.generateSecret(keySpec);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        return secretKey;
+    }
+
+    /**
+     * 加密明文字符串
+     *
+     * @param plaintext 待加密的明文字符串
+     * @param password  生成密钥时所使用的密码
+     * @param salt      盐值
+     * @return 加密后的密文字符串
+     * @throws Exception
+     */
+    public static String encrypt(String plaintext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] encipheredData = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
+
+            encipheredData = cipher.doFinal(plaintext.getBytes());
+        } catch (Exception e) {
+        }
+        return bytesToHexString(encipheredData);
+    }
+
+    /**
+     * 解密密文字符串
+     *
+     * @param ciphertext 待解密的密文字符串
+     * @param password   生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致)
+     * @param salt       盐值(如需解密,该参数需要与加密时使用的一致)
+     * @return 解密后的明文字符串
+     * @throws Exception
+     */
+    public static Boolean decrypt(String ciphertext, String password, byte[] salt) {
+
+        Key key = getPBEKey(password);
+        byte[] passDec = null;
+        PBEParameterSpec parameterSpec = new PBEParameterSpec(getStaticSalt(), ITERATIONCOUNT);
+        try {
+            Cipher cipher = Cipher.getInstance(ALGORITHM);
+
+            cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
+
+            passDec = cipher.doFinal(hexStringToBytes(ciphertext));
+            return true;
+        } catch (Exception e) {
+            // TODO: handle exception
+            return false;
+        }
+//        return new String(passDec);
+    }
+
+    /**
+     * 将字节数组转换为十六进制字符串
+     *
+     * @param src 字节数组
+     * @return
+     */
+    public static String bytesToHexString(byte[] src) {
+        StringBuilder stringBuilder = new StringBuilder("");
+        if (src == null || src.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < src.length; i++) {
+            int v = src[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 将十六进制字符串转换为字节数组
+     *
+     * @param hexString 十六进制字符串
+     * @return
+     */
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    private static byte charToByte(char c) {
+        return (byte) "0123456789ABCDEF".indexOf(c);
+    }
+
+    public static void main(String[] args) {
+
+        String userName = "hao";
+        String password = "123456";
+
+        try {
+            byte[] salt = PasswordUtils.getStaticSalt();
+            String ciphertext = PasswordUtils.encrypt(userName, password, salt);
+            System.out.println("密文:" + ciphertext);
+            Boolean plaintext = PasswordUtils.decrypt(ciphertext, password, salt);
+            System.out.println("明文" + plaintext);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+
+
+
+
+    }
+
+
+}

+ 101 - 0
gis_common/src/main/java/com/gis/common/util/Result.java

@@ -0,0 +1,101 @@
+package com.gis.common.util;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 通用返回类
+ *
+ * @author
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Result<T> implements Serializable {
+    private static final long serialVersionUID = -1491499610244557029L;
+    public static final String SUCCESS_MSG = "操作成功";
+    public static int CODE_SUCCESS = 0;
+    public static int CODE_FAILURE = -1;
+    public static String[] NOOP = new String[]{};
+
+    /**
+     * 处理状态:0: 成功, 1: 失败
+     */
+    @ApiModelProperty(value = "处理状态:0: 成功, 1: 失败", name = "code")
+    private int code;
+    /**
+     * 消息
+     */
+    @ApiModelProperty(value = "消息", name = "msg")
+    private String msg;
+    /**
+     * 返回数据
+     */
+    @ApiModelProperty(value = "返回数据", name = "data")
+    private T data;
+    /**
+     * 处理成功,并返回数据
+     *
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(Object data) {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, data);
+    }
+    /**
+     * 处理成功
+     *
+     * @return data
+     */
+    public static Result success() {
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result success(String msg) {
+        return new Result(CODE_SUCCESS, msg, NOOP);
+    }
+    /**
+     * 处理成功
+     *
+     * @param msg  消息
+     * @param data 数据对象
+     * @return data
+     */
+    public static Result success(String msg, Object data) {
+        return new Result(CODE_SUCCESS, msg, data);
+    }
+    /**
+     * 处理失败,并返回数据(一般为错误信息)
+     *
+     * @param code 错误代码
+     * @param msg  消息
+     * @return data
+     */
+    public static Result failure(int code, String msg) {
+        return new Result(code, msg, NOOP);
+    }
+    /**
+     * 处理失败
+     *
+     * @param msg 消息
+     * @return data
+     */
+    public static Result failure(String msg) {
+        return failure(CODE_FAILURE, msg);
+    }
+
+    @Override
+    public String toString() {
+        return "JsonResult [code=" + code + ", msg=" + msg + ", data="
+                + data + "]";
+    }
+}

+ 27 - 0
gis_web/pom.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cms_chengdu_screen</artifactId>
+        <groupId>com.gis</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>gis_web</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.gis</groupId>
+            <artifactId>gis_common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>

+ 13 - 0
gis_web/src/main/java/com/gis/web/aop/WebControllerLog.java

@@ -0,0 +1,13 @@
+package com.gis.web.aop;
+
+import java.lang.annotation.*;
+
+/**
+ * Created by Hb_zzZ on 2020/2/27.
+ */
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface WebControllerLog {
+    String description() default "";
+}

+ 69 - 0
gis_web/src/main/java/com/gis/web/aop/WebLogAspect.java

@@ -0,0 +1,69 @@
+package com.gis.web.aop;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * Created by owen on 2020/2/25 0025 9:24
+ *
+ * 日志aop
+ */
+@Slf4j
+@Aspect
+@Component
+public class WebLogAspect {
+
+    @Autowired
+    private HttpServletRequest request;
+
+
+    @Pointcut("execution(* com.gis.web.controller.*.*(..))")//切入点描述 这个是controller包的切入点
+//    @Pointcut("execution(* com.gis.web.controller.*(..))")//切入点描述 这个是controller包的切入点
+    public void controllerLog(){}//签名,可以理解成这个切入点的一个名称
+
+    @Before("controllerLog()") //在切入点的方法run之前要干的
+    public void logBeforeController(JoinPoint joinPoint) throws Exception {
+
+        // 获取token
+        String token = request.getHeader("token");
+
+
+        // 记录下请求内容
+        log.warn("start : {}" , request.getRequestURI());
+        log.info("request Method : {}" , request.getMethod());
+        log.info("request IP : {}" , request.getRemoteAddr());
+        log.info("request Args : {}" , Arrays.toString(joinPoint.getArgs()));
+
+        // token为空,直接返回
+        if (StringUtils.isBlank(token)) {
+            return;
+        }
+
+
+        //下面这个getSignature().getDeclaringTypeName()是获取包+类名的   然后后面的joinPoint.getSignature.getName()获取了方法名
+        log.info("request Class_Method : {}" , joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
+
+
+
+    }
+
+
+    //使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
+    @AfterReturning(returning = "ret", pointcut = "controllerLog()")
+    public void doAfterReturning(Object ret) throws Throwable {
+        // 处理完请求,返回内容
+        log.warn("end : {}", request.getRequestURI());
+    }
+
+
+}

+ 41 - 0
gis_web/src/main/java/com/gis/web/controller/BaiduWeatherController.java

@@ -0,0 +1,41 @@
+package com.gis.web.controller;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.gis.common.util.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by owen on 2020/11/6 0006 9:56
+ *
+ * 调用百度天气api, 需要在百度控制台创建应用,添加ip白名称
+ * 目前是设置0.0.0.0/0
+ */
+@Log4j2
+@Api(tags = "百度天气")
+@RestController
+@RequestMapping("weather")
+public class BaiduWeatherController {
+
+    // 百度应用应用AK
+    private static final String AK = "KXhUz8ptVFAyVK3zi1OXvaFOq9Qq9Gst";
+
+
+    // 47.107.252.54,221.4.210.172
+
+    @ApiOperation("获取天气(测试码:110100)")
+    @GetMapping("get/{districtId}")
+    public Result getWeather(@PathVariable String districtId){
+        // http://api.map.baidu.com/weather/v1/?district_id=222405&data_type=all&ak=你的ak
+        String api = "http://api.map.baidu.com/weather/v1/?district_id=" + districtId + "&data_type=all&ak=" + AK;
+        String s = HttpUtil.get(api);
+        JSONObject result = JSONObject.parseObject(s);
+        return Result.success(result);
+    }
+}

+ 142 - 0
gis_web/src/main/java/com/gis/web/controller/DoorController.java

@@ -0,0 +1,142 @@
+package com.gis.web.controller;
+
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.gis.common.util.Result;
+import com.gis.web.dto.PageDateDto;
+import com.gis.common.util.DoorUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.junit.Test;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.TreeMap;
+
+
+/**
+ * Created by owen on 2020/10/18 0018 12:17
+ */
+@Log4j2
+@Api(tags = "德源门禁")
+@RestController
+@RequestMapping("door")
+public class DoorController  {
+
+    // 测试环境请求域名
+    private static String BASE_URL = "https://cdpre.tfsmy.com/intelligence-access-control-api";
+
+    @ApiOperation("访客总数、近7天每日统计数(测试:510124112006001)")
+    @GetMapping("getVisitorCount/{code}")
+    public Result getVisitorCount(@PathVariable String code) throws Exception {
+        String apiUrl = BASE_URL + "/bi/getVisitorCount";
+        TreeMap<String, Object> param = new TreeMap<>();
+        param.put("code", code);
+        return DoorUtils.doPost(apiUrl, param);
+    }
+
+
+    @ApiOperation("今日进入和外出总数")
+    @GetMapping("dailyInOut/{code}")
+    public Result dailyInOut(@PathVariable String code) throws Exception {
+        String apiUrl = BASE_URL + "/bi/dailyInOut";
+        TreeMap<String, Object> param = new TreeMap<>();
+        param.put("code", code);
+        return DoorUtils.doGet(apiUrl, param);
+    }
+
+
+    @ApiOperation("时间段进入和外出")
+    @PostMapping("accessRecordsWithDevice")
+    public Result accessRecordsWithDevice(@RequestBody PageDateDto param) throws Exception {
+        String apiUrl = BASE_URL + "/bi/accessRecordsWithDevice";
+        TreeMap<String, Object> reqParam = new TreeMap<>();
+        reqParam.put("code", param.getCode());
+        reqParam.put("startTime", getTime(param.getStartTime()));
+        reqParam.put("endTime", getTime(param.getEndTime()));
+
+        return DoorUtils.doGet(apiUrl, reqParam);
+    }
+
+
+    @ApiOperation("车辆进出日志")
+    @PostMapping("entranceCarLogList")
+    public Result entranceCarLogList(@RequestBody PageDateDto param) throws Exception {
+        String apiUrl = BASE_URL + "/bi/entranceCarLogList";
+        TreeMap<String, Object> reqParam = new TreeMap<>();
+        reqParam.put("code", param.getCode());
+        reqParam.put("pageSize", param.getPageSize());
+        reqParam.put("pageNo", param.getPageNum());
+
+        return DoorUtils.doPost(apiUrl, reqParam);
+    }
+
+
+    @ApiOperation("车辆进出统计(按天计算)")
+    @PostMapping("entranceCarLogDateAvgData")
+    public Result entranceCarLogDateAvgData(@RequestBody PageDateDto param) throws Exception {
+        String apiUrl = BASE_URL + "/bi/entranceCarLogDateAvgData";
+        TreeMap<String, Object> reqParam = new TreeMap<>();
+        reqParam.put("code", param.getCode());
+        reqParam.put("startTime", getTime(param.getStartTime()));
+        reqParam.put("endTime", getTime(param.getEndTime()));
+
+        return DoorUtils.doPost(apiUrl, reqParam);
+    }
+
+    @ApiOperation("车辆进出统计(按小时计算)")
+    @PostMapping("entranceCarLogHourAvgData")
+    public Result entranceCarLogHourAvgData(@RequestBody PageDateDto param) throws Exception {
+        String apiUrl = BASE_URL + "/bi/entranceCarLogHourAvgData";
+        TreeMap<String, Object> reqParam = new TreeMap<>();
+        reqParam.put("code", param.getCode());
+        reqParam.put("startTime", param.getStartTime());
+        reqParam.put("endTime", param.getEndTime());
+
+        return DoorUtils.doPost(apiUrl, reqParam);
+    }
+
+    /***
+     * 返回数据进行了加密,需要解密
+     */
+    @ApiOperation("异常时间进出日志(指定查找0点-5点数据)")
+    @PostMapping("findInOutLog")
+    public Result findInOutLog(@RequestBody PageDateDto param) throws Exception {
+        String apiUrl = BASE_URL + "/bi/findInOutLog";
+        TreeMap<String, Object> reqParam = new TreeMap<>();
+        reqParam.put("code", param.getCode());
+        reqParam.put("dateTime", param.getStartTime());
+        reqParam.put("pageSize", param.getPageSize());
+        reqParam.put("pageNo", param.getPageNum());
+        return DoorUtils.doPostDecrypt(apiUrl, reqParam);
+    }
+
+
+    /** 获取时间毫秒数 */
+    private Long getTime(String str) {
+        DateTime time = DateUtil.parse(str, "yyyy-MM-dd HH:mm:ss");
+        return time.getTime();
+    }
+
+
+    @Test
+    public void testLong(){
+        getTime("2020-11-02 13:20:20");
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 142 - 0
gis_web/src/main/java/com/gis/web/controller/ExceptionController.java

@@ -0,0 +1,142 @@
+package com.gis.web.controller;
+
+import com.gis.common.exception.BaseRuntimeException;
+import com.gis.common.util.Result;
+import lombok.extern.log4j.Log4j2;
+//import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
+
+/**
+ * 统一捕捉异常,自定义返回参数
+ * 这里只可以捕获controller层的异常。
+ */
+@Log4j2
+@RestControllerAdvice
+public class ExceptionController {
+
+    // 捕捉shiro的异常
+//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+//    @ExceptionHandler(ShiroException.class)
+//    public Result handle401(ShiroException e) {
+////        return Result.failure(5001, e.getMessage());
+//        log.error("没有授权1");
+//        return Result.failure(5001, "没有授权");
+//    }
+
+
+
+    /**
+     * 捕捉UnauthorizedException
+     *
+     * 权限不够,会抛这个异常
+     */
+//    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+//    @ExceptionHandler(UnauthorizedException.class)
+//    public Result handle401() {
+//        log.error("没有授权2");
+//        return Result.failure(5001, "没有授权");
+//    }
+
+    // 捕捉其他所有异常
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public Result globalException(HttpServletRequest request, Throwable ex) {
+        return Result.failure(getStatus(request).value(), ex.getMessage());
+    }
+
+
+    private HttpStatus getStatus(HttpServletRequest request) {
+        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
+        if (statusCode == null) {
+            return HttpStatus.INTERNAL_SERVER_ERROR;
+        }
+        return HttpStatus.valueOf(statusCode);
+    }
+
+    @ResponseBody
+    @ExceptionHandler(BaseRuntimeException.class)
+    @ResponseStatus(HttpStatus.OK)
+    public Result runtimeExceptionHandler(HttpServletRequest request, BaseRuntimeException e) {
+        log.error(request.getRequestURI() + ":" + e.getMsg());
+//        return Result.failure(e.getCode() == null ? Result.CODE_FAILURE : e.getCode(), e.getMsg());
+        return Result.failure(e.getCode(), e.getMsg());
+    }
+
+    /**
+     * 方法参数校验
+     *
+     * 注解验证异常
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+        return Result.failure(60001, e.getBindingResult().getFieldError().getDefaultMessage());
+    }
+
+    /**
+     * ValidationException
+     */
+    @ExceptionHandler(ValidationException.class)
+    public Result handleValidationException(ValidationException e) {
+        log.error(e.getMessage(), e);
+        return Result.failure(60002, e.getCause().getMessage());
+    }
+
+    /**
+     * ConstraintViolationException
+     */
+    @ExceptionHandler(ConstraintViolationException.class)
+    public Result handleConstraintViolationException(ConstraintViolationException e) {
+        log.error(e.getMessage(), e);
+        return Result.failure(60003, e.getMessage());
+    }
+
+    @ExceptionHandler(NoHandlerFoundException.class)
+    public Result handlerNoFoundException(Exception e) {
+        log.error(e.getMessage(), e);
+        return Result.failure(60004, "路径不存在,请检查路径是否正确");
+    }
+
+
+
+
+    @ExceptionHandler(NullPointerException.class)
+    public Result handlerNullPointerException(Exception e) {
+        log.error(e.getMessage(), e);
+        return Result.failure(60005, "空指针异常");
+    }
+
+//    @ExceptionHandler(BuilderException.class)
+//    public Result handlerBuilderException(Exception e) {
+//        log.error(e.getMessage(), e);
+//        return Result.failure(60006, "SQL mybatis 异常");
+//    }
+
+
+    /**
+     * 防止表单重复提交
+     * 需要结合数据库某个字段设置唯一字段使用
+     *
+     * 例如userName
+     *
+     * 也可以结合redis使用
+     */
+//    @ExceptionHandler(DuplicateKeyException.class)
+//    public Result handleDuplicateKeyException(DuplicateKeyException e) {
+//        log.error(e.getMessage(), e);
+//        return Result.failure(60005, "数据重复,请检查后提交");
+//    }
+
+
+
+}
+

+ 180 - 0
gis_web/src/main/java/com/gis/web/controller/ScreenController.java

@@ -0,0 +1,180 @@
+package com.gis.web.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.gis.common.deyuan.util.ResultUtils;
+import com.gis.common.util.Result;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+
+
+/**
+ * Created by owen on 2020/10/18 0018 12:17
+ */
+@Log4j2
+@Api(tags = "德源大屏")
+@RestController
+@RequestMapping("screen")
+public class ScreenController  {
+
+
+
+    @ApiOperationSupport(order=1)
+    @ApiOperation("街道概况-街道人员组成、房屋信息")
+    @GetMapping("baseData/{code}")
+    public Result baseData(@PathVariable String code){
+        String apiUrl = "/open/api/v1/community/base-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=1)
+    @ApiOperation("街道概况-街道服务")
+    @GetMapping("serviceData/{code}")
+    public JSONObject serviceData(@PathVariable String code){
+        String apiUrl = "/open/api/v1/community/service-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGet(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=1)
+    @ApiOperation("街道概况-公共空间数据")
+    @GetMapping("spaceData/{code}")
+    public JSONObject spaceData(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/space-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGet(apiUrl, param);
+    }
+
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-社区活动")
+    @GetMapping("activityData/{code}")
+    public Result activityData(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/activity-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        param.put("children", "true");
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-邻里交流,cityCode:460300")
+    @GetMapping("interFlow/{cityCode}")
+    public Result interFlow(@PathVariable String cityCode) {
+        String apiUrl = "/open/api/v1/community/statistics/interflow";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("cityCode", cityCode);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+//    @ApiOperation("积分商城数据")
+//    @GetMapping("pointData/{code}")
+//    public Result pointData(@PathVariable String code) {
+//        String apiUrl = "/open/api/v1/community/point-data";
+//        HashMap<String, Object> param = new HashMap<>();
+//        param.put("code", code);
+//        return ResultUtils.doGetResult(apiUrl, param);
+//    }
+
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-社区资讯")
+    @GetMapping("infoData/{code}")
+    public Result infoData(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/info-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    /** 无数据*/
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-可信生活圈")
+    @GetMapping("businessData/{code}")
+    public Result businessData(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/business-data";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-党建活动")
+    @GetMapping("activity/{code}")
+    public Result activity(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/deyuan/activity";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-党组织概况")
+    @GetMapping("organization/{code}")
+    public Result organization(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/deyuan/organization";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+    @ApiOperationSupport(order=2)
+    @ApiOperation("场景营造-党建资讯")
+    @GetMapping("article/{code}")
+    public Result article(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/deyuan/article";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("code", code);
+        return ResultUtils.doGetResult(apiUrl, param);
+    }
+
+
+
+    @ApiOperation("就业发展-就业专栏(code:510100)")
+    @GetMapping("getStatistics/{code}")
+    public Result getStatistics(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/community/deyuan/getStatistics";
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("cityCode", code);
+        // 商家分组编码
+        param.put("group", "5f34e07ffb01d500019698ea");
+        return Result.success(ResultUtils.doGet(apiUrl, param));
+    }
+
+
+    @ApiOperation("网格治理-一键报警")
+    @GetMapping("getInfo/{code}")
+    public Result getInfo(@PathVariable String code) {
+        String apiUrl = "/open/api/v1/sspReportInfo/getInfo";
+
+        HashMap<String, Object> param = new HashMap<>();
+        param.put("xzCode", code);
+        param.put("xzLevel", "1");
+        param.put("topic", "111");
+        return Result.success(ResultUtils.doGet(apiUrl, param));
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}

+ 29 - 0
gis_web/src/main/java/com/gis/web/dto/PageDateDto.java

@@ -0,0 +1,29 @@
+package com.gis.web.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * Created by Owen on 2019/10/28 0028 12:24
+ * 有时间
+ */
+@Data
+public class PageDateDto extends PageDto {
+
+    /**
+     * 开始时间
+     * 需要用字符串接收
+     */
+    @ApiModelProperty(value = "开始时间", name = "startTime")
+    private String startTime;
+
+
+    @ApiModelProperty(value = "结束时间", name = "endTime")
+    private String endTime;
+
+
+
+
+
+}

+ 26 - 0
gis_web/src/main/java/com/gis/web/dto/PageDto.java

@@ -0,0 +1,26 @@
+package com.gis.web.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * Created by Owen on 2019/10/28 0028 12:24
+ */
+@Data
+public class PageDto {
+
+
+    @ApiModelProperty(value = "起始页码,默认1为第一页", name = "pageNum")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "每页数量", name = "pageSize")
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "搜索条件", name = "searchKey")
+    private String code;
+
+
+
+
+}

文件差异内容过多而无法显示
+ 325 - 0
gis_web/src/main/java/com/gis/web/test/TestSign.java


+ 242 - 0
pom.xml

@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- museum parent-->
+    <groupId>com.gis</groupId>
+    <!--<artifactId>gis_cms</artifactId>-->
+    <artifactId>cms_chengdu_screen</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0.0</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.0.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <modules>
+        <module>gis_common</module>
+        <module>gis_web</module>
+        <!--<module>gis_domain</module>-->
+        <!--<module>gis_service</module>-->
+        <!--<module>gis_mapper</module>-->
+        <module>gis_application</module>
+    </modules>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+        <spring.boot.version>2.1.0.RELEASE</spring.boot.version>
+        <gis.version>1.0.0</gis.version>
+        <fastjson.version>1.2.51</fastjson.version>
+        <druid.version>1.1.14</druid.version>
+        <hutool.version>5.3.3</hutool.version>
+        <lombok.version>1.18.2</lombok.version>
+        <lang3.version>3.7</lang3.version>
+        <mysql.version>8.0.15</mysql.version>
+        <shiro.version>1.4.0</shiro.version>
+        <jwt.version>3.2.0</jwt.version>
+        <jjwt.version>0.6.0</jjwt.version>
+        <aliyun.core.version>4.0.3</aliyun.core.version>
+        <aliyun.dysmsapi.version>1.1.0</aliyun.dysmsapi.version>
+        <aliyun.oss.version>2.5.0</aliyun.oss.version>
+        <tk.mybatis.version>2.0.2</tk.mybatis.version>
+        <tk.mapper.version>4.0.3</tk.mapper.version>
+        <pagehelper.version>1.2.5</pagehelper.version>
+        <knife4j.version>2.0.2</knife4j.version>
+        <junit.version>4.12</junit.version>
+
+    </properties>
+
+
+    <!--dependencyManagement用于管理依赖版本号, 必须写版本号,不然依赖不上-->
+    <dependencyManagement>
+        <dependencies>
+            <!--模块版本管理-->
+
+            <dependency>
+                <groupId>com.gis</groupId>
+                <artifactId>gis_application</artifactId>
+                <version>${gis.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.gis</groupId>
+                <artifactId>gis_common</artifactId>
+                <version>${gis.version}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>com.gis</groupId>
+                <artifactId>gis_web</artifactId>
+                <version>${gis.version}</version>
+            </dependency>
+
+
+            <!-- springboot -->
+            <!--<dependency>-->
+                <!--<groupId>org.springframework.boot</groupId>-->
+                <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
+                <!--<version>${spring.boot.version}</version>-->
+            <!--</dependency>-->
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-web</artifactId>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter-test</artifactId>
+                <scope>test</scope>
+                <version>${spring.boot.version}</version>
+            </dependency>
+
+            <!--springboot中的redis依赖-->
+            <!--<dependency>-->
+                <!--<groupId>org.springframework.boot</groupId>-->
+                <!--<artifactId>spring-boot-starter-data-redis</artifactId>-->
+                <!--<version>${spring.boot.version}</version>-->
+            <!--</dependency>-->
+
+            <!--rabbit MQ-->
+            <!--<dependency>-->
+                <!--<groupId>org.springframework.boot</groupId>-->
+                <!--<artifactId>spring-boot-starter-amqp</artifactId>-->
+                <!--<version>${spring.boot.version}</version>-->
+            <!--</dependency>-->
+
+            <!-- lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+
+            <!-- fastjson -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson.version}</version>
+            </dependency>
+
+            <!--阿里数据库连接池 -->
+            <!--<dependency>-->
+                <!--<groupId>com.alibaba</groupId>-->
+                <!--<artifactId>druid-spring-boot-starter</artifactId>-->
+                <!--<version>${druid.version}</version>-->
+            <!--</dependency>-->
+
+            <!-- mysql -->
+            <!--<dependency>-->
+                <!--<groupId>mysql</groupId>-->
+                <!--<artifactId>mysql-connector-java</artifactId>-->
+                <!--<version>${mysql.version}</version>-->
+            <!--</dependency>-->
+
+            <!-- 工具类 -->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
+
+            <!-- StringUtils -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${lang3.version}</version>
+            </dependency>
+
+            <!-- knife4j aip 包-->
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-boot-starter</artifactId>
+                <version>${knife4j.version}</version>
+            </dependency>
+
+            <!-- shiro -->
+            <!--<dependency>-->
+                <!--<groupId>org.apache.shiro</groupId>-->
+                <!--<artifactId>shiro-spring</artifactId>-->
+                <!--<version>${shiro.version}</version>-->
+            <!--</dependency>-->
+
+
+            <!-- jwt -->
+            <!--<dependency>-->
+                <!--<groupId>com.auth0</groupId>-->
+                <!--<artifactId>java-jwt</artifactId>-->
+                <!--<version>${jwt.version}</version>-->
+            <!--</dependency>-->
+
+            <!--<dependency>-->
+                <!--<groupId>io.jsonwebtoken</groupId>-->
+                <!--<artifactId>jjwt</artifactId>-->
+                <!--<version>${jjwt.version}</version>-->
+            <!--</dependency>-->
+
+            <!--aliyun sdk-->
+            <!--<dependency>-->
+                <!--<groupId>com.aliyun</groupId>-->
+                <!--<artifactId>aliyun-java-sdk-core</artifactId>-->
+                <!--<version>${aliyun.core.version}</version>-->
+            <!--</dependency>-->
+
+            <!--<dependency>-->
+                <!--<groupId>com.aliyun</groupId>-->
+                <!--<artifactId>aliyun-java-sdk-dysmsapi</artifactId>-->
+                <!--<version>${aliyun.dysmsapi.version}</version>-->
+            <!--</dependency>-->
+
+            <!--aliyun oss-->
+            <!--<dependency>-->
+                <!--<groupId>com.aliyun.oss</groupId>-->
+                <!--<artifactId>aliyun-sdk-oss</artifactId>-->
+                <!--<version>${aliyun.oss.version}</version>-->
+            <!--</dependency>-->
+
+            <!--tk.mybatis 依赖-->
+            <!--<dependency>-->
+                <!--<groupId>tk.mybatis</groupId>-->
+                <!--<artifactId>mapper-spring-boot-starter</artifactId>-->
+                <!--<version>${tk.mybatis.version}</version>-->
+                <!--&lt;!&ndash; tk.mybatis 跟springboot jap 包冲突&ndash;&gt;-->
+                <!--<exclusions>-->
+                    <!--<exclusion>-->
+                        <!--<groupId>javax.persistence</groupId>-->
+                        <!--<artifactId>persistence-api</artifactId>-->
+                    <!--</exclusion>-->
+                <!--</exclusions>-->
+            <!--</dependency>-->
+
+
+            <!--分页插件-->
+            <!--<dependency>-->
+                <!--<groupId>com.github.pagehelper</groupId>-->
+                <!--<artifactId>pagehelper-spring-boot-starter</artifactId>-->
+                <!--<version>${pagehelper.version}</version>-->
+            <!--</dependency>-->
+
+            <dependency>
+                <groupId>junit</groupId>
+                <artifactId>junit</artifactId>
+                <version>${junit.version}</version>
+            </dependency>
+
+
+
+
+
+        </dependencies>
+    </dependencyManagement>
+
+
+</project>

+ 26 - 0
remark.md

@@ -0,0 +1,26 @@
+## 成都德源数据大屏api
+
+# sit
+    server:47.107.252.54,这服务器需要开放端口才能外网访问
+    tomcat:/指房宝-master - 47.107.252.54/root/user/java/tomcat_cmsChengDuScreen_8106
+    doc: http://47.107.252.54:8106/doc.html
+    web: http://47.107.252.54:8106/chengdu/cljk.html
+    
+    <Context path="" docBase="/root/user/java/tomcat_cmsChengDuScreen_8106/webapps/cmsChengDuScreen" debug="0" reloadable="true" crossContext="true"/>
+
+
+
+
+接口名称	测试参数	是否有数据
+街道概况-街道人员组成、房屋信息	510115001076	有
+街道概况-街道服务	510115001076	有
+街道概况-公共空间数据	510115001076	有
+场景营造-党建活动	510115001076	否
+场景营造-社区活动	510115001076	否
+场景营造-党建资讯	510115001076	否
+场景营造-可信生活圈	510115001076	否
+场景营造-社区资讯	510115001076	有
+场景营造-邻里交流	460300	有
+场景营造-党组织概况	510115001076	有
+网格治理-一键报警	 510100	有
+就业发展-就业专栏	 510100	有