Files
senmesh-zc/src/main/java/com/newyetai/common/validation/util/ValidateUtils.java
ran.shang 7e38b8d971 init
2025-06-11 09:42:13 +08:00

250 lines
7.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.newyetai.common.validation.util;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.util.Assert;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
import java.util.regex.Pattern;
/**
* @author on 2019-11-05
*/
public class ValidateUtils {
/**
* 用户安全码校验正则
*/
public static final String SECURITY_CODE_PATTERN = "^[A-Za-z\\d!@#$%^&*]{6,32}$";
public static Pattern numberPattern = Pattern.compile("^[-\\+]?[\\d]*$");
public static Pattern mobilePattern = Pattern.compile("^[1][0-9]{10}$");
public static Pattern fixedTelephone = Pattern.compile("^[0]\\d{2,3}\\d{7,8}");
public static final Pattern USERNAME_PATTERN = Pattern.compile("^[a-zA-Z0-9]{4,32}$");
public static final Pattern PASSWORD_PATTERN = Pattern.compile("[A-Za-z\\d!@#$%^&*]{6,32}$");
/**
* 正则 邮箱
*/
private static Pattern EMAIL_REG = Pattern.compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
/**
* 昵称校验
*/
private static Pattern NICK_NAME_REG = Pattern.compile("^[\\u4e00-\\u9fffa-zA-Z0-9]{2,32}$");
/** 姓名 **/
private static final Pattern REAL_NAME_REG = Pattern.compile(
"^(([a-zA-Z+\\.?\\·?a-zA-Z+]{2,30}$)|([\\u4e00-\\u9fff+\\·?\\u4e00-\\u9fff+]{2,30}$))");
public static Validator validator = Validation.buildDefaultValidatorFactory()
.getValidator();
/**
* 身份证号权重因子、对应验证码
*/
// 前十七位加权因子
public static final int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 这是除以11后,可能产生的11位余数对应的验证码
public static final String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
// 假设18位身份证号码:41000119910101123X 410001 19910101 123X
// ^开头
// [1-9] 第一位1-9中的一个 4
// \\d{5} 五位数字 10001(前六位省市县地区)
// (18|19|20) 19(现阶段可能取值范围18xx-20xx年)
// \\d{2} 91(年份)
// ((0[1-9])|(10|11|12)) 01(月份)
// (([0-2][1-9])|10|20|30|31)01(日期)
// \\d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
// [0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
// $结尾
// 假设15位身份证号码:410001910101123 410001 910101 123
// ^开头
// [1-9] 第一位1-9中的一个 4
// \\d{5} 五位数字 10001(前六位省市县地区)
// \\d{2} 91(年份)
// ((0[1-9])|(10|11|12)) 01(月份)
// (([0-2][1-9])|10|20|30|31)01(日期)
// \\d{3} 三位数字 123(第十五位奇数代表男,偶数代表女),15位身份证不含X
// $结尾
private static Pattern idCardPattern = Pattern.compile(
"(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
+ "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)");
/**
* 手机号码校验
*
* @param mobile
* @return
*/
public static boolean isPhone(String mobile) {
if (StringUtils.isBlank(mobile)) {
return false;
}
return mobilePattern.matcher(mobile).matches();
}
/**
* 固定电话校验
*
* @param phone
* @return
*/
public static boolean isFixedTelephone(String phone) {
if (StringUtils.isBlank(phone)) {
return false;
}
phone = phone.replace("-", "");
return fixedTelephone.matcher(phone).matches();
}
/**
* 身份证校验
*
* @param idCard
* @return
*/
public static boolean isIdCard(String idCard) {
if (StringUtils.isBlank(idCard)) {
return false;
}
boolean matches = idCardPattern.matcher(idCard).matches();
// 判断第18位校验值
if (matches) {
if (idCard.length() == 18) {
try {
char[] charArray = idCard.toCharArray();
int sum = 0;
for (int i = 0; i < idCardWi.length; i++) {
int current = Integer.parseInt(String.valueOf(charArray[i]));
int count = current * idCardWi[i];
sum += count;
}
char idCardLast = charArray[17];
int idCardMod = sum % 11;
if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
return matches;
}
/**
* 校验对象,校验未通过返回异常信息
* @param object
* @param groups
* @return null 校验通过;否则 返回异常信息
* @author sr on 2021-05-25
*/
public static String validate(Object object, Class<?>... groups) {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (constraintViolations.isEmpty()) {
return null;
}
StringBuilder errMsg = new StringBuilder();
constraintViolations.forEach(constraintViolation -> errMsg
.append(constraintViolation.getMessage()).append(CommonConstants.COMMA));
return errMsg.toString();
}
/**
* 校验对象,校验未通过抛BusinessException
* @param object
* @param groups
* @author sr on 2021-05-25
*/
public static void validateBiz(Object object, Class<?>... groups) {
String errMsg = validate(object, groups);
Assert.isNull(errMsg, errMsg);
}
/**
* 校验对象,校验未通过抛BusinessException
* @param object
* @param errMsg 自定义异常信息
* @param groups
* @author sr on 2021-06-10
*/
public static void validateBiz(Object object, String errMsg, Class<?>... groups) {
String originErrMsg = validate(object, groups);
Assert.isNull(originErrMsg, errMsg);
}
/**
* 账号是否合规
* @param userName
* @return
* @author sr on 2021-07-07
*/
public static boolean matchUsername(String userName) {
if (StringUtils.isBlank(userName)) {
return false;
}
return USERNAME_PATTERN.matcher(userName).matches();
}
/**
* 密码是否合规
* @param password
* @return
* @author sr on 2021-07-07
*/
public static boolean matchPassword(String password) {
if (StringUtils.isBlank(password)) {
return false;
}
return PASSWORD_PATTERN.matcher(password).matches();
}
/**
* 邮箱是否合规
* @param email
* @return
* @author sr on 2021-07-07
*/
public static boolean checkEmail(String email) {
if (StringUtils.isBlank(email)) {
return false;
}
return EMAIL_REG.matcher(email).matches();
}
public static boolean checkNickName(String nickname) {
if (StringUtils.isBlank(nickname)) {
return false;
}
return NICK_NAME_REG.matcher(nickname).matches();
}
/**
* 检查中文姓名
*
* @param realname 中文名
* @return boolean
*/
public static boolean checkRealName(String realname) {
if (StringUtils.isBlank(realname)) {
return false;
}
return REAL_NAME_REG.matcher(realname).matches();
}
}