Forráskód Böngészése

feat: 敏感词改为从数据库中拉取

xsx 1 éve
szülő
commit
d1bfe1251a

+ 50 - 0
im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java

@@ -0,0 +1,50 @@
+package com.bx.implatform.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 敏感词
+ *
+ * @author Blue 
+ * @since 1.0.0 2024-07-20
+ */
+
+@Data
+@TableName("im_sensitive_word")
+public class SensitiveWord {
+	/**
+	* id
+	*/
+	@TableId
+	private Long id;
+
+	/**
+	* 敏感词内容
+	*/
+	private String content;
+
+	/**
+	* 是否启用
+	*/
+	private Boolean enabled;
+
+	/**
+	 * 创建者
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private Long creator;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private LocalDateTime createTime;
+
+
+}

+ 16 - 0
im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java

@@ -0,0 +1,16 @@
+package com.bx.implatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.bx.implatform.entity.SensitiveWord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* 敏感词
+*
+* @author Blue 
+* @since 1.0.0 2024-07-20
+*/
+@Mapper
+public interface SensitiveWordMapper extends BaseMapper<SensitiveWord> {
+	
+}

+ 22 - 0
im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java

@@ -0,0 +1,22 @@
+package com.bx.implatform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.bx.implatform.dto.LoginDTO;
+import com.bx.implatform.dto.ModifyPwdDTO;
+import com.bx.implatform.dto.RegisterDTO;
+import com.bx.implatform.entity.SensitiveWord;
+import com.bx.implatform.entity.User;
+import com.bx.implatform.vo.LoginVO;
+import com.bx.implatform.vo.OnlineTerminalVO;
+import com.bx.implatform.vo.UserVO;
+
+import java.util.List;
+
+public interface SensitiveWordService extends IService<SensitiveWord> {
+
+    /**
+     * 查询所有开启的敏感词
+     * @return
+     */
+    List<String> findAllEnabledWords();
+}

+ 30 - 0
im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java

@@ -0,0 +1,30 @@
+package com.bx.implatform.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.bx.implatform.entity.SensitiveWord;
+import com.bx.implatform.mapper.SensitiveWordMapper;
+import com.bx.implatform.service.SensitiveWordService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class SensitiveWordServiceImpl extends ServiceImpl<SensitiveWordMapper, SensitiveWord> implements
+    SensitiveWordService {
+
+    @Override
+    public List<String> findAllEnabledWords() {
+        LambdaQueryWrapper<SensitiveWord> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(SensitiveWord::getEnabled,true);
+        wrapper.select(SensitiveWord::getContent);
+        List<SensitiveWord> words = this.list(wrapper);
+        return words.stream().map(SensitiveWord::getContent).collect(Collectors.toList());
+    }
+}

+ 27 - 22
im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java

@@ -1,29 +1,30 @@
 package com.bx.implatform.util;
 
+import cn.hutool.core.util.StrUtil;
+import com.bx.imcommon.util.ThreadPoolExecutorFactory;
+import com.bx.implatform.service.SensitiveWordService;
 import jakarta.annotation.PostConstruct;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.CharUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 敏感词过滤器——SensitiveFilter
  *
  * @author Andrews
  * @date 2023/12/4 11:12
- * @return null
  */
 @Slf4j
 @Component
-@NoArgsConstructor
+@RequiredArgsConstructor
 public final class SensitiveFilterUtil {
 
     /**
@@ -36,12 +37,19 @@ public final class SensitiveFilterUtil {
      */
     private static final TrieNode ROOT_NODE = new TrieNode();
 
+    /**
+     * 线程池
+     */
+    private static final ScheduledThreadPoolExecutor EXECUTOR_SERVICE =
+        ThreadPoolExecutorFactory.getThreadPoolExecutor();
+
+    private final SensitiveWordService sensitiveWordService;
+
     /**
      * 1、 前缀树  前缀树某一个节点
      *
      * @author NXY
      * @date 2023/12/4 11:17
-     * @return null
      */
     private static class TrieNode {
         // 关键词结束标识
@@ -79,18 +87,16 @@ public final class SensitiveFilterUtil {
      */
     @PostConstruct
     public void init() {
-        try {
-            // 类加载器
-            InputStream is = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");
-            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-            String keyword;
-            while ((keyword = reader.readLine()) != null) {
-                // 添加到前缀树
-                this.addKeyword(keyword);
-            }
-        } catch (IOException e) {
-            log.error("加载敏感词文件失败: " + e.getMessage());
-        }
+        // 每120s装载一次敏感词
+        EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
+            List<String> keywords = sensitiveWordService.findAllEnabledWords();
+            keywords.forEach(keyword->{
+                if(StrUtil.isNotEmpty(keyword)){
+                    // 添加到前缀树
+                    addKeyword(keyword);
+                }
+            });
+        },0,120, TimeUnit.SECONDS);
     }
 
     /**
@@ -189,10 +195,9 @@ public final class SensitiveFilterUtil {
     /**
      * 判断是否为符号 ——特殊符号
      *
-     * @param c
-     * @return boolean
      * @author NXY
      * @date 2023/12/4 11:17
+     * @return boolean
      */
     private boolean isSymbol(Character c) {
         // 0x2E80~0x9FFF 是东亚文字范围

+ 0 - 3
im-platform/src/main/resources/sensitive-words.txt

@@ -1,3 +0,0 @@
-杀了你
-傻逼
-去死