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