Pārlūkot izejas kodu

code review:敏感词

YunaiV 1 gadu atpakaļ
vecāks
revīzija
14f006088a

+ 2 - 2
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<String> validateText(String text, List<String> tags);
 
     /**
-     * 判断文本是否合法
+     * 判断文本是否包含敏感词
      *
      * @param text 文本
      * @param tags 标签数组
-     * @return 是否合法 true-合法 false-不合法
+     * @return 是否包含敏感词
      */
     boolean isTextValid(String text, List<String> tags);
 

+ 4 - 1
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;
     }

+ 5 - 4
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<String> strs) {
-        children = new HashMap<>();
+        // 排序,优先使用较短的前缀
+        strs = CollUtil.sort(strs, String::compareTo);
         // 构建树
-        strs = CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀
+        children = new HashMap<>();
         for (String str : strs) {
             Map<Character, Object> 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<Character, Object> child = (Map<Character, Object>) 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<Character, Object> child, StringBuilder result) {

+ 1 - 10
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<String> result = sensitiveWordService.validateText(text, null);
         // 断言
@@ -247,7 +246,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
 
         // 准备参数
         String text2 = "你是傻瓜,你是笨蛋,你是白";
-
         // 调用
         List<String> result2 = sensitiveWordService.validateText(text2, null);
         // 断言
@@ -259,7 +257,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
         testInitLocalCache();
         // 准备参数
         String text = "你是傻瓜,你是笨蛋";
-
         // 调用
         List<String> result = sensitiveWordService.validateText(text, singletonList("论坛"));
         // 断言
@@ -268,12 +265,10 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
 
         // 准备参数
         String text2 = "你是白";
-
         // 调用
         List<String> 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("测试")));
     }