| HELP.md | |||||
| target/ | |||||
| !.mvn/wrapper/maven-wrapper.jar | |||||
| !**/src/main/** | |||||
| !**/src/test/** | |||||
| ### 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/ | |||||
| ### VS Code ### | |||||
| .vscode/ | |||||
| *.DS_Store | |||||
| *.log | |||||
| *.log.* | |||||
| html/ |
| ## 一、更新记录 | |||||
| ## 二、项目描述 | |||||
| - 一个基于 spring-boot 框架的 " **接受 Ailink 设备数据推送的API Demo项目** "。 | |||||
| - 拉取项目之后,建议按照自己的功能区域重命名文件,现以简单的位置进行区分。 | |||||
| - 项目环境:JDK1.8、 SpringBoot2、Maven、Intellij IDEA、Mysql8、Redis | |||||
| - 请拉取 master 分支的代码,其余是开发分支。 | |||||
| 友情链接: | |||||
| 1. []() | |||||
| ## 三、主要文件介绍 | |||||
| | 文件 | 作用/功能 | | |||||
| |----------------------------|----------------------------| | |||||
| | pom.xml | jar包管理配置文件 | | |||||
| | application.properties | 项目启动配置主文件,切换不同的使用环境 | | |||||
| | application-dev.properties | 测试环境启动配置文件 | | |||||
| | com/inet/*Application.java | 项目启动类 | | |||||
| ## 四、使用介绍 | |||||
| 1. **如何启动项目** | |||||
| - 需要提前安装好`jdk1.8`与`maven`,使用maven下载`pom.xml`对应的jar,完成后,找到项目启动文件,使用debug方式启动 | |||||
| ## 五、其余 | |||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||||
| xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||||
| <modelVersion>4.0.0</modelVersion> | |||||
| <parent> | |||||
| <groupId>org.springframework.boot</groupId> | |||||
| <artifactId>spring-boot-starter-parent</artifactId> | |||||
| <version>2.1.3.RELEASE</version> | |||||
| </parent> | |||||
| <groupId>com.inet</groupId> | |||||
| <artifactId>ailink-receiver-pull-demo</artifactId> | |||||
| <version>1.0.0</version> | |||||
| <packaging>jar</packaging> | |||||
| <name>ailink-receiver-demo</name> | |||||
| <url>http://maven.apache.org</url> | |||||
| <properties> | |||||
| <java.version>1.8</java.version> | |||||
| <spring-cloud.version>Dalston.RELEASE</spring-cloud.version> | |||||
| </properties> | |||||
| <dependencies> | |||||
| <dependency> | |||||
| <groupId>org.springframework.boot</groupId> | |||||
| <artifactId>spring-boot-starter-web</artifactId> | |||||
| </dependency> | |||||
| <dependency> | |||||
| <groupId>commons-lang</groupId> | |||||
| <artifactId>commons-lang</artifactId> | |||||
| <version>2.5</version> | |||||
| </dependency> | |||||
| <dependency> | |||||
| <groupId>commons-codec</groupId> | |||||
| <artifactId>commons-codec</artifactId> | |||||
| <version>1.4</version> | |||||
| </dependency> | |||||
| </dependencies> | |||||
| <build> | |||||
| <plugins> | |||||
| <plugin> | |||||
| <groupId>org.springframework.boot</groupId> | |||||
| <artifactId>spring-boot-maven-plugin</artifactId> | |||||
| <configuration> | |||||
| <mainClass>com.inet.ailink.receiver.ReceiverApplication</mainClass> | |||||
| <layout>JAR</layout> | |||||
| </configuration> | |||||
| </plugin> | |||||
| </plugins> | |||||
| </build> | |||||
| </project> |
| package com.inet.ailink.receiver; | |||||
| import org.springframework.boot.SpringApplication; | |||||
| import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | |||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | |||||
| import org.springframework.scheduling.annotation.EnableAsync; | |||||
| @SpringBootApplication | |||||
| @EnableAutoConfiguration | |||||
| @EnableAsync | |||||
| public class ReceiverApplication { | |||||
| public static void main(String args[]){ | |||||
| SpringApplication.run(ReceiverApplication.class, args); | |||||
| } | |||||
| } | |||||
| package com.inet.ailink.receiver; | |||||
| import org.springframework.boot.builder.SpringApplicationBuilder; | |||||
| import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; | |||||
| public class ServletInitializer extends SpringBootServletInitializer { | |||||
| @Override | |||||
| protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { | |||||
| return application.sources(ReceiverApplication.class); | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.enums; | |||||
| public enum StatusCode{ | |||||
| SUCCESS("1","success"), | |||||
| FAIL("0","faile") | |||||
| ; | |||||
| private String code=""; | |||||
| private String msg=""; | |||||
| StatusCode(String code,String msg){ | |||||
| this.code=code; | |||||
| this.msg=msg; | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| public String getMsg() { | |||||
| return msg; | |||||
| } | |||||
| public void setMsg(String msg) { | |||||
| this.msg = msg; | |||||
| } | |||||
| public static StatusCode getByCode(String param){ | |||||
| for(StatusCode thisCode:StatusCode.values()){ | |||||
| if(thisCode.code.equals(param)){ | |||||
| return thisCode; | |||||
| } | |||||
| } | |||||
| return null; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.exception; | |||||
| import com.inet.ailink.receiver.common.enums.StatusCode; | |||||
| public class BizException extends Exception { | |||||
| /** | |||||
| * | |||||
| */ | |||||
| private static final long serialVersionUID = -4155383900948675082L; | |||||
| private String code="9999"; | |||||
| private String msg=""; | |||||
| private String[] params; | |||||
| private Object data; | |||||
| public BizException() { | |||||
| super(); | |||||
| } | |||||
| public BizException(StatusCode statusCode) { | |||||
| super(); | |||||
| code=statusCode.getCode(); | |||||
| msg=statusCode.getMsg(); | |||||
| } | |||||
| public BizException(StatusCode statusCode,Object data) { | |||||
| super(); | |||||
| code=statusCode.getCode(); | |||||
| msg=statusCode.getMsg(); | |||||
| this.data = data; | |||||
| } | |||||
| public BizException(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| public BizException(String code,String msg) { | |||||
| this.code = code; | |||||
| this.msg = msg; | |||||
| } | |||||
| public BizException(Throwable cause) { | |||||
| super(cause); | |||||
| } | |||||
| public BizException(String code,Throwable exception) { | |||||
| super(exception); | |||||
| this.code = code; | |||||
| } | |||||
| public BizException(String code, String msg, Throwable exception) { | |||||
| super(msg, exception); | |||||
| this.code = code; | |||||
| } | |||||
| public BizException(String code,String[] params) { | |||||
| super(); | |||||
| this.code = code; | |||||
| this.params = params; | |||||
| } | |||||
| public BizException(String code,String[] params,Throwable exception) { | |||||
| super(exception); | |||||
| this.code = code; | |||||
| this.params = params; | |||||
| } | |||||
| public String getCode() { | |||||
| return this.code; | |||||
| } | |||||
| public String[] getParams() { | |||||
| return params; | |||||
| } | |||||
| @Override | |||||
| public String toString() { | |||||
| String s = getClass().getName(); | |||||
| return s + ": " + code + " params:"+params; | |||||
| } | |||||
| public String getMsg() { | |||||
| return msg; | |||||
| } | |||||
| public void setMsg(String msg) { | |||||
| this.msg = msg; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| public Object getData() { | |||||
| return data; | |||||
| } | |||||
| public void setData(Object data) { | |||||
| this.data = data; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.response; | |||||
| import com.inet.ailink.receiver.common.enums.StatusCode; | |||||
| //@ApiModel("基础响应参数") | |||||
| //@JsonInclude(JsonInclude.Include.NON_NULL) | |||||
| public class Response<T> { | |||||
| private String code; | |||||
| private String msg; | |||||
| private T data; | |||||
| public Response() { | |||||
| this(StatusCode.SUCCESS); | |||||
| } | |||||
| public void setData(T data) { | |||||
| this.data = data; | |||||
| } | |||||
| public Response(StatusCode errorEnum) { | |||||
| setErr(errorEnum); | |||||
| } | |||||
| public Response(StatusCode err, T data) { | |||||
| setErr(err); | |||||
| setData(data); | |||||
| } | |||||
| public void setErr(StatusCode error) { | |||||
| this.code = error.getCode(); | |||||
| this.msg = error.getMsg(); | |||||
| } | |||||
| public String getCode() { | |||||
| return code; | |||||
| } | |||||
| public void setCode(String code) { | |||||
| this.code = code; | |||||
| } | |||||
| public String getMsg() { | |||||
| return msg; | |||||
| } | |||||
| public void setMsg(String msg) { | |||||
| this.msg = msg; | |||||
| } | |||||
| public T getData() { | |||||
| return data; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import org.apache.commons.codec.binary.Base64; | |||||
| import javax.crypto.Cipher; | |||||
| import javax.crypto.spec.IvParameterSpec; | |||||
| import javax.crypto.spec.SecretKeySpec; | |||||
| import java.nio.charset.StandardCharsets; | |||||
| /** | |||||
| * AES 加解密工具类 | |||||
| */ | |||||
| public class AESUtils { | |||||
| /** | |||||
| * CBC 密码分组链接模式加密,需要一个向量iv,可增加加密算法的强度 | |||||
| * @param content 待加密内容 | |||||
| * @param key 秘钥 | |||||
| * @param offset 偏移量字符串 | |||||
| */ | |||||
| public static String aesCBCEncrypt(String content, String key,String offset) throws Exception { | |||||
| key = convertKey(key); | |||||
| offset = convertOffset(offset); | |||||
| Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); | |||||
| SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); | |||||
| IvParameterSpec iv = new IvParameterSpec(offset.getBytes()); | |||||
| cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, iv); | |||||
| byte[] encrypted = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8)); | |||||
| // return Base64.encodeBase64String(encrypted); | |||||
| return Base64Util.encoderString(encrypted); | |||||
| } | |||||
| /** | |||||
| * CBC 密码分组链接模式解密 | |||||
| * @param content 待解密内容 | |||||
| * @param key 秘钥 | |||||
| * @param offset 偏移量字符串 | |||||
| */ | |||||
| public static String aesCBCDecrypt(String content, String key,String offset) throws Exception { | |||||
| key = convertKey(key); | |||||
| offset = convertOffset(offset); | |||||
| Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); | |||||
| SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); | |||||
| IvParameterSpec iv = new IvParameterSpec(offset.getBytes()); | |||||
| cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv); | |||||
| byte[] encrypted = cipher.doFinal(Base64.decodeBase64(content)); | |||||
| return new String(encrypted, StandardCharsets.UTF_8); | |||||
| } | |||||
| public static String convertKey(String key){ | |||||
| if(StringSelfUtil.isEmpty(key)){ | |||||
| throw new NullPointerException(); | |||||
| } | |||||
| int length = key.length(); | |||||
| if(length > 16) { | |||||
| key = key.substring(0, 16); | |||||
| } | |||||
| return key; | |||||
| } | |||||
| public static String convertOffset(String offset){ | |||||
| if(StringSelfUtil.isEmpty(offset)){ | |||||
| throw new NullPointerException(); | |||||
| } | |||||
| int length = offset.length(); | |||||
| if(length > 16){ | |||||
| offset = offset.substring(0,16); | |||||
| } | |||||
| return offset; | |||||
| } | |||||
| public static void main(String[] args) throws Exception{ | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.util.Base64; | |||||
| public class Base64Util | |||||
| { | |||||
| final static Base64.Decoder decoder = Base64.getDecoder(); | |||||
| final static Base64.Encoder encoder = Base64.getEncoder(); | |||||
| public Base64Util(){} | |||||
| /** | |||||
| * 解码 | |||||
| * @param encoderStr | |||||
| * @return | |||||
| * @throws UnsupportedEncodingException | |||||
| */ | |||||
| public static String decoderString(String base64Text) throws UnsupportedEncodingException{ | |||||
| String result = ""; | |||||
| if(base64Text != null && !base64Text.isEmpty() && !base64Text.equals("")){ | |||||
| byte[] textByte = decoder.decode(base64Text); | |||||
| result = bytes_String16(textByte); | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * byte[]转16进制字符串 | |||||
| * @param b | |||||
| * @return | |||||
| */ | |||||
| public static String bytes_String16(byte[] b) { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| for(int i=0;i<b.length;i++) { | |||||
| sb.append(String.format("%02x", b[i])); | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| /** | |||||
| * 编码 | |||||
| * @param encoderStr | |||||
| * @return | |||||
| * @throws UnsupportedEncodingException | |||||
| */ | |||||
| public static String encoderString(String base64Text) throws UnsupportedEncodingException{ | |||||
| String result = ""; | |||||
| if(base64Text != null && !base64Text.isEmpty() && !base64Text.equals("")){ | |||||
| byte[] textByte = base64Text.getBytes("UTF-8"); | |||||
| result = encoder.encodeToString(textByte); | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * 编码 | |||||
| * @param encoderStr | |||||
| * @return | |||||
| * @throws UnsupportedEncodingException | |||||
| */ | |||||
| public static String encoderString(byte[] textByte) throws UnsupportedEncodingException{ | |||||
| return encoder.encodeToString(textByte); | |||||
| } | |||||
| public static int getLength(String s) { | |||||
| int length = 0; | |||||
| for (int i = 0; i < s.length(); i++) { | |||||
| int ascii = Character.codePointAt(s, i); | |||||
| if (ascii >= 0 && ascii <= 255) { | |||||
| length++; | |||||
| } else { | |||||
| length += 2; | |||||
| } | |||||
| } | |||||
| return length; | |||||
| } | |||||
| /** | |||||
| * 十进制转16进制 | |||||
| * @param n | |||||
| * @return | |||||
| */ | |||||
| private static String intToHex(int n) { | |||||
| StringBuilder sb = new StringBuilder(8); | |||||
| String a; | |||||
| char []b = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; | |||||
| if(n==0){ | |||||
| return "00"; | |||||
| } | |||||
| while(n != 0){ | |||||
| if(n<0){ | |||||
| n= 256 +n; | |||||
| } | |||||
| sb = sb.append(b[n%16]); | |||||
| n = n/16; | |||||
| } | |||||
| a = sb.reverse().toString(); | |||||
| if(a.length() == 1){ | |||||
| a= "0"+a; | |||||
| } | |||||
| return a; | |||||
| } | |||||
| public static byte[] hexStrToByteArray(String str) | |||||
| { | |||||
| if (str == null) { | |||||
| return null; | |||||
| } | |||||
| if (str.length() == 0) { | |||||
| return new byte[0]; | |||||
| } | |||||
| byte[] byteArray = new byte[str.length() / 2]; | |||||
| for (int i = 0; i < byteArray.length; i++){ | |||||
| String subStr = str.substring(2 * i, 2 * i + 2); | |||||
| byteArray[i] = ((byte)Integer.parseInt(subStr, 16)); | |||||
| } | |||||
| return byteArray; | |||||
| } | |||||
| /** | |||||
| * 获取开始下标到结束下标的16进制的值 | |||||
| * @param start | |||||
| * @param end | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| public static String getStartToEndForHex(int start,int end,byte[] params){ | |||||
| String result = ""; | |||||
| for(int i=start;i<=end;i++){ | |||||
| if(i==end){ | |||||
| result = result+intToHex(params[i]); | |||||
| }else{ | |||||
| result = result+intToHex(params[i])+":"; | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * 获取开始下标到结束下标的10进制的值 | |||||
| * @param start | |||||
| * @param end | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| public static String getStartToEndForInt(int start,int end,byte[] params){ | |||||
| String result = ""; | |||||
| for(int i=start;i<=end;i++){ | |||||
| int temp = params[i]; | |||||
| if(temp < 0){ | |||||
| temp = 256 + temp; | |||||
| } | |||||
| if(i==end){ | |||||
| result = result+temp; | |||||
| }else{ | |||||
| result = result+temp+":"; | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * 获取低位到高位的移位+或运算的值 | |||||
| * @param indexLow | |||||
| * @param indexHigh | |||||
| * @param params | |||||
| * @return | |||||
| */ | |||||
| public static String getLowConactHighEndForInt(int indexLow,int indexHigh,byte[] params){ | |||||
| String result = ""; | |||||
| int tempResult = 0; | |||||
| for(int i = indexLow;i<=indexHigh;i++){ | |||||
| int temp = (params[i] < 0 ? 256 + params[i] : params[i]); | |||||
| int tempmov = (indexHigh-i)+2; | |||||
| tempmov = (i == indexHigh ? 0 : (int) Math.pow(2, tempmov)); | |||||
| tempResult = (temp << tempmov) | tempResult; | |||||
| } | |||||
| return result+tempResult; | |||||
| } | |||||
| public static Integer getLowConactHighEndForByte(byte b,int start,int end){ | |||||
| String bitStr = ""; | |||||
| for(int i=start;i<=end;i++){ | |||||
| bitStr += String.valueOf((b >> (7-i)) & 0x1); | |||||
| } | |||||
| return Integer.parseInt(bitStr,2); | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.math.BigDecimal; | |||||
| import java.text.DateFormat; | |||||
| import java.text.ParseException; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Calendar; | |||||
| import java.util.Date; | |||||
| import java.util.GregorianCalendar; | |||||
| import java.util.TimeZone; | |||||
| import org.apache.commons.lang.StringUtils; | |||||
| import org.apache.commons.lang.time.FastDateFormat; | |||||
| /** | |||||
| * @ClassName: DateUtils | |||||
| * @Description: 日期处理工具类 | |||||
| * @author Yann | |||||
| * @date 2020-08-20 下午3:11:57 | |||||
| * | |||||
| */ | |||||
| public class DateUtils { | |||||
| /** | |||||
| * ISO8601 formatter for date without time zone. The format used is | |||||
| * <tt>yyyy-MM-dd</tt>. | |||||
| */ | |||||
| public static final FastDateFormat DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd"); | |||||
| /** | |||||
| * ISO8601 date format: yyyy-MM-dd | |||||
| */ | |||||
| public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd"; | |||||
| public static final String DATE_FORMAT_PATTERN_NO_SEPARATOR = "yyyyMMdd"; | |||||
| /** | |||||
| * ISO8601 date-time format: yyyy-MM-dd HH:mm:ss | |||||
| */ | |||||
| public static final String DATETIME_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"; | |||||
| /** | |||||
| * for bet view format: yyyy-MM-dd HH:mm:ss | |||||
| */ | |||||
| public static final String DATETIME_JSVIEW_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss"; | |||||
| public static final String DATETIME_SENDTIME_FORMAT_PATTERN = "yyyyMMddHHmmssSSS"; | |||||
| /** | |||||
| * 日期时间格式:yyyy-MM-dd HH:mm,不显示秒 | |||||
| */ | |||||
| public static final String DATETIME_WITHOUT_SECOND_FORMAT_PATTERN = "yyyy-MM-dd HH:mm"; | |||||
| /** | |||||
| * 日期时间格式:yyyy-MM-dd HH | |||||
| */ | |||||
| public static final String DATETIME_WITHOUT_MINUTES_FORMAT_PATTERN = "yyyy-MM-dd HH"; | |||||
| public static final String DATE_TIME_START00 = " 00:00:00"; | |||||
| public static final String DATE_TIME_END23 = " 23:59:59"; | |||||
| /** | |||||
| * 日期时间格式:yyyyMMddHHmm,不显示秒 | |||||
| */ | |||||
| public static final String DATETIME_WITHOUT_SECOND_FORMAT= "yyyyMMddHHmm"; | |||||
| /** | |||||
| * 获得当前时间 | |||||
| */ | |||||
| public static Date currentDate() { | |||||
| return new Date(); | |||||
| } | |||||
| public static Date getDate(Long time) { | |||||
| return new Date(time); | |||||
| } | |||||
| public static Long getCurTime() { | |||||
| return System.currentTimeMillis(); | |||||
| } | |||||
| public static Date parse(String str) { | |||||
| return parse(str, DATE_FORMAT_PATTERN); | |||||
| } | |||||
| public static Date parse(String str, String pattern) { | |||||
| if (StringUtils.isBlank(str)) { | |||||
| return null; | |||||
| } | |||||
| DateFormat parser = new SimpleDateFormat(pattern); | |||||
| try { | |||||
| return parser.parse(str); | |||||
| } catch (ParseException e) { | |||||
| throw new IllegalArgumentException("Can't parse " + str + " using " + pattern); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 根据时间变量返回时间字符串 | |||||
| */ | |||||
| public static String format(Date date, String pattern) { | |||||
| if (date == null) { | |||||
| return null; | |||||
| } | |||||
| FastDateFormat df = FastDateFormat.getInstance(pattern); | |||||
| return df.format(date); | |||||
| } | |||||
| public static String format(Long time, String pattern) { | |||||
| if (time == null) { | |||||
| return null; | |||||
| } | |||||
| FastDateFormat df = FastDateFormat.getInstance(pattern); | |||||
| return df.format(new Date(time)); | |||||
| } | |||||
| /** | |||||
| * return date format is <code>yyyy-MM-dd</code> | |||||
| */ | |||||
| public static String format(Date date) { | |||||
| return date == null ? null : DATE_FORMAT.format(date); | |||||
| } | |||||
| public static Date getEndDateTimeOfCurrentYear() { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(currentDate()); | |||||
| cal.set(Calendar.MONTH, Calendar.DECEMBER); | |||||
| cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 23); | |||||
| cal.set(Calendar.MINUTE, 59); | |||||
| cal.set(Calendar.SECOND, 59); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static Date getStartDateTimeOfCurrentYear() { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(currentDate()); | |||||
| cal.set(Calendar.MONTH, Calendar.JANUARY); | |||||
| cal.set(Calendar.DAY_OF_MONTH, 1); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||||
| cal.set(Calendar.MINUTE, 0); | |||||
| cal.set(Calendar.SECOND, 0); | |||||
| return parse(format(cal.getTime())); | |||||
| } | |||||
| public static Date getStartDateTimeOfYear(int year) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.set(Calendar.YEAR, year); | |||||
| cal.set(Calendar.MONTH, Calendar.JANUARY); | |||||
| cal.set(Calendar.DAY_OF_MONTH, 1); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||||
| cal.set(Calendar.MINUTE, 0); | |||||
| cal.set(Calendar.SECOND, 0); | |||||
| return parse(format(cal.getTime())); | |||||
| } | |||||
| public static Date getEndDateTimeOfYear(int year) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.set(Calendar.YEAR, year); | |||||
| cal.set(Calendar.MONTH, Calendar.DECEMBER); | |||||
| cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 23); | |||||
| cal.set(Calendar.MINUTE, 59); | |||||
| cal.set(Calendar.SECOND, 59); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static Date getStartTimeOfCurrentDate() { | |||||
| return getStartTimeOfDate(currentDate()); | |||||
| } | |||||
| public static Date getEndTimeOfCurrentDate() { | |||||
| return getEndTimeOfDate(currentDate()); | |||||
| } | |||||
| public static Date getStartTimeOfCurrentMonth() { | |||||
| return getStartDateTimeOfMonth(DateUtils.currentDate()); | |||||
| } | |||||
| public static Date getEndTimeOfCurrentMonth() { | |||||
| return getEndDateTimeOfMonth(DateUtils.currentDate()); | |||||
| } | |||||
| public static Date getStartTimeOfDate(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||||
| cal.set(Calendar.MINUTE, 0); | |||||
| cal.set(Calendar.SECOND, 0); | |||||
| return parse(format(cal.getTime())); | |||||
| } | |||||
| public static Date getEndTimeOfDate(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 23); | |||||
| cal.set(Calendar.MINUTE, 59); | |||||
| cal.set(Calendar.SECOND, 59); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static Date getSpecialEndTimeOfDate(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 24); | |||||
| cal.set(Calendar.MINUTE, 00); | |||||
| cal.set(Calendar.SECOND, 00); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static Date getStartDateTimeOfMonth(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.set(Calendar.DAY_OF_MONTH, 1); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||||
| cal.set(Calendar.MINUTE, 0); | |||||
| cal.set(Calendar.SECOND, 0); | |||||
| return parse(format(cal.getTime())); | |||||
| } | |||||
| public static Date getStartDateTimeOfMonth(int year, int month) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.set(Calendar.YEAR, year); | |||||
| cal.set(Calendar.MONTH, month - 1); | |||||
| cal.set(Calendar.DAY_OF_MONTH, 1); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 0); | |||||
| cal.set(Calendar.MINUTE, 0); | |||||
| cal.set(Calendar.SECOND, 0); | |||||
| return parse(format(cal.getTime())); | |||||
| } | |||||
| public static Date getEndDateTimeOfMonth(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); | |||||
| cal.set(Calendar.HOUR_OF_DAY, 23); | |||||
| cal.set(Calendar.MINUTE, 59); | |||||
| cal.set(Calendar.SECOND, 59); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static Date addHours(Date date, int hours) { | |||||
| return add(date, Calendar.HOUR_OF_DAY, hours); | |||||
| } | |||||
| public static Date addMinutes(Date date, int minutes) { | |||||
| return add(date, Calendar.MINUTE, minutes); | |||||
| } | |||||
| public static Date addSeconds(Date date, int seconds) { | |||||
| return add(date, Calendar.SECOND, seconds); | |||||
| } | |||||
| public static Date addDays(Date date, int days) { | |||||
| return add(date, Calendar.DATE, days); | |||||
| } | |||||
| public static Date addMonths(Date date, int months) { | |||||
| return add(date, Calendar.MONTH, months); | |||||
| } | |||||
| public static Date addYears(Date date, int years) { | |||||
| return add(date, Calendar.YEAR, years); | |||||
| } | |||||
| private static Date add(Date date, int field, int amount) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| cal.add(field, amount); | |||||
| return cal.getTime(); | |||||
| } | |||||
| public static long calcDateBetween(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0; | |||||
| } | |||||
| return ((end.getTime() - start.getTime()) / 86400001) + 1; | |||||
| } | |||||
| public static long calcHoursBetween(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0; | |||||
| } | |||||
| return ((end.getTime() - start.getTime()) / (60000 * 60)); | |||||
| } | |||||
| public static Double calcHoursDoubleBetween(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0d; | |||||
| } | |||||
| Double time = ((end.getTime() - start.getTime()) / (60000.0 * 60.0)); | |||||
| return Double.valueOf(new java.text.DecimalFormat("#.0").format(time)); | |||||
| } | |||||
| public static Double calcHoursDouble(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0d; | |||||
| } | |||||
| // (new BigDecimal(end.getTime()).subtract(new | |||||
| // BigDecimal(start.getTime()))).divide(new BigDecimal(60000.0*60.0), 7, | |||||
| // BigDecimal.ROUND_HALF_UP).doubleValue(); | |||||
| Double time = (new BigDecimal(end.getTime()).subtract(new BigDecimal(start.getTime()))) | |||||
| .divide(new BigDecimal(60000.0 * 60.0), 7, BigDecimal.ROUND_HALF_UP).doubleValue();// ((end.getTime() - | |||||
| // start.getTime()) | |||||
| // / | |||||
| // (60000.0*60.0)); | |||||
| return time; | |||||
| } | |||||
| public static long calcMinutesBetween(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0; | |||||
| } | |||||
| return ((end.getTime() - start.getTime()) / 60000); | |||||
| } | |||||
| public static long calcSecondsBetween(Date start, Date end) { | |||||
| if (start == null || end == null) { | |||||
| return 0; | |||||
| } | |||||
| return ((end.getTime() - start.getTime()) / 1000); | |||||
| } | |||||
| public static long calcSecondsBetween(Long start, Long end) { | |||||
| return (end - start) / 1000; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期天。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isSunday(Date date) { | |||||
| return getDate(date) == Calendar.SUNDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期一。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isMonday(Date date) { | |||||
| return getDate(date) == Calendar.MONDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期二。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isTuesday(Date date) { | |||||
| return getDate(date) == Calendar.TUESDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期三。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isWednesday(Date date) { | |||||
| return getDate(date) == Calendar.WEDNESDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期四。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isThursday(Date date) { | |||||
| return getDate(date) == Calendar.THURSDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期五。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isFriday(Date date) { | |||||
| return getDate(date) == Calendar.FRIDAY; | |||||
| } | |||||
| /** | |||||
| * 获得日期是否为星期六。 | |||||
| * | |||||
| * @param date 日期 | |||||
| * @return | |||||
| */ | |||||
| public static boolean isSaturday(Date date) { | |||||
| return getDate(date) == Calendar.SATURDAY; | |||||
| } | |||||
| public static int getDate(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| return cal.get(Calendar.DAY_OF_WEEK); | |||||
| } | |||||
| /** | |||||
| * 获得相对于今天的昨天的时间。 | |||||
| * | |||||
| * @return 昨天此时。 | |||||
| */ | |||||
| public static Date getYesterday() { | |||||
| return addDays(currentDate(), -1); | |||||
| } | |||||
| /** | |||||
| * 获得月份 | |||||
| * | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public static int getMonth(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.MONTH) + 1; | |||||
| } | |||||
| /** | |||||
| * 获得年份 | |||||
| * | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public static int getYear(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.YEAR); | |||||
| } | |||||
| /** | |||||
| * 获得天 | |||||
| * | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public static int getDay(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.DATE); | |||||
| } | |||||
| /** | |||||
| * 获得天 | |||||
| * | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public static int getDayOfYear(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.DAY_OF_YEAR); | |||||
| } | |||||
| /** | |||||
| * 获得小时 | |||||
| * | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public static int getHours(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.HOUR_OF_DAY); | |||||
| } | |||||
| public static int getMinutes(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.MINUTE); | |||||
| } | |||||
| public static int getSeconds(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.SECOND); | |||||
| } | |||||
| public static int getMILLISECOND(Date date) { | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| calendar.setTime(date); | |||||
| return calendar.get(Calendar.MILLISECOND); | |||||
| } | |||||
| public static long getTimeDiff(Date beginDate, Date endDate) { | |||||
| return (endDate.getTime() - beginDate.getTime()) / 1000; | |||||
| } | |||||
| public static int getDaysOfMonth(int year, int month) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.set(Calendar.YEAR, year); | |||||
| cal.set(Calendar.MONTH, month);// 7月 | |||||
| return cal.getActualMaximum(Calendar.DATE); | |||||
| } | |||||
| public static long convertDate2Long(Date date) { | |||||
| if (date == null) { | |||||
| return 0l; | |||||
| } | |||||
| return date.getTime(); | |||||
| } | |||||
| public static Date convertLong2Date(Long unixTimestamp) { | |||||
| if (unixTimestamp != null) { | |||||
| return new java.util.Date(unixTimestamp); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| /** | |||||
| * 判断时间是否在指定的时间范围内。 | |||||
| * | |||||
| * @param low | |||||
| * @param high | |||||
| * @return | |||||
| */ | |||||
| public static boolean between(Date low, Date high) { | |||||
| return currentDate().after(low) && currentDate().before(high); | |||||
| } | |||||
| public static int getDayValue(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| int i = cal.get(Calendar.DAY_OF_WEEK); | |||||
| if (i == 1) { | |||||
| return 7; | |||||
| } else { | |||||
| return i - 1; | |||||
| } | |||||
| } | |||||
| public static boolean isBefore(Date date1, Date date2) { | |||||
| return date1.getTime() < date2.getTime(); | |||||
| } | |||||
| public static Date average(Date date1, Date date2) { | |||||
| return new Date((date1.getTime() + date2.getTime()) / 2); | |||||
| } | |||||
| public static int getDaysOfMonth(Date date) { | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| cal.setTime(date); | |||||
| return cal.get(Calendar.DAY_OF_MONTH); | |||||
| } | |||||
| public static int getCurrentRemainingSeconds() { | |||||
| // *** 计算过期时间 一整天 获取 时:分:秒 | |||||
| Calendar calendar = Calendar.getInstance(); | |||||
| int hours = calendar.get(Calendar.HOUR_OF_DAY); // 时 | |||||
| int minutes = calendar.get(Calendar.MINUTE); // 分 | |||||
| int seconds = calendar.get(Calendar.SECOND); // 秒 | |||||
| return 24 * 60 * 60 - hours * 60 * 60 - minutes * 60 - seconds; | |||||
| } | |||||
| public static Long getTimeLong(String str) { | |||||
| return parse(str, DATETIME_FORMAT_PATTERN).getTime(); | |||||
| } | |||||
| public static String getStringTodayC() { | |||||
| Date currentTime = new Date(); | |||||
| SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS"); | |||||
| String dateString = formatter.format(currentTime); | |||||
| return dateString; | |||||
| } | |||||
| public static String getStringTodayB() { | |||||
| Date currentTime = new Date(); | |||||
| SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); | |||||
| String dateString = formatter.format(currentTime); | |||||
| return dateString; | |||||
| } | |||||
| /////////////////////////////////////////////////// | |||||
| // 引用s https://blog.csdn.net/tz_gx/article/details/25284237 | |||||
| // s 上月第一天 | |||||
| public static Date getPreviousMonthDayBegin() { | |||||
| Calendar lastDate = Calendar.getInstance(); | |||||
| lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 | |||||
| lastDate.add(Calendar.MONTH, -1);// 减一个月,变为上月的1号 | |||||
| return lastDate.getTime(); | |||||
| } | |||||
| // s 获得上月最后一天的日期 | |||||
| public static Date getPreviousMonthDayEnd() { | |||||
| Calendar lastDate = Calendar.getInstance(); | |||||
| lastDate.add(Calendar.MONTH, -1);// 减一个月 | |||||
| lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 | |||||
| lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天 | |||||
| return lastDate.getTime(); | |||||
| } | |||||
| // s 获取当月第一天 | |||||
| public static Date getCurrentMonthDayBegin() { | |||||
| Calendar lastDate = Calendar.getInstance(); | |||||
| lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 | |||||
| return lastDate.getTime(); | |||||
| } | |||||
| // s 计算当月最后一天,返回字符串 | |||||
| public static Date getCurrentMonthDayEnd() { | |||||
| Calendar lastDate = Calendar.getInstance(); | |||||
| lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 | |||||
| lastDate.add(Calendar.MONTH, 1);// 加一个月,变为下月的1号 | |||||
| lastDate.add(Calendar.DATE, -1);// 减去一天,变为当月最后一天 | |||||
| return lastDate.getTime(); | |||||
| } | |||||
| // s 获得本周一的日期 | |||||
| public static Date getCurrentWeekDayBegin() { | |||||
| int mondayPlus = getMondayPlus(); | |||||
| GregorianCalendar currentDate = new GregorianCalendar(); | |||||
| currentDate.add(GregorianCalendar.DATE, mondayPlus); | |||||
| return currentDate.getTime(); | |||||
| } | |||||
| // s 获得本周星期日的日期 | |||||
| public static Date getCurrentWeekDayEnd() { | |||||
| int mondayPlus = getMondayPlus(); | |||||
| GregorianCalendar currentDate = new GregorianCalendar(); | |||||
| currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); | |||||
| Date monday = currentDate.getTime(); | |||||
| return monday; | |||||
| } | |||||
| // s 获得当前日期与本周一相差的天数 | |||||
| private static int getMondayPlus() { | |||||
| Calendar cd = Calendar.getInstance(); | |||||
| // 获得今天是一周的第几天,星期日是第一天,星期二是第二天...... | |||||
| int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; // s 因为按中国礼拜一作为第一天所以这里减1 | |||||
| if (dayOfWeek == 1) { | |||||
| return 0; | |||||
| } else { | |||||
| return 1 - dayOfWeek; | |||||
| } | |||||
| } | |||||
| // s 获得上周星期一的日期 | |||||
| public static Date getPreviousWeekDayBegin() { | |||||
| int mondayPlus = getMondayPlus(); | |||||
| GregorianCalendar currentDate = new GregorianCalendar(); | |||||
| currentDate.add(GregorianCalendar.DATE, mondayPlus - 7); | |||||
| return currentDate.getTime(); | |||||
| } | |||||
| // s 获得上周星期日的日期 | |||||
| public static Date getPreviousWeekDayEnd() { | |||||
| int mondayPlus = getMondayPlus(); | |||||
| GregorianCalendar currentDate = new GregorianCalendar(); | |||||
| currentDate.add(GregorianCalendar.DATE, mondayPlus - 1); | |||||
| return currentDate.getTime(); | |||||
| } | |||||
| public static int getAge(Date birthDay){ | |||||
| Calendar cal = Calendar.getInstance(); | |||||
| if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 | |||||
| return 0; | |||||
| } | |||||
| int yearNow = cal.get(Calendar.YEAR); //当前年份 | |||||
| int monthNow = cal.get(Calendar.MONTH); //当前月份 | |||||
| int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 | |||||
| cal.setTime(birthDay); | |||||
| int yearBirth = cal.get(Calendar.YEAR); | |||||
| int monthBirth = cal.get(Calendar.MONTH); | |||||
| int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); | |||||
| int age = yearNow - yearBirth; //计算整岁数 | |||||
| if (monthNow <= monthBirth) { | |||||
| if (monthNow == monthBirth) { | |||||
| if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 | |||||
| }else{ | |||||
| age--;//当前月份在生日之前,年龄减一 | |||||
| } | |||||
| } | |||||
| return age; | |||||
| } | |||||
| public static Date getCurrZoneGMT0(){ | |||||
| SimpleDateFormat dateFormat = new SimpleDateFormat(DATETIME_FORMAT_PATTERN); | |||||
| dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); | |||||
| return parse(dateFormat.format(new Date()), DATETIME_FORMAT_PATTERN) ; | |||||
| } | |||||
| /////////////////////////////////// | |||||
| public static void main(String[] args) { | |||||
| // System.out.println(getMILLISECOND(new Date())); | |||||
| System.out.println(format(getCurrZoneGMT0(),DATETIME_FORMAT_PATTERN)); | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| public class IpUtils { | |||||
| public static String getIpAddr(HttpServletRequest request) { | |||||
| String ip = request.getHeader("x-forwarded-for"); | |||||
| if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | |||||
| ip = request.getHeader("Proxy-Client-IP"); | |||||
| } | |||||
| if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | |||||
| ip = request.getHeader("WL-Proxy-Client-IP"); | |||||
| } | |||||
| if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { | |||||
| ip = request.getRemoteAddr(); | |||||
| } | |||||
| return ip; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.io.IOException; | |||||
| import org.apache.commons.lang.StringUtils; | |||||
| import com.fasterxml.jackson.annotation.JsonInclude.Include; | |||||
| import com.fasterxml.jackson.core.JsonProcessingException; | |||||
| import com.fasterxml.jackson.databind.DeserializationFeature; | |||||
| import com.fasterxml.jackson.databind.JavaType; | |||||
| import com.fasterxml.jackson.databind.ObjectMapper; | |||||
| import com.fasterxml.jackson.databind.SerializationFeature; | |||||
| import com.fasterxml.jackson.databind.util.JSONPObject; | |||||
| public class JsonMapper { | |||||
| private ObjectMapper mapper; | |||||
| public JsonMapper() { | |||||
| this(null); | |||||
| } | |||||
| public JsonMapper(Include include) { | |||||
| mapper = new ObjectMapper(); | |||||
| if (include != null) { | |||||
| mapper.setSerializationInclusion(include); | |||||
| } | |||||
| mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); | |||||
| mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); | |||||
| } | |||||
| public static JsonMapper nonEmptyMapper() { | |||||
| return new JsonMapper(Include.NON_EMPTY); | |||||
| } | |||||
| public static JsonMapper nonDefaultMapper() { | |||||
| return new JsonMapper(Include.NON_DEFAULT); | |||||
| } | |||||
| public static JsonMapper nonAlwaysMapper() { | |||||
| return new JsonMapper(Include.ALWAYS); | |||||
| } | |||||
| public String toJson(Object object) { | |||||
| try { | |||||
| return mapper.writeValueAsString(object); | |||||
| } catch (IOException e) { | |||||
| return null; | |||||
| } | |||||
| } | |||||
| public <T> T fromMapToObject(Object map, Class<T> cls) { | |||||
| return this.fromJson(this.toJson(map), cls); | |||||
| } | |||||
| public <T> T fromMapToObject(Object map, JavaType cls) { | |||||
| return this.fromJson(this.toJson(map), cls); | |||||
| } | |||||
| public <T> T fromJson(String jsonString, Class<T> clazz) { | |||||
| if (StringUtils.isEmpty(jsonString)) { | |||||
| return null; | |||||
| } | |||||
| try { | |||||
| return mapper.readValue(jsonString, clazz); | |||||
| } catch (IOException e) { | |||||
| e.printStackTrace(); | |||||
| return null; | |||||
| } | |||||
| } | |||||
| public <T> T fromJson(String jsonString, JavaType javaType) { | |||||
| if (StringUtils.isEmpty(jsonString)) { | |||||
| return null; | |||||
| } | |||||
| try { | |||||
| return (T) mapper.readValue(jsonString, javaType); | |||||
| } catch (IOException e) { | |||||
| e.printStackTrace(); | |||||
| return null; | |||||
| } | |||||
| } | |||||
| public JavaType createCollectionType(Class<?> collectionClass, Class<?>... elementClasses) { | |||||
| return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); | |||||
| } | |||||
| public <T> T update(String jsonString, T object) { | |||||
| try { | |||||
| return (T) mapper.readerForUpdating(object).readValue(jsonString); | |||||
| } catch (JsonProcessingException e) { | |||||
| e.printStackTrace(); | |||||
| } catch (IOException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| public String toJsonP(String functionName, Object object) { | |||||
| return toJson(new JSONPObject(functionName, object)); | |||||
| } | |||||
| public void enableEnumUseToString() { | |||||
| mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); | |||||
| mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); | |||||
| } | |||||
| public ObjectMapper getMapper() { | |||||
| return mapper; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| public class JsonUtils { | |||||
| protected static JsonMapper jmapper = JsonMapper.nonEmptyMapper(); | |||||
| /** | |||||
| * json数据结构转换对象 | |||||
| * @param jsonStr | |||||
| * @param clazz | |||||
| * @return | |||||
| */ | |||||
| public static <T> T fromJson(String jsonStr,Class<T> clazz){ | |||||
| return jmapper.fromJson(jsonStr, clazz); | |||||
| } | |||||
| /**json数据结构转换List<MyBean> | |||||
| * @param jsonStr | |||||
| * @param clazz | |||||
| * @return | |||||
| */ | |||||
| public static <T> List<T> fromJson2List(String jsonStr,Class<T> clazz){ | |||||
| return jmapper.fromJson(jsonStr, | |||||
| JsonMapper.nonDefaultMapper().createCollectionType(List.class, clazz)); | |||||
| } | |||||
| /** | |||||
| * 对象转换json数据结构 | |||||
| * @param obj | |||||
| * @return | |||||
| */ | |||||
| public static String toJson(Object obj){ | |||||
| return jmapper.toJson(obj); | |||||
| } | |||||
| public static void main(String[] args){ | |||||
| /*String s="[{\"level\":\"3\",\"time\":\"1428551739622\"},{\"level\":\"4\",\"time\":\"1428551739623\"}]"; | |||||
| List<DeviceSignalRecordRequest> ss=fromJson2List(s, DeviceSignalRecordRequest.class); | |||||
| String sss=toJson(new DeviceSignalRecordRequest()); | |||||
| System.out.println(ss);*/ | |||||
| List<String> a=new ArrayList<String>(); | |||||
| List<String> b=new ArrayList<String>(); | |||||
| List<List<String>> cc =new ArrayList<List<String>>(); | |||||
| a.add("11:00"); | |||||
| a.add("12:00"); | |||||
| b.add("13:00"); | |||||
| b.add("14:00"); | |||||
| cc.add(a); | |||||
| cc.add(b); | |||||
| System.out.println(JsonUtils.toJson(a)); | |||||
| List<String> k=JsonUtils.fromJson2List(JsonUtils.toJson(a),String.class); | |||||
| for(String s:k){ | |||||
| System.out.println(s); | |||||
| } | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.security.MessageDigest; | |||||
| import java.util.Arrays; | |||||
| import java.util.Map; | |||||
| import java.util.Set; | |||||
| public class MD5Util { | |||||
| public MD5Util(){} | |||||
| /** | |||||
| * 生成签名 | |||||
| * @param data 待签名数据 | |||||
| * @param key API密钥 | |||||
| * @return 签名 | |||||
| */ | |||||
| public static String generateSignature(Map<String, Object> data, String key) throws Exception { | |||||
| Set<String> keySet = data.keySet(); | |||||
| String[] keyArray = keySet.toArray(new String[keySet.size()]); | |||||
| Arrays.sort(keyArray); | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| for (String k : keyArray) { | |||||
| if(data.get(k) != null){ | |||||
| String keyValueTemp = data.get(k).toString().trim(); | |||||
| if (keyValueTemp.length() > 0) // 参数值为空,则不参与签名 | |||||
| sb.append(k).append("=").append(keyValueTemp).append("&"); | |||||
| } | |||||
| } | |||||
| sb.append("key=").append(key); | |||||
| String md5Str = getMD5(sb.toString()).toUpperCase(); | |||||
| return md5Str; | |||||
| } | |||||
| /** | |||||
| * 生成 MD5 | |||||
| * @param data 待处理数据 | |||||
| * @return MD5结果 | |||||
| */ | |||||
| public static String getMD5(String data) throws Exception { | |||||
| MessageDigest md = MessageDigest.getInstance("MD5"); | |||||
| byte[] array = md.digest(data.getBytes("UTF-8")); | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| for (byte item : array) { | |||||
| sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); | |||||
| } | |||||
| return sb.toString().toUpperCase(); | |||||
| } | |||||
| public static void main(String [] args) throws Exception{ | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.util.regex.Pattern; | |||||
| public class StringSelfUtil { | |||||
| public static boolean startWithChar(String s) { | |||||
| if (s != null && s.length() > 0) { | |||||
| String start = s.trim().substring(0, 1); | |||||
| Pattern pattern = Pattern.compile("^[A-Za-z]+$"); | |||||
| return pattern.matcher(start).matches(); | |||||
| } else { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| public static boolean isNumeric(String str){ | |||||
| Pattern pattern = Pattern.compile("[0-9]*"); | |||||
| return pattern.matcher(str).matches(); | |||||
| } | |||||
| public static String byteArrayToStr(byte[] byteArray) { | |||||
| if (byteArray == null) { | |||||
| return null; | |||||
| } | |||||
| String str = new String(byteArray); | |||||
| return str; | |||||
| } | |||||
| public static boolean isEmpty(String s){ | |||||
| if(s==null || s.equals("") || s.isEmpty()){ | |||||
| return true; | |||||
| }else{ | |||||
| return false; | |||||
| } | |||||
| } | |||||
| public static boolean isBlank(String s){ | |||||
| return isEmpty(s); | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.utils; | |||||
| import java.io.BufferedReader; | |||||
| import java.io.File; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.FileReader; | |||||
| import java.io.IOException; | |||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| public class TxtUtils { | |||||
| public static List<String> txt2String(File file){ | |||||
| StringBuilder result = new StringBuilder(); | |||||
| List<String> list = new ArrayList<String>(); | |||||
| try{ | |||||
| BufferedReader br = new BufferedReader(new FileReader(file)); | |||||
| String s = null; | |||||
| while((s = br.readLine())!=null){ | |||||
| list.add(s); | |||||
| } | |||||
| br.close(); | |||||
| }catch(Exception e){ | |||||
| e.printStackTrace(); | |||||
| } | |||||
| return list; | |||||
| } | |||||
| public static void string2Txt(String str, String logpath) throws IOException{ | |||||
| byte[] sb = str.getBytes(); | |||||
| //若是true 在原有的文本上追加写入 false覆盖原有的文本 ,不写默认为false | |||||
| FileOutputStream fos = new FileOutputStream(logpath,true); | |||||
| fos.write(sb); | |||||
| fos.flush(); | |||||
| fos.close(); | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.common.vo; | |||||
| import com.fasterxml.jackson.databind.annotation.JsonSerialize; | |||||
| @JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) | |||||
| public class Response<T>{ | |||||
| private String status; | |||||
| public T data; | |||||
| public T config; | |||||
| public T msg; | |||||
| public Response(){} | |||||
| public T getData() { | |||||
| return data; | |||||
| } | |||||
| public void setData(T data) { | |||||
| this.data = data; | |||||
| } | |||||
| public String getStatus() { | |||||
| return status; | |||||
| } | |||||
| public void setStatus(String status) { | |||||
| this.status = status; | |||||
| } | |||||
| public T getConfig() { | |||||
| return config; | |||||
| } | |||||
| public void setConfig(T config) { | |||||
| this.config = config; | |||||
| } | |||||
| public T getMsg() { | |||||
| return msg; | |||||
| } | |||||
| public void setMsg(T msg) { | |||||
| this.msg = msg; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.controller; | |||||
| import java.io.IOException; | |||||
| import java.io.PrintWriter; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| public abstract class BaseController extends java.beans.PropertyEditorSupport | |||||
| { | |||||
| /** | |||||
| * 写回任意原始数据 | |||||
| * @param response | |||||
| * @param result | |||||
| * @throws IOException | |||||
| */ | |||||
| public void writeOutResponse(HttpServletResponse response,String result) throws IOException{ | |||||
| response.setHeader("Access-Control-Allow-Origin",""); | |||||
| response.setHeader("Access-Control-Allow-Credentials",""); | |||||
| response.setHeader("Access-Control-Allow-Methods",""); | |||||
| response.setHeader("Access-Control-Max-Age",""); | |||||
| response.setHeader("Access-Control-Allow-Headers",""); | |||||
| response.setHeader("X-Application-Context",""); | |||||
| response.setHeader("Transfer-Encoding", ""); | |||||
| response.setHeader("ResponseBodySize", result.length()+""); | |||||
| PrintWriter out = response.getWriter(); | |||||
| out.write(result); | |||||
| out.flush(); | |||||
| out.close(); | |||||
| } | |||||
| } | |||||
| package com.inet.ailink.receiver.controller; | |||||
| import java.io.IOException; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.web.bind.annotation.PathVariable; | |||||
| import org.springframework.web.bind.annotation.RequestBody; | |||||
| import org.springframework.web.bind.annotation.RequestMapping; | |||||
| import org.springframework.web.bind.annotation.ResponseBody; | |||||
| import org.springframework.web.bind.annotation.RestController; | |||||
| import com.inet.ailink.receiver.common.utils.JsonUtils; | |||||
| import com.inet.ailink.receiver.service.impl.SysLogsServiceImpl; | |||||
| @RestController | |||||
| @RequestMapping(value="deData",produces={"application/json;charset=UTF-8"}) | |||||
| public class DeDataBaseController extends BaseController { | |||||
| @Autowired | |||||
| SysLogsServiceImpl sysLogsServiceImpl; | |||||
| /** | |||||
| * 接受4G/WIFI+BLE设备测量结果数据 | |||||
| * @param params | |||||
| * @param request | |||||
| * @param response | |||||
| * @throws IOException | |||||
| */ | |||||
| @RequestMapping(value="pullData") | |||||
| @ResponseBody | |||||
| public Object saveDataBase(@RequestBody String params,HttpServletRequest request,HttpServletResponse response) throws IOException { | |||||
| return sysLogsServiceImpl.save(params,request); | |||||
| } | |||||
| /** | |||||
| * 获取4G/WIFI+BLE设备测量结果数据 | |||||
| * @param date | |||||
| * @param request | |||||
| * @param response | |||||
| * @throws IOException | |||||
| */ | |||||
| @RequestMapping(value="getData/{date}") | |||||
| @ResponseBody | |||||
| public String getData(@PathVariable String date,HttpServletRequest request,HttpServletResponse response) throws IOException { | |||||
| return JsonUtils.toJson(sysLogsServiceImpl.getData(date)) ; | |||||
| } | |||||
| } |
| package com.inet.ailink.receiver.entity; | |||||
| import com.inet.ailink.receiver.common.vo.Response; | |||||
| /** | |||||
| * @author Dream_Kang | |||||
| * | |||||
| */ | |||||
| @SuppressWarnings("serial") | |||||
| public class SysLogs implements Comparable<SysLogs>{ | |||||
| /** | |||||
| * 原始参数 | |||||
| */ | |||||
| private String encryptParams; | |||||
| /** | |||||
| * 数据接收时间 | |||||
| */ | |||||
| private String createTime; | |||||
| /** | |||||
| * 访问者IP地址 | |||||
| */ | |||||
| private String ip; | |||||
| /** | |||||
| * 请求URI | |||||
| */ | |||||
| private String uri; | |||||
| /** | |||||
| * 解密后的设备数据 | |||||
| */ | |||||
| private Object decryptParams; | |||||
| /** | |||||
| * 签名 | |||||
| */ | |||||
| private String sign; | |||||
| /** | |||||
| * appKey | |||||
| */ | |||||
| private String productKey; | |||||
| /** | |||||
| * errorMsg | |||||
| */ | |||||
| private String errorMsg; | |||||
| private Long sortCloumns; | |||||
| private Response<Object> result; | |||||
| public String getEncryptParams() { | |||||
| return encryptParams; | |||||
| } | |||||
| public void setEncryptParams(String encryptParams) { | |||||
| this.encryptParams = encryptParams; | |||||
| } | |||||
| public String getCreateTime() { | |||||
| return createTime; | |||||
| } | |||||
| public void setCreateTime(String createTime) { | |||||
| this.createTime = createTime; | |||||
| } | |||||
| public String getIp() { | |||||
| return ip; | |||||
| } | |||||
| public void setIp(String ip) { | |||||
| this.ip = ip; | |||||
| } | |||||
| public String getUri() { | |||||
| return uri; | |||||
| } | |||||
| public void setUri(String uri) { | |||||
| this.uri = uri; | |||||
| } | |||||
| public Object getDecryptParams() { | |||||
| return decryptParams; | |||||
| } | |||||
| public void setDecryptParams(Object decryptParams) { | |||||
| this.decryptParams = decryptParams; | |||||
| } | |||||
| public String getSign() { | |||||
| return sign; | |||||
| } | |||||
| public void setSign(String sign) { | |||||
| this.sign = sign; | |||||
| } | |||||
| public String getProductKey() { | |||||
| return productKey; | |||||
| } | |||||
| public void setProductKey(String productKey) { | |||||
| this.productKey = productKey; | |||||
| } | |||||
| public String getErrorMsg() { | |||||
| return errorMsg; | |||||
| } | |||||
| public void setErrorMsg(String errorMsg) { | |||||
| this.errorMsg = errorMsg; | |||||
| } | |||||
| /** | |||||
| * @return the sortCloumns | |||||
| */ | |||||
| public Long getSortCloumns() { | |||||
| return sortCloumns; | |||||
| } | |||||
| /** | |||||
| * @param sortCloumns the sortCloumns to set | |||||
| */ | |||||
| public void setSortCloumns(Long sortCloumns) { | |||||
| this.sortCloumns = sortCloumns; | |||||
| } | |||||
| @Override | |||||
| public int compareTo(SysLogs o) { | |||||
| return (int) (o.sortCloumns - this.sortCloumns); | |||||
| } | |||||
| public Response<Object> getResult() { | |||||
| return result; | |||||
| } | |||||
| public void setResult(Response<Object> result) { | |||||
| this.result = result; | |||||
| } | |||||
| } | |||||
| package com.inet.ailink.receiver.mapper; | |||||
| public interface ISysLogsDao{ | |||||
| } |
| /** | |||||
| * | |||||
| */ | |||||
| package com.inet.ailink.receiver.service; | |||||
| import java.util.List; | |||||
| import com.inet.ailink.receiver.common.exception.BizException; | |||||
| public interface IBaseService<E>{ | |||||
| public int update(E entity) throws BizException; | |||||
| public int save(List<E> entityList) throws BizException; | |||||
| public int save(E entity) throws BizException; | |||||
| E get(Long id) throws BizException; | |||||
| int remove(Long id) throws BizException; | |||||
| public List<E> selectListObjByAttribute(Object entity) throws BizException ; | |||||
| } |
| package com.inet.ailink.receiver.service.impl; | |||||
| import java.io.File; | |||||
| import java.io.IOException; | |||||
| import java.math.BigDecimal; | |||||
| import java.nio.charset.StandardCharsets; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Date; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import javax.servlet.http.HttpServletRequest; | |||||
| import com.inet.ailink.receiver.common.utils.*; | |||||
| import org.springframework.stereotype.Service; | |||||
| import com.inet.ailink.receiver.common.enums.StatusCode; | |||||
| import com.inet.ailink.receiver.common.vo.Response; | |||||
| import com.inet.ailink.receiver.entity.SysLogs; | |||||
| import java.util.Collections; | |||||
| @Service | |||||
| public class SysLogsServiceImpl | |||||
| { | |||||
| String logPath = "-log.log"; | |||||
| String productKey = "FjPkkwq902nAodaC"; | |||||
| String productSecret = "kPO5mod7mi9jhobgabvopqinkAnujh"; | |||||
| public Response<Object> save(String params, HttpServletRequest request) throws IOException { | |||||
| Response<Object> result = new Response<Object>(); | |||||
| SysLogs log = new SysLogs(); | |||||
| try { | |||||
| Map<String,String> paramsMap = JsonUtils.fromJson(params, Map.class); | |||||
| String deviceDataEncrypt = paramsMap.get("params"); | |||||
| log.setEncryptParams(deviceDataEncrypt); | |||||
| log.setIp(IpUtils.getIpAddr(request)); | |||||
| log.setUri(request.getRequestURI()); | |||||
| log.setCreateTime(DateUtils.getStringTodayB()); | |||||
| log.setSortCloumns(DateUtils.getCurTime()); | |||||
| //获取请求头信息中的productKey,通过productKey,获取productSecret | |||||
| // String productKey = request.getHeader("productKey"); | |||||
| // String productSecret = ""; | |||||
| //解析数据 | |||||
| //1.解密数据,使用AES/CBC/PKCS5Padding进行解密 | |||||
| String deviceDataDecrypt = AESUtils.aesCBCDecrypt(deviceDataEncrypt,productSecret,productKey); | |||||
| //2.校验签名 | |||||
| Map<String,Object> deviceDataMap = JsonUtils.fromJson(deviceDataDecrypt,Map.class); | |||||
| String sign = MD5Util.generateSignature(deviceDataMap,productSecret); | |||||
| String requestSign = request.getHeader("sign"); | |||||
| if(!sign.equals(requestSign)){ | |||||
| //处理签名不一致的情况 | |||||
| } | |||||
| //3.消息去重,同一条数据的requestId相同,可以根据requestId进行数据去重 | |||||
| String requestId = deviceDataMap.get("requestId").toString(); | |||||
| //4.业务处理,依据数据类型CID,区分不同类型的设备数据 | |||||
| String cid = deviceDataMap.get("cid").toString(); | |||||
| if(cid.equals("80")){//噪音计的CID=80 | |||||
| saveNoiseData(deviceDataMap); | |||||
| } | |||||
| //保存日志记录 | |||||
| log.setDecryptParams(deviceDataMap); | |||||
| log.setProductKey(productKey); | |||||
| log.setSign(requestSign); | |||||
| } catch (Exception e) { | |||||
| log.setErrorMsg(e.getMessage()); | |||||
| } | |||||
| //测试返回错误信息,重新推送 | |||||
| int a = (int) (Math.random()*10); | |||||
| if(a == 1 || a == 3 || a == 5){ | |||||
| result.setStatus(StatusCode.FAIL.getCode()); | |||||
| result.setMsg(StatusCode.FAIL.getMsg()); | |||||
| }else{ | |||||
| result.setStatus(StatusCode.SUCCESS.getCode()); | |||||
| result.setMsg(StatusCode.SUCCESS.getMsg()); | |||||
| } | |||||
| log.setResult(result); | |||||
| TxtUtils.string2Txt(JsonUtils.toJson(log)+"\n",DateUtils.format(new Date(),DateUtils.DATE_FORMAT_PATTERN_NO_SEPARATOR)+logPath); | |||||
| return result; | |||||
| } | |||||
| /** | |||||
| * 保存噪音计数据 | |||||
| * @param deviceDataMap | |||||
| */ | |||||
| public void saveNoiseData(Map<String,Object> deviceDataMap ){ | |||||
| //持久化数据或者进行消息通知等业务处理 | |||||
| } | |||||
| /** | |||||
| * 获取保存的日志记录数据 | |||||
| * @param date | |||||
| * @return | |||||
| */ | |||||
| public Object getData(String date) { | |||||
| if(StringSelfUtil.isEmpty(date)){ | |||||
| date = DateUtils.format(new Date(),DateUtils.DATE_FORMAT_PATTERN_NO_SEPARATOR); | |||||
| } | |||||
| List<String> strList = TxtUtils.txt2String(new File(date+logPath)); | |||||
| List<SysLogs> resultList = new ArrayList<SysLogs>(); | |||||
| for(String obj:strList){ | |||||
| resultList.add(JsonUtils.fromJson(obj, SysLogs.class)); | |||||
| } | |||||
| Collections.sort(resultList); | |||||
| return resultList; | |||||
| } | |||||
| } |
| spring.application.name=ailink-receiver-pull-demo | |||||
| server.port=8099 | |||||
| #spring.datasource.driver-class-name=com.mysql.jdbc.Driver | |||||
| spring.datasource.driver-class-name= | |||||
| spring.datasource.url= | |||||
| spring.datasource.username= | |||||
| spring.datasource.password= | |||||
| spring.jpa.properties.hibernate.hbm2ddl.auto=update | |||||
| spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect | |||||
| spring.jpa.show-sql= true | |||||
| mybatis.config-locations=classpath:mybatis/mybatis-config.xml | |||||
| mybatis.mapper-locations=classpath:mybatis/mapper/*.xml | |||||
| mybatis.type-aliases-package=com.inet.ailink.receiver.entity | |||||
| logging.level.com.inet.ailink.receiver.mapper=debug | |||||
| #jackson | |||||
| spring.jackson.default-property-inclusion=non_null | |||||
| spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=true | |||||
| spring.profiles.active=dev | |||||
| #allow upload size | |||||
| #spring.http.multipart.maxFileSize = 20Mb | |||||
| #spring.http.multipart.maxRequestSize=100Mb | |||||
| spring.servlet.multipart.maxFileSize=20MB | |||||
| spring.servlet.multipart.maxRequestSize=100MB |
| <?xml version="1.0" encoding="UTF-8" ?> | |||||
| <!DOCTYPE mapper | |||||
| PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" | |||||
| "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> | |||||
| <mapper namespace="com.inet.ailink.receiver.mapper.ISysLogsDao"> | |||||
| <resultMap id="sysLogsResult" type="com.inet.ailink.receiver.entity.SysLogs"> | |||||
| </resultMap> | |||||
| <!-- 用于select查询公用抽取的列 --> | |||||
| <sql id="sysLogsColumns"> | |||||
| <![CDATA[ | |||||
| id as id, | |||||
| beanName as beanName, | |||||
| methodName as methodName, | |||||
| serviceType as serviceType, | |||||
| uri as uri, | |||||
| localHostAddr as localHostAddr, | |||||
| remoteAddr as remoteAddr, | |||||
| userId as userId, | |||||
| userName as userName, | |||||
| startTime as startTime, | |||||
| executeTime as executeTime, | |||||
| pramString as pramString, | |||||
| operatorType as operatorType, | |||||
| isSuccess as isSuccess, | |||||
| failMessage as failMessage, | |||||
| responseResult as responseResult, | |||||
| logLevel as logLevel, | |||||
| executeSql as executeSql, | |||||
| rowId as rowId, | |||||
| delStatus as delStatus, | |||||
| appId as appId | |||||
| ]]> | |||||
| </sql> | |||||
| <!-- useGeneratedKeys="true" keyProperty="xxx" for sqlserver and mysql --> | |||||
| <insert id="insert" parameterType="com.inet.ailink.receiver.entity.SysLogs" | |||||
| useGeneratedKeys="true" keyProperty="id" | |||||
| flushCache="true"> | |||||
| <![CDATA[ | |||||
| INSERT INTO | |||||
| sys_logs ( | |||||
| beanName , | |||||
| methodName , | |||||
| serviceType , | |||||
| uri , | |||||
| localHostAddr , | |||||
| remoteAddr , | |||||
| userId , | |||||
| userName , | |||||
| startTime , | |||||
| executeTime , | |||||
| pramString , | |||||
| operatorType , | |||||
| isSuccess , | |||||
| failMessage , | |||||
| responseResult , | |||||
| logLevel , | |||||
| executeSql , | |||||
| rowId , | |||||
| delStatus , | |||||
| appId | |||||
| ) VALUES ( | |||||
| #{beanName,javaType=string,jdbcType=VARCHAR} , | |||||
| #{methodName,javaType=string,jdbcType=VARCHAR} , | |||||
| #{serviceType,javaType=string,jdbcType=VARCHAR} , | |||||
| #{uri,javaType=string,jdbcType=VARCHAR} , | |||||
| #{localHostAddr,javaType=string,jdbcType=VARCHAR} , | |||||
| #{remoteAddr,javaType=string,jdbcType=VARCHAR} , | |||||
| #{userId,javaType=long,jdbcType=BIGINT} , | |||||
| #{userName,javaType=string,jdbcType=VARCHAR} , | |||||
| #{startTime,javaType=date,jdbcType=TIMESTAMP} , | |||||
| #{executeTime,javaType=long,jdbcType=BIGINT} , | |||||
| #{pramString,javaType=string,jdbcType=VARCHAR} , | |||||
| #{operatorType,javaType=string,jdbcType=VARCHAR} , | |||||
| #{isSuccess,javaType=integer,jdbcType=INTEGER} , | |||||
| #{failMessage,javaType=string,jdbcType=VARCHAR} , | |||||
| #{responseResult,javaType=string,jdbcType=LONGVARCHAR} , | |||||
| #{logLevel,javaType=integer,jdbcType=INTEGER} , | |||||
| #{executeSql,javaType=string,jdbcType=VARCHAR} , | |||||
| #{rowId,javaType=string,jdbcType=VARCHAR} , | |||||
| #{delStatus,javaType=integer,jdbcType=INTEGER}, | |||||
| #{appId,javaType=long,jdbcType=BIGINT} | |||||
| ) | |||||
| ]]> | |||||
| </insert> | |||||
| <update id="update" parameterType="com.inet.ailink.receiver.entity.SysLogs"> | |||||
| UPDATE sys_logs SET | |||||
| <if test="beanName != null"> | |||||
| beanName = #{beanName,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="methodName != null"> | |||||
| methodName = #{methodName,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="serviceType != null"> | |||||
| serviceType = #{serviceType,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="uri != null"> | |||||
| uri = #{uri,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="localHostAddr != null"> | |||||
| localHostAddr = #{localHostAddr,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="remoteAddr != null"> | |||||
| remoteAddr = #{remoteAddr,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="userId != null"> | |||||
| userId = #{userId,javaType=long,jdbcType=BIGINT} , | |||||
| </if> | |||||
| <if test="userName != null"> | |||||
| userName = #{userName,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="startTime != null"> | |||||
| startTime = #{startTime,javaType=date,jdbcType=TIMESTAMP} , | |||||
| </if> | |||||
| <if test="executeTime != null"> | |||||
| executeTime = #{executeTime,javaType=long,jdbcType=BIGINT} , | |||||
| </if> | |||||
| <if test="pramString != null"> | |||||
| pramString = #{pramString,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="operatorType != null"> | |||||
| operatorType = #{operatorType,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="isSuccess != null"> | |||||
| isSuccess = #{isSuccess,javaType=integer,jdbcType=INTEGER} , | |||||
| </if> | |||||
| <if test="failMessage != null"> | |||||
| failMessage = #{failMessage,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="responseResult != null"> | |||||
| responseResult = #{responseResult,javaType=string,jdbcType=LONGVARCHAR} , | |||||
| </if> | |||||
| <if test="logLevel != null"> | |||||
| logLevel = #{logLevel,javaType=integer,jdbcType=INTEGER} , | |||||
| </if> | |||||
| <if test="executeSql != null"> | |||||
| executeSql = #{executeSql,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="rowId != null"> | |||||
| rowId = #{rowId,javaType=string,jdbcType=VARCHAR} , | |||||
| </if> | |||||
| <if test="delStatus != null"> | |||||
| delStatus = #{delStatus,javaType=integer,jdbcType=INTEGER} | |||||
| </if> | |||||
| WHERE | |||||
| id = #{id} | |||||
| </update> | |||||
| <delete id="delete" parameterType="java.lang.Long"> | |||||
| <![CDATA[ | |||||
| delete from sys_logs where | |||||
| id = #{id} | |||||
| ]]> | |||||
| </delete> | |||||
| <select id="getById" parameterType="long" resultMap="sysLogsResult" flushCache="false"> | |||||
| select <include refid="sysLogsColumns" /> | |||||
| <![CDATA[ | |||||
| from sys_logs | |||||
| where | |||||
| id = #{id} | |||||
| ]]> | |||||
| </select> | |||||
| <select id="getByIds" parameterType="list" resultMap="sysLogsResult" flushCache="false"> | |||||
| select <include refid="sysLogsColumns" /> | |||||
| from sys_logs | |||||
| where id in | |||||
| <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> | |||||
| #{item} </foreach> | |||||
| </select> | |||||
| <sql id="sysLogsDynamicWhere"> | |||||
| <!-- ognl访问静态方法的表达式 为@class@method(args),以下为调用rapid中的Ognl.isNotEmpty()方法,还有其它方法如isNotBlank()可以使用,具体请查看Ognl类 --> | |||||
| <where> | |||||
| <if test="@Ognl@isNotEmpty(id)"> | |||||
| and id = #{id} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(beanName)"> | |||||
| and beanName = #{beanName} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(methodName)"> | |||||
| and methodName = #{methodName} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(serviceType)"> | |||||
| and serviceType = #{serviceType} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(uri)"> | |||||
| and uri = #{uri} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(localHostAddr)"> | |||||
| and localHostAddr = #{localHostAddr} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(remoteAddr)"> | |||||
| and remoteAddr = #{remoteAddr} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(userId)"> | |||||
| and userId = #{userId} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(userName)"> | |||||
| and userName = #{userName} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(startTime)"> | |||||
| and startTime = #{startTime} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(executeTime)"> | |||||
| and executeTime = #{executeTime} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(pramString)"> | |||||
| and pramString = #{pramString} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(operatorType)"> | |||||
| and operatorType = #{operatorType} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(isSuccess)"> | |||||
| and isSuccess = #{isSuccess} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(failMessage)"> | |||||
| and failMessage = #{failMessage} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(responseResult)"> | |||||
| and responseResult = #{responseResult} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(logLevel)"> | |||||
| and logLevel = #{logLevel} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(executeSql)"> | |||||
| and executeSql = #{executeSql} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(rowId)"> | |||||
| and rowId = #{rowId} | |||||
| </if> | |||||
| <if test="@Ognl@isNotEmpty(delStatus)"> | |||||
| and delStatus = #{delStatus} | |||||
| </if> | |||||
| </where> | |||||
| </sql> | |||||
| <select id="getAll" resultMap="sysLogsResult" flushCache="false"> | |||||
| select <include refid="sysLogsColumns" /> | |||||
| from sys_logs | |||||
| <if test="@Ognl@isNotEmpty(sortColumns)"> | |||||
| ORDER BY ${sortColumns} | |||||
| </if> | |||||
| </select> | |||||
| <select id="getObjByAttribute" resultMap="sysLogsResult"> | |||||
| select <include refid="sysLogsColumns" /> | |||||
| from sys_logs | |||||
| <include refid="sysLogsDynamicWhere"/> | |||||
| </select> | |||||
| </mapper> |
| <?xml version="1.0" encoding="UTF-8" ?> | |||||
| <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> | |||||
| <configuration> | |||||
| <typeAliases> | |||||
| <typeAlias alias="Integer" type="java.lang.Integer" /> | |||||
| <typeAlias alias="Long" type="java.lang.Long" /> | |||||
| <typeAlias alias="HashMap" type="java.util.HashMap" /> | |||||
| <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" /> | |||||
| <typeAlias alias="ArrayList" type="java.util.ArrayList" /> | |||||
| <typeAlias alias="LinkedList" type="java.util.LinkedList" /> | |||||
| </typeAliases> | |||||
| </configuration> |