From 357fdd3a27f06a4ab9b89fa2db6d6d958554c2cb Mon Sep 17 00:00:00 2001 From: lichao <326994889@qq.com> Date: Mon, 30 Oct 2023 15:18:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=84=B1=E6=95=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tools/annotation/MaskResponse.java | 13 +- .../tools/processor/MaskProcessor.java | 118 ++++++++++++++++++ .../controller/IcResiUserController.java | 1 + 3 files changed, 130 insertions(+), 2 deletions(-) diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java index 3985a6db44..9a84ac7d37 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/annotation/MaskResponse.java @@ -19,6 +19,15 @@ public @interface MaskResponse { String MASK_TYPE_YANTAI_PEOPLE_NAME = "YANTAI_PEOPLE_NAME"; + String MASK_TYPE_YANTAI_ID_CARD = "YANTAI_ID_CARD"; + + String MASK_TYPE_YANTAI_WORK_ADDRESS = "YANTAI_WORK_ADDRESS"; + String MASK_TYPE_YANTAI_RESI_ADDRESS = "YANTAI_RESI_ADDRESS"; + + String MASK_TYPE_YANTAI_MOBILE = "YANTAI_MOBILE"; + + String MASK_TYPE_YANTAI_HOUSE = "YANTAI_HOUSE"; + ///** // * 默认的一些字段,如果没有手动指定,就会使用默认的。如果手动指定了,就不再使用默认的 // */ @@ -33,11 +42,11 @@ public @interface MaskResponse { * 要打码的字段列表。会递归的着这些字段 * @return */ - String[] fieldNames() default {"idCard","mobile","phone","yantaiPeopleName"}; + String[] fieldNames() default {"idCard","mobile","phone","yantaiPeopleName","yantaiWorkAddress","yantaiResiAddress","yantaiMobile","yantaiHouse"}; /** * 要打码的类型 * @return */ - String[] fieldsMaskType() default { MASK_TYPE_ID_CARD, MASK_TYPE_MOBILE, MASK_TYPE_MOBILE , MASK_TYPE_YANTAI_PEOPLE_NAME}; + String[] fieldsMaskType() default { MASK_TYPE_ID_CARD, MASK_TYPE_MOBILE, MASK_TYPE_MOBILE , MASK_TYPE_YANTAI_PEOPLE_NAME,MASK_TYPE_YANTAI_ID_CARD,MASK_TYPE_YANTAI_WORK_ADDRESS,MASK_TYPE_YANTAI_RESI_ADDRESS,MASK_TYPE_YANTAI_MOBILE,MASK_TYPE_YANTAI_HOUSE}; } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java index 652af74529..47158ac595 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/processor/MaskProcessor.java @@ -142,6 +142,21 @@ public class MaskProcessor { }else if (MaskResponse.MASK_TYPE_YANTAI_PEOPLE_NAME.equals(maskType)) { return maskYantaiPeopleName(originString); } + else if (MaskResponse.MASK_TYPE_YANTAI_ID_CARD.equals(maskType)) { + return maskYantaiIdCard(originString); + } + else if (MaskResponse.MASK_TYPE_YANTAI_WORK_ADDRESS.equals(maskType)) { + return maskYantaiWorkAddress(originString); + } + else if (MaskResponse.MASK_TYPE_YANTAI_RESI_ADDRESS.equals(maskType)) { + return maskYantaiWorkAddress(originString); + } + else if (MaskResponse.MASK_TYPE_YANTAI_HOUSE.equals(maskType)) { + return maskYantaiWorkAddress(originString); + } + else if (MaskResponse.MASK_TYPE_YANTAI_MOBILE.equals(maskType)) { + return maskYantaiMobile(originString); + } else { return originString; } @@ -256,6 +271,68 @@ public class MaskProcessor { return originString; } + /** + * 唯一整件号打码,可能是身份证号或者是护照号 + * 将明文字符串打码变为掩码。保留前1后1,后面打码 + * @param originString + * @return + */ + private String maskYantaiIdCard(String originString) { + + // 检查字符串长度 + if (originString.length() < 3) { + return originString; + } else { + char firstChar = originString.charAt(0); // 获取第一个字符 + char lastChar = originString.charAt(originString.length() - 1); // 获取最后一个字符 + + StringBuilder maskedString = new StringBuilder(); + maskedString.append(firstChar); // 保留第一个字符 + // 使用 * 替换中间的字符 + for (int i = 1; i < originString.length() - 1; i++) { + maskedString.append('*'); + } + maskedString.append(lastChar); // 保留最后一个字符 + + return maskedString.toString(); + } + } + + /** + * @Description: 工作地址 + * @param originString: + * @Return java.lang.String + * @Author: lichao + * @Date: 2023/10/26 15:47 + */ + private String maskYantaiWorkAddress(String originString) { + + + if (originString.length() > 12) { + // 如果长度大于12,只显示前6位正常,后6位使用*代替 + int length = originString.length(); + StringBuilder maskedString = new StringBuilder(); + + maskedString.append(originString, 0, 6); // 显示前6位正常 + for (int i = 6; i < length; i++) { + maskedString.append('*'); // 后续使用*代替 + } + return maskedString.toString(); + } else { + // 如果长度小于等于12,显示前一半字符,后一半用*代替 + int length = originString.length(); + int halfLength = length / 2; + StringBuilder maskedString = new StringBuilder(); + + maskedString.append(originString, 0, halfLength); // 显示前一半正常 + for (int i = halfLength; i < length; i++) { + maskedString.append('*'); // 后一半使用*代替 + } + + return maskedString.toString(); + } + } + /** * 将明文字符串打码变为掩码。保留前3后4,中间打码 * 187****3461 @@ -275,6 +352,46 @@ public class MaskProcessor { return originString.replaceAll("^(1\\d{2})\\d*(\\d{4})$", new StringBuilder("$1").append(maskStr).append("$2").toString()); } + private String maskYantaiMobile(String originString) { + int length = originString.length(); + if (length < 7) { + return originString; + } + + if (originString.matches("^\\d{11}$")) { + // 如果是11位手机号,显示前3位和后2位,其余*显示 + StringBuilder maskedString = new StringBuilder(); + maskedString.append(originString, 0, 3); // 前3位正常显示 + maskedString.append("****"); // 中间4位用*代替 + maskedString.append(originString, 7, 9); // 后2位正常显示 + return maskedString.toString(); + + } else if (originString.contains("-")) { + // 如果包含"-",处理带"-"的情况 + StringBuilder maskedString = new StringBuilder(); + String[] parts = originString.split("-", 2); // 限制分割为两部分 + + + // 处理包含"-"的情况 + String firstPart = parts[0]; + String lastPart = parts[1]; + + maskedString.append(firstPart); // "-前面的正常字符" + maskedString.append("-"); // 保留"-" + maskedString.append("*******"); // "-后面的除了最后一位都显示"*" + maskedString.append(lastPart.charAt(lastPart.length() - 1)); // 最后一位正常显示 + return maskedString.toString(); + } else if (originString.matches("^\\d{7,8}$")) { + // 如果是7位或8位的,显示前1位和后1位,其余*显示 + StringBuilder maskedString = new StringBuilder(); + maskedString.append(originString, 0, 1); // 前1位正常显示 + maskedString.append("******"); // 中间的用*代替 + maskedString.append(originString, originString.length() - 1, originString.length()); // 后1位正常显示 + return maskedString.toString(); + } + return originString; + } + public static void main(String[] args) { String[] idc = {"idCard"}; String[] idct = {MaskResponse.MASK_TYPE_ID_CARD}; @@ -282,5 +399,6 @@ public class MaskProcessor { System.out.println(r); String s = MaskProcessor.maskIdCard("372284152412022222"); System.out.println(s); + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java index db0529770f..af367c8181 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcResiUserController.java @@ -1135,6 +1135,7 @@ public class IcResiUserController implements ResultDataResolver { * @return */ @PostMapping("search") + @MaskResponse(fieldNames = {"ID_CARD","MOBILE","HOME_ID"}, fieldsMaskType = {MaskResponse.MASK_TYPE_YANTAI_ID_CARD,MaskResponse.MASK_TYPE_YANTAI_MOBILE,MaskResponse.MASK_TYPE_YANTAI_HOUSE}) public Result>> searchResi(@RequestBody IcResiUserPageFormDTO input, @LoginUser TokenDto loginUser) { if (StringUtils.isBlank(input.getKeyword())) { PageData> r = new PageData>(new ArrayList<>(), NumConstant.ZERO_L);