diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java index ab23a15c4..e84e81f6d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordService.java @@ -88,11 +88,11 @@ public interface SensitiveWordService { List validateText(String text, List tags); /** - * 判断文本是否合法 + * 判断文本是否包含敏感词 * * @param text 文本 * @param tags 标签数组 - * @return 是否合法 true-合法 false-不合法 + * @return 是否包含敏感词 */ boolean isTextValid(String text, List tags); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java index 9c41941ef..991708c36 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImpl.java @@ -258,7 +258,10 @@ public class SensitiveWordServiceImpl implements SensitiveWordService { if (trie == null) { continue; } - return trie.isValid(text); + // 如果有一个标签不合法,则返回 false 不合法 + if (!trie.isValid(text)) { + return false; + } } return true; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java index 1a0a5c055..8c3e4bc0f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/collection/SimpleTrie.java @@ -30,9 +30,10 @@ public class SimpleTrie { * @param strs 字符串数组 */ public SimpleTrie(Collection strs) { - children = new HashMap<>(); + // 排序,优先使用较短的前缀 + strs = CollUtil.sort(strs, String::compareTo); // 构建树 - strs = CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 + children = new HashMap<>(); for (String str : strs) { Map child = children; // 遍历每个字符 @@ -60,7 +61,7 @@ public class SimpleTrie { */ public boolean isValid(String text) { // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 - for (int i = 0; i < text.length() ; i++) { + for (int i = 0; i < text.length(); i++) { Map child = (Map) children.get(text.charAt(i)); if (child == null) { continue; @@ -126,7 +127,7 @@ public class SimpleTrie { * @param index 开始未知 * @param child 节点(当前遍历到的) * @param result 返回敏感词 - * @return 是否无敏感词 true-无 false-有 + * @return 是否有敏感词 */ @SuppressWarnings("unchecked") private static boolean recursionWithResult(String text, int index, Map child, StringBuilder result) { diff --git a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java index be566e2ed..47f1ea923 100644 --- a/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java +++ b/yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/sensitiveword/SensitiveWordServiceImplTest.java @@ -66,7 +66,7 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { // 调用 sensitiveWordService.initLocalCache(); // 断言 sensitiveWordTagsCache 缓存 - assertEquals(SetUtils.asSet("论坛", "蔬菜","测试"), sensitiveWordService.getSensitiveWordTagSet()); + assertEquals(SetUtils.asSet("论坛", "蔬菜", "测试"), sensitiveWordService.getSensitiveWordTagSet()); // 断言 sensitiveWordCache assertEquals(4, sensitiveWordService.getSensitiveWordCache().size()); assertPojoEquals(wordDO1, sensitiveWordService.getSensitiveWordCache().get(0)); @@ -239,7 +239,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { testInitLocalCache(); // 准备参数 String text = "你是傻瓜,你是笨蛋"; - // 调用 List result = sensitiveWordService.validateText(text, null); // 断言 @@ -247,7 +246,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { // 准备参数 String text2 = "你是傻瓜,你是笨蛋,你是白"; - // 调用 List result2 = sensitiveWordService.validateText(text2, null); // 断言 @@ -259,7 +257,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { testInitLocalCache(); // 准备参数 String text = "你是傻瓜,你是笨蛋"; - // 调用 List result = sensitiveWordService.validateText(text, singletonList("论坛")); // 断言 @@ -268,12 +265,10 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { // 准备参数 String text2 = "你是白"; - // 调用 List result2 = sensitiveWordService.validateText(text2, singletonList("测试")); // 断言 assertEquals(singletonList("白"), result2); - } @Test @@ -281,13 +276,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { testInitLocalCache(); // 准备参数 String text = "你是傻瓜,你是笨蛋"; - // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text, null)); // 准备参数 String text2 = "你是白"; - // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text2, null)); } @@ -297,13 +290,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { testInitLocalCache(); // 准备参数 String text = "你是傻瓜,你是笨蛋"; - // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text, singletonList("论坛"))); // 准备参数 String text2 = "你是白"; - // 调用,断言 assertFalse(sensitiveWordService.isTextValid(text2, singletonList("测试"))); }