基于JDK 17 編寫的Java常用工具類

文章目錄

    • DateUtils
    • EncryptUtils
    • Fun
    • IdCardCalibrationUtil
    • Result
    • ResultCode
    • ValidateNameUtil
    • ValidatePhoneUtil

廢話少說看源碼

DateUtils

package com.huihang.core.utils;import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class DateUtils {private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");// 其他方法.../*** 獲得當前日期 yyyy-MM-dd HH:mm:ss*/public String getCurrentTime() {return LocalDateTime.now().format(DATE_TIME_FORMATTER);}/*** 獲取系統當前時間戳*/public String getSystemTime() {return String.valueOf(System.currentTimeMillis());}/*** 獲取當前日期 yyyy-MM-dd*/public String getDateByString() {return LocalDate.now().format(DATE_FORMATTER);}/*** 得到兩個時間差 格式yyyy-MM-dd HH:mm:ss*/public long dateSubtraction(String start, String end) {LocalDateTime startDate = LocalDateTime.parse(start, DATE_TIME_FORMATTER);LocalDateTime endDate = LocalDateTime.parse(end, DATE_TIME_FORMATTER);return Duration.between(startDate, endDate).toMillis();}/*** 判斷當前時間是否在[startTime, endTime]區間*/public boolean isEffectiveDate(LocalDate nowTime, String dateSection) {String[] times = dateSection.split(",");LocalDate startTime = LocalDate.parse(times[0], DATE_FORMATTER);LocalDate endTime = LocalDate.parse(times[1], DATE_FORMATTER);return !nowTime.isBefore(startTime) && !nowTime.isAfter(endTime);}}

EncryptUtils

package com.huihang.core.utils;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;public class EncryptUtils {private static final String AES_MODE = "AES/GCM/NoPadding";private static final int GCM_TAG_LENGTH = 128;private static final int AES_KEY_SIZE = 32; // 32字節 = 256位密鑰private static final int GCM_IV_SIZE = 12;  // GCM模式下通常使用12字節IV// 定義固定的密鑰和IVprivate static final byte[] FIXED_KEY = new byte[]{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0x88, (byte) 0x99, (byte) 0xAA,  (byte) 0xBB, (byte)0xCC, (byte)0xDD, (byte)0xEE, (byte)0xFF, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte)0x88,(byte) 0x99, (byte)0xAA, (byte)0xBB,(byte) 0xCC, (byte)0xDD, (byte)0xEE,(byte) 0xFF};private static final byte[] FIXED_IV = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B};private static final SecretKey key = new SecretKeySpec(FIXED_KEY, "AES");private static final byte[] iv = FIXED_IV;/*** 使用提供的 AES 密鑰和初始化向量(IV)對數據進行加密。** @param data 要加密的數據* @return 返回 Base64 編碼的加密結果*/public static String aesEncrypt(String data) {try {Cipher cipher = Cipher.getInstance(AES_MODE);GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);cipher.init(Cipher.ENCRYPT_MODE, key, spec);byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypted);} catch (Exception e) {throw new RuntimeException(e);}}/*** 使用提供的 AES 密鑰和初始化向量(IV)對加密的數據進行解密。** @param encryptedData Base64 編碼的加密數據* @return 返回解密后的原始數據*/public static String aesDecrypt(String encryptedData) {try {Cipher cipher = Cipher.getInstance(AES_MODE);GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);cipher.init(Cipher.DECRYPT_MODE, key, spec);byte[] decoded = Base64.getDecoder().decode(encryptedData);byte[] decrypted = cipher.doFinal(decoded);return new String(decrypted, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException(e);}}/*** 生成一個指定長度的隨機密鑰。** @return 生成的AES密鑰*/private static SecretKey generateAESKey() {byte[] keyBytes = new byte[AES_KEY_SIZE];SecureRandom random = new SecureRandom();random.nextBytes(keyBytes);return new SecretKeySpec(keyBytes, "AES");}/*** 生成一個指定長度的隨機IV。** @return 生成的IV字節數組*/private static byte[] generateIV() {byte[] iv = new byte[GCM_IV_SIZE];SecureRandom random = new SecureRandom();random.nextBytes(iv);return iv;}/*** 對輸入字符串進行 MD5 哈希計算。** @param data 要哈希的字符串* @return 返回 32 位十六進制表示的 MD5 哈希值* @throws NoSuchAlgorithmException 如果無法獲取指定算法的消息摘要實例*/public static String md5(String data){MessageDigest md = null;try {md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));return bytesToHex(digest);}/*** 對輸入字符串進行 SHA-256 哈希計算。** @param data 要哈希的字符串* @return 返回 64 位十六進制表示的 SHA-256 哈希值* @throws NoSuchAlgorithmException 如果無法獲取指定算法的消息摘要實例*/public static String sha256(String data) throws NoSuchAlgorithmException {MessageDigest md = MessageDigest.getInstance("SHA-256");byte[] digest = md.digest(data.getBytes(StandardCharsets.UTF_8));return bytesToHex(digest);}/*** 使用提供的 AES 密鑰和初始化向量(IV)對數據進行加密。** @param data 要加密的數據* @param key  AES 加密密鑰* @param iv   初始化向量,對于 GCM 模式應為 12 字節* @return 返回 Base64 編碼的加密結果* @throws Exception 如果加密過程中出現錯誤*/public static String aesEncrypt(String data, SecretKey key, byte[] iv) {Cipher cipher = null;try {cipher = Cipher.getInstance(AES_MODE);GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);cipher.init(Cipher.ENCRYPT_MODE, key, spec);byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypted);} catch (Exception e) {throw new RuntimeException(e);}}/*** 使用提供的 AES 密鑰和初始化向量(IV)對加密的數據進行解密。** @param encryptedData Base64 編碼的加密數據* @param key           AES 解密密鑰* @param iv            初始化向量,對于 GCM 模式應為 12 字節* @return 返回解密后的原始數據* @throws Exception 如果解密過程中出現錯誤*/public static String aesDecrypt(String encryptedData, SecretKey key, byte[] iv)  {Cipher cipher = null;try {cipher = Cipher.getInstance(AES_MODE);GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH, iv);cipher.init(Cipher.DECRYPT_MODE, key, spec);byte[] decoded = Base64.getDecoder().decode(encryptedData);byte[] decrypted = cipher.doFinal(decoded);return new String(decrypted, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException(e);}}/*** 使用 RSA 公鑰對數據進行加密。** @param data      要加密的數據* @param publicKey RSA 公鑰* @return 返回 Base64 編碼的加密結果* @throws Exception 如果加密過程中出現錯誤*/public static String rsaEncrypt(String data, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypted);}/*** 使用 RSA 私鑰對加密的數據進行解密。** @param encryptedData Base64 編碼的加密數據* @param privateKey    RSA 私鑰* @return 返回解密后的原始數據* @throws Exception 如果解密過程中出現錯誤*/public static String rsaDecrypt(String encryptedData, PrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decoded = Base64.getDecoder().decode(encryptedData);byte[] decrypted = cipher.doFinal(decoded);return new String(decrypted, StandardCharsets.UTF_8);}/*** 生成一個指定大小的 RSA 密鑰對。** @param keySize RSA 密鑰長度(例如 2048)* @return 返回生成的 KeyPair 對象,包含公鑰和私鑰* @throws NoSuchAlgorithmException 如果無法獲取指定算法的密鑰對生成器實例*/public static KeyPair generateRsaKeyPair(int keySize) throws NoSuchAlgorithmException {KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(keySize);return keyGen.generateKeyPair();}/*** 生成一個新的 AES 密鑰。** @return 返回生成的 AES SecretKey 對象* @throws NoSuchAlgorithmException 如果無法獲取指定算法的密鑰生成器實例*/public static SecretKey generateAesKey() throws NoSuchAlgorithmException {KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(AES_KEY_SIZE);return keyGen.generateKey();}/*** 將字節數組轉換為十六進制字符串。** @param bytes 要轉換的字節數組* @return 返回對應的十六進制字符串*/private static String bytesToHex(byte[] bytes) {StringBuilder sb = new StringBuilder();for (byte b : bytes) {sb.append(String.format("%02x", b));}return sb.toString();}
}

Fun

package com.huihang.core.utils;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.*;public class Fun {/*** 檢查給定的集合是否為空或null。** @param collection 要檢查的集合* @return 如果集合是null或空,則返回true;否則返回false。*/public static boolean isEmpty(Collection<?> collection) {return (collection == null || collection.isEmpty());}/*** 檢查給定的map是否為空或null。** @param map 要檢查的map* @return 如果地圖是null或空,則返回true;否則返回false。*/public static boolean isEmpty(Map<?, ?> map) {return (map == null || map.isEmpty());}public static boolean isEmpty(Object o) {return Objects.isNull(o);}public static boolean isNotEmpty(Object o) {return Objects.nonNull(o);}/*** 檢查給定的集合是否不為空且非null。** @param collection 要檢查的集合* @return 如果集合不是null并且包含元素,則返回true;否則返回false。*/public static boolean isNotEmpty(Collection<?> collection) {return (collection != null && !collection.isEmpty());}/*** 檢查給定的地圖是否不為空且非null。** @param map 要檢查的地圖* @return 如果地圖不是null并且包含條目,則返回true;否則返回false。*/public static boolean isNotEmpty(Map<?, ?> map) {return (map != null && !map.isEmpty());}/*** 檢查給定的CharSequence對象是否為空字符串或null。** @param cs 要檢查的CharSequence對象(如String)* @return 如果CharSequence是null或長度為0,則返回true;否則返回false。*/public static boolean isEmpty(CharSequence cs) {return cs == null || cs.isEmpty();}/*** 檢查給定的CharSequence對象是否不為空字符串且非null。** @param cs 要檢查的CharSequence對象(如String)* @return 如果CharSequence不是null并且長度大于0,則返回true;否則返回false。*/public static boolean isNotEmpty(CharSequence cs) {return !isEmpty(cs);}/*** 拷貝數據到新對象(單個)** @param source 源實例對象* @return 拷貝后的新實例對象*/public static <T> T copy(T source) {if (Objects.isNull(source)) {return null;}Class<?> c = source.getClass();List<Field> fields = getFields(c);return newInstance(source, c, fields);}/*** 拷貝數據到新對象(批量)** @param sourceList 源實例對象集合* @return 拷貝后的新實例對象集合*/public static <T> List<T> copyList(List<T> sourceList) {if (Objects.isNull(sourceList) || sourceList.isEmpty()) {return Collections.emptyList();}Class<?> c = getClass(sourceList);if (Objects.isNull(c)) {return Collections.emptyList();}List<Field> fields = getFields(c);List<T> ts = new ArrayList<>();for (T t : sourceList) {T s = newInstance(t, c, fields);if (Objects.nonNull(s)) {ts.add(s);}}return ts;}/*** 單個深度拷貝** @param source 源實例化對象* @param target 目標對象類(如:User.class)* @return 目標實例化對象*/public static <T> T copy(Object source, Class<T> target) {if (Objects.isNull(source) || Objects.isNull(target)) {return null;}List<Field> sourceFields = getFields(source.getClass());List<Field> targetFields = getFields(target);T t = null;try {t = newInstance(source, target, sourceFields, targetFields);} catch (Exception e) {e.printStackTrace();}return t;}/*** 批量深度拷貝(如果原集合中有null,則自動忽略)** @param sourceList 源實例化對象集合* @param target     目標對象類(如:User.class)* @return 目標實例化對象集合*/public static <T, K> List<K> copyList(List<T> sourceList, Class<K> target) {if (Objects.isNull(sourceList) || sourceList.isEmpty() || Objects.isNull(target)) {return Collections.emptyList();}Class<?> c = getClass(sourceList);if (Objects.isNull(c)) {return Collections.emptyList();}List<Field> sourceFields = getFields(c);List<Field> targetFields = getFields(target);List<K> ks = new ArrayList<>();for (T t : sourceList) {if (Objects.nonNull(t)) {try {K k = newInstance(t, target, sourceFields, targetFields);ks.add(k);} catch (Exception e) {e.printStackTrace();}}}return ks;}/*** 獲取List集合中的類名** @param list 對象集合* @return 類名*/private static <T> Class<?> getClass(List<T> list) {for (T t : list) {if (Objects.nonNull(t)) {return t.getClass();}}return null;}/*** 實例化同源對象** @param source 源對象* @param c      源對象類名* @param fields 源對象屬性集合* @return 同源新對象*/@SuppressWarnings("unchecked")private static <T> T newInstance(T source, Class<?> c, List<Field> fields) {T t = null;try {t = (T) c.newInstance();for (Field field : fields) {field.setAccessible(true);field.set(t, field.get(source));}} catch (Exception e) {e.printStackTrace();}return t;}/*** 目標實例化對象** @param source       原對實例化象* @param target       目標對象類* @param sourceFields 源對象字段集合* @param targetFields 目標對象屬性字段集合* @return 目標實例化對象*/private static <T> T newInstance(Object source, Class<T> target, List<Field> sourceFields,List<Field> targetFields) throws Exception {Constructor<T> constructor = target.getDeclaredConstructor();T t = constructor.newInstance();if (targetFields.isEmpty()) {return t;}for (Field field : sourceFields) {field.setAccessible(true);Object o = field.get(source);Field sameField = getSameField(field, targetFields);if (Objects.nonNull(sameField)) {sameField.setAccessible(true);sameField.set(t, o);}}return t;}/*** 獲取目標對象中同源對象屬性相同的屬性(字段名稱,字段類型一致則判定為相同)** @param field  源對象屬性* @param fields 目標對象屬性集合* @return 目標對象相同的屬性*/private static Field getSameField(Field field, List<Field> fields) {String name = field.getName();String type = field.getType().getName();for (Field f : fields) {if (name.equals(f.getName()) && type.equals(f.getType().getName())) {return f;}}return null;}/*** 獲取一個類中的所有屬性(包括父類屬性)** @param c 類名* @return List<Field>*/private static List<Field> getFields(Class<?> c) {List<Field> fieldList = new ArrayList<>();Field[] fields = c.getDeclaredFields();if (fields.length > 0) {fieldList.addAll(Arrays.asList(fields));}return getSuperClassFields(c, fieldList);}/*** 遞歸獲取父類屬性** @param o         類名* @param allFields 外層定義的所有屬性集合* @return 父類所有屬性*/private static List<Field> getSuperClassFields(Class<?> o, List<Field> allFields) {Class<?> superclass = o.getSuperclass();if (Objects.isNull(superclass) || Object.class.getName().equals(superclass.getName())) {return allFields;}Field[] fields = superclass.getDeclaredFields();if (fields.length == 0) {return allFields;}allFields.addAll(Arrays.asList(fields));return getSuperClassFields(superclass, allFields);}}

IdCardCalibrationUtil

package com.huihang.core.utils;import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.List;
import java.util.stream.IntStream;/*** 身份證校準工具*/
public class IdCardCalibrationUtil {private static final List<Integer> FACTORS = List.of(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);private static final String[] VERIFY_CODES = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");public static boolean validateIdCard(String idCard) {return switch (idCard.length()) {case 18 -> validate18DigitIdCard(idCard);case 15 -> validateConverted15DigitIdCard(idCard);default -> false;};}private static boolean validate18DigitIdCard(String idCard) {var sum = IntStream.range(0, 17).map(i -> Character.getNumericValue(idCard.charAt(i)) * FACTORS.get(i)).sum();var mod = sum % 11;return VERIFY_CODES[mod].equalsIgnoreCase(idCard.substring(17));}private static boolean validateConverted15DigitIdCard(String idCard) {if (!idCard.matches("\\d{15}")) {return false;}try {String newBirthDate = "19" + idCard.substring(6, 8) + idCard.substring(6, 12);LocalDate.parse(newBirthDate, DATE_FORMATTER);String newIdCard = idCard.substring(0, 6) + newBirthDate + idCard.substring(12, 15);String checkSum = calculateCheckSum(newIdCard);return validate18DigitIdCard(newIdCard + checkSum);} catch (DateTimeParseException e) {return false;}}private static String calculateCheckSum(String idCard) {var sum = IntStream.range(0, 17).map(i -> Character.getNumericValue(idCard.charAt(i)) * FACTORS.get(i)).sum();int mod = sum % 11;return VERIFY_CODES[mod];}
}

Result

package com.huihang.core.utils;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Result<T> {private Integer code;   //狀態碼private String message; //返回信息private T data;         //返回數據public static <T> Result<T> success(T data) {return new Result<>(ResultCode.SUCCESS.getCode(),ResultCode.SUCCESS.getMessage(), data);}public static <T> Result<T> error(int resultCode) {return new Result<>(resultCode, ResultCode.getMessageByCode(resultCode), null);}
}

ResultCode

package com.huihang.core.utils;
import lombok.Getter;
@Getter
public enum ResultCode {SUCCESS(2000, "成功"),RESOURCE_UPDATED(2001, "資源更新成功"),RESOURCE_DELETED(2002, "資源刪除成功"),BATCH_OPERATION_SUCCESS(2003, "批量操作成功"),ASYNCHRONOUS_PROCESS_STARTED(2004, "異步處理已開始"),DATA_PROCESSED(2005, "數據處理成功"),SUBSCRIPTION_CREATED(2006, "訂閱創建成功"),USER_ACTIVATED(2007, "用戶激活成功"),PASSWORD_RESET(2008, "密碼重置成功"),EMAIL_VERIFIED(2009, "郵箱驗證成功"),SMS_VERIFIED(2011, "短信驗證成功"),LICENSE_GRANTED(2012, "授權許可已授予"),TRANSACTION_COMMITTED(2013, "事務提交成功"),CACHE_CLEARED(2014, "緩存清除成功"),CONFIGURATION_SAVED(2015, "配置保存成功"),EXPORT_COMPLETED(2016, "導出完成"),IMPORT_COMPLETED(2017, "導入完成"),PAYMENT_RECEIVED(2018, "支付已接收"),REFUND_COMPLETED(2019, "退款完成"),TASK_COMPLETED(2020, "任務完成"),FILE_UPLOADED(2021, "文件上傳成功"),FILE_DOWNLOADED(2022, "文件下載成功"),MESSAGE_SENT(2023, "消息發送成功"),NOTIFICATION_SENT(2024, "通知發送成功"),INVITATION_SENT(2025, "邀請發送成功"),ACCOUNT_LOCKED(2026, "賬戶鎖定成功"),ACCOUNT_UNLOCKED(2027, "賬戶解鎖成功"),SESSION_CREATED(2028, "會話創建成功"),SESSION_TERMINATED(2029, "會話終止成功"),TOKEN_GENERATED(2030, "令牌生成成功"),API_KEY_GENERATED(2031, "API密鑰生成成功"),INCORRECT_PARAM(4010, "參數不正確"),VALIDATION_ERROR(4000, "數據驗證錯誤"),VERSION_MISMATCH(4002, "版本不匹配"),DEPRECATED_API(4003, "已廢棄的API接口"),ILLEGAL_OPERATION(4004, "非法操作"),DATA_FORMAT_ERROR(4005, "數據格式錯誤"),QUOTA_EXCEEDED(4006, "超出配額限制"),VERIFICATION_FAILED(4007, "驗證失敗"),ENTITY_LOCKED(4008, "實體已被鎖定"),UNPARSEABLE_CONTENT(4009, "無法解析的內容"),TOO_MANY_REQUESTS(4290, "請求過于頻繁,請稍后再試"),UNSUPPORTED_MEDIA_TYPE(4150, "不支持的媒體類型"),REQUEST_ENTITY_TOO_LARGE(4130, "請求體過大"),METHOD_NOT_ALLOWED(4050, "方法不允許"),IP_NOT_ALLOWED(4031, "不允許的IP地址"),USER_NOT_EXISTS(4040, "用戶不存在"),NOT_FOUND(4040, "資源未找到"),CAPTCHA_ERROR(4011, "驗證碼錯誤"),CAPTCHA_TOO_MANY_REQUESTS_ERROR(4012, "驗證碼請求次數過多,請稍后重試!"),CLIENT_CLOSED_REQUEST(4999, "客戶端關閉連接"),ERROR(5000, "失敗"),TIMEOUT(5004, "操作超時"),INTERNAL_ERROR(5008, "系統內部錯誤"),SERVICE_UNAVAILABLE(5003, "服務不可用"),DEPENDENCY_SERVICE_UNAVAILABLE(5009, "依賴的服務不可用"),THIRD_PARTY_SERVICE_ERROR(5013, "第三方服務響應異常"),TRANSACTION_FAILED(5014, "事務處理失敗"),CACHE_OPERATION_FAILED(5015, "緩存操作失敗"),ENCRYPTION_DECRYPTION_ERROR(5016, "數據加密解密失敗"),DATA_SYNC_FAILED(5017, "數據同步失敗"),EMAIL_SENDING_FAILED(5018, "郵件發送失敗"),SMS_SENDING_FAILED(5019, "短信發送失敗"),PAYMENT_FAILED(5020, "支付失敗"),TASK_EXECUTION_FAILED(5021, "任務執行失敗"),NETWORK_FAILURE(5011, "網絡連接失敗"),SERVER_CLOSED_CONNECTION(5010, "服務器關閉連接"),CONFIGURATION_ERROR(5012, "配置錯誤"),EXTERNAL_SERVICE_FAIL(5002, "外部服務調用失敗"),NO_LOGIN(6000, "未登錄"),FAIL_LOGIN(6001,"登錄失敗,賬戶或密碼錯誤!"),ACCOUNT_LOCKOUT(6002,"賬戶已鎖定"),AUTHENTICATION_FAILED(6003, "認證失敗"),INVALID_TOKEN(6004, "令牌無效"),TOKEN_EXPIRED(6005, "令牌過期"),NO_AUTH(7000, "沒有權限"),ACCESS_DENIED(7002, "禁止訪問"),OPERATION_DENIED(7001, "操作被拒絕"),SESSION_EXPIRED(6001, "會話過期"),UPLOAD_FAIL(5005, "文件上傳失敗"),DOWNLOAD_FAIL(5006, "文件下載失敗"),DATABASE_ERROR(5007, "數據庫操作失敗");private final int code;private final String message;ResultCode(int code, String message) {this.code = code;this.message = message;}public static String getMessageByCode(int code) {for (ResultCode resultCode : ResultCode.values()) {if (resultCode.getCode() == code) {return resultCode.getMessage();}}return null;}
}

ValidateNameUtil

package com.huihang.core.utils;import java.util.regex.Pattern;/*** 名稱校驗工具*/
public class ValidateNameUtil {// 定義兩個正則表達式,一個用于漢字姓名,一個用于英文姓名private static final Pattern CHINESE_NAME_PATTERN = Pattern.compile("^[\\u4e00-\\u9fa5]{2,18}$");private static final Pattern ENGLISH_NAME_PATTERN = Pattern.compile("^[a-zA-Z\\s-]{2,80}$");/*** 驗證輸入的名字是否符合漢字或英文名字的格式.** @param name 待驗證的名字字符串* @return 如果名字格式正確返回 true,否則返回 false*/public static boolean validateName(String name) {if (name == null || name.trim().isEmpty()) {return false;}// 檢查是否為中文名字或英文名字return isValidChineseName(name) || isValidEnglishName(name);}/*** 驗證輸入的名字是否符合漢字姓名的格式.** @param name 待驗證的名字字符串* @return 如果名字格式正確返回 true,否則返回 false*/public static boolean isValidChineseName(String name) {if (name == null || name.trim().isEmpty()) {return false;}return CHINESE_NAME_PATTERN.matcher(name).matches();}/*** 驗證輸入的名字是否符合英文姓名的格式.** @param name 待驗證的名字字符串* @return 如果名字格式正確返回 true,否則返回 false*/public static boolean isValidEnglishName(String name) {if (name == null || name.trim().isEmpty()) {return false;}return ENGLISH_NAME_PATTERN.matcher(name).matches();}
}

ValidatePhoneUtil

package com.huihang.core.utils;import java.util.regex.Pattern;/*** 手機號校驗工具*/
public class ValidatePhoneUtil {// 定義一個正則表達式來匹配中國大陸手機號private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("^1(3[0-9]|4[579]|5[0-35-9]|6[6]|7[0135678]|8[0-9]|9[89])\\d{8}$");/*** 驗證輸入的字符串是否符合中國大陸手機號的格式.** @param phoneNumber 待驗證的手機號字符串* @return 如果手機號格式正確返回 true,否則返回 false*/public static boolean validatePhoneNumber(String phoneNumber) {if (phoneNumber == null || phoneNumber.trim().isEmpty()) {return false;}// 使用預編譯得正則表達式校驗手機號碼return PHONE_NUMBER_PATTERN.matcher(phoneNumber).matches();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64539.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Casino Royale靶場wp

0x00 下載安裝 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 導入vmware啟動 0x01 主機信息收集 0x02目錄掃描 index.php 獲取到一個域名 修改本地hosts 添加一行 路徑&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 點擊…

智能家居體驗大變革 博聯 AI 方案讓智能不再繁瑣

1. 全球AI技術發展背景及智能家居市場趨勢 人工智能&#xff08;AI&#xff09;技術的飛速發展正在推動全球各行業的數字化轉型。國際電信聯盟與德勤聯合發布《人工智能向善影響》報告指出&#xff0c;全球94%的商界領袖認為&#xff0c;人工智能技術對于其企業在未來5年內的發…

鴻蒙開發(27)案例今日任務

案例為純前端實現&#xff0c;總結案例。 主頁面代碼 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…

WPF編程excel表格操作

WPF編程excel表格操作 摘要NPOI安裝封裝代碼測試代碼 摘要 Excel操作幾種方式 使用開源庫NPOI(常用&#xff0c;操作豐富)使用Microsoft.Office.Interop.Excel COM組件(兼容性問題)使用OpenXml(效率高)使用OleDb(過時) NPOI安裝 封裝代碼 using System; using System.IO; u…

tcp_rcv_synsent_state_process函數

tcp_rcv_synsent_state_process 是 Linux Kernel 中用于處理 TCP 連接在 SYN-SENT 狀態下接收到報文的函數。這個函數在 TCP 三次握手階段起到了至關重要的作用,處理了在客戶端發送 SYN 請求之后收到服務器響應報文的各種情況。 以下是這個函數的解讀和剖析: int tcp_rcv_sy…

音視頻采集推流時間戳記錄方案

音視頻同步更多文章 深入理解音視頻pts&#xff0c;dts&#xff0c;time_base以及時間數學公式_視頻pts計算-CSDN博客 ffplay音視頻同步分析_ffplay 音視頻同步-CSDN博客 音視頻采集打時間戳設計 實時音視頻數據的采集和處理場景。具體來說: 采集階段: 在音視頻數據采集過…

Spark Runtime Filter

Runtime Filter 參考鏈接&#xff1a; https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…

從0入門自主空中機器人-1【課程介紹】

關于本課程&#xff1a; 本次課程是一套面向對自主空中機器人感興趣的學生、愛好者、相關從業人員的免費課程&#xff0c;包含了從硬件組裝、機載電腦環境設置、代碼部署、實機實驗等全套詳細流程&#xff0c;帶你從0開始&#xff0c;組裝屬于自己的自主無人機&#xff0c;并讓…

專業140+總分410+南京大學851信號與系統考研經驗南大電子信息通信集成電路,真題,大綱。參考書。

本人本科中等211&#xff0c;離保送本校差一點&#xff0c;考研前糾結本校還是追求更高目標&#xff0c;和家人聊了自己的想法&#xff0c;感謝父母對我的支持&#xff0c;堅定報考南大的目標&#xff0c;最終專業851信號與系統140&#xff0c;總分410順利被南京大學錄取&#…

【C++】初識C++之C語言加入光榮的進化(上)

寫在前面 本篇筆記作為C的開篇筆記&#xff0c;主要是講解C關鍵字(C98)連帶一點點(C11)的知識。掌握的C新語法新特性&#xff0c;當然C是兼容C的&#xff0c;我們學習C的那套在C中也是受用。 ps:點我跳轉下集 文章目錄 寫在前面一、命名空間域1.1、命名空間域的定義與使用1.2…

CGAL windows 安裝教程

1.下載源代碼 CGAL官網下載https://github.com/CGAL/cgal/releases 2.下載boost庫 BOOST官網下載https://www.boost.org/ 3.下載 GMP and MPFR 4.配置VS2022 頭文件&#xff1a; 庫路徑 做完以上步驟&#xff0c;可以使用CGAL了&#xff01;

從0入門自主空中機器人-2-2【無人機硬件選型-PX4篇】

1. 常用資料以及官方網站 無人機飛控PX4用戶使用手冊&#xff08;無人機基本設置、地面站使用教程、軟硬件搭建等&#xff09;&#xff1a;https://docs.px4.io/main/en/ PX4固件開源地址&#xff1a;https://github.com/PX4/PX4-Autopilot 飛控硬件、數傳模塊、GPS、分電板等…

每天40分玩轉Django:Django緩存

一、Django緩存概述 在高并發的Web應用中,緩存是提高性能的重要手段。通過緩存頻繁訪問的數據,可以顯著減少數據庫查詢和渲染模板的時間,從而加快響應速度,提升用戶體驗。Django提供了多層級的緩存方案,可以靈活地滿足不同場景下的緩存需求。 Django支持的緩存方式包括: 視圖…

GraphRAG 框架哪家強?選擇最適合你智能問答系統的框架

GraphRAG 框架哪家強&#xff1f;選擇最適合你智能問答系統的框架 點擊進入&#xff1a;GraphRAG系列文章-Nano-GraphRAG&#xff1a;打造輕量級醫療診斷助手 點擊進入&#xff1a;GraphRAG系列文章-突破傳統知識管理瓶頸&#xff1a;LlamaIndex GraphRAG 讓企業知識問答更智能…

Mac電腦python多版本環境安裝與切換

我當前是python3.9.6環境&#xff0c;需要使用3.9.8環境&#xff0c;通過brew安裝3.9.8版本&#xff0c;然后通過pyenv切換環境 步驟 1: 安裝 pyenv brew install pyenv brew install pyenv-virtualenv 步驟 2: 安裝 Python 3.9.8&#xff08;使用 pyenv 安裝指定版本的 Pyth…

Redis--持久化策略(AOF與RDB)

持久化策略&#xff08;AOF與RDB&#xff09; 持久化Redis如何實現數據不丟失&#xff1f;RDB 快照是如何實現的呢&#xff1f;執行時機RDB原理執行快照時&#xff0c;數據能被修改嗎&#xff1f; AOF持久化是怎么實現的&#xff1f;AOF原理三種寫回策略AOF重寫機制 RDB和AOF合…

C高級:思維導圖Day2

目錄 總覽1 總覽2 總覽1 壓縮與解壓縮 打包與解包 軟連接與硬鏈接 ubuntu下關機與重啟指令 總覽2 結束

pwntools用法

pwntools 是一個Python庫&#xff0c; 用于編寫二進制漏洞利用&#xff08;exploitation&#xff09;腳本 功能&#xff1a; 遠程連接和本地連接&#xff1a; 支持通過TCP/UDP連接遠程服務或與本地進程進行交互。Shellcode和ROP鏈構造&#xff1a; 提供了便捷的工具來生成和利…

【每日學點鴻蒙知識】placement設置top、組件攜帶自定義參數、主動隱藏輸入框、Web設置字體、對話框設置全屏寬

1、popup組件placement設置top沒有生效&#xff1f; 可以用offset屬性將popup往下邊偏移一下 來規避 2、組件攜帶自定義參數的接口是哪個&#xff1f; 參考鏈接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…

PyTorch快速入門教程【小土堆】之優化器

視頻地址優化器&#xff08;一&#xff09;_嗶哩嗶哩_bilibili import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR1…