26 changed files with 569 additions and 372 deletions
@ -0,0 +1,351 @@ |
|||||
|
package com.bnyer.common.core.annotation; |
||||
|
|
||||
|
|
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
|
||||
|
import javax.validation.Constraint; |
||||
|
import javax.validation.ConstraintValidator; |
||||
|
import javax.validation.ConstraintValidatorContext; |
||||
|
import javax.validation.Payload; |
||||
|
import java.lang.annotation.Documented; |
||||
|
import java.lang.annotation.Retention; |
||||
|
import java.lang.annotation.RetentionPolicy; |
||||
|
import java.lang.annotation.Target; |
||||
|
import java.util.regex.Matcher; |
||||
|
import java.util.regex.Pattern; |
||||
|
|
||||
|
import static java.lang.annotation.ElementType.*; |
||||
|
|
||||
|
/** |
||||
|
* @author :WXC |
||||
|
* @Date :2023/04/11 |
||||
|
* @description : |
||||
|
*/ |
||||
|
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) |
||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||
|
@Documented |
||||
|
@Constraint(validatedBy = { CustomParamsValidation.CustomParamsValidationImpl.class }) |
||||
|
public @interface CustomParamsValidation { |
||||
|
|
||||
|
/** |
||||
|
* 预定义的正则表达式 |
||||
|
*/ |
||||
|
class Regexp{ |
||||
|
/** |
||||
|
* 常规输入框:匹配中文,字母,数字 |
||||
|
*/ |
||||
|
private final static String INPUTTXT="^[A-Za-z0-9\u4e00-\u9fa5]*$"; |
||||
|
|
||||
|
/** |
||||
|
* 昵称匹配:匹配中文,字母,数字 下划线 |
||||
|
*/ |
||||
|
private final static String NICKNAME="^[A-Za-z0-9_\u4e00-\u9fa5]*$"; |
||||
|
|
||||
|
/**********以上public 的正则提供 regexp 属性使用**********/ |
||||
|
|
||||
|
/**********以下private 的正则提供 paramType 计算**********/ |
||||
|
/** |
||||
|
* 匹配邮箱 |
||||
|
*/ |
||||
|
private final static String EMAIL="^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"; |
||||
|
/** |
||||
|
* uuid |
||||
|
* 格式 |
||||
|
* {8}-{4}-{4}-{4}-{12} |
||||
|
* 如 |
||||
|
* 4cbd6c8b-1111-45f4-b477-a524707aedfd |
||||
|
*/ |
||||
|
private static final String UUID="^[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}$"; |
||||
|
/** |
||||
|
* yyyy-MM-dd |
||||
|
*/ |
||||
|
private static final String DATE = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9]))$"; |
||||
|
/** |
||||
|
* yyyyMMdd |
||||
|
*/ |
||||
|
private static final String DATE2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))$"; |
||||
|
/** |
||||
|
* yyyy-MM-dd HH:mm:ss |
||||
|
*/ |
||||
|
private static final String DATETIME = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; |
||||
|
/** |
||||
|
* yyyyMMddHHmmss |
||||
|
*/ |
||||
|
private static final String DATETIME2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$"; |
||||
|
/** |
||||
|
* yyyy-MM-dd HH:mm |
||||
|
*/ |
||||
|
private static final String DATETIME3 = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9])$"; |
||||
|
|
||||
|
/** |
||||
|
* HH:mm:ss |
||||
|
*/ |
||||
|
private static final String TIME = "^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; |
||||
|
/** |
||||
|
* HHmmss |
||||
|
*/ |
||||
|
private static final String TIME2 = "^([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$"; |
||||
|
|
||||
|
/** |
||||
|
* 手机号码 |
||||
|
*/ |
||||
|
private static final String MOBILEPHONE="^1\\d{10}$"; |
||||
|
|
||||
|
/** |
||||
|
* 匹配IPV4地址 |
||||
|
*/ |
||||
|
private final static String IPV4="((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))"; |
||||
|
//=============可以在此扩展正则=============
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 校验正则 |
||||
|
* @param regexp |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean validateRegexp(String regexp,String value){ |
||||
|
Pattern pattern = Pattern.compile(regexp); |
||||
|
Matcher matcher = pattern.matcher(value); |
||||
|
return matcher.matches(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 预定义的参数类型 |
||||
|
*/ |
||||
|
class ParamType { |
||||
|
//匹配IPV4地址
|
||||
|
public static final String IPV4 = "ipv4"; |
||||
|
/** |
||||
|
* uuid |
||||
|
*/ |
||||
|
public static final String UUID="uuid"; |
||||
|
/** |
||||
|
* 匹配中文 |
||||
|
*/ |
||||
|
public static final String INPUTTXT="inputtxt"; |
||||
|
/** |
||||
|
* 匹配中文英文数字下划线 |
||||
|
*/ |
||||
|
public static final String NICKNAME="nickname"; |
||||
|
|
||||
|
/** |
||||
|
* 匹配邮箱 |
||||
|
*/ |
||||
|
public static final String EMAIL="email"; |
||||
|
|
||||
|
/** |
||||
|
* 手机号码 |
||||
|
*/ |
||||
|
public static final String MOBILEPHONE="mobilephone"; |
||||
|
|
||||
|
/** |
||||
|
* yyyy-MM-dd |
||||
|
*/ |
||||
|
public static final String DATE = "yyyy-MM-dd"; |
||||
|
/** |
||||
|
* yyyyMMdd |
||||
|
*/ |
||||
|
public static final String DATE2 = "yyyyMMdd"; |
||||
|
/** |
||||
|
* yyyy-MM-dd HH:mm:ss |
||||
|
*/ |
||||
|
public static final String DATETIME = "yyyy-MM-dd HH:mm:ss"; |
||||
|
/** |
||||
|
* yyyyMMddHHmmss |
||||
|
*/ |
||||
|
public static final String DATETIME2 = "yyyyMMddHHmmss"; |
||||
|
/** |
||||
|
* yyyy-MM-dd HH:mm |
||||
|
*/ |
||||
|
public static final String DATETIME3 = "yyyy-MM-dd HH:mm"; |
||||
|
|
||||
|
/** |
||||
|
* HH:mm:ss |
||||
|
*/ |
||||
|
public static final String TIME = "HH:mm:ss"; |
||||
|
/** |
||||
|
* HHmmss |
||||
|
*/ |
||||
|
public static final String TIME2 = "HHmmss"; |
||||
|
/** |
||||
|
* 参数类型校验 |
||||
|
* |
||||
|
* @param paramType |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean validateParamType(String paramType, String value) { |
||||
|
boolean flag = false; |
||||
|
|
||||
|
switch (paramType) { |
||||
|
case ParamType.IPV4: |
||||
|
value = value.replaceAll(" ",""); |
||||
|
flag = Regexp.validateRegexp(Regexp.IPV4, value); |
||||
|
break; |
||||
|
case ParamType.MOBILEPHONE: flag = Regexp.validateRegexp(Regexp.MOBILEPHONE, value);break; |
||||
|
case ParamType.NICKNAME: flag = Regexp.validateRegexp(Regexp.NICKNAME, value);break; |
||||
|
case ParamType.EMAIL: flag = Regexp.validateRegexp(Regexp.EMAIL, value);break; |
||||
|
case ParamType.UUID : flag = Regexp.validateRegexp(Regexp.UUID, value);break; |
||||
|
case ParamType.INPUTTXT : flag = Regexp.validateRegexp(Regexp.INPUTTXT, value);break; |
||||
|
case ParamType.DATE : flag = validateDateParamType(ParamType.DATE, value);break; |
||||
|
case ParamType.DATE2 : flag = validateDateParamType(ParamType.DATE2, value);break; |
||||
|
case ParamType.DATETIME : flag = validateDateParamType(ParamType.DATETIME, value);break; |
||||
|
case ParamType.DATETIME2 : flag = validateDateParamType(ParamType.DATETIME2, value);break; |
||||
|
case ParamType.DATETIME3 : flag = validateDateParamType(ParamType.DATETIME3, value);break; |
||||
|
case ParamType.TIME : flag = validateDateParamType(ParamType.TIME, value);break; |
||||
|
case ParamType.TIME2 : flag = validateDateParamType(ParamType.TIME2, value);break; |
||||
|
} |
||||
|
return flag; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* dateFormat 属性配置,配置的值 不是内置值,验证无法通过 |
||||
|
* @param dateFormat |
||||
|
* @param value |
||||
|
* @return |
||||
|
*/ |
||||
|
private static boolean validateDateParamType(String dateFormat,String value){ |
||||
|
String regexp = null; |
||||
|
|
||||
|
if(DATE.equals(dateFormat)){ |
||||
|
regexp = Regexp.DATE; |
||||
|
}else if(DATE2.equals(dateFormat)){ |
||||
|
regexp = Regexp.DATE2; |
||||
|
}else if(DATETIME.equals(dateFormat)){ |
||||
|
regexp = Regexp.DATETIME; |
||||
|
}else if(DATETIME2.equals(dateFormat)){ |
||||
|
regexp = Regexp.DATETIME2; |
||||
|
}else if(DATETIME3.equals(dateFormat)){ |
||||
|
regexp = Regexp.DATETIME3; |
||||
|
}else if(TIME.equals(dateFormat)){ |
||||
|
regexp = Regexp.TIME; |
||||
|
}else if(TIME2.equals(dateFormat)){ |
||||
|
regexp = Regexp.TIME2; |
||||
|
} |
||||
|
|
||||
|
if(regexp!=null){ |
||||
|
boolean flag = Regexp.validateRegexp(regexp, value); |
||||
|
//时间不用做2月29日瑞年判断
|
||||
|
if(TIME.equals(dateFormat) || TIME2.equals(dateFormat)){ |
||||
|
return flag; |
||||
|
} |
||||
|
if(flag){ |
||||
|
//月份和日期部分
|
||||
|
String monthAndDay = ""; |
||||
|
//2月29日常量
|
||||
|
String monthAndDayConstant = ""; |
||||
|
Integer year = null; |
||||
|
switch (dateFormat) { |
||||
|
case DATE: |
||||
|
case DATETIME: |
||||
|
case DATETIME3: |
||||
|
monthAndDay = StringUtils.substring(value, 5, 10); |
||||
|
monthAndDayConstant = "02-29"; |
||||
|
year = Integer.valueOf(StringUtils.substring(value, 0, 4)); |
||||
|
break; |
||||
|
case DATE2: |
||||
|
case DATETIME2: |
||||
|
monthAndDay = StringUtils.substring(value, 4, 8); |
||||
|
monthAndDayConstant = "0229"; |
||||
|
year = Integer.valueOf(StringUtils.substring(value, 0, 4)); |
||||
|
break; |
||||
|
} |
||||
|
//2月29日判断是否是润年,非润年没有2月29日
|
||||
|
if(monthAndDay.equals(monthAndDayConstant)){ |
||||
|
if(!isLeapYear(year)){ |
||||
|
flag = false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return flag; |
||||
|
} |
||||
|
|
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 判断是否是润年 |
||||
|
* @param year |
||||
|
* @return |
||||
|
*/ |
||||
|
private static boolean isLeapYear(int year){ |
||||
|
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 预定义Range |
||||
|
* |
||||
|
*/ |
||||
|
class Range{ |
||||
|
private static boolean contains(String range,String value){ |
||||
|
boolean flag = false; |
||||
|
if(StringUtils.isEmpty(value)){ |
||||
|
return false; |
||||
|
} |
||||
|
if(StringUtils.isNotEmpty(range)){ |
||||
|
String[] arr = range.split("\\|"); |
||||
|
for (String string : arr) { |
||||
|
if(value.equals(string)){ |
||||
|
flag = true; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return flag; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 参数类型,最优先推荐使用的属性 |
||||
|
* @return |
||||
|
*/ |
||||
|
String paramType() default ""; |
||||
|
|
||||
|
/** |
||||
|
* 限制字符串或者数字 可选项,用 | 分割 ,如 00|10|20 |
||||
|
* @return |
||||
|
*/ |
||||
|
String range() default ""; |
||||
|
|
||||
|
String message() default "参数基本校验不通过错误:注意格式及长度"; |
||||
|
|
||||
|
Class<?>[]groups() default {}; |
||||
|
|
||||
|
Class<? extends Payload>[]payload() default {}; |
||||
|
|
||||
|
class CustomParamsValidationImpl implements ConstraintValidator<CustomParamsValidation,String> { |
||||
|
|
||||
|
String paramType; |
||||
|
|
||||
|
String range; |
||||
|
|
||||
|
|
||||
|
@Override |
||||
|
public void initialize(CustomParamsValidation constraintAnnotation) { |
||||
|
paramType = constraintAnnotation.paramType(); |
||||
|
range = constraintAnnotation.range(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean isValid(String value, ConstraintValidatorContext context) { |
||||
|
if(StringUtils.isNotEmpty(value)){ |
||||
|
//根据参数类型校验正则
|
||||
|
if(StringUtils.isNotEmpty(paramType)){ |
||||
|
return ParamType.validateParamType(paramType, value); |
||||
|
} |
||||
|
//校验参数范围
|
||||
|
if (StringUtils.isNotEmpty(range)){ |
||||
|
return Range.contains(range, value); |
||||
|
} |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -1,67 +0,0 @@ |
|||||
package com.bnyer.common.core.annotation; |
|
||||
|
|
||||
import org.apache.commons.lang3.StringUtils; |
|
||||
|
|
||||
import java.lang.annotation.Documented; |
|
||||
import java.lang.annotation.Retention; |
|
||||
import java.lang.annotation.RetentionPolicy; |
|
||||
import java.lang.annotation.Target; |
|
||||
|
|
||||
import static java.lang.annotation.ElementType.*; |
|
||||
|
|
||||
/** |
|
||||
* @author :WXC |
|
||||
* @Date :2023/03/31 |
|
||||
* @description : 自定义参数校验注解 |
|
||||
*/ |
|
||||
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) |
|
||||
@Retention(RetentionPolicy.RUNTIME) |
|
||||
@Documented |
|
||||
public @interface DiyParamsValidation { |
|
||||
|
|
||||
/** |
|
||||
* 限制字符串或者数字 可选项,用 | 分割 ,如 00|10|20 |
|
||||
* @return |
|
||||
*/ |
|
||||
String range() default ""; |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* 预定义Range |
|
||||
* |
|
||||
*/ |
|
||||
public static class Range{ |
|
||||
/** |
|
||||
* 参数只能是00,20 |
|
||||
*/ |
|
||||
public static final String STATE_D_E="00|20"; |
|
||||
/** |
|
||||
* 参数只能是00,10,20 |
|
||||
*/ |
|
||||
public static final String STATE_ALL="00|10|20"; |
|
||||
/** |
|
||||
* 参数只能是desc,asc |
|
||||
*/ |
|
||||
public static final String SORT_DIRECTION="desc|asc"; |
|
||||
|
|
||||
private static boolean contains(String range,String value){ |
|
||||
boolean flag = false; |
|
||||
if(StringUtils.isEmpty(value)){ |
|
||||
return false; |
|
||||
} |
|
||||
if(StringUtils.isNotEmpty(range)){ |
|
||||
String[] arr = range.split("\\|"); |
|
||||
for (String string : arr) { |
|
||||
if(value.equals(string)){ |
|
||||
flag = true; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
return flag; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
String message() default "参数基本校验不通过错误:注意格式及长度"; |
|
||||
} |
|
||||
@ -0,0 +1,36 @@ |
|||||
|
package com.bnyer.common.core.enums; |
||||
|
|
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.Getter; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
|
||||
|
/** |
||||
|
* @author :WXC |
||||
|
* @Date :2023/04/23 |
||||
|
* @description :时间单位 |
||||
|
*/ |
||||
|
@Getter |
||||
|
@AllArgsConstructor |
||||
|
public enum EnumTimeUnit { |
||||
|
|
||||
|
DAY(0,"天"), |
||||
|
WEEK(1,"周"), |
||||
|
MONTH(2,"月"), |
||||
|
QUARTER(3,"季"), |
||||
|
YEAR(4,"年"), |
||||
|
HOURS(5,"时"), |
||||
|
MINUTE(6,"分"), |
||||
|
SECONDS(7,"秒"), |
||||
|
; |
||||
|
|
||||
|
private final int unit; |
||||
|
private final String name; |
||||
|
|
||||
|
public static EnumTimeUnit getEnumTimeUnitByUnit(int unit) { |
||||
|
return Arrays.stream(values()) |
||||
|
.filter(vipTimeUnit -> unit == vipTimeUnit.getUnit()) |
||||
|
.findFirst().orElseThrow(() -> new SecurityException("unit 未匹配上对应的时间单位")); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -1,39 +0,0 @@ |
|||||
package com.bnyer.pay.dto; |
|
||||
|
|
||||
import com.bnyer.common.core.annotation.DiyParamsValidation; |
|
||||
import io.swagger.annotations.ApiModelProperty; |
|
||||
import lombok.Getter; |
|
||||
import lombok.NoArgsConstructor; |
|
||||
import lombok.Setter; |
|
||||
|
|
||||
import javax.validation.constraints.NotBlank; |
|
||||
|
|
||||
/** |
|
||||
* @author :WXC |
|
||||
* @Date :2023/04/03 |
|
||||
* @description : |
|
||||
*/ |
|
||||
@Getter |
|
||||
@Setter |
|
||||
@NoArgsConstructor |
|
||||
public class AliPayInOrderDto { |
|
||||
@ApiModelProperty(value="orderId",example = "1") |
|
||||
@NotBlank(message = "orderId 不能为空") |
|
||||
private String orderId; |
|
||||
|
|
||||
@ApiModelProperty(value="费用(单位元)",example = "0.01") |
|
||||
@NotBlank(message = "请输入金额(单位元)") |
|
||||
private String payAmount; |
|
||||
|
|
||||
@ApiModelProperty(value="用户ip",example = "127.0.0.1") |
|
||||
@NotBlank(message = "请输入终端IP") |
|
||||
private String ip; |
|
||||
|
|
||||
@ApiModelProperty(value="商品标题",example = "商品标题") |
|
||||
@NotBlank(message = "请输入支付标题") |
|
||||
private String goodsSubject; |
|
||||
|
|
||||
@ApiModelProperty(value="商品描述",example = "商品描述") |
|
||||
@NotBlank(message = "请输入支付描述") |
|
||||
private String goodsDesc; |
|
||||
} |
|
||||
@ -1,48 +0,0 @@ |
|||||
package com.bnyer.pay.dto; |
|
||||
|
|
||||
import com.bnyer.common.core.annotation.DiyParamsValidation; |
|
||||
import io.swagger.annotations.ApiModelProperty; |
|
||||
import lombok.Getter; |
|
||||
import lombok.NoArgsConstructor; |
|
||||
import lombok.Setter; |
|
||||
|
|
||||
import javax.validation.constraints.NotBlank; |
|
||||
|
|
||||
/** |
|
||||
* @author :WXC |
|
||||
* @Date :2023/04/05 |
|
||||
* @description : |
|
||||
*/ |
|
||||
@Getter |
|
||||
@Setter |
|
||||
@NoArgsConstructor |
|
||||
public class WxPayInOrderDto { |
|
||||
|
|
||||
@ApiModelProperty(value="orderId",example = "1") |
|
||||
@NotBlank |
|
||||
private String orderId; |
|
||||
|
|
||||
@ApiModelProperty(value="timestamp",example = "1111111111") |
|
||||
@NotBlank |
|
||||
private String timestamp; |
|
||||
|
|
||||
@ApiModelProperty(value="费用(单位分)",example = "1") |
|
||||
@NotBlank(message = "请输入金额(单位分)") |
|
||||
private String feeFen; |
|
||||
|
|
||||
@ApiModelProperty(value="商品描述",example = "商品描述") |
|
||||
@NotBlank(message = "请输入支付描述") |
|
||||
private String goodsDesc; |
|
||||
|
|
||||
@ApiModelProperty(value="用户ip",example = "127.0.0.1") |
|
||||
@NotBlank(message = "请输入终端IP") |
|
||||
private String ip; |
|
||||
|
|
||||
@ApiModelProperty(value="交易类型[APP不传,JSAPI必传|MINIPROGRAM],APP|JSAPI|MWEB|MINIPROGRAM",example = "JSAPI") |
|
||||
@DiyParamsValidation(range = "APP|JSAPI|MWEB|MINIPROGRAM",message = "请输入正确的交易类型") |
|
||||
private String tradeType; |
|
||||
|
|
||||
@ApiModelProperty(value="openid[APP不传,JSAPI必传]",example = "12345678") |
|
||||
private String openid; |
|
||||
|
|
||||
} |
|
||||
Loading…
Reference in new issue