| package com.doumee.core.utils; | 
|   | 
| import com.doumee.core.constants.ResponseStatus; | 
| import com.doumee.core.exception.BusinessException; | 
|   | 
| import java.security.SecureRandom; | 
| import java.util.HashSet; | 
| import java.util.Set; | 
|   | 
| /** | 
|  * Created by IntelliJ IDEA. | 
|  * | 
|  * @Author : Rk | 
|  * @create 2025/10/27 16:23 | 
|  */ | 
| public class PasswordGenerator { | 
|   | 
|     private static final String LOWER = "abcdefghijklmnopqrstuvwxyz"; | 
|     private static final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | 
|     private static final String DIGITS = "0123456789"; | 
|     private static final String SYMBOLS = "!@#$%^&*()_+-=[]{};':|,.<>/?"; | 
|     private static final String PASSWORD_CHARS = LOWER + UPPER + DIGITS + SYMBOLS; | 
|     private static final int PASSWORD_LENGTH = 8; // 你可以根据需要调整密码长度 | 
|   | 
|     public static void getPasswordTypeCount(String password){ | 
|         Set<Integer> typeCount = new HashSet<>(4); | 
|         for (int i = 0; i < password.length(); i++) { | 
|             String key = password.substring(i,i+1); | 
|             if(LOWER.indexOf(key)>=Constants.ZERO){ | 
|                 typeCount.add(Constants.ZERO); | 
|             }else if(UPPER.indexOf(key)>=Constants.ZERO){ | 
|                 typeCount.add(Constants.ONE); | 
|             }else if(DIGITS.indexOf(key)>=Constants.ZERO){ | 
|                 typeCount.add(Constants.TWO); | 
|             }else if(SYMBOLS.indexOf(key)>=Constants.ZERO){ | 
|                 typeCount.add(Constants.THREE); | 
|             }else{ | 
|                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请使用合法的密码内容"); | 
|             } | 
|         } | 
|         if(typeCount.size()<Constants.THREE||password.length()<8){ | 
|             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"密码至少包括数字、大写字母、小写字母、特殊字符中的三种字符,且至少8位数"); | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     public static String generatePassword() { | 
|         SecureRandom random = new SecureRandom(); | 
|         StringBuilder password = new StringBuilder(PASSWORD_LENGTH); | 
|         Set<Character> usedChars = new HashSet<>(); | 
|   | 
| //        while (password.length() < PASSWORD_LENGTH) { | 
| //            int index = random.nextInt(PASSWORD_CHARS.length()); | 
| //            char randomChar = PASSWORD_CHARS.charAt(index); | 
| //            // 确保每种类型的字符至少出现一次 | 
| //            if (usedChars.add(randomChar)) { | 
| //                password.append(randomChar); | 
| //            } | 
| //        } | 
|         // 如果需要确保每种类型都至少出现一次,可以注释掉上面的循环,使用下面的代码: | 
|         for (int i = 0; i < PASSWORD_LENGTH; i++) { | 
|             int type = random.nextInt(4); // 0=lower, 1=upper, 2=digit, 3=symbol | 
|             String charSet; | 
|             switch (type) { | 
|                 case 0: charSet = LOWER; break; | 
|                 case 1: charSet = UPPER; break; | 
|                 case 2: charSet = DIGITS; break; | 
|                 default: charSet = SYMBOLS; break; | 
|             } | 
|             int index = random.nextInt(charSet.length()); | 
|             password.append(charSet.charAt(index)); | 
|         } | 
|         // Shuffle the string to avoid predictable patterns (optional) | 
|         password.toString().chars() | 
|                 .mapToObj(c -> (char) c) | 
|                 .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) | 
|                 .toString(); // This line is a no-op, but it's here to show the method call for completeness. | 
|         return password.toString(); | 
|     } | 
|   | 
|     public static void main(String[] args) { | 
|         System.out.println("Generated Password: " + generatePassword()); | 
|     } | 
| } |