疯狂的狮子Li
2024-01-14 2417517aeec7512b0580acd85eb7c5d26d2bdcc5
add 新增 正则工具类 字符串提取 字符串校验
已添加4个文件
已修改1个文件
239 ■■■■■ 文件已修改
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/RegexConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package org.dromara.common.core.constant;
import cn.hutool.core.lang.RegexPool;
/**
 * å¸¸ç”¨æ­£åˆ™è¡¨è¾¾å¼å­—符串
 * <p>
 * å¸¸ç”¨æ­£åˆ™è¡¨è¾¾å¼é›†åˆï¼Œæ›´å¤šæ­£åˆ™è§: https://any86.github.io/any-rule/
 *
 * @author Feng
 */
public interface RegexConstants extends RegexPool {
    /**
     * å­—典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
     */
    public static final String DICTIONARY_TYPE = "^[a-z][a-z0-9_]*$";
    /**
     * èº«ä»½è¯å·ç ï¼ˆåŽ6位)
     */
    public static final String ID_CARD_LAST_6 = "^(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
    /**
     * QQ号码
     */
    public static final String QQ_NUMBER = "^[1-9][0-9]\\d{4,9}$";
    /**
     * é‚®æ”¿ç¼–码
     */
    public static final String POSTAL_CODE = "^[1-9]\\d{5}$";
    /**
     * æ³¨å†Œè´¦å·
     */
    public static final String ACCOUNT = "^[a-zA-Z][a-zA-Z0-9_]{4,15}$";
    /**
     * å¯†ç ï¼šåŒ…含至少8个字符,包括大写字母、小写字母、数字和特殊字符
     */
    public static final String PASSWORD = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$";
    /**
     * é€šç”¨çŠ¶æ€ï¼ˆ0表示正常,1表示停用)
     */
    public static final String STATUS = "^[01]$";
}
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/factory/RegexPatternPoolFactory.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package org.dromara.common.core.factory;
import cn.hutool.core.lang.PatternPool;
import org.dromara.common.core.constant.RegexConstants;
import java.util.regex.Pattern;
/**
 * æ­£åˆ™è¡¨è¾¾å¼æ¨¡å¼æ± å·¥åŽ‚
 * <p>初始化的时候将正则表达式加入缓存池当中</p>
 * <p>提高正则表达式的性能,避免重复编译相同的正则表达式</p>
 *
 * @author 21001
 */
public class RegexPatternPoolFactory extends PatternPool {
    /**
     * å­—典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
     */
    public static final Pattern DICTIONARY_TYPE = get(RegexConstants.DICTIONARY_TYPE);
    /**
     * èº«ä»½è¯å·ç ï¼ˆåŽ6位)
     */
    public static final Pattern ID_CARD_LAST_6 = get(RegexConstants.ID_CARD_LAST_6);
    /**
     * QQ号码
     */
    public static final Pattern QQ_NUMBER = get(RegexConstants.QQ_NUMBER);
    /**
     * é‚®æ”¿ç¼–码
     */
    public static final Pattern POSTAL_CODE = get(RegexConstants.POSTAL_CODE);
    /**
     * æ³¨å†Œè´¦å·
     */
    public static final Pattern ACCOUNT = get(RegexConstants.ACCOUNT);
    /**
     * å¯†ç ï¼šåŒ…含至少8个字符,包括大写字母、小写字母、数字和特殊字符
     */
    public static final Pattern PASSWORD = get(RegexConstants.PASSWORD);
    /**
     * é€šç”¨çŠ¶æ€ï¼ˆ0表示正常,1表示停用)
     */
    public static final Pattern STATUS = get(RegexConstants.STATUS);
}
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.util.ReUtil;
import org.dromara.common.core.constant.RegexConstants;
/**
 * æ­£åˆ™ç›¸å…³å·¥å…·ç±»
 *
 * @author Feng
 */
public final class RegexUtils extends ReUtil {
    /**
     * ä»Žè¾“入字符串中提取匹配的部分,如果没有匹配则返回默认值
     *
     * @param input        è¦æå–的输入字符串
     * @param regex        ç”¨äºŽåŒ¹é…çš„æ­£åˆ™è¡¨è¾¾å¼ï¼Œå¯ä»¥ä½¿ç”¨ {@link RegexConstants} ä¸­å®šä¹‰çš„常量
     * @param defaultInput å¦‚果没有匹配时返回的默认值
     * @return å¦‚果找到匹配的部分,则返回匹配的部分,否则返回默认值
     */
    public static String extractFromString(String input, String regex, String defaultInput) {
        try {
            return ReUtil.get(regex, input, 1);
        } catch (Exception e) {
            return defaultInput;
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/regex/RegexValidator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package org.dromara.common.core.utils.regex;
import cn.hutool.core.exceptions.ValidateException;
import cn.hutool.core.lang.Validator;
import org.dromara.common.core.factory.RegexPatternPoolFactory;
import java.util.regex.Pattern;
/**
 * æ­£åˆ™å­—段校验器
 * ä¸»è¦éªŒè¯å­—段非空、是否为满足指定格式等
 *
 * @author Feng
 */
public class RegexValidator extends Validator {
    /**
     * å­—典类型必须以字母开头,且只能为(小写字母,数字,下滑线)
     */
    public static final Pattern DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE;
    /**
     * èº«ä»½è¯å·ç ï¼ˆåŽ6位)
     */
    public static final Pattern ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6;
    /**
     * QQ号码
     */
    public static final Pattern QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER;
    /**
     * é‚®æ”¿ç¼–码
     */
    public static final Pattern POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE;
    /**
     * æ³¨å†Œè´¦å·
     */
    public static final Pattern ACCOUNT = RegexPatternPoolFactory.ACCOUNT;
    /**
     * å¯†ç ï¼šåŒ…含至少8个字符,包括大写字母、小写字母、数字和特殊字符
     */
    public static final Pattern PASSWORD = RegexPatternPoolFactory.PASSWORD;
    /**
     * é€šç”¨çŠ¶æ€ï¼ˆ0表示正常,1表示停用)
     */
    public static final Pattern STATUS = RegexPatternPoolFactory.STATUS;
    /**
     * æ£€æŸ¥è¾“入的账号是否匹配预定义的规则
     *
     * @param value è¦éªŒè¯çš„账号
     * @return å¦‚果账号符合规则,返回 true;否则,返回 false。
     */
    public static boolean isAccount(CharSequence value) {
        return isMatchRegex(ACCOUNT, value);
    }
    /**
     * éªŒè¯è¾“入的账号是否符合规则,如果不符合,则抛出 ValidateException å¼‚常
     *
     * @param value    è¦éªŒè¯çš„账号
     * @param errorMsg éªŒè¯å¤±è´¥æ—¶æŠ›å‡ºçš„异常消息
     * @param <T>      CharSequence çš„子类型
     * @return å¦‚果验证通过,返回输入的账号
     * @throws ValidateException å¦‚果验证失败
     */
    public static <T extends CharSequence> T validateAccount(T value, String errorMsg) throws ValidateException {
        if (!isAccount(value)) {
            throw new ValidateException(errorMsg);
        }
        return value;
    }
    /**
     * æ£€æŸ¥è¾“入的状态是否匹配预定义的规则
     *
     * @param value è¦éªŒè¯çš„状态
     * @return å¦‚果状态符合规则,返回 true;否则,返回 false。
     */
    public static boolean isStatus(CharSequence value) {
        return isMatchRegex(STATUS, value);
    }
    /**
     * éªŒè¯è¾“入的状态是否符合规则,如果不符合,则抛出 ValidateException å¼‚常
     *
     * @param value    è¦éªŒè¯çš„状态
     * @param errorMsg éªŒè¯å¤±è´¥æ—¶æŠ›å‡ºçš„异常消息
     * @param <T>      CharSequence çš„子类型
     * @return å¦‚果验证通过,返回输入的状态
     * @throws ValidateException å¦‚果验证失败
     */
    public static <T extends CharSequence> T validateStatus(T value, String errorMsg) throws ValidateException {
        if (!isStatus(value)) {
            throw new ValidateException(errorMsg);
        }
        return value;
    }
}
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java
@@ -6,6 +6,7 @@
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.constant.RegexConstants;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysDictType;
@@ -37,7 +38,7 @@
     */
    @NotBlank(message = "字典类型不能为空")
    @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符")
    @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
    @Pattern(regexp = RegexConstants.DICTIONARY_TYPE, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
    private String dictType;
    /**