sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离
<h1 id="前言">前言</h1><p>sensitive-word-admin 最初的定位是让大家知道如何使用 sensitive-word,所以开始想做个简单的例子。</p>
<p>不过秉持着把一个工具做好的原则,也收到很多小伙伴的建议。</p>
<p>v2.0.0 在 ruoyi-vue(也非常感谢若依作者多年来的无私奉献) 的基础之上,对整体 UI 进行重构。</p>
<p>为了实现一个让用户可以开箱就用的敏感词控台。</p>
<h1 id="项目介绍">项目介绍</h1>
<h2 id="平台简介">平台简介</h2>
<p>sensitive-word-admin 是和 sensitive-word 配套使用的控台。</p>
<ul>
<li>前端采用Vue、Element UI。</li>
<li>后端采用Spring Boot、Spring Security、Redis & Jwt。</li>
<li>权限认证使用Jwt,支持多终端认证系统。</li>
<li>支持加载动态权限菜单,多方式轻松权限控制。</li>
<li>高效率开发,使用代码生成器可以一键生成前后端代码。</li>
</ul>
<h2 id="拓展阅读">拓展阅读</h2>
<blockquote>
<p>sensitive-word-admin 敏感词控台 v1.2.0 版本开源</p>
</blockquote>
<blockquote>
<p>sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍</p>
</blockquote>
<h2 id="特性">特性</h2>
<ul>
<li>
<p>基本的 CRUD</p>
</li>
<li>
<p>敏感词修改实时生效</p>
</li>
</ul>
<blockquote>
<p>变更日志</p>
</blockquote>
<h1 id="本地启动">本地启动</h1>
<h2 id="依赖">依赖</h2>
<p>redis</p>
<p>mysql</p>
<p>node</p>
<h2 id="后端">后端</h2>
<p>2)执行 mysql 脚本</p>
<p>登录 mysql</p>
<p>清空库(谨慎操作,别清空了以前的数据)</p>
<pre><code>use test;
drop database sensitive_word;
</code></pre>
<p>创建库</p>
<pre><code>create database sensitive_word;
use sensitive_word;
</code></pre>
<p>执行 sql 下的 <code>init.sql</code>+ <code>sensitive_word.sql</code></p>
<p>3)修改配置</p>
<p><code>application-druid.yml</code> 调整一下数据库链接+账户密码</p>
<pre><code class="language-yaml">spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/sensitive_word?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: PASSWORD
</code></pre>
<p>运行 SpringBootApplication#main()</p>
<h2 id="前端">前端</h2>
<pre><code>cd admin-ui
npm install --registry=https://registry.npm.taobao.org
npm run dev
</code></pre>
<h2 id="登录">登录</h2>
<p>打开浏览器,输入:http://localhost:80 (默认账户 admin/admin123)</p>
<h2 id="敏感词基本管理">敏感词基本管理</h2>
<p>你可以在敏感词管理菜单,进行管理。</p>
<p><img src="https://img2024.cnblogs.com/other/1436333/202505/1436333-20250510151842825-465215390.png"></p>
<h1 id="api">API</h1>
<p>ApiSensitiveWordController 中包含对应的 api 方法,后续可以添加验签等校验。</p>
<h2 id="接口列表">接口列表</h2>
<table>
<thead>
<tr>
<th style="text-align: left">api</th>
<th style="text-align: left">入参</th>
<th style="text-align: left">出参</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">/api/sensitiveWord/contains</td>
<td style="text-align: left">string</td>
<td style="text-align: left">boolean</td>
<td style="text-align: left">是否包含敏感词</td>
</tr>
<tr>
<td style="text-align: left">/api/sensitiveWord/findAll</td>
<td style="text-align: left">string</td>
<td style="text-align: left"><code>List<String></code></td>
<td style="text-align: left">获取所有的敏感词</td>
</tr>
<tr>
<td style="text-align: left">/api/sensitiveWord/findFist</td>
<td style="text-align: left">string</td>
<td style="text-align: left">string</td>
<td style="text-align: left">获取第一个的敏感词</td>
</tr>
<tr>
<td style="text-align: left">/api/sensitiveWord/replace</td>
<td style="text-align: left">string</td>
<td style="text-align: left">string</td>
<td style="text-align: left">获取替换后的结果</td>
</tr>
<tr>
<td style="text-align: left">/api/sensitiveWord/tags</td>
<td style="text-align: left">string</td>
<td style="text-align: left"><code>Set<String></code></td>
<td style="text-align: left">获取敏感词的标签列表</td>
</tr>
</tbody>
</table>
<h2 id="接口验证">接口验证</h2>
<h3 id="token">token</h3>
<p><img src="https://img2024.cnblogs.com/other/1436333/202505/1436333-20250510151843876-903799804.png"></p>
<p>我们登录之后,可以获取到对应的 token。</p>
<p>比如我们打开【系统工具】-【系统接口】,任意找一个接口,看一下对应的 Authorization</p>
<p>比如这里就是</p>
<pre><code>eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImxvZ2luX3VzZXJfa2V5IjoiYzBjMmY0MWQtMjliMS00YzlkLWI2ZmMtNDhlZTk4MGIwZjJjIn0.67qpqIndfAd4J769ny1jqq8kEnATE9u5DbjJoMpbiMCSvAg2WaBV0b4nBjo5UxKVqcqbYgmnIN4gUi3AP2p6uw
</code></pre>
<h3 id="swagger-认证">swagger 认证</h3>
<p>然后点击绿色认证按钮认证一下,输入上面的 token。</p>
<p>就可以想基本的 swagger 一样验证接口。</p>
<h3 id="curl-请求">curl 请求</h3>
<p>你可以本地直接 curl</p>
<pre><code>curl -X GET "http://localhost:80/dev-api/api/sensitiveWord/tags?text=%E4%BA%8C%E5%8D%81%E5%85%AB%E7%94%BB%E7%94%9F" -H "accept: */*" -H "Authorization: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImxvZ2luX3VzZXJfa2V5IjoiYzBjMmY0MWQtMjliMS00YzlkLWI2ZmMtNDhlZTk4MGIwZjJjIn0.67qpqIndfAd4J769ny1jqq8kEnATE9u5DbjJoMpbiMCSvAg2WaBV0b4nBjo5UxKVqcqbYgmnIN4gUi3AP2p6uw"
</code></pre>
<p>结果:</p>
<pre><code>{
"respCode": "0000",
"respMessage": "成功",
"result": [
"伟人",
"画家"
]
}
</code></pre>
<h1 id="如何自定义标签">如何自定义标签</h1>
<h2 id="自定义单词-tag">自定义单词 TAG</h2>
<p>我们在配置中指定:</p>
<pre><code class="language-java">@Configuration
public class SensitiveWordConfig {
@Autowired
private MyDdWordAllow myDdWordAllow;
@Autowired
private MyDdWordDeny myDdWordDeny;
/**
* 自定义单词标签
*
* @since v1.4.0
*/
@Autowired
private MyDdWordTags myDdWordTags;
/**
* 初始化引导类
* @return 初始化引导类
* @since 1.0.0
*/
@Bean
public SensitiveWordBs sensitiveWordBs() {
return SensitiveWordBs.newInstance()
.wordAllow(WordAllows.chains(WordAllows.defaults(), myDdWordAllow))
.wordDeny(WordDenys.chains(WordDenys.defaults(), myDdWordDeny))
.wordTag(myDdWordTags)
// 各种其他配置
.init();
}
}
</code></pre>
<h2 id="myddwordtags-自定义实现">MyDdWordTags 自定义实现</h2>
<p>MyDdWordTags 是一个实现的例子:</p>
<p>核心分为两步:</p>
<p>1)根据【标签单词映射表】获取单词对应的标签编码(tag_code) 列表</p>
<p>2)根据【标签表】中的 tag_code 去查询对应的 标签描述(tag_label) 列表</p>
<p>所以需要分别配置二者,然后进行关联。</p>
<pre><code class="language-sql">SELECT DISTINCT
mapping.word AS word,
tag.tag_label AS tagLabel
FROM word_tag_mapping mapping
INNER JOIN tag tag ON mapping.tag_code = tag.tag_code
WHERE tag.status = 'Y'
</code></pre>
<h1 id="road-map">road-map</h1>
<p>当然,v2.0.0 出版的能力还比较欠缺,用户体验还是不够友好。</p>
<p>感兴趣的小伙伴也可以针对下面的需求进行 PR,欢迎一起交流。</p>
<p>如果你有需求,可以去这里issues</p>
<h2 id="待改进点">待改进点</h2>
<ul class="contains-task-list">
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> 单个词的修改实时生效</label></li>
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> word/tags 的修改,增量的变化,而不是全量</label></li>
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> word-tag 的处理,改为枚举映射,而不是手动输入</label></li>
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> 限定接入系统 appKey appSecret</label></li>
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> 系统的调用记录</label></li>
<li class="task-list-item"><input class="task-list-item-checkbox" disabled="" type="checkbox"><label> 数据大盘</label></li>
<li><s>[ ] word 操作时对应的日志表,有必要存在吗?(可以不保留,ruoyi 本身就有操作日志)</s></li>
</ul>
<h1 id="技术鸣谢">技术鸣谢</h1>
<ul>
<li>感谢 ruoyi-vue 的无私奉献</li>
</ul>
<h1 id="拓展阅读-1">拓展阅读</h1>
<p>sensitive-word-admin v1.3.0 发布 如何支持分布式部署?</p>
<p>sensitive-word-admin 敏感词控台 v1.2.0 版本开源</p>
<p>sensitive-word 基于 DFA 算法实现的高性能敏感词工具介绍</p>
<p>更多技术交流</p>
<h1 id="开源矩阵">开源矩阵</h1>
<p>sensitive-word 敏感词</p>
<p>pinyin 汉字转拼音</p>
<p>pinyin2hanzi 拼音转汉字</p>
<p>segment 高性能中文分词</p>
<p>opencc4j 中文繁简体转换</p>
<p>nlp-hanzi-similar 汉字相似度</p>
<p>word-checker 拼写检测</p>
<h1 id="参考资料">参考资料</h1>
<p>https://github.com/houbb/sensitive-word-admin</p><br><br>
来源:https://www.cnblogs.com/houbbBlogs/p/18869636
頁:
[1]