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> |