Commit 14f006088a6d4c4d0cee5694d4def487948141d2

Authored by YunaiV
1 parent 630890d0

code review:敏感词

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 { @@ -88,11 +88,11 @@ public interface SensitiveWordService {
88 List<String> validateText(String text, List<String> tags); 88 List<String> validateText(String text, List<String> tags);
89 89
90 /** 90 /**
91 - * 判断文本是否合法 91 + * 判断文本是否包含敏感词
92 * 92 *
93 * @param text 文本 93 * @param text 文本
94 * @param tags 标签数组 94 * @param tags 标签数组
95 - * @return 是否合法 true-合法 false-不合法 95 + * @return 是否包含敏感词
96 */ 96 */
97 boolean isTextValid(String text, List<String> tags); 97 boolean isTextValid(String text, List<String> tags);
98 98
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 { @@ -258,7 +258,10 @@ public class SensitiveWordServiceImpl implements SensitiveWordService {
258 if (trie == null) { 258 if (trie == null) {
259 continue; 259 continue;
260 } 260 }
261 - return trie.isValid(text); 261 + // 如果有一个标签不合法,则返回 false 不合法
  262 + if (!trie.isValid(text)) {
  263 + return false;
  264 + }
262 } 265 }
263 return true; 266 return true;
264 } 267 }
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 { @@ -30,9 +30,10 @@ public class SimpleTrie {
30 * @param strs 字符串数组 30 * @param strs 字符串数组
31 */ 31 */
32 public SimpleTrie(Collection<String> strs) { 32 public SimpleTrie(Collection<String> strs) {
33 - children = new HashMap<>(); 33 + // 排序,优先使用较短的前缀
  34 + strs = CollUtil.sort(strs, String::compareTo);
34 // 构建树 35 // 构建树
35 - strs = CollUtil.sort(strs, String::compareTo); // 排序,优先使用较短的前缀 36 + children = new HashMap<>();
36 for (String str : strs) { 37 for (String str : strs) {
37 Map<Character, Object> child = children; 38 Map<Character, Object> child = children;
38 // 遍历每个字符 39 // 遍历每个字符
@@ -60,7 +61,7 @@ public class SimpleTrie { @@ -60,7 +61,7 @@ public class SimpleTrie {
60 */ 61 */
61 public boolean isValid(String text) { 62 public boolean isValid(String text) {
62 // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词 63 // 遍历 text,使用每一个 [i, n) 段的字符串,使用 children 前缀树匹配,是否包含敏感词
63 - for (int i = 0; i < text.length() ; i++) { 64 + for (int i = 0; i < text.length(); i++) {
64 Map<Character, Object> child = (Map<Character, Object>) children.get(text.charAt(i)); 65 Map<Character, Object> child = (Map<Character, Object>) children.get(text.charAt(i));
65 if (child == null) { 66 if (child == null) {
66 continue; 67 continue;
@@ -126,7 +127,7 @@ public class SimpleTrie { @@ -126,7 +127,7 @@ public class SimpleTrie {
126 * @param index 开始未知 127 * @param index 开始未知
127 * @param child 节点(当前遍历到的) 128 * @param child 节点(当前遍历到的)
128 * @param result 返回敏感词 129 * @param result 返回敏感词
129 - * @return 是否无敏感词 true-无 false-有 130 + * @return 是否有敏感词
130 */ 131 */
131 @SuppressWarnings("unchecked") 132 @SuppressWarnings("unchecked")
132 private static boolean recursionWithResult(String text, int index, Map<Character, Object> child, StringBuilder result) { 133 private static boolean recursionWithResult(String text, int index, Map<Character, Object> child, StringBuilder result) {
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 { @@ -66,7 +66,7 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
66 // 调用 66 // 调用
67 sensitiveWordService.initLocalCache(); 67 sensitiveWordService.initLocalCache();
68 // 断言 sensitiveWordTagsCache 缓存 68 // 断言 sensitiveWordTagsCache 缓存
69 - assertEquals(SetUtils.asSet("论坛", "蔬菜","测试"), sensitiveWordService.getSensitiveWordTagSet()); 69 + assertEquals(SetUtils.asSet("论坛", "蔬菜", "测试"), sensitiveWordService.getSensitiveWordTagSet());
70 // 断言 sensitiveWordCache 70 // 断言 sensitiveWordCache
71 assertEquals(4, sensitiveWordService.getSensitiveWordCache().size()); 71 assertEquals(4, sensitiveWordService.getSensitiveWordCache().size());
72 assertPojoEquals(wordDO1, sensitiveWordService.getSensitiveWordCache().get(0)); 72 assertPojoEquals(wordDO1, sensitiveWordService.getSensitiveWordCache().get(0));
@@ -239,7 +239,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -239,7 +239,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
239 testInitLocalCache(); 239 testInitLocalCache();
240 // 准备参数 240 // 准备参数
241 String text = "你是傻瓜,你是笨蛋"; 241 String text = "你是傻瓜,你是笨蛋";
242 -  
243 // 调用 242 // 调用
244 List<String> result = sensitiveWordService.validateText(text, null); 243 List<String> result = sensitiveWordService.validateText(text, null);
245 // 断言 244 // 断言
@@ -247,7 +246,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -247,7 +246,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
247 246
248 // 准备参数 247 // 准备参数
249 String text2 = "你是傻瓜,你是笨蛋,你是白"; 248 String text2 = "你是傻瓜,你是笨蛋,你是白";
250 -  
251 // 调用 249 // 调用
252 List<String> result2 = sensitiveWordService.validateText(text2, null); 250 List<String> result2 = sensitiveWordService.validateText(text2, null);
253 // 断言 251 // 断言
@@ -259,7 +257,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -259,7 +257,6 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
259 testInitLocalCache(); 257 testInitLocalCache();
260 // 准备参数 258 // 准备参数
261 String text = "你是傻瓜,你是笨蛋"; 259 String text = "你是傻瓜,你是笨蛋";
262 -  
263 // 调用 260 // 调用
264 List<String> result = sensitiveWordService.validateText(text, singletonList("论坛")); 261 List<String> result = sensitiveWordService.validateText(text, singletonList("论坛"));
265 // 断言 262 // 断言
@@ -268,12 +265,10 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -268,12 +265,10 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
268 265
269 // 准备参数 266 // 准备参数
270 String text2 = "你是白"; 267 String text2 = "你是白";
271 -  
272 // 调用 268 // 调用
273 List<String> result2 = sensitiveWordService.validateText(text2, singletonList("测试")); 269 List<String> result2 = sensitiveWordService.validateText(text2, singletonList("测试"));
274 // 断言 270 // 断言
275 assertEquals(singletonList("白"), result2); 271 assertEquals(singletonList("白"), result2);
276 -  
277 } 272 }
278 273
279 @Test 274 @Test
@@ -281,13 +276,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -281,13 +276,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
281 testInitLocalCache(); 276 testInitLocalCache();
282 // 准备参数 277 // 准备参数
283 String text = "你是傻瓜,你是笨蛋"; 278 String text = "你是傻瓜,你是笨蛋";
284 -  
285 // 调用,断言 279 // 调用,断言
286 assertFalse(sensitiveWordService.isTextValid(text, null)); 280 assertFalse(sensitiveWordService.isTextValid(text, null));
287 281
288 // 准备参数 282 // 准备参数
289 String text2 = "你是白"; 283 String text2 = "你是白";
290 -  
291 // 调用,断言 284 // 调用,断言
292 assertFalse(sensitiveWordService.isTextValid(text2, null)); 285 assertFalse(sensitiveWordService.isTextValid(text2, null));
293 } 286 }
@@ -297,13 +290,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest { @@ -297,13 +290,11 @@ public class SensitiveWordServiceImplTest extends BaseDbUnitTest {
297 testInitLocalCache(); 290 testInitLocalCache();
298 // 准备参数 291 // 准备参数
299 String text = "你是傻瓜,你是笨蛋"; 292 String text = "你是傻瓜,你是笨蛋";
300 -  
301 // 调用,断言 293 // 调用,断言
302 assertFalse(sensitiveWordService.isTextValid(text, singletonList("论坛"))); 294 assertFalse(sensitiveWordService.isTextValid(text, singletonList("论坛")));
303 295
304 // 准备参数 296 // 准备参数
305 String text2 = "你是白"; 297 String text2 = "你是白";
306 -  
307 // 调用,断言 298 // 调用,断言
308 assertFalse(sensitiveWordService.isTextValid(text2, singletonList("测试"))); 299 assertFalse(sensitiveWordService.isTextValid(text2, singletonList("测试")));
309 } 300 }