From d1bfe1251a68a1d3a2af9235d96babea3e3b0077 Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Sat, 20 Jul 2024 23:35:11 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=20=E6=95=8F=E6=84=9F=E8=AF=8D?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=BB=8E=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=AD?= =?UTF-8?q?=E6=8B=89=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bx/implatform/entity/SensitiveWord.java | 50 +++++++++++++++++++ .../mapper/SensitiveWordMapper.java | 16 ++++++ .../service/SensitiveWordService.java | 22 ++++++++ .../impl/SensitiveWordServiceImpl.java | 30 +++++++++++ .../implatform/util/SensitiveFilterUtil.java | 49 ++++++++++-------- .../src/main/resources/sensitive-words.txt | 3 -- 6 files changed, 145 insertions(+), 25 deletions(-) create mode 100644 im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java create mode 100644 im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java create mode 100644 im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java create mode 100644 im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java delete mode 100644 im-platform/src/main/resources/sensitive-words.txt diff --git a/im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java b/im-platform/src/main/java/com/bx/implatform/entity/SensitiveWord.java new file mode 100644 index 0000000..8ced7c7 --- /dev/null +++ b/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; + + +} \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java b/im-platform/src/main/java/com/bx/implatform/mapper/SensitiveWordMapper.java new file mode 100644 index 0000000..d989801 --- /dev/null +++ b/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 { + +} \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java b/im-platform/src/main/java/com/bx/implatform/service/SensitiveWordService.java new file mode 100644 index 0000000..f6a4b86 --- /dev/null +++ b/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 { + + /** + * 查询所有开启的敏感词 + * @return + */ + List findAllEnabledWords(); +} diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/SensitiveWordServiceImpl.java new file mode 100644 index 0000000..572e5bd --- /dev/null +++ b/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 implements + SensitiveWordService { + + @Override + public List findAllEnabledWords() { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SensitiveWord::getEnabled,true); + wrapper.select(SensitiveWord::getContent); + List words = this.list(wrapper); + return words.stream().map(SensitiveWord::getContent).collect(Collectors.toList()); + } +} diff --git a/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java b/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java index 2368d72..0491c14 100644 --- a/im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java +++ b/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 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 是东亚文字范围 diff --git a/im-platform/src/main/resources/sensitive-words.txt b/im-platform/src/main/resources/sensitive-words.txt deleted file mode 100644 index 59cac85..0000000 --- a/im-platform/src/main/resources/sensitive-words.txt +++ /dev/null @@ -1,3 +0,0 @@ -杀了你 -傻逼 -去死 \ No newline at end of file