練手項目中實現發表文章時檢測文章是否帶有敏感詞,以及對所有敏感詞的一鍵過濾功能
文章目錄
- 效果預覽
- 實現步驟
效果預覽
隨便復制一篇內容到輸入框
機器審核文章存在敏感詞,彈消息提示并進入人工審核階段(若機器審核通過,則無需審核直接發表)
審核瀏覽界面,把敏感詞庫關聯到的所有敏感詞高亮顯示
再來看看一鍵打碼功能,將文章中的敏感詞替換成*
號
文章進行打碼后就能直接發表通過了
實現步驟
有想過使用Elasticsearch實現,不過還要自己搞個敏感詞庫表感覺有點麻煩,體量較小的項目還是簡單點實現吧,過段時間再研究采用Elasticsearch的方案。
所以此處我們引用sensitive-word
敏感詞工具組件上手
sensitive-word文檔
首先Maven 引入依賴
<dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version>0.9.0</version>
</dependency>
在工具類文件夾中新建一個MyWordReplace.java來存放我們自定義的替換策略,用來實現敏感詞高亮
public class MyWordReplace implements IWordReplace {@Overridepublic void replace(StringBuilder stringBuilder, final char[] rawChars, IWordResult wordResult, IWordContext wordContext) {// 獲取敏感詞String sensitiveWord = InnerWordCharUtils.getString(rawChars, wordResult);// 自定義不同的敏感詞替換策略,可以從數據庫等地方讀取if("我草".equals(sensitiveWord)) {stringBuilder.append("我測");} else if("傻X".equals(sensitiveWord)) {stringBuilder.append("睿智");} else {// 除了自定義敏感詞替換策略,其余在富文本中轉成紅色高亮顯示stringBuilder.append("<span style='color:red'>"+sensitiveWord+"</span>");}}
}
服務層中調用組件方法對傳入參數進行敏感詞校驗和高亮替換
NoteContent content = note.getContent(); // 獲取文本對象內容// 設一個布爾值作為返回值判斷文章是否帶敏感詞boolean flag = false;if (note.getStatus()!= Note.STATE_NORMAL) {if (!SensitiveWordHelper.contains(content.getContent())) {note.setStatus(Note.STATE_RELEASE);}else{// 替換高亮處理過濾后的文本content.setContent(SensitiveWordHelper.replace(content.getContent(), new MyWordReplace()));// 文章有敏感詞,flag設為trueflag = true;}}
然后是非常簡單的一鍵打碼功能,前端設置一個一鍵打碼的按鈕,綁定點擊方法如下
// 把文章內容作為參數傳給后端,后端處理完返回字符串到前端,替換掉原有文本
const putMosaic = function () {contentMosaic({ content: form.contentStr }).then(res => {form.contentStr = res.dataElMessage.success('一鍵打碼成功')})
}
后端處理直接在控制層實現
@RequiresLogin@PutMapping("/contentMosaic")public R<String> contentMosaic(@RequestBody NoteContent noteContent) {String content = noteContent.getContent();if (!StringUtils.hasText(content)) {throw new ServiceException("內容為空");}// 直接返回打碼替換后的內容return R.ok(SensitiveWordHelper.replace(content));}
完事~
10W的敏感詞庫還是有點過于敏感了,最好是根據項目要求自定義敏感詞庫,更多用法還是參考官方文檔