first commit
This commit is contained in:
commit
112733abfe
|
@ -0,0 +1,33 @@
|
||||||
|
HELP.md
|
||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
|
||||||
|
### STS ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
|
@ -0,0 +1,5 @@
|
||||||
|
##对接汇聚中心
|
||||||
|
#global mode
|
||||||
|
SENDTYPE=HJPT
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<!-- 日志存放路径 -->
|
||||||
|
<property name="log.path" value="/home/project/dataSend/log"/>
|
||||||
|
<!-- 日志输出格式 -->
|
||||||
|
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
|
||||||
|
|
||||||
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统日志输出 -->
|
||||||
|
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/info.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}.info.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>2</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<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">
|
||||||
|
<file>${log.path}/error.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}.error.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<maxHistory>2</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>ERROR</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统模块日志级别控制 -->
|
||||||
|
<logger name="com.bootdo" level="info"/>
|
||||||
|
<!-- Spring日志级别控制 -->
|
||||||
|
<logger name="org.springframework" level="warn"/>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!--系统操作日志-->
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="file_info"/>
|
||||||
|
<appender-ref ref="file_error"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<root level="error">
|
||||||
|
<appender-ref ref="file_error"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
|
@ -0,0 +1,163 @@
|
||||||
|
<?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>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>2.6.3</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
<groupId>com.watu</groupId>
|
||||||
|
<artifactId>dataSend</artifactId>
|
||||||
|
<version>V3</version>
|
||||||
|
<name>bootdo</name>
|
||||||
|
<description>Demo project for Spring Boot</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<druid.version>1.1.12</druid.version>
|
||||||
|
</properties>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--jdbc-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--mysql-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--数据库连接池 德鲁伊-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>druid</artifactId>
|
||||||
|
<version>${druid.version}</version>
|
||||||
|
<!--<druid.version>1.1.12</druid.version>-->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--log4j-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
<version>1.2.12</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--mybatis-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mybatis.spring.boot</groupId>
|
||||||
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
|
<version>2.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<!--mybatis-->
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-collections</groupId>
|
||||||
|
<artifactId>commons-collections</artifactId>
|
||||||
|
<version>3.2.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.15</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--commons -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.6</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-configuration</groupId>
|
||||||
|
<artifactId>commons-configuration</artifactId>
|
||||||
|
<version>1.10</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba</groupId>
|
||||||
|
<artifactId>fastjson</artifactId>
|
||||||
|
<version>1.2.31</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp/okhttp -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp</groupId>
|
||||||
|
<artifactId>okhttp</artifactId>
|
||||||
|
<version>2.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
<artifactId>okhttp</artifactId>
|
||||||
|
<version>4.9.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.hikvision.ga</groupId>
|
||||||
|
<artifactId>artemis-http-client</artifactId>
|
||||||
|
<version>1.1.3</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- mybatis-plus 增强CRUD -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.baomidou</groupId>
|
||||||
|
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||||
|
<version>3.4.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.22.2</version>
|
||||||
|
<configuration>
|
||||||
|
<skipTests>true</skipTests>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.bootdo;
|
||||||
|
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableTransactionManagement
|
||||||
|
@MapperScan("com.bootdo.datasend.*.mapper")
|
||||||
|
@EnableCaching
|
||||||
|
@EnableAsync(proxyTargetClass = true)
|
||||||
|
@EnableScheduling
|
||||||
|
public class DataSendApplication {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DataSendApplication.class);
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
|
||||||
|
SpringApplication.run(DataSendApplication.class, args);
|
||||||
|
System.out.println("ヾ(◍°∇°◍)ノ゙ bootdo启动成功 ヾ(◍°∇°◍)ノ゙\n" +
|
||||||
|
" ______ _ ______ \n" +
|
||||||
|
"|_ _ \\ / |_|_ _ `. \n" +
|
||||||
|
" | |_) | .--. .--. `| |-' | | `. \\ .--. \n" +
|
||||||
|
" | __'. / .'`\\ \\/ .'`\\ \\| | | | | |/ .'`\\ \\ \n" +
|
||||||
|
" _| |__) || \\__. || \\__. || |, _| |_.' /| \\__. | \n" +
|
||||||
|
"|_______/ '.__.' '.__.' \\__/|______.' '.__.' ");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.bootdo.datasend.dianxin.config;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Binding;
|
||||||
|
import org.springframework.amqp.core.BindingBuilder;
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.amqp.core.TopicExchange;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class RabbitConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue myQueue() {
|
||||||
|
// 创建队列 myQueue
|
||||||
|
return new Queue("myQueue", true);
|
||||||
|
}
|
||||||
|
@Bean
|
||||||
|
public TopicExchange exchange() {
|
||||||
|
return new TopicExchange("warnrecord");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Binding binding(Queue queue, TopicExchange exchange) {
|
||||||
|
return BindingBuilder.bind(queue).to(exchange).with("routing.key.#");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.bootdo.datasend.dianxin.controller.standard;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/api")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ApiController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册直接成功
|
||||||
|
*
|
||||||
|
* @param str
|
||||||
|
* @param response
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@RequestMapping("/test")
|
||||||
|
public Object Register(@RequestBody String str, HttpServletResponse response) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.bootdo.datasend.dianxin.controller.standard;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class ProducerController {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(ProducerController.class);
|
||||||
|
|
||||||
|
private final RabbitTemplate rabbitTemplate;
|
||||||
|
|
||||||
|
public ProducerController(RabbitTemplate rabbitTemplate) {
|
||||||
|
this.rabbitTemplate = rabbitTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/send")
|
||||||
|
public String sendMessage(@RequestBody String message) {
|
||||||
|
rabbitTemplate.convertAndSend("warnrecord", "routing.key.warnrecord", message);
|
||||||
|
return "Message sent!";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public String sendMessagetest() {
|
||||||
|
try {
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("12aaa3", "2aaa34");
|
||||||
|
json.put("2aaa34", "45aaa6");
|
||||||
|
rabbitTemplate.convertAndSend("warnrecord", "routing.key.warnrecord", json);
|
||||||
|
logger.info("Message sent!");
|
||||||
|
return "Message sent!";
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package com.bootdo.datasend.dianxin.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高抛记录表(BaseHighThrowRecord)Domain
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:34:36
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName(value = "base_high_throw_record")
|
||||||
|
public class BaseHighThrowRecord {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备编码
|
||||||
|
*/
|
||||||
|
private String deviceCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道国标编码
|
||||||
|
*/
|
||||||
|
private String gbsChannelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NVR设备编号
|
||||||
|
*/
|
||||||
|
private String serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道号
|
||||||
|
*/
|
||||||
|
private Integer channelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监控大类
|
||||||
|
*/
|
||||||
|
private Integer parentMonitoringType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型
|
||||||
|
*/
|
||||||
|
private Integer deviceType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备能力集
|
||||||
|
*/
|
||||||
|
private String structuredCameraType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安装位置
|
||||||
|
*/
|
||||||
|
private String deviceAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备方位
|
||||||
|
*/
|
||||||
|
private Integer orientation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ip
|
||||||
|
*/
|
||||||
|
private String deviceIp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多维设备SN
|
||||||
|
*/
|
||||||
|
private String geminiSn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场所编码
|
||||||
|
*/
|
||||||
|
private String placeCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场所名称
|
||||||
|
*/
|
||||||
|
private String placeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高抛图路径
|
||||||
|
*/
|
||||||
|
private String highThrowImgurl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 抓拍时间
|
||||||
|
*/
|
||||||
|
private Long passTime;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,206 @@
|
||||||
|
package com.bootdo.datasend.dianxin.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能设备信息表(DevopsDeviceInfo)Domain
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:34:36
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName(value = "devops_device_info")
|
||||||
|
public class DevopsDeviceInfo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
@TableId(value = "id", type = IdType.AUTO)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备编码
|
||||||
|
*/
|
||||||
|
private String deviceCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道国标编码
|
||||||
|
*/
|
||||||
|
private String gbsChannelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监控大类
|
||||||
|
*/
|
||||||
|
private Integer parentMonitoringType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型
|
||||||
|
*/
|
||||||
|
private Integer deviceType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备能力集
|
||||||
|
*/
|
||||||
|
private String structuredCameraType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安装位置
|
||||||
|
*/
|
||||||
|
private String deviceAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备方位
|
||||||
|
*/
|
||||||
|
private Integer orientation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备SN编号
|
||||||
|
*/
|
||||||
|
private String deviceSn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备品牌
|
||||||
|
*/
|
||||||
|
private String deviceBrand;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备ip
|
||||||
|
*/
|
||||||
|
private String deviceIp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备端口
|
||||||
|
*/
|
||||||
|
private Integer devicePort;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备MAC
|
||||||
|
*/
|
||||||
|
private String deviceMac;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备IMEI
|
||||||
|
*/
|
||||||
|
private String deviceImei;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备经度
|
||||||
|
*/
|
||||||
|
private Double longitude;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备纬度
|
||||||
|
*/
|
||||||
|
private Double latitude;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* U3D经度
|
||||||
|
*/
|
||||||
|
private Double u3dLongitude;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* U3D纬度
|
||||||
|
*/
|
||||||
|
private Double u3dLatitude;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备高度
|
||||||
|
*/
|
||||||
|
private String deviceHeight;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备厂家
|
||||||
|
*/
|
||||||
|
private String manufactor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备登陆帐号
|
||||||
|
*/
|
||||||
|
private String account;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备登陆密码
|
||||||
|
*/
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 进出方向
|
||||||
|
*/
|
||||||
|
private Integer direction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RTSP流地址
|
||||||
|
*/
|
||||||
|
private String rtspAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预警等级类型划分(1:一级,3:三级)
|
||||||
|
*/
|
||||||
|
private Integer isDoorwayVideo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商汤region_id
|
||||||
|
*/
|
||||||
|
private String stRegionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商汤camera_idx
|
||||||
|
*/
|
||||||
|
private String stCameraIdx;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道号
|
||||||
|
*/
|
||||||
|
private Integer channelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date createTimeV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建者
|
||||||
|
*/
|
||||||
|
private Integer createByV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*/
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date updateTimeV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新者
|
||||||
|
*/
|
||||||
|
private Integer updateByV;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 场所名称
|
||||||
|
*/
|
||||||
|
private String placeName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备编号
|
||||||
|
*/
|
||||||
|
private String serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多维设备sn
|
||||||
|
*/
|
||||||
|
private String geminiSn;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.bootdo.datasend.dianxin.listener;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MessageConsumer {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
|
||||||
|
|
||||||
|
//测试消费kafka
|
||||||
|
// 监听队列 "myQueue"
|
||||||
|
@RabbitListener(queues = "myQueue")
|
||||||
|
public void receiveMessage(JSONObject message) {
|
||||||
|
try {
|
||||||
|
// 处理接收到的消息
|
||||||
|
logger.info("Received message: " + message.toString());
|
||||||
|
// 在这里添加你对消息的处理逻辑
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 捕获并打印异常
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.bootdo.datasend.dianxin.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.BaseHighThrowRecord;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高抛记录表(BaseHighThrowRecord)Mapper
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:35:05
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface BaseHighThrowRecordMapper extends BaseMapper<BaseHighThrowRecord> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.bootdo.datasend.dianxin.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.DevopsDeviceInfo;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能设备信息表(DevopsDeviceInfo)Mapper
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:35:05
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface DevopsDeviceInfoMapper extends BaseMapper<DevopsDeviceInfo> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package com.bootdo.datasend.dianxin.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.BaseHighThrowRecord;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高抛记录表(BaseHighThrowRecord)Service
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:34:35
|
||||||
|
*/
|
||||||
|
public interface BaseHighThrowRecordService extends IService<BaseHighThrowRecord> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.bootdo.datasend.dianxin.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.DevopsDeviceInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能设备信息表(DevopsDeviceInfo)Service
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:34:36
|
||||||
|
*/
|
||||||
|
public interface DevopsDeviceInfoService extends IService<DevopsDeviceInfo> {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.bootdo.datasend.dianxin.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.BaseHighThrowRecord;
|
||||||
|
import com.bootdo.datasend.dianxin.mapper.BaseHighThrowRecordMapper;
|
||||||
|
import com.bootdo.datasend.dianxin.service.BaseHighThrowRecordService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 高抛记录表(BaseHighThrowRecord)ServiceImpl
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:35:05
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class BaseHighThrowRecordServiceImpl extends ServiceImpl<BaseHighThrowRecordMapper, BaseHighThrowRecord> implements BaseHighThrowRecordService {
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.bootdo.datasend.dianxin.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.bootdo.datasend.dianxin.domain.DevopsDeviceInfo;
|
||||||
|
import com.bootdo.datasend.dianxin.mapper.DevopsDeviceInfoMapper;
|
||||||
|
import com.bootdo.datasend.dianxin.service.DevopsDeviceInfoService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 智能设备信息表(DevopsDeviceInfo)ServiceImpl
|
||||||
|
*
|
||||||
|
* @author makejava
|
||||||
|
* @since 2024-11-18 09:35:05
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class DevopsDeviceInfoServiceImpl extends ServiceImpl<DevopsDeviceInfoMapper, DevopsDeviceInfo> implements DevopsDeviceInfoService {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.bootdo.schedule;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import org.springframework.scheduling.annotation.SchedulingConfigurer;
|
||||||
|
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableScheduling
|
||||||
|
public class ScheduleConfig implements SchedulingConfigurer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
|
||||||
|
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(30));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
|
public class Base64Util {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(Base64Util.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64转图片
|
||||||
|
*
|
||||||
|
* @param base64Code base64码
|
||||||
|
*/
|
||||||
|
public static void convertBase64ToImage(String base64Code, String picname) {
|
||||||
|
|
||||||
|
BufferedImage image = null;
|
||||||
|
byte[] imageByte = null;
|
||||||
|
try {
|
||||||
|
imageByte = DatatypeConverter.parseBase64Binary(base64Code);
|
||||||
|
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
|
||||||
|
image = ImageIO.read(new ByteArrayInputStream(imageByte));
|
||||||
|
bis.close();
|
||||||
|
File outputfile = new File("d:\\" + picname);
|
||||||
|
ImageIO.write(image, "jpg", outputfile);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将图片转换成Base64编码
|
||||||
|
*
|
||||||
|
* @param imgFile 待处理图片
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getImgStr(String imgFile) {
|
||||||
|
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
|
||||||
|
InputStream in = null;
|
||||||
|
byte[] data = null;
|
||||||
|
//读取图片字节数组
|
||||||
|
try {
|
||||||
|
in = new FileInputStream(imgFile);
|
||||||
|
data = new byte[in.available()];
|
||||||
|
in.read(data);
|
||||||
|
in.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.info("base64转换异常,url:" + imgFile);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return java.util.Base64.getEncoder().encodeToString(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理base64串 将+变成空格
|
||||||
|
*
|
||||||
|
* @param urlBase64
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String encodeStr(String urlBase64) {
|
||||||
|
try {
|
||||||
|
urlBase64 = URLEncoder.encode(urlBase64, "UTF-8");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.info(StringKit.getTrace(e));
|
||||||
|
}
|
||||||
|
return urlBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ConfigParam {
|
||||||
|
|
||||||
|
|
||||||
|
public static String SENDTYPE = PropertiesUtil.queryPropertiesByKey("SENDTYPE");
|
||||||
|
}
|
|
@ -0,0 +1,662 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间小工具
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class DateTool {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(DateTool.class);
|
||||||
|
|
||||||
|
private static final long SECOND = 24 * 60 * 60 * 1000L;
|
||||||
|
private static final SimpleDateFormat ym = new SimpleDateFormat("yyyyMM");
|
||||||
|
private static final SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
private static final SimpleDateFormat ymdhms = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||||
|
private static final SimpleDateFormat yyyy = new SimpleDateFormat("yyyy");
|
||||||
|
private static final SimpleDateFormat yMMdd = new SimpleDateFormat("MM-dd");
|
||||||
|
private static final SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
|
||||||
|
private static final SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");
|
||||||
|
private static final SimpleDateFormat YYYYMMDD = new SimpleDateFormat("yyyy-MM-dd");
|
||||||
|
|
||||||
|
public static final SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||||
|
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
private static final SimpleDateFormat ymdDir = new SimpleDateFormat("yyyyMMdd");
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年
|
||||||
|
* 2022
|
||||||
|
*/
|
||||||
|
public int getYear(Date date) {
|
||||||
|
int rel = 0;
|
||||||
|
if (null == date) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
rel = Integer.parseInt(yyyy.format(date));
|
||||||
|
} catch (Exception e) {
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年月
|
||||||
|
* 202205
|
||||||
|
*/
|
||||||
|
public String yearMonth() {
|
||||||
|
return ym.format(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当日开始时间
|
||||||
|
*/
|
||||||
|
public String getStartTime() {
|
||||||
|
long current = System.currentTimeMillis();//当前时间毫秒数
|
||||||
|
//今天零点零分零秒的毫秒数
|
||||||
|
long zero = ((current / SECOND) * SECOND - TimeZone.getDefault().getRawOffset());
|
||||||
|
return ymd.format(zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 带T时间处理
|
||||||
|
*
|
||||||
|
* @param time
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getDateTimeT(long time) {
|
||||||
|
String ymd = YYYYMMDD.format(new Date(time * 1000));
|
||||||
|
String hms = HHmmss.format(new Date(time * 1000));
|
||||||
|
return (ymd + "T" + hms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今日0点的绝对秒
|
||||||
|
*/
|
||||||
|
public Long getStartTimeLong() {
|
||||||
|
long current = System.currentTimeMillis();//当前时间毫秒数
|
||||||
|
//今天零点零分零秒的毫秒数
|
||||||
|
long zero = ((current / SECOND) * SECOND - TimeZone.getDefault().getRawOffset());
|
||||||
|
return zero / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当日结束时间
|
||||||
|
*/
|
||||||
|
public String getEndTime() {
|
||||||
|
long current = System.currentTimeMillis();//当前时间毫秒数
|
||||||
|
//今天零点零分零秒的毫秒数
|
||||||
|
long zero = (current / SECOND) * SECOND - TimeZone.getDefault().getRawOffset();
|
||||||
|
//今天23点59分59秒的毫秒数
|
||||||
|
long twelve = (zero + SECOND - 1);
|
||||||
|
return ymd.format(twelve);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今天23点59分59秒 绝对秒
|
||||||
|
*/
|
||||||
|
public Long getEndTimeLong() {
|
||||||
|
long current = System.currentTimeMillis();//当前时间毫秒数
|
||||||
|
//今天零点零分零秒的毫秒数
|
||||||
|
long zero = (current / SECOND) * SECOND - TimeZone.getDefault().getRawOffset();
|
||||||
|
//今天23点59分59秒的毫秒数
|
||||||
|
long twelve = (zero + SECOND - 1);
|
||||||
|
return twelve / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取日期格式字符串时间
|
||||||
|
*/
|
||||||
|
public String getDateTime(long time) {
|
||||||
|
if (time == 0L) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
String format = ymd.format(new Date(time * 1000));
|
||||||
|
if (StringUtils.isNotBlank(format)) {
|
||||||
|
return format;
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今天 2022-08-18 00:00:00
|
||||||
|
*/
|
||||||
|
public String getDayStart() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
String startDate = ymd.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10) + " 00:00:00";
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今天 2022-08-18 23:59:59
|
||||||
|
*/
|
||||||
|
public String getDayEnd() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
String endDate = ymd.format(calendar.getTime());
|
||||||
|
endDate = endDate.substring(0, 10) + " 23:59:59";
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前一天 2022-08-15 00:00:00
|
||||||
|
*/
|
||||||
|
public static String getLastDayStart() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
String startDate = ymd.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10) + " 00:00:00";
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前一天 时间戳
|
||||||
|
*/
|
||||||
|
public static String getLastDayStartTimestamp() {
|
||||||
|
try {
|
||||||
|
String format = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
String dateStr = getLastDayStart();
|
||||||
|
SimpleDateFormat ft = new SimpleDateFormat(format);
|
||||||
|
Date date = ft.parse(dateStr);
|
||||||
|
long resL = date.getTime();
|
||||||
|
String res = StringKit.toString(resL / 1000);
|
||||||
|
return StringKit.toString(res);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前一天 2022-08-15 23:59:59
|
||||||
|
*/
|
||||||
|
public String getLastDayEnd() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
String endDate = ymd.format(calendar.getTime());
|
||||||
|
endDate = endDate.substring(0, 10) + " 23:59:59";
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前一天 年月日
|
||||||
|
*/
|
||||||
|
public String getDayStr() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
String dayStr = yyyyMMdd.format(calendar.getTime());
|
||||||
|
return dayStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取年月日时间
|
||||||
|
* yyyyMMdd
|
||||||
|
*/
|
||||||
|
public String getDayStr(long longStr) {
|
||||||
|
String rel = "";
|
||||||
|
try {
|
||||||
|
rel = yyyyMMdd.format(longStr * 1000);
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取年月日时间
|
||||||
|
* yyyyMMdd
|
||||||
|
*/
|
||||||
|
public String getDayStr2(String date) {
|
||||||
|
String rel = "";
|
||||||
|
try {
|
||||||
|
rel = yyyyMMdd.format(ymd.parse(date));
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期字符串 计算 绝对秒
|
||||||
|
*/
|
||||||
|
public long getDayLong(String date) {
|
||||||
|
try {
|
||||||
|
Date parse = ymd.parse(date);
|
||||||
|
return parse.getTime() / 1000;
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前年份
|
||||||
|
*/
|
||||||
|
public String getYear() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -1);
|
||||||
|
String endDate = ymd.format(calendar.getTime());
|
||||||
|
endDate = endDate.substring(0, 10) + " 23:59:59";
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取每个月的第一天
|
||||||
|
*/
|
||||||
|
public String getMonthFirst() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.set(Calendar.DATE, 1);
|
||||||
|
calendar.roll(Calendar.DATE, -1);
|
||||||
|
|
||||||
|
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM-");
|
||||||
|
String startTime = sdfTwo.format(new Date()) + "01 00:00:00";
|
||||||
|
return startTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取每个月的最后一天
|
||||||
|
*/
|
||||||
|
public String getMonthLast() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.set(Calendar.DATE, 1);
|
||||||
|
calendar.roll(Calendar.DATE, -1);
|
||||||
|
|
||||||
|
int maxDate = calendar.get(Calendar.DATE);
|
||||||
|
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM-");
|
||||||
|
String endTime = sdfTwo.format(new Date()) + maxDate + " 23:59:59";
|
||||||
|
return endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前n天 2022-08-15 23:59:59
|
||||||
|
*/
|
||||||
|
public String getDayStart(int n) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -n);
|
||||||
|
String startDate = ymd.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10) + " 00:00:00";
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前n天 2022-08-15 23:59:59
|
||||||
|
*/
|
||||||
|
public String getDayStartYYYYMMDD(int n) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -n);
|
||||||
|
String startDate = ymd.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10);
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前n天 2022-08-15 23:59:59
|
||||||
|
*/
|
||||||
|
public String getDayEnd(int n) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -n);
|
||||||
|
String endDate = ymd.format(calendar.getTime());
|
||||||
|
endDate = endDate.substring(0, 10) + " 23:59:59";
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取n天前的指定日期
|
||||||
|
*/
|
||||||
|
public String getYMD(int n) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -n);
|
||||||
|
String ymd = yyyyMMdd.format(calendar.getTime());
|
||||||
|
return ymd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前ymdhms日期格式
|
||||||
|
*/
|
||||||
|
public String getYmdhms() {
|
||||||
|
return ymdhms.format(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* yyyyMMdd转mm.dd
|
||||||
|
*/
|
||||||
|
public String timeConversion(String yyyyMMdd) {
|
||||||
|
String rel = "";
|
||||||
|
try {
|
||||||
|
if (StringUtils.isBlank(yyyyMMdd)) {
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
if (yyyyMMdd.length() != 8) {
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
String mm = yyyyMMdd.substring(4, 6);
|
||||||
|
String dd = yyyyMMdd.substring(6, 8);
|
||||||
|
rel = String.valueOf(Integer.parseInt(mm)) + "." + String.valueOf(Integer.parseInt(dd));
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年月
|
||||||
|
* m=0表示当月
|
||||||
|
* m=1表示前一月
|
||||||
|
* m=2表示前两月
|
||||||
|
*/
|
||||||
|
public String yearMonth(int m) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.MONTH, -m);
|
||||||
|
return ym.format(calendar.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDayStr3(String date) {
|
||||||
|
String rel = "";
|
||||||
|
try {
|
||||||
|
Date parse = yyyyMMdd.parse(date);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long daysBetween(String one, String two) {
|
||||||
|
long difference = 0L;
|
||||||
|
try {
|
||||||
|
Date parseOne = yyyyMMdd.parse(one);
|
||||||
|
Date parseTwo = yyyyMMdd.parse(two);
|
||||||
|
difference = (parseOne.getTime() - parseTwo.getTime()) / 86400000;
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return Math.abs(difference) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取前N天 MMdd
|
||||||
|
*/
|
||||||
|
public static String getLastDayMmdd(int num) {
|
||||||
|
if (num == 0) {
|
||||||
|
num = 1;
|
||||||
|
}
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -num);
|
||||||
|
String startDate = yMMdd.format(calendar.getTime());
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* n个月前的1号开始时间
|
||||||
|
*/
|
||||||
|
public String getMonthFirst(int n) {
|
||||||
|
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM");
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.MONTH, -n);
|
||||||
|
Date m = calendar.getTime();
|
||||||
|
String format = sdfTwo.format(m);
|
||||||
|
return format + "-01 00:00:00";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* n个月前的最后一天结束时间
|
||||||
|
*/
|
||||||
|
public String getMonthLast(int n) {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.set(Calendar.MONTH, 1 - n + 2);
|
||||||
|
calendar.set(Calendar.DATE, 1);
|
||||||
|
calendar.roll(Calendar.DATE, -1);
|
||||||
|
int maxDate = calendar.get(Calendar.DATE);
|
||||||
|
SimpleDateFormat sdfTwo = new SimpleDateFormat("yyyy-MM-");
|
||||||
|
String endTime = sdfTwo.format(calendar.getTime()) + maxDate + " 23:59:59";
|
||||||
|
return endTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间转换为时间戳
|
||||||
|
*/
|
||||||
|
public static String dateToStamp(String s) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
String res;
|
||||||
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
|
||||||
|
Date date = simpleDateFormat.parse(s);
|
||||||
|
long ts = date.getTime();
|
||||||
|
ts = ts / 1000;
|
||||||
|
res = StringKit.toString(ts);
|
||||||
|
return res;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间转换为时间戳
|
||||||
|
*/
|
||||||
|
public static String getNowTimeStr() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
String currentTime = df.format(new Date());
|
||||||
|
return currentTime;
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.info(StringKit.getTrace(e));
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getTime() {
|
||||||
|
return ymdhms.format(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间戳转换成 标准时间
|
||||||
|
*
|
||||||
|
* @param seconds
|
||||||
|
* @param format
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String timeStamp2Date(String seconds, String format) {
|
||||||
|
if (seconds == null || seconds.isEmpty() || seconds.equals("null")) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (format == null || format.isEmpty()) {
|
||||||
|
format = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
}
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
||||||
|
return sdf.format(new Date(Long.valueOf(seconds + "000")));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上个月 时间戳转换成 标准时间
|
||||||
|
*
|
||||||
|
* @param format
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getLastMonth(String format) {
|
||||||
|
Calendar calendar = Calendar.getInstance();//日历对象
|
||||||
|
calendar.setTime(new Date());//设置当前日期
|
||||||
|
calendar.add(Calendar.MONTH, -1);//月份减一
|
||||||
|
Date lastMonth = calendar.getTime();
|
||||||
|
|
||||||
|
if (format == null || format.isEmpty()) {
|
||||||
|
format = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
}
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(format);
|
||||||
|
return sdf.format(lastMonth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDateStr(String sendTime) {
|
||||||
|
String dateStr;
|
||||||
|
String dateFir = StringKit.toString(sendTime);
|
||||||
|
Date date = null;
|
||||||
|
if ("".equals(dateFir)) {
|
||||||
|
date = new Date(System.currentTimeMillis());
|
||||||
|
} else {
|
||||||
|
Long dateFirL = Long.valueOf(dateFir);
|
||||||
|
date = new Date(dateFirL * 1000);
|
||||||
|
}
|
||||||
|
dateStr = sdf.format(date);
|
||||||
|
return dateStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String convertTimeToString(String longTime) {
|
||||||
|
String format = "yyyyMMddHHmmss";
|
||||||
|
try {
|
||||||
|
Timestamp t = new Timestamp(Long.parseLong(longTime) * 1000L);
|
||||||
|
SimpleDateFormat sDateFormat = new SimpleDateFormat(format);
|
||||||
|
return sDateFormat.format(t);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
throw new RuntimeException((new StringBuilder()).append("Can't format the time by format[").append(format).append("]!").toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 30天前
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String readRecordStart() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, -30);
|
||||||
|
String startDate = sdf.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10) + " 00:00:00";
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String readRecordDayStart() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
calendar.add(Calendar.DAY_OF_MONTH, 0);
|
||||||
|
String startDate = sdf.format(calendar.getTime());
|
||||||
|
startDate = startDate.substring(0, 10) + " 00:00:00";
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 今天
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String readRecordEnd() {
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
calendar.setTime(new Date());
|
||||||
|
String endDate = sdf.format(calendar.getTime());
|
||||||
|
endDate = endDate.substring(0, 10) + " 23:59:59";
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据绝对秒 计算年月 yyyyMM
|
||||||
|
*
|
||||||
|
* @param tempLongTime
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static int yearMonth(String tempLongTime) {
|
||||||
|
if (StringUtils.isBlank(tempLongTime) || tempLongTime.length() != 10) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
String format = ym.format(new Date(Long.parseLong(tempLongTime) * 1000L));
|
||||||
|
return Integer.parseInt(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String yearMonthDay(String tempLongTime) {
|
||||||
|
if (StringUtils.isBlank(tempLongTime) || tempLongTime.length() != 10) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String format = ymd.format(new Date(Long.parseLong(tempLongTime) * 1000L));
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 特殊场景
|
||||||
|
* 通过jpg获取时间
|
||||||
|
*
|
||||||
|
* @param tempLongTime
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static long ymdhms(String tempLongTime) {
|
||||||
|
long rel = 0;
|
||||||
|
try {
|
||||||
|
rel = ymdhms.parse(tempLongTime).getTime() / 1000;
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getLongTime(String tempLongTime) {
|
||||||
|
long rel = 0;
|
||||||
|
try {
|
||||||
|
rel = ymd.parse(tempLongTime).getTime() / 1000;
|
||||||
|
} catch (ParseException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String ymdhmsDate() {
|
||||||
|
return ymdhms.format(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始时间
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getStart() {
|
||||||
|
long time = System.currentTimeMillis() / 1000 - 60 * 60 * 24 * 180;
|
||||||
|
return ymd.format(new Date(time * 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前日期
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getEnd() {
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
return ymd.format(new Date(time));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间戳对应日期目录
|
||||||
|
*/
|
||||||
|
public static String dateDir(long longTime) {
|
||||||
|
String tempLongTime = String.valueOf(longTime);
|
||||||
|
String format = ymdDir.format(new Date(Long.parseLong(tempLongTime) * 1000L));
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期处理
|
||||||
|
*/
|
||||||
|
public class DateUtils {
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(DateUtils.class);
|
||||||
|
/**
|
||||||
|
* 时间格式(yyyy-MM-dd)
|
||||||
|
*/
|
||||||
|
public final static String DATE_PATTERN = "yyyy-MM-dd";
|
||||||
|
/**
|
||||||
|
* 时间格式(yyyy-MM-dd HH:mm:ss)
|
||||||
|
*/
|
||||||
|
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
|
public static String format(Date date) {
|
||||||
|
return format(date, DATE_PATTERN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String format(Date date, String pattern) {
|
||||||
|
if (date != null) {
|
||||||
|
SimpleDateFormat df = new SimpleDateFormat(pattern);
|
||||||
|
return df.format(date);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算距离现在多久,非精确
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getTimeBefore(Date date) {
|
||||||
|
Date now = new Date();
|
||||||
|
long l = now.getTime() - date.getTime();
|
||||||
|
long day = l / (24 * 60 * 60 * 1000);
|
||||||
|
long hour = (l / (60 * 60 * 1000) - day * 24);
|
||||||
|
long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
|
||||||
|
long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
|
||||||
|
String r = "";
|
||||||
|
if (day > 0) {
|
||||||
|
r += day + "天";
|
||||||
|
} else if (hour > 0) {
|
||||||
|
r += hour + "小时";
|
||||||
|
} else if (min > 0) {
|
||||||
|
r += min + "分";
|
||||||
|
} else if (s > 0) {
|
||||||
|
r += s + "秒";
|
||||||
|
}
|
||||||
|
r += "前";
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算距离现在多久,精确
|
||||||
|
*
|
||||||
|
* @param date
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getTimeBeforeAccurate(Date date) {
|
||||||
|
Date now = new Date();
|
||||||
|
long l = now.getTime() - date.getTime();
|
||||||
|
long day = l / (24 * 60 * 60 * 1000);
|
||||||
|
long hour = (l / (60 * 60 * 1000) - day * 24);
|
||||||
|
long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
|
||||||
|
long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
|
||||||
|
String r = "";
|
||||||
|
if (day > 0) {
|
||||||
|
r += day + "天";
|
||||||
|
}
|
||||||
|
if (hour > 0) {
|
||||||
|
r += hour + "小时";
|
||||||
|
}
|
||||||
|
if (min > 0) {
|
||||||
|
r += min + "分";
|
||||||
|
}
|
||||||
|
if (s > 0) {
|
||||||
|
r += s + "秒";
|
||||||
|
}
|
||||||
|
r += "前";
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDateStr(String seconds){
|
||||||
|
SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_PATTERN);
|
||||||
|
return sdf.format(new Date(Long.valueOf(seconds+"000")));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
|
||||||
|
import javax.crypto.Mac;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ant 加密 工具类
|
||||||
|
*
|
||||||
|
* @author bc
|
||||||
|
* @Date 2020-08-12 9:34
|
||||||
|
*/
|
||||||
|
public class EncryptUtil {
|
||||||
|
|
||||||
|
protected final static Charset CHARSET_UTF8 = Charset.forName("utf-8");
|
||||||
|
|
||||||
|
private final static String SECRET_ID = "SecretId";
|
||||||
|
|
||||||
|
private final static String BODY = "Body";
|
||||||
|
|
||||||
|
private final static String TIME_STAMP = "Timestamp";
|
||||||
|
|
||||||
|
private final static String SIGNVERSION = "Signversion";
|
||||||
|
|
||||||
|
private final static String MAC_NAME = "HmacSHA1";
|
||||||
|
|
||||||
|
private final static String EQUALS_SYMBOL = "=";
|
||||||
|
|
||||||
|
private final static String AND = "&";
|
||||||
|
|
||||||
|
private final static Base64 base64 = new Base64();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成签名
|
||||||
|
*
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @param secretId 申请的secretId
|
||||||
|
* @param secretKey 申请的secretKey
|
||||||
|
* @param contentJsonString 待加密的字符串
|
||||||
|
* @param method 方法名
|
||||||
|
* @return 生成的验签签名
|
||||||
|
*/
|
||||||
|
public static String signature(String timestamp, String secretId, String secretKey, String contentJsonString,String method) throws Exception {
|
||||||
|
|
||||||
|
String stringBuilder = toSignSourceSimplePost(timestamp, secretId, contentJsonString);
|
||||||
|
System.out.println("stringBuilder:"+stringBuilder);
|
||||||
|
byte[] bytes = hmacSHA1Encrypt(stringBuilder, secretKey);
|
||||||
|
return base64.encodeToString(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简单拼接顺序字符串
|
||||||
|
*/
|
||||||
|
private static String toSignSourceSimplePost(String timestamp, String secretId, String jsonStr) {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append(SECRET_ID).append(EQUALS_SYMBOL).append(secretId).append(AND);
|
||||||
|
builder.append(TIME_STAMP).append(EQUALS_SYMBOL).append(timestamp).append(AND);
|
||||||
|
builder.append(SIGNVERSION).append(EQUALS_SYMBOL).append("v2").append(AND);
|
||||||
|
builder.append(BODY).append(EQUALS_SYMBOL).append(jsonStr);
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String toSignSourceSimpleGet(String timestamp, String secretId, String jsonStr) {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append(SECRET_ID).append(EQUALS_SYMBOL).append(secretId).append(AND);
|
||||||
|
builder.append(TIME_STAMP).append(EQUALS_SYMBOL).append(timestamp).append(AND);
|
||||||
|
builder.append(SIGNVERSION).append(EQUALS_SYMBOL).append("v2");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加密原始参数
|
||||||
|
*
|
||||||
|
* @param encryptText 待加密的原始字符串
|
||||||
|
* @param encryptKey 颁发的secretKey
|
||||||
|
* @return 加密的byte数组,用于生成签名
|
||||||
|
*/
|
||||||
|
private static byte[] hmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
|
||||||
|
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
|
||||||
|
SecretKey secretKey = new SecretKeySpec(encryptKey.getBytes(CHARSET_UTF8), MAC_NAME);
|
||||||
|
//生成一个指定 Mac 算法 的 Mac 对象
|
||||||
|
Mac mac = Mac.getInstance(MAC_NAME);
|
||||||
|
//用给定密钥初始化 Mac 对象
|
||||||
|
mac.init(secretKey);
|
||||||
|
|
||||||
|
byte[] data = encryptText.getBytes(CHARSET_UTF8);
|
||||||
|
if (null == data || 0 == data.length){
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
if(data.length>1024){
|
||||||
|
data = Arrays.copyOfRange(data,0,1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
//完成 Mac 操作
|
||||||
|
return mac.doFinal(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String key = "SecretId=J5HrA2KccOexV0IWx8I&Timestamp=1597659585761&Body={\n" +
|
||||||
|
" \"account\": \"string\",\n" +
|
||||||
|
" \"cameraId\": \"string\",\n" +
|
||||||
|
" \"cameraName\": \"string\",\n" +
|
||||||
|
" \"cameraSerialNum\": \"string\",\n" +
|
||||||
|
" \"deviceType\": \"string\",\n" +
|
||||||
|
" \"groupId\": \"string\",\n" +
|
||||||
|
" \"ip\": \"string\",\n" +
|
||||||
|
" \"lat\": \"string\",\n" +
|
||||||
|
" \"lng\": \"string\",\n" +
|
||||||
|
" \"password\": \"string\",\n" +
|
||||||
|
" \"port\": \"string\",\n" +
|
||||||
|
" \"rtsp\": \"string\",\n" +
|
||||||
|
" \"suppleRtsp\": \"string\"\n" +
|
||||||
|
"}";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 全局常量类
|
||||||
|
*/
|
||||||
|
public class Gl {
|
||||||
|
|
||||||
|
public static final String DEFAULT_20 = "88321023198905233412";
|
||||||
|
public static final int BATCH_NUM = 1000;
|
||||||
|
|
||||||
|
|
||||||
|
// bcp文件基础路径
|
||||||
|
public static final String BASE_BCP_PATH = "/home/dataaccess/";
|
||||||
|
// bcp文件error路径
|
||||||
|
public static final String BASE_BCP_PATH_ERROR = "/home/error/";
|
||||||
|
// bcp类型 人脸
|
||||||
|
public static final String BCP_TYPE_RENLIAN = "renlian";
|
||||||
|
// bcp类型 车辆
|
||||||
|
public static final String BCP_TYPE_CHELIANG = "cheliang";
|
||||||
|
// bcp类型 门禁
|
||||||
|
public static final String BCP_TYPE_MENJING = "menjing";
|
||||||
|
// bcp类型 测温
|
||||||
|
public static final String BCP_TYPE_CEWEN = "cewen";
|
||||||
|
// bcp类型 ETC
|
||||||
|
public static final String BCP_TYPE_ETC = "etc";
|
||||||
|
// bcp类型 高空抛物
|
||||||
|
public static final String BCP_TYPE_GAOPAO = "gaopao";
|
||||||
|
// bcp类型 高空抛物
|
||||||
|
public static final String BCP_TYPE_YANGAN = "yangan";
|
||||||
|
|
||||||
|
// bcp文件标识 人脸抓拍
|
||||||
|
public static final String FILE_FLAG_FACE = "FaceCapture";
|
||||||
|
// bcp文件标识 人脸门禁
|
||||||
|
public static final String FILE_FLAG_DOOR_FACE = "DoorEvent";
|
||||||
|
// bcp文件标识 测温
|
||||||
|
public static final String FILE_FLAG_THERMAL = "Thermal";
|
||||||
|
// bcp文件标识 车辆抓拍
|
||||||
|
public static final String FILE_FLAG_VEHICLE = "CarMessage";
|
||||||
|
// bcp文件标识 ETC抓拍
|
||||||
|
public static final String FILE_FLAG_ETC = "ETC";
|
||||||
|
// bcp文件标识 高空抛物
|
||||||
|
public static final String FILE_FLAG_GAOPAO = "Parabolic";
|
||||||
|
// bcp文件标识 烟感告警
|
||||||
|
public static final String FILE_FLAG_YANGAN = "Smoke_";
|
||||||
|
// bcp文件标识 烟感状态
|
||||||
|
public static final String FILE_FLAG_YANGAN_STATUS = "SmokeStatus";
|
||||||
|
|
||||||
|
// txt文件标识 多码 电子围栏
|
||||||
|
public static final String FILE_FLAG_FENCE = "WY_";
|
||||||
|
|
||||||
|
// bcp文件标识
|
||||||
|
public static final String FILE_FLAG_BCP = ".bcp";
|
||||||
|
// txt文件标识
|
||||||
|
public static final String FILE_FLAG_TXT = ".txt";
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* MD5加密工具(是基于hash算法实现,不可逆)
|
||||||
|
*
|
||||||
|
* @author xuyi3
|
||||||
|
* @2016年7月13日 @下午3:10:54
|
||||||
|
* @Md5Utils
|
||||||
|
* @功能说明:<br>
|
||||||
|
* @春风十里不如你
|
||||||
|
* @备注
|
||||||
|
*/
|
||||||
|
public class Md5Utils {
|
||||||
|
|
||||||
|
/** 16进制的字符数组 */
|
||||||
|
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
|
||||||
|
"e", "f" };
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param source
|
||||||
|
* 需要加密的原字符串
|
||||||
|
* @param encoding
|
||||||
|
* 指定编码类型
|
||||||
|
* @param uppercase
|
||||||
|
* 是否转为大写字符串
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String MD5Encode(String source, String encoding, boolean uppercase) {
|
||||||
|
String result = null;
|
||||||
|
try {
|
||||||
|
result = source;
|
||||||
|
// 获得MD5摘要对象
|
||||||
|
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
||||||
|
// 使用指定的字节数组更新摘要信息
|
||||||
|
messageDigest.update(result.getBytes(encoding));
|
||||||
|
// messageDigest.digest()获得16位长度
|
||||||
|
result = byteArrayToHexString(messageDigest.digest());
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return uppercase ? result.toUpperCase() : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换字节数组为16进制字符串
|
||||||
|
*
|
||||||
|
* @param bytes
|
||||||
|
* 字节数组
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String byteArrayToHexString(byte[] bytes) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
for (byte tem : bytes) {
|
||||||
|
stringBuilder.append(byteToHexString(tem));
|
||||||
|
}
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换byte到16进制
|
||||||
|
*
|
||||||
|
* @param b
|
||||||
|
* 要转换的byte
|
||||||
|
* @return 16进制对应的字符
|
||||||
|
*/
|
||||||
|
private static String byteToHexString(byte b) {
|
||||||
|
int n = b;
|
||||||
|
if (n < 0) {
|
||||||
|
n = 256 + n;
|
||||||
|
}
|
||||||
|
int d1 = n / 16;
|
||||||
|
int d2 = n % 16;
|
||||||
|
return hexDigits[d1] + hexDigits[d2];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getResponse(String username, String realm, String password, String method, String url, String nonce, String nc, String cnonce, String qop) {
|
||||||
|
// HA1 = md5("username:realm:password");
|
||||||
|
String Ha1str = username+":"+realm+":"+password;
|
||||||
|
String resHa1 = MD5Encode(Ha1str,"utf-8",false);
|
||||||
|
|
||||||
|
// HA2 = md5("method:uri");
|
||||||
|
String Ha2str = method+":"+url;
|
||||||
|
String resHa2 = MD5Encode(Ha2str,"utf-8",false);
|
||||||
|
|
||||||
|
|
||||||
|
// response = md5("HA1:nouce:nc:cnonce:qop:HA2");
|
||||||
|
String responsestr = resHa1+":"+nonce+":"+nc+":"+cnonce+":"+qop+":"+resHa2;
|
||||||
|
String responseHa2 = MD5Encode(responsestr,"utf-8",false);
|
||||||
|
// 188ffa2b22cb3b0cf20d5c05131953fe
|
||||||
|
return responseHa2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//备注:其实apache commones Codec包中有常用的一些加密算法实现
|
|
@ -0,0 +1,78 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
|
||||||
|
import javax.net.ssl.HostnameVerifier;
|
||||||
|
import javax.net.ssl.SSLContext;
|
||||||
|
import javax.net.ssl.SSLEngine;
|
||||||
|
import javax.net.ssl.SSLSession;
|
||||||
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
|
import javax.net.ssl.TrustManager;
|
||||||
|
import javax.net.ssl.X509ExtendedTrustManager;
|
||||||
|
|
||||||
|
public class MySSLSocketClient {
|
||||||
|
|
||||||
|
//获取TrustManager
|
||||||
|
public static X509ExtendedTrustManager X509 = new X509ExtendedTrustManager() {
|
||||||
|
@Override
|
||||||
|
public void checkClientTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkServerTrusted(X509Certificate[] x509Certificates, String s, Socket socket) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkClientTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkServerTrusted(X509Certificate[] x509Certificates, String s, SSLEngine sslEngine) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public X509Certificate[] getAcceptedIssuers() {
|
||||||
|
return new X509Certificate[0];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//获取这个SSLSocketFactory
|
||||||
|
public static SSLSocketFactory getSSLSocketFactory() {
|
||||||
|
try {
|
||||||
|
SSLContext sslContext = SSLContext.getInstance("SSL");
|
||||||
|
sslContext.init(null, new TrustManager[]{X509}, new SecureRandom());
|
||||||
|
return sslContext.getSocketFactory();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//获取HostnameVerifier
|
||||||
|
public static HostnameVerifier getHostnameVerifier() {
|
||||||
|
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
|
||||||
|
@Override
|
||||||
|
public boolean verify(String s, SSLSession sslSession) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return hostnameVerifier;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
public class NumKit {
|
||||||
|
|
||||||
|
public NumKit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Double checkDouble(String num) {
|
||||||
|
try {
|
||||||
|
Double i = Double.valueOf(num);
|
||||||
|
return i;
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0D;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer checkInt(String num) {
|
||||||
|
try {
|
||||||
|
Integer i = Integer.valueOf(num);
|
||||||
|
return i;
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long checkLong(String num) {
|
||||||
|
try {
|
||||||
|
Long i = Long.valueOf(num);
|
||||||
|
return i;
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BigDecimal checkBigDecimal(String num) {
|
||||||
|
try {
|
||||||
|
BigDecimal bd = new BigDecimal(num);
|
||||||
|
return bd;
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OrderedProperties
|
||||||
|
* @author Unmi
|
||||||
|
* @date 2012-12-07
|
||||||
|
*/
|
||||||
|
public class OrderedProperties extends Properties {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -4627607243846121965L;
|
||||||
|
|
||||||
|
private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
|
||||||
|
|
||||||
|
public Enumeration<Object> keys() {
|
||||||
|
return Collections.<Object> enumeration(keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object put(Object key, Object value) {
|
||||||
|
keys.add(key);
|
||||||
|
return super .put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Object> keySet() {
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> stringPropertyNames() {
|
||||||
|
Set<String> set = new LinkedHashSet<String>();
|
||||||
|
|
||||||
|
for (Object key : this .keys) {
|
||||||
|
set.add((String) key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.tomcat.util.codec.binary.Base64;
|
||||||
|
import sun.misc.BASE64Decoder;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成图片工具类
|
||||||
|
*/
|
||||||
|
public class PicFile {
|
||||||
|
|
||||||
|
private static BASE64Decoder decoder = new BASE64Decoder();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成图片
|
||||||
|
*/
|
||||||
|
public static boolean generateImage1(String filePath, String imgBase64Str, String fileName) {
|
||||||
|
if (StringUtils.isBlank(filePath)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(imgBase64Str)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(fileName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
byte[] b = decoder.decodeBuffer(imgBase64Str);
|
||||||
|
ByteArrayInputStream inputStream = new ByteArrayInputStream(b);
|
||||||
|
File file = new File(filePath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdirs();
|
||||||
|
}
|
||||||
|
if (!filePath.endsWith("/")) {
|
||||||
|
filePath = filePath + "/";
|
||||||
|
}
|
||||||
|
File f = new File(filePath + fileName);
|
||||||
|
BufferedImage bi = ImageIO.read(inputStream);
|
||||||
|
ImageIO.write(bi, "jpg", f);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64转图片
|
||||||
|
*/
|
||||||
|
public static boolean generateImage(String filePath, String imgBase64Str, String fileName) {
|
||||||
|
if (StringUtils.isBlank(filePath)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(imgBase64Str)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(fileName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
BufferedImage image = null;
|
||||||
|
byte[] imageByte = null;
|
||||||
|
try {
|
||||||
|
imageByte = DatatypeConverter.parseBase64Binary(imgBase64Str);
|
||||||
|
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
|
||||||
|
image = ImageIO.read(new ByteArrayInputStream(imageByte));
|
||||||
|
bis.close();
|
||||||
|
File outPutFile = new File(filePath + fileName);
|
||||||
|
ImageIO.write(image, "jpg", outPutFile);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64转图片
|
||||||
|
*/
|
||||||
|
public static boolean generateImage(String filePathName, String imgBase64Str) {
|
||||||
|
if (StringUtils.isBlank(filePathName)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(imgBase64Str)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
BufferedImage image = null;
|
||||||
|
byte[] imageByte = null;
|
||||||
|
try {
|
||||||
|
imageByte = DatatypeConverter.parseBase64Binary(imgBase64Str);
|
||||||
|
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
|
||||||
|
image = ImageIO.read(new ByteArrayInputStream(imageByte));
|
||||||
|
bis.close();
|
||||||
|
File outPutFile = new File(filePathName + ".tmp");
|
||||||
|
String fileFolder = outPutFile.getParent();
|
||||||
|
File folderFile = new File(fileFolder);
|
||||||
|
if(!folderFile.exists()){
|
||||||
|
folderFile.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageIO.write(image, "jpg", outPutFile);
|
||||||
|
outPutFile.renameTo(new File(filePathName));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将图片转换成Base64编码
|
||||||
|
*/
|
||||||
|
public static String getImgStr(String imgFile) {
|
||||||
|
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
|
||||||
|
InputStream in = null;
|
||||||
|
byte[] data = null;
|
||||||
|
//读取图片字节数组
|
||||||
|
try {
|
||||||
|
in = new FileInputStream(imgFile);
|
||||||
|
data = new byte[in.available()];
|
||||||
|
in.read(data);
|
||||||
|
in.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return new String(Base64.encodeBase64(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,189 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取Properties综合类,默认绑定到classpath下的config.properties文件。
|
||||||
|
*
|
||||||
|
* @author 朱志杰 QQ:695520848
|
||||||
|
*/
|
||||||
|
public class PropertiesUtil {
|
||||||
|
//配置文件的路径
|
||||||
|
private String configPath = "config"+File.separator+"application.properties";
|
||||||
|
public static final String Path = "config"+File.separator+"application.properties";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置文件对象
|
||||||
|
*/
|
||||||
|
private Properties props = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 默认构造函数,用于sh运行,自动找到classpath下的config.properties。
|
||||||
|
*/
|
||||||
|
public PropertiesUtil() throws IOException {
|
||||||
|
InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("application.properties");
|
||||||
|
props = new Properties();
|
||||||
|
props.load(in);
|
||||||
|
//关闭资源
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据key值读取配置的值
|
||||||
|
* Jun 26, 2010 9:15:43 PM
|
||||||
|
*
|
||||||
|
* @param key key值
|
||||||
|
* @return key 键对应的值
|
||||||
|
* @throws IOException
|
||||||
|
* @author 朱志杰
|
||||||
|
*/
|
||||||
|
public String readValue(String key) throws IOException {
|
||||||
|
return props.getProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取properties的全部信息
|
||||||
|
* Jun 26, 2010 9:21:01 PM
|
||||||
|
*
|
||||||
|
* @throws FileNotFoundException 配置文件没有找到
|
||||||
|
* @throws IOException 关闭资源文件,或者加载配置文件错误
|
||||||
|
* @author 朱志杰
|
||||||
|
*/
|
||||||
|
public Map<String, String> readAllProperties() throws FileNotFoundException, IOException {
|
||||||
|
//保存所有的键值
|
||||||
|
Map<String, String> map = new HashMap<String, String>();
|
||||||
|
Enumeration en = props.propertyNames();
|
||||||
|
while (en.hasMoreElements()) {
|
||||||
|
String key = (String) en.nextElement();
|
||||||
|
String Property = props.getProperty(key);
|
||||||
|
map.put(key, Property);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置某个key的值,并保存至文件。
|
||||||
|
* Jun 26, 2010 9:15:43 PM
|
||||||
|
*
|
||||||
|
* @param key key值
|
||||||
|
* @return key 键对应的值
|
||||||
|
* @throws IOException
|
||||||
|
* @author 朱志杰
|
||||||
|
*/
|
||||||
|
public void setValue(String key, String value) throws IOException {
|
||||||
|
Properties prop = new Properties();
|
||||||
|
InputStream fis = new FileInputStream(this.configPath);
|
||||||
|
// 从输入流中读取属性列表(键和元素对)
|
||||||
|
prop.load(fis);
|
||||||
|
// 调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
|
||||||
|
// 强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
|
||||||
|
OutputStream fos = new FileOutputStream(this.configPath);
|
||||||
|
prop.setProperty(key, value);
|
||||||
|
// 以适合使用 load 方法加载到 Properties 表中的格式,
|
||||||
|
// 将此 Properties 表中的属性列表(键和元素对)写入输出流
|
||||||
|
prop.store(fos, "last update");
|
||||||
|
//关闭文件
|
||||||
|
fis.close();
|
||||||
|
fos.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取配置文件中key的对应值
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String queryPropertiesByKey(String key) {
|
||||||
|
if (StringUtils.isBlank(key)) return "";
|
||||||
|
Properties properties = new Properties();
|
||||||
|
// 使用InPutStream流读取properties文件
|
||||||
|
BufferedReader bufferedReader = null;
|
||||||
|
try {
|
||||||
|
bufferedReader = new BufferedReader(new FileReader(Path));
|
||||||
|
properties.load(bufferedReader);
|
||||||
|
String rel = properties.getProperty(key);
|
||||||
|
bufferedReader.close();
|
||||||
|
// 获取key对应的value值
|
||||||
|
return rel;
|
||||||
|
} catch (IOException e) {
|
||||||
|
if(null != bufferedReader){
|
||||||
|
try {
|
||||||
|
bufferedReader.close();
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if(null != bufferedReader){
|
||||||
|
try {
|
||||||
|
bufferedReader.close();
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置配置文件key的value值
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public static void setPropertiesByKey(String key, String value) {
|
||||||
|
// String realpath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
|
||||||
|
File file = new File(Path);
|
||||||
|
OrderedProperties properties = new OrderedProperties();
|
||||||
|
try {
|
||||||
|
properties.load(new FileInputStream(file));
|
||||||
|
properties.setProperty(key, value);
|
||||||
|
FileOutputStream oFile = new FileOutputStream(Path);//true表示追加打开
|
||||||
|
properties.store(oFile, "The New properties file");
|
||||||
|
oFile.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 读取配置文件中key的对应值
|
||||||
|
*
|
||||||
|
* @param key
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String queryValue(String key) {
|
||||||
|
if (StringUtils.isBlank(key)) return "";
|
||||||
|
Properties properties = new Properties();
|
||||||
|
BufferedReader bufferedReader = null;
|
||||||
|
String rel = "";
|
||||||
|
try {
|
||||||
|
bufferedReader = new BufferedReader(new FileReader(Path));
|
||||||
|
properties.load(bufferedReader);
|
||||||
|
rel = properties.getProperty(key);
|
||||||
|
if (StringUtils.isNotBlank(rel)) {
|
||||||
|
rel = rel.trim();
|
||||||
|
}
|
||||||
|
bufferedReader.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (null != bufferedReader) {
|
||||||
|
try {
|
||||||
|
bufferedReader.close();
|
||||||
|
} catch (IOException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class RandomUtils {
|
||||||
|
/**
|
||||||
|
* 获取从a至z,长度为length随机数
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getRandomStr(int length) {
|
||||||
|
String base = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
Random random = new Random();
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int number = random.nextInt(base.length());
|
||||||
|
sb.append(base.charAt(number));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取随机长度随机字符
|
||||||
|
*
|
||||||
|
* @param length
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getRandomString(int length) { // length表示生成字符串的长度
|
||||||
|
String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
Random random = new Random();
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int number = random.nextInt(base.length());
|
||||||
|
sb.append(base.charAt(number));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取随机长度随机数字
|
||||||
|
*
|
||||||
|
* @param length
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String getRandomNumString(int length) { // length表示生成字符串的长度
|
||||||
|
String base = "0123456789";
|
||||||
|
Random random = new Random();
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int number = random.nextInt(base.length());
|
||||||
|
sb.append(base.charAt(number));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ant 加密 工具类
|
||||||
|
*
|
||||||
|
* @author bc
|
||||||
|
* @Date 2020-08-12 9:34
|
||||||
|
*/
|
||||||
|
public class SHAUtil {
|
||||||
|
|
||||||
|
public static String sha1(String decript) {
|
||||||
|
try {
|
||||||
|
MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
||||||
|
digest.update(decript.getBytes());
|
||||||
|
byte[] messageDigest = digest.digest();
|
||||||
|
// Create Hex String
|
||||||
|
StringBuffer hexString = new StringBuffer();
|
||||||
|
// 字节数组转换为 十六进制 数
|
||||||
|
for (int i = 0; i < messageDigest.length; i++) {
|
||||||
|
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
|
||||||
|
if (shaHex.length() < 2) {
|
||||||
|
hexString.append(0);
|
||||||
|
}
|
||||||
|
hexString.append(shaHex);
|
||||||
|
}
|
||||||
|
return hexString.toString();
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
System.out.println("字节数组转换异常" + e);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 南京鸿信
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Map<String, Object> getHeaders() {
|
||||||
|
Map<String, Object> map = Collections.synchronizedMap(new HashMap<>(5));
|
||||||
|
String decript = "";
|
||||||
|
String appId = PropertiesUtil.queryPropertiesByKey("APPID");
|
||||||
|
String appKey = PropertiesUtil.queryPropertiesByKey("APPKEY");
|
||||||
|
String nonce = UUID.randomUUID().toString().replace("-", "");
|
||||||
|
String curTime = String.valueOf(System.currentTimeMillis());
|
||||||
|
decript = nonce + appKey + curTime;
|
||||||
|
String checkNum = sha1(decript);
|
||||||
|
System.out.println("appId:" + appId + ", appKey:" + appKey + ", nonce:" + nonce + ", curTime:" + curTime + ", checkNum:" + checkNum);
|
||||||
|
map.put("appId", appId);
|
||||||
|
map.put("appKey", appKey);
|
||||||
|
map.put("nonce", nonce);
|
||||||
|
map.put("curTime", curTime);
|
||||||
|
map.put("checkNum", checkNum);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import javax.net.ssl.*;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class SSLSocketClient {
|
||||||
|
//获取这个SSLSocketFactory
|
||||||
|
public static SSLSocketFactory getSSLSocketFactory() {
|
||||||
|
try {
|
||||||
|
SSLContext sslContext = SSLContext.getInstance("SSL");
|
||||||
|
sslContext.init(null, getTrustManager(), new SecureRandom());
|
||||||
|
return sslContext.getSocketFactory();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取TrustManager
|
||||||
|
private static TrustManager[] getTrustManager() {
|
||||||
|
return new TrustManager[]{
|
||||||
|
new X509TrustManager() {
|
||||||
|
@Override
|
||||||
|
public void checkClientTrusted(X509Certificate[] chain, String authType) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkServerTrusted(X509Certificate[] chain, String authType) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public X509Certificate[] getAcceptedIssuers() {
|
||||||
|
return new X509Certificate[]{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取HostnameVerifier
|
||||||
|
public static HostnameVerifier getHostnameVerifier() {
|
||||||
|
return (s, sslSession) -> true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static X509TrustManager getX509TrustManager() {
|
||||||
|
X509TrustManager trustManager = null;
|
||||||
|
try {
|
||||||
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
|
||||||
|
trustManagerFactory.init((KeyStore) null);
|
||||||
|
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
|
||||||
|
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
|
||||||
|
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
|
||||||
|
}
|
||||||
|
trustManager = (X509TrustManager) trustManagers[0];
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return trustManager;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import javax.net.ssl.*;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Miss.Ru
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SslUtils {
|
||||||
|
private static void trustAllHttpsCertificates() throws Exception {
|
||||||
|
TrustManager[] trustAllCerts = new TrustManager[1];
|
||||||
|
TrustManager tm = new miTM();
|
||||||
|
trustAllCerts[0] = tm;
|
||||||
|
SSLContext sc = SSLContext.getInstance("SSL");
|
||||||
|
sc.init(null, trustAllCerts, null);
|
||||||
|
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
|
||||||
|
}
|
||||||
|
|
||||||
|
static class miTM implements TrustManager,X509TrustManager {
|
||||||
|
public X509Certificate[] getAcceptedIssuers() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isServerTrusted(X509Certificate[] certs) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isClientTrusted(X509Certificate[] certs) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkServerTrusted(X509Certificate[] certs, String authType)
|
||||||
|
throws CertificateException {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkClientTrusted(X509Certificate[] certs, String authType)
|
||||||
|
throws CertificateException {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static void ignoreSsl() throws Exception{
|
||||||
|
HostnameVerifier hv = new HostnameVerifier() {
|
||||||
|
public boolean verify(String urlHostName, SSLSession session) {
|
||||||
|
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
trustAllHttpsCertificates();
|
||||||
|
HttpsURLConnection.setDefaultHostnameVerifier(hv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class StringKit {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(StringKit.class);
|
||||||
|
|
||||||
|
public StringKit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Boolean isEmpty(Object argObject) {
|
||||||
|
Boolean tbool = false;
|
||||||
|
String tString = toString(argObject);
|
||||||
|
if (tString.equals("")) {
|
||||||
|
tbool = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tbool;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(Object argObject) {
|
||||||
|
String tmpstr = "";
|
||||||
|
try {
|
||||||
|
if (argObject != null) {
|
||||||
|
tmpstr = argObject.toString();
|
||||||
|
if ("null".equals(tmpstr) || "underfind".equals(tmpstr) || "undefined".equals(tmpstr) || "{}".equals(tmpstr)) {
|
||||||
|
tmpstr = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception var3) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return tmpstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean isNumeric(String str) {
|
||||||
|
Pattern pattern = Pattern.compile("[0-9]*");
|
||||||
|
return pattern.matcher(str).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEng(String str) {
|
||||||
|
Pattern pattern = Pattern.compile("[a-zA-Z]");
|
||||||
|
return pattern.matcher(str).matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String getTrace(Throwable t) {
|
||||||
|
|
||||||
|
StringWriter stringWriter = new StringWriter();
|
||||||
|
PrintWriter writer = new PrintWriter(stringWriter);
|
||||||
|
t.printStackTrace(writer);
|
||||||
|
StringBuffer buffer = stringWriter.getBuffer();
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 空时 返回NA(有的厂家字段必填,我们没有,先用NA补充)
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String responseNa(Object object) {
|
||||||
|
if (isEmpty(object)) {
|
||||||
|
return "NA";
|
||||||
|
}
|
||||||
|
return String.valueOf(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查某个字符串出现几次
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Integer getStrCount(String str, String indexStr) {
|
||||||
|
|
||||||
|
//java中判断一个字符出现的次数
|
||||||
|
//在下面字符串中查找有几个啊
|
||||||
|
// String str = "啊!我爱你中国!啊,我爱你故乡";
|
||||||
|
//存放每个字符的数组
|
||||||
|
String[] strs = new String[str.length()];
|
||||||
|
//计数该字符出现了多少次
|
||||||
|
int count = 0;
|
||||||
|
//先把字符串转换成数组
|
||||||
|
for (int i = 0; i < strs.length; i++) {
|
||||||
|
strs[i] = str.substring(i, i + 1);
|
||||||
|
}
|
||||||
|
//挨个字符进行查找,查找到之后count++
|
||||||
|
for (int i = 0; i < strs.length; i++) {
|
||||||
|
if (strs[i].equals(indexStr)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// System.out.println("一共有"+count+"个啊");
|
||||||
|
return count;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,298 @@
|
||||||
|
package com.bootdo.util;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ValidUtil {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(ValidUtil.class);
|
||||||
|
private static final String SM = "SM";
|
||||||
|
private static final String FSM = "FSM";
|
||||||
|
private static final int VILLAGE_CODE_LENGTH = 15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验身份证号
|
||||||
|
*
|
||||||
|
* @param idCard
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkIdCard(String idCard) {
|
||||||
|
if (StringUtils.isBlank(idCard)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (idCard.length() != 18) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return idCard.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测是否带眼镜
|
||||||
|
*
|
||||||
|
* @param glasses
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkGlasses(String glasses) {
|
||||||
|
if (StringUtils.isBlank(glasses)) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
int glassInt = 0;
|
||||||
|
try {
|
||||||
|
glassInt = Integer.parseInt(glasses);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
if (glassInt == 0 || glassInt == 1 || glassInt == 2) {
|
||||||
|
glasses = String.valueOf(glassInt);
|
||||||
|
} else {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
return glasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否戴帽子
|
||||||
|
*
|
||||||
|
* @param hat
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkHat(String hat) {
|
||||||
|
if (StringUtils.isBlank(hat)) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
int hatInt = 0;
|
||||||
|
try {
|
||||||
|
hatInt = Integer.parseInt(hat);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
if (hatInt == 0 || hatInt == 1 || hatInt == 2) {
|
||||||
|
hat = String.valueOf(hatInt);
|
||||||
|
} else {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
return hat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否戴口罩
|
||||||
|
*
|
||||||
|
* @param mask
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkMask(String mask) {
|
||||||
|
if (StringUtils.isBlank(mask)) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
int maskInt = 0;
|
||||||
|
try {
|
||||||
|
maskInt = Integer.parseInt(mask);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
if (maskInt == 0 || maskInt == 1 || maskInt == 2) {
|
||||||
|
mask = String.valueOf(maskInt);
|
||||||
|
} else {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 档案编号
|
||||||
|
*
|
||||||
|
* @param dossierCode
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkDossierCode(String dossierCode) {
|
||||||
|
if (StringUtils.isBlank(dossierCode) || dossierCode.equals("0")) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
int dossierCodeInt = 0;
|
||||||
|
try {
|
||||||
|
dossierCodeInt = Integer.parseInt(dossierCode);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return String.valueOf(dossierCodeInt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 相似度
|
||||||
|
*
|
||||||
|
* @param similarity
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String checkSimilarity(String similarity) {
|
||||||
|
if (StringUtils.isBlank(similarity) || similarity.equals("0")) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
int similarityInt = 0;
|
||||||
|
try {
|
||||||
|
similarityInt = Integer.parseInt(similarity);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return String.valueOf(similarityInt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String checkIvsDeviceCode(String isvCode) {
|
||||||
|
if (StringUtils.isBlank(isvCode) || isvCode.equals("0")) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return String.valueOf(isvCode.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 入库档案编号
|
||||||
|
* ivsCode ivs服务器SN
|
||||||
|
* dossierCode 样本库和陌生人库id
|
||||||
|
*/
|
||||||
|
public String dealDossierCode(String ivsCode, String idCard, String dossierCode) {
|
||||||
|
if (StringUtils.isBlank(ivsCode)
|
||||||
|
|| StringUtils.isBlank(dossierCode)
|
||||||
|
|| "0".equals(ivsCode)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(idCard)) {
|
||||||
|
return FSM + "-" + ivsCode + "-" + dossierCode;
|
||||||
|
} else {
|
||||||
|
return SM + "-" + ivsCode + "-" + dossierCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 人脸比对结果
|
||||||
|
* 1比对成功 2比对失败 3未比对
|
||||||
|
*
|
||||||
|
* @param idCard
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int dealCompare(String idCard) {
|
||||||
|
if (StringUtils.isBlank(idCard)) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if (idCard.length() == 18) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkTime(String time) {
|
||||||
|
try {
|
||||||
|
if (StringUtils.isBlank(time)
|
||||||
|
|| time.length() != 10) {
|
||||||
|
log.error("checkTime time:" + time);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String s = DateTool.yearMonthDay(time);
|
||||||
|
if (StringUtils.isBlank(s) || s.contains("-00")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("checkTime Exception:" + e.getMessage());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车牌颜色
|
||||||
|
*
|
||||||
|
* @param color
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int dealPlateColor(String color) {
|
||||||
|
if (StringUtils.isBlank(color)) {
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
if ("黄".equals(color) || "黄色".equals(color)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ("蓝".equals(color) || "蓝色".equals(color)) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if ("白".equals(color) || "白色".equals(color)) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if ("黑".equals(color) || "黑色".equals(color)) {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if ("绿".equals(color) || "绿色".equals(color)) {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
if ("黄绿".equals(color) || "黄绿色".equals(color)) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 车身颜色
|
||||||
|
*
|
||||||
|
* @param color
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int dealVehicleColor(String color) {
|
||||||
|
if (StringUtils.isBlank(color)) {
|
||||||
|
return 99;
|
||||||
|
}
|
||||||
|
if ("黑".equals(color) || "黑色".equals(color)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ("白".equals(color) || "白色".equals(color)) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if ("灰".equals(color) || "灰色".equals(color)) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
if ("红".equals(color) || "红色".equals(color)) {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if ("蓝".equals(color) || "蓝色".equals(color)) {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
|
if ("黄".equals(color) || "黄色".equals(color)) {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
if ("橙".equals(color) || "橙色".equals(color)) {
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
if ("棕".equals(color) || "棕色".equals(color)) {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
if ("绿".equals(color) || "绿色".equals(color)) {
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
if ("紫".equals(color) || "紫色".equals(color)) {
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
if ("青".equals(color) || "青色".equals(color)) {
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
if ("粉".equals(color) || "粉色".equals(color)) {
|
||||||
|
return 12;
|
||||||
|
}
|
||||||
|
if ("透明".equals(color) || "透明色".equals(color)) {
|
||||||
|
return 13;
|
||||||
|
}
|
||||||
|
return 99;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String checkVillageCode(String villageCode) {
|
||||||
|
if (StringUtils.isBlank(villageCode)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
villageCode = villageCode.trim();
|
||||||
|
if (villageCode.length() != VILLAGE_CODE_LENGTH) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return villageCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package com.bootdo.util.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.core.task.TaskExecutor;
|
||||||
|
import org.springframework.scheduling.annotation.EnableAsync;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableAsync
|
||||||
|
public class AsyncConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public TaskExecutor taskExecutor() {
|
||||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
|
||||||
|
// 设置核心线程数
|
||||||
|
executor.setCorePoolSize(5);
|
||||||
|
// 设置最大线程数
|
||||||
|
executor.setMaxPoolSize(10);
|
||||||
|
// 设置队列容量
|
||||||
|
executor.setQueueCapacity(20);
|
||||||
|
// 设置线程活跃时间(秒)
|
||||||
|
executor.setKeepAliveSeconds(60);
|
||||||
|
// 设置默认线程名称
|
||||||
|
executor.setThreadNamePrefix("lawrence-");
|
||||||
|
// 设置拒绝策略
|
||||||
|
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
// 等待所有任务结束后再关闭线程池
|
||||||
|
executor.setWaitForTasksToCompleteOnShutdown(true);
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.bootdo.util.config;
|
||||||
|
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class Text {
|
||||||
|
|
||||||
|
@Async
|
||||||
|
public void sayHellot(int i){
|
||||||
|
// System.out.println(i+"---"+System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
//package com.bootdo.util.kafka;
|
||||||
|
//
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//import com.alibaba.fastjson.JSONObject;
|
||||||
|
//import com.bootdo.dataaccess.dianxin.domain.dfwl.DfwlVehicleRecord;
|
||||||
|
//import org.apache.kafka.clients.producer.KafkaProducer;
|
||||||
|
//import org.apache.kafka.clients.producer.ProducerRecord;
|
||||||
|
//
|
||||||
|
//public class ProducerDemo {
|
||||||
|
//
|
||||||
|
// private final KafkaProducer<String, String> producer;
|
||||||
|
//
|
||||||
|
// public final static String TOPIC = "third_vehicle_access_log";
|
||||||
|
//
|
||||||
|
// private ProducerDemo() {
|
||||||
|
// Properties props = new Properties();
|
||||||
|
// props.put("bootstrap.servers", "32.132.2.71:9092");//xxx服务器ip
|
||||||
|
//// props.put("bootstrap.servers", "xxx:9092,1xxx:9092,xxx:9092");//xxx服务器ip
|
||||||
|
// props.put("acks", "all");//所有follower都响应了才认为消息提交成功,即"committed"
|
||||||
|
// props.put("retries", 0);//retries = MAX 无限重试,直到你意识到出现了问题:)
|
||||||
|
// props.put("batch.size", 16384);//producer将试图批处理消息记录,以减少请求次数.默认的批量处理消息字节数
|
||||||
|
// //batch.size当批量的数据大小达到设定值后,就会立即发送,不顾下面的linger.ms
|
||||||
|
// props.put("linger.ms", 1);//延迟1ms发送,这项设置将通过增加小的延迟来完成--即,不是立即发送一条记录,producer将会等待给定的延迟时间以允许其他消息记录发送,这些消息记录可以批量处理
|
||||||
|
// props.put("buffer.memory", 33554432);//producer可以用来缓存数据的内存大小。
|
||||||
|
// props.put("key.serializer",
|
||||||
|
// "org.apache.kafka.common.serialization.IntegerSerializer");
|
||||||
|
// props.put("value.serializer",
|
||||||
|
// "org.apache.kafka.common.serialization.StringSerializer");
|
||||||
|
//
|
||||||
|
// producer = new KafkaProducer<String, String>(props);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public void produce() {
|
||||||
|
// int messageNo = 1;
|
||||||
|
// final int COUNT = 5;
|
||||||
|
//
|
||||||
|
// while(messageNo < COUNT) {
|
||||||
|
// String key = String.valueOf(messageNo);
|
||||||
|
//
|
||||||
|
// DfwlVehicleRecord newBean = new DfwlVehicleRecord() ;
|
||||||
|
// newBean.setEquipmentIP("192.168.11.2");
|
||||||
|
// newBean.setVillageCode("WT_320903_LYXC_2021052615");
|
||||||
|
// newBean.setEnterOrOut("0");
|
||||||
|
// newBean.setPlatePicUrl("url");
|
||||||
|
// newBean.setCarUrl("url");
|
||||||
|
// newBean.setSenceUrl("url");
|
||||||
|
// newBean.setImageFormat("base64");
|
||||||
|
// newBean.setPassTime("2021-01-01 00:00:00");
|
||||||
|
// newBean.setPlateNo("1");
|
||||||
|
// newBean.setAvObj("1");
|
||||||
|
// newBean.setAvObjName("test");
|
||||||
|
// newBean.setSource("4");
|
||||||
|
//
|
||||||
|
// String data = String.format(JSONObject.toJSONString(newBean), key);
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// producer.send(new ProducerRecord<String, String>(TOPIC, data));
|
||||||
|
// } catch (Exception e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
// messageNo++;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// producer.close();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
|
@ -0,0 +1,35 @@
|
||||||
|
//package com.bootdo.util.kafka;
|
||||||
|
//import java.util.Arrays;
|
||||||
|
//import java.util.Properties;
|
||||||
|
//
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||||
|
//import org.apache.kafka.clients.consumer.ConsumerRecords;
|
||||||
|
//import org.apache.kafka.clients.consumer.KafkaConsumer;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//public class UserKafkaConsumer extends Thread {
|
||||||
|
//
|
||||||
|
// public static void main(String[] args){
|
||||||
|
// Properties properties = new Properties();
|
||||||
|
// properties.put("bootstrap.servers", "32.132.2.71:9092");//xxx是服务器集群的ip
|
||||||
|
// properties.put("group.id", "jd-group");
|
||||||
|
// properties.put("enable.auto.commit", "true");
|
||||||
|
// properties.put("auto.commit.interval.ms", "1000");
|
||||||
|
// properties.put("auto.offset.reset", "latest");
|
||||||
|
// properties.put("session.timeout.ms", "30000");
|
||||||
|
// properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
|
||||||
|
// properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
|
||||||
|
//
|
||||||
|
// KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
|
||||||
|
// kafkaConsumer.subscribe(Arrays.asList("test5"));
|
||||||
|
// while (true) {
|
||||||
|
// ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
|
||||||
|
// for (ConsumerRecord<String, String> record : records) {
|
||||||
|
// System.out.println("-----------------");
|
||||||
|
// System.out.printf("offset = %d, value = %s", record.offset(), record.value());
|
||||||
|
// System.out.println();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//}
|
|
@ -0,0 +1,90 @@
|
||||||
|
package com.bootdo.util.safe;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author daifei
|
||||||
|
* @Description: AES对称加密工具类
|
||||||
|
* @date 2021年4月14日
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AESTools {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(AESTools.class);
|
||||||
|
private static final String KEY_ALGORITHM = "AES";
|
||||||
|
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";// 默认的加密算法
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AES 加密操作
|
||||||
|
*
|
||||||
|
* @param content 待加密内容
|
||||||
|
* @param password 加密密码
|
||||||
|
* @return 返回Base64转码后的加密数据
|
||||||
|
*/
|
||||||
|
public static String encrypt(String content, String password) {
|
||||||
|
if (StringUtils.isBlank(content)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);// 创建密码器
|
||||||
|
|
||||||
|
byte[] byteContent = content.getBytes("utf-8");
|
||||||
|
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 初始化为加密模式的密码器
|
||||||
|
|
||||||
|
byte[] result = cipher.doFinal(byteContent);// 加密
|
||||||
|
|
||||||
|
return Base64Tools.encodeToString(result);// 通过Base64转码返回
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.error("AES加密失败:" + content);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AES 解密操作
|
||||||
|
*
|
||||||
|
* @param content
|
||||||
|
* @param password
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String decrypt(String content, String password) {
|
||||||
|
if (StringUtils.isBlank(content)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// 实例化
|
||||||
|
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
|
||||||
|
|
||||||
|
// 使用密钥初始化,设置为解密模式
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));
|
||||||
|
|
||||||
|
// 执行操作
|
||||||
|
byte[] result = cipher.doFinal(Base64Tools.decodeFromString(content));
|
||||||
|
return new String(result, "utf-8");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.error("AES解密失败:" + content);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成加密秘钥
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static SecretKeySpec getSecretKey(final String password) {
|
||||||
|
try {
|
||||||
|
return new SecretKeySpec(password.getBytes("UTF-8"), KEY_ALGORITHM);// 转换为AES专用密钥
|
||||||
|
} catch (Exception ex) {
|
||||||
|
LoggerFactory.getLogger(AESTools.class).error("", ex);
|
||||||
|
throw new RuntimeException("生成加密秘钥");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package com.bootdo.util.safe;
|
||||||
|
|
||||||
|
public class AesConstant {
|
||||||
|
public static final String AES_COMMON = "watu2022G409watu";
|
||||||
|
public static final String AES_PHONE = "phoneG409WaTuNj1";
|
||||||
|
public static final String AES_ID_CARD = "idCardG409WaTuNj";
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
package com.bootdo.util.safe;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
|
||||||
|
public abstract class Base64Tools {
|
||||||
|
|
||||||
|
private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given byte array.
|
||||||
|
*
|
||||||
|
* @param src the original byte array
|
||||||
|
* @return the encoded byte array
|
||||||
|
*/
|
||||||
|
public static byte[] encode(byte[] src) {
|
||||||
|
if (src.length == 0) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
return Base64.getEncoder().encode(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-decode the given byte array.
|
||||||
|
*
|
||||||
|
* @param src the encoded byte array
|
||||||
|
* @return the original byte array
|
||||||
|
*/
|
||||||
|
public static byte[] decode(byte[] src) {
|
||||||
|
if (src.length == 0) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
return Base64.getDecoder().decode(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given byte array using the RFC 4648
|
||||||
|
* "URL and Filename Safe Alphabet".
|
||||||
|
*
|
||||||
|
* @param src the original byte array
|
||||||
|
* @return the encoded byte array
|
||||||
|
* @since 4.2.4
|
||||||
|
*/
|
||||||
|
public static byte[] encodeUrlSafe(byte[] src) {
|
||||||
|
if (src.length == 0) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
return Base64.getUrlEncoder().encode(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-decode the given byte array using the RFC 4648
|
||||||
|
* "URL and Filename Safe Alphabet".
|
||||||
|
*
|
||||||
|
* @param src the encoded byte array
|
||||||
|
* @return the original byte array
|
||||||
|
* @since 4.2.4
|
||||||
|
*/
|
||||||
|
public static byte[] decodeUrlSafe(byte[] src) {
|
||||||
|
if (src.length == 0) {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
return Base64.getUrlDecoder().decode(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given byte array to a String.
|
||||||
|
*
|
||||||
|
* @param src the original byte array (may be {@code null})
|
||||||
|
* @return the encoded byte array as a UTF-8 String
|
||||||
|
*/
|
||||||
|
public static String encodeToString(byte[] src) {
|
||||||
|
if (src.length == 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return new String(encode(src), DEFAULT_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-decode the given byte array from an UTF-8 String.
|
||||||
|
*
|
||||||
|
* @param src the encoded UTF-8 String
|
||||||
|
* @return the original byte array
|
||||||
|
*/
|
||||||
|
public static byte[] decodeFromString(String src) {
|
||||||
|
if (src.isEmpty()) {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
return decode(src.getBytes(DEFAULT_CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-encode the given byte array to a String using the RFC 4648
|
||||||
|
* "URL and Filename Safe Alphabet".
|
||||||
|
*
|
||||||
|
* @param src the original byte array
|
||||||
|
* @return the encoded byte array as a UTF-8 String
|
||||||
|
*/
|
||||||
|
public static String encodeToUrlSafeString(byte[] src) {
|
||||||
|
return new String(encodeUrlSafe(src), DEFAULT_CHARSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base64-decode the given byte array from an UTF-8 String using the RFC 4648
|
||||||
|
* "URL and Filename Safe Alphabet".
|
||||||
|
*
|
||||||
|
* @param src the encoded UTF-8 String
|
||||||
|
* @return the original byte array
|
||||||
|
*/
|
||||||
|
public static byte[] decodeFromUrlSafeString(String src) {
|
||||||
|
return decodeUrlSafe(src.getBytes(DEFAULT_CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
package com.bootdo.util.safe;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签名算法类型
|
||||||
|
*/
|
||||||
|
public enum SignAlgorithm {
|
||||||
|
|
||||||
|
// The RSA signature algorithm
|
||||||
|
NONEwithRSA("NONEwithRSA", "RSA"),
|
||||||
|
|
||||||
|
// The MD2/MD5 with RSA Encryption signature algorithm
|
||||||
|
MD2withRSA("MD2withRSA", "RSA"),
|
||||||
|
MD5withRSA("MD5withRSA", "RSA"),
|
||||||
|
|
||||||
|
// The signature algorithm with SHA-* and the RSA
|
||||||
|
SHA1withRSA("SHA1withRSA", "RSA"),
|
||||||
|
SHA256withRSA("SHA256withRSA", "RSA"),
|
||||||
|
SHA384withRSA("SHA384withRSA", "RSA"),
|
||||||
|
SHA512withRSA("SHA512withRSA", "RSA"),
|
||||||
|
|
||||||
|
// The Digital Signature Algorithm
|
||||||
|
NONEwithDSA("NONEwithDSA", "DSA"),
|
||||||
|
// The DSA with SHA-1 signature algorithm
|
||||||
|
SHA1withDSA("SHA1withDSA", "DSA"),
|
||||||
|
|
||||||
|
// The ECDSA signature algorithms
|
||||||
|
NONEwithECDSA("NONEwithECDSA", "EC"),
|
||||||
|
SHA1withECDSA("SHA1withECDSA", "EC"),
|
||||||
|
SHA256withECDSA("SHA256withECDSA", "EC"),
|
||||||
|
SHA384withECDSA("SHA384withECDSA", "EC"),
|
||||||
|
SHA512withECDSA("SHA512withECDSA", "EC");//
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*
|
||||||
|
* @param value 算法字符表示,区分大小写
|
||||||
|
* @param type XXXwithXXX算法的后半部分算法,如果为ECDSA,返回算法为EC
|
||||||
|
*/
|
||||||
|
private SignAlgorithm(String value, String type) {
|
||||||
|
this.value = value;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取算法字符串表示,区分大小写
|
||||||
|
*
|
||||||
|
* @return 算法字符串表示
|
||||||
|
*/
|
||||||
|
public String getValue() {
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
package com.bootdo.util.safe;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.KeyFactory;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.PrivateKey;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.security.spec.KeySpec;
|
||||||
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
|
||||||
|
public class SignatureTools {
|
||||||
|
|
||||||
|
private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sha256WithRsa 加签
|
||||||
|
*
|
||||||
|
* @param content 待签名的字符串
|
||||||
|
* @param priKeyBase64 base64编码的私钥
|
||||||
|
* @return base64编码的签名
|
||||||
|
*/
|
||||||
|
public static String rsa256Sign(String content, String priKeyBase64) {
|
||||||
|
byte[] signed = sign(SignAlgorithm.SHA256withRSA, content.getBytes(DEFAULT_CHARSET), Base64Tools.decodeFromString(priKeyBase64));
|
||||||
|
return Base64Tools.encodeToString(signed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sha256WithRsa 验签
|
||||||
|
*
|
||||||
|
* @param content 待验签的字符串
|
||||||
|
* @param pubKeyBase64 base64编码的公钥
|
||||||
|
* @param signBase64 base64编码签名
|
||||||
|
* @return 签名是否正确
|
||||||
|
*/
|
||||||
|
public static boolean rsa256Verify(String content, String pubKeyBase64, String signBase64) {
|
||||||
|
return verify(SignAlgorithm.SHA256withRSA, content.getBytes(DEFAULT_CHARSET), Base64Tools.decodeFromString(signBase64),
|
||||||
|
Base64Tools.decodeFromString(pubKeyBase64));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] sign(SignAlgorithm algorithm, byte[] content, byte[] key) {
|
||||||
|
try {
|
||||||
|
PrivateKey priKey = generatePrivateKey(algorithm, key);
|
||||||
|
java.security.Signature signature = java.security.Signature.getInstance(algorithm.getValue());
|
||||||
|
signature.initSign(priKey);
|
||||||
|
signature.update(content);
|
||||||
|
byte[] signed = signature.sign();
|
||||||
|
return signed;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean verify(SignAlgorithm algorithm, byte[] content, byte[] sign, byte[] key) {
|
||||||
|
try {
|
||||||
|
java.security.Signature signature = java.security.Signature.getInstance(algorithm.getValue());
|
||||||
|
PublicKey publicKey = generatePublicKey(algorithm, key);
|
||||||
|
signature.initVerify(publicKey);
|
||||||
|
signature.update(content);
|
||||||
|
return signature.verify(sign);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PrivateKey generatePrivateKey(SignAlgorithm algorithmType, byte[] key)
|
||||||
|
throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
return generatePrivateKey(algorithmType, new PKCS8EncodedKeySpec(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PrivateKey generatePrivateKey(SignAlgorithm algorithmType, KeySpec keySpec)
|
||||||
|
throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
return KeyFactory.getInstance(algorithmType.getType()).generatePrivate(keySpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PublicKey generatePublicKey(SignAlgorithm algorithm, byte[] key)
|
||||||
|
throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
return generatePublicKey(algorithm, new X509EncodedKeySpec(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PublicKey generatePublicKey(SignAlgorithm algorithm, KeySpec keySpec)
|
||||||
|
throws InvalidKeySpecException, NoSuchAlgorithmException {
|
||||||
|
return KeyFactory.getInstance(algorithm.getType()).generatePublic(keySpec);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
spring:
|
||||||
|
datasource: #数据库
|
||||||
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
|
username: root
|
||||||
|
password: '1qaz!QAZ'
|
||||||
|
url: jdbc:mysql://221.229.107.118:30519/multidimensional_box?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT
|
||||||
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
|
initialSize: 5 # 配置初始化大小、最小、最大
|
||||||
|
minIdle: 5
|
||||||
|
maxActive: 20
|
||||||
|
# 配置获取连接等待超时的时间
|
||||||
|
maxWait: 60000
|
||||||
|
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||||
|
timeBetweenEvictionRunsMillis: 60000
|
||||||
|
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
||||||
|
minEvictableIdleTimeMillis: 30000
|
||||||
|
validationQuery: SELECT 'x'
|
||||||
|
testWhileIdle: true
|
||||||
|
testOnBorrow: false
|
||||||
|
testOnReturn: false
|
||||||
|
# 打开PSCache,并且指定每个连接上PSCache的大小。如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。
|
||||||
|
poolPreparedStatements: false
|
||||||
|
maxPoolPreparedStatementPerConnectionSize: 20
|
||||||
|
# 配置监控统计拦截的filters,wall防sql注入,日志
|
||||||
|
filters: stat, wall, log4j
|
||||||
|
main:
|
||||||
|
allow-circular-references: true
|
||||||
|
jpa:
|
||||||
|
show-sql: true
|
||||||
|
properties:
|
||||||
|
hibernate:
|
||||||
|
format_sql: true
|
||||||
|
rabbitmq:
|
||||||
|
host: 110.1.200.11
|
||||||
|
port: 19000
|
||||||
|
username: root
|
||||||
|
password: 'sm@rtC@m!n23ty'
|
||||||
|
dynamic: true
|
||||||
|
|
||||||
|
#mybatis:
|
||||||
|
# type-aliases-package: com.bootdo.pretreatment.*.entity
|
||||||
|
# mapper-locations: classpath:mapper/*.xml,classpath:mapper/*/*.xml,classpath:mapper/*/*/*.xml
|
||||||
|
#wt:
|
||||||
|
# version: 1.0.0
|
||||||
|
|
||||||
|
mybatis:
|
||||||
|
configuration:
|
||||||
|
map-underscore-to-camel-case: true
|
||||||
|
mapper-locations: classpath:mapper/*.xml,classpath:mapper/*/*.xml,classpath:mapper/*/*/*.xml
|
||||||
|
typeAliasesPackage: com.bootdo.datasend.**.domain
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
org.hibernate.SQL: DEBUG
|
||||||
|
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8301
|
||||||
|
config: file:config/logback.xml
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// _ooOoo_ //
|
||||||
|
// o8888888o //
|
||||||
|
// 88" . "88 //
|
||||||
|
// (| ^_^ |) //
|
||||||
|
// O\ = /O //
|
||||||
|
// ____/`---'\____ //
|
||||||
|
// .' \\| |// `. //
|
||||||
|
// / \\||| : |||// \ //
|
||||||
|
// / _||||| -:- |||||- \ //
|
||||||
|
// | | \\\ - /// | | //
|
||||||
|
// | \_| ''\---/'' | | //
|
||||||
|
// \ .-\__ `-` ___/-. / //
|
||||||
|
// ___`. .' /--.--\ `. . ___ //
|
||||||
|
// ."" '< `.___\_<|>_/___.' >'"". //
|
||||||
|
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
|
||||||
|
// \ \ `-. \_ __\ /__ _/ .-` / / //
|
||||||
|
// ========`-.____`-.___\_____/___.-`____.-'======== //
|
||||||
|
// `=---=' //
|
||||||
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
|
||||||
|
// 佛祖保佑 永不宕机 永无BUG //
|
||||||
|
////////////////////////////////////////////////////////////////////
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,80 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<!-- 日志存放路径 -->
|
||||||
|
<property name="log.path" value="/home/project/dataSend/log"/>
|
||||||
|
<!-- 日志输出格式 -->
|
||||||
|
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
|
||||||
|
|
||||||
|
<!-- 控制台输出 -->
|
||||||
|
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统日志输出 -->
|
||||||
|
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${log.path}/info.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}.info.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<cleanHistoryOnStart>true</cleanHistoryOnStart>
|
||||||
|
<maxHistory>2</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<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">
|
||||||
|
<file>${log.path}/error.log</file>
|
||||||
|
<!-- 循环政策:基于时间创建日志文件 -->
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||||
|
<!-- 日志文件名格式 -->
|
||||||
|
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}.error.log</fileNamePattern>
|
||||||
|
<!-- 日志最大的历史 60天 -->
|
||||||
|
<cleanHistoryOnStart>true</cleanHistoryOnStart>
|
||||||
|
<maxHistory>2</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<pattern>${log.pattern}</pattern>
|
||||||
|
</encoder>
|
||||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
|
<!-- 过滤的级别 -->
|
||||||
|
<level>ERROR</level>
|
||||||
|
<!-- 匹配时的操作:接收(记录) -->
|
||||||
|
<onMatch>ACCEPT</onMatch>
|
||||||
|
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||||
|
<onMismatch>DENY</onMismatch>
|
||||||
|
</filter>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<!-- 系统模块日志级别控制 -->
|
||||||
|
<logger name="com.bootdo" level="info"/>
|
||||||
|
<!-- Spring日志级别控制 -->
|
||||||
|
<logger name="org.springframework" level="warn"/>
|
||||||
|
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<!--系统操作日志-->
|
||||||
|
<root level="info">
|
||||||
|
<appender-ref ref="file_info"/>
|
||||||
|
<appender-ref ref="file_error"/>
|
||||||
|
</root>
|
||||||
|
|
||||||
|
<root level="error">
|
||||||
|
<appender-ref ref="file_error"/>
|
||||||
|
</root>
|
||||||
|
</configuration>
|
Loading…
Reference in New Issue