若依 ruoyi-vue SpringBoot highlight-textarea 输入框敏感词关键词高亮标红(二)

参考文章,非常感谢大佬的分享
实现可高亮的输入框 — HighlightTextarea
GitHub:highlight-textarea

可看作者上一篇文章
若依 ruoyi-vue SpringBoot聊天敏感词过滤sensitive-word(一)

效果图

在这里插入图片描述

审核时,输入框高亮敏感词,并且能编辑
在这里插入图片描述

前端代码

列表高亮
      <el-table-columnlabel="标题"align="center"prop="publishTitle":show-overflow-tooltip="true"><template slot-scope="scope"><span v-html="highlightPublishTitle(scope.row)"></span></template></el-table-column>

    highlightPublishTitle(row){let text = row.publishTitlefor (const word of row.titleSensitiveWord) {const regex = new RegExp(word, 'g')text = text.replace(regex, `<span style="color: red;">${word}</span>`)}return text},
编辑表单输入框高亮
        <el-form-item label="标题" prop="publishTitle"><highlight-textareav-if="open"style="width: 100%;"placeholder="请输入":text="form.publishTitle"type="input"@change="(value) => {form.publishTitle = value}":highlightKey="form.titleSensitiveWord"></highlight-textarea></el-form-item>
引用组件
import HighlightTextarea from '@/components/HighlightTextarea/index.vue';components: { HighlightTextarea },
npm安装
npm install less@^4.2.0 less-loader@^7.3.0
组件
<template><div class="highlight-box"><template v-if="type === 'textarea'"><div v-if="value"class="textarea-outer"ref="textareaOuter":style="{'height': `${maxHeight}px`}"><div ref="outerInner" class="outer-inner"v-html="highlightHtml(value)"></div></div><textarearef="textareaBox":style="{'height': `${maxHeight}px`}":placeholder="placeholder"@keyup.enter="syncScrollTop"v-model.trim="value"></textarea></template><template v-if="type === 'input'"><div v-if="value"class="input-outer"v-html="highlightHtml(value)"></div><input type="text":placeholder="placeholder"v-model.trim="value"/></template></div>
</template><script>
export default {name: 'HighlightTextarea',data() {return {value: ''}},props: {placeholder: {type: String,required: false,default: '请输入'},text: {type: String,required: false,default: ''},highlightKey: {type: Array,require: false,default: () => []},type: {type: String,required: true,default: 'textarea'},maxHeight: {type: Number,required: false,default: 220}},created() {this.value = this.text.replace(/(^\s*)|(\s*$)/g, '').replace(/<br \/>|<br\/>|<br>/g, '\n')},mounted() {this.scrollMousewheel()},computed: {},watch: {value(newValue) {this.$emit('change', newValue)}},methods: {highlightHtml(str) {if ((!str || !this.highlightKey || this.highlightKey.length === 0) && this.type !== 'textarea') {return str}let rebuild = strif (this.highlightKey.filter(item => ~str.indexOf(item)).length) {let regStr = ''let regExp = nullthis.highlightKey.forEach(list => {regStr = this.escapeString(list)regExp = new RegExp(regStr, 'g')rebuild = rebuild.replace(regExp, `<span>${list}</span>`)})}if (this.type === 'textarea') {rebuild = rebuild.replace(/\n/g, '<br/>').replace(/\s/g, '&nbsp;')// textarea有滚动条时,div底部不能和textarea重合,故加一个<br/>const wrap = this.$refs.textareaBoxif (wrap && wrap.scrollHeight > this.maxHeight) {rebuild = rebuild + '<br/>'}}return rebuild},syncScrollTop() {const wrap = this.$refs.textareaBoxconst outerWrap = this.$refs.textareaOuterconst outerInner = this.$refs.outerInnerif (wrap.scrollHeight > this.maxHeight && outerInner.scrollHeight !== wrap.scrollHeight) {outerInner.style.height = `${wrap.scrollHeight}px`}if (wrap.scrollTop !== outerWrap.scrollTop) {outerWrap.scrollTop = wrap.scrollTop}},scrollMousewheel() {if (this.type === 'input') {return}this.$nextTick(() => {this.eventHandler('add')})},// 处理字符串中可能对正则有影响的字符escapeString(value) {const characterss = ['(', ')', '[', ']', '{', '}', '^', '$', '|', '?', '*', '+', '.']let str = value.replace(new RegExp('\\\\', 'g'), '\\\\')characterss.forEach(function(characters) {let r = new RegExp('\\' + characters, 'g')str = str.replace(r, '\\' + characters)})return str},eventHandler(type) {const wrap = this.$refs.textareaBoxif (wrap) {let mousewheelevt = (/Firefox/i.test(navigator.userAgent))? 'DOMMouseScroll' : 'mousewheel'wrap[`${type}EventListener`](mousewheelevt, this.syncScrollTop)wrap[`${type}EventListener`]('scroll', this.syncScrollTop)}}},destroyed() {this.eventHandler('remove')}
}
</script><style lang="less">
@width: 500px;
.highlight-box {font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;position: relative;display: flex;font-size: 12px;width: @width;position: relative;color: #333333;background: #ffffff;border-radius: 5px;overflow: hidden;.textarea-outer,.input-outer {box-sizing: border-box;width: @width;position: absolute;top: 0;left: 0;right: 0;border: 1px solid transparent;border-top: 0;// 鼠标事件失效 ie6-10不支持pointer-events: none;cursor: text;span {color: #F27C49;}&:hover {border-color: #4C84FF;}}.textarea-outer {overflow-y: auto;line-height: 20px;word-break: break-all;.outer-inner {padding: 5px 8px;width: 100%;box-sizing: border-box;}}textarea {width: @width;line-height: 20px;resize: none;}.input-outer,input {width: @width;height: 28px;line-height: 28px;}.input-outer {bottom: 0;padding: 0 8px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}textarea,input {font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;font-size: 12px;// position: relative;// z-index: 2;// 光标的颜色color: #333333;// 文本颜色text-shadow: 0 0 0 rgba(0, 0, 0, 0);-webkit-text-fill-color: transparent;background: transparent;border-radius: 5px;border: 1px solid #E0E0E0;padding: 4px 8px;box-sizing: border-box;&::placeholder {-webkit-text-fill-color: #999999;}&:hover {border-color: #4C84FF;}&:focus {border-color: #4C84FF;box-shadow: 0 0 0 2px #DBE4FF;outline: none;}}
}
</style>

后端代码

触发敏感词记录
 /*** 敏感词检查**/public void sensitiveWordCheck(SubPublishing subPublishing) {List<TzLySensitiveWordRecord> recordList = new ArrayList<>();Date nowDate = DateUtils.getNowDate();//找出标题的敏感词List<String> titleList = SensitiveWordHelper.findAll(subPublishing.getPublishTitle());TzLySensitiveWordRecord dbTitle = sensitiveWordRecordService.selectTzLySensitiveWordRecordByMessageIdAndSource(subPublishing.getId(), HYZR_TITLE);//插入if (ObjectUtil.isNull(dbTitle) && CollectionUtils.isNotEmpty(titleList)) {TzLySensitiveWordRecord record = new TzLySensitiveWordRecord();record.setWordId(null);// 敏感词IDrecord.setWord(StrUtil.join(",", titleList)); //敏感词record.setMessageId(subPublishing.getId());// 主键IDrecord.setUserId(Long.valueOf(subPublishing.getCreatorId()));// 发送人IDrecord.setUserName(subPublishing.getCreatorName());// 发送人姓名record.setMobile(subPublishing.getCreatorTel());// 发送人手机号record.setSendTime(nowDate);// 发送时间record.setIsDeleted(0);// 是否删除record.setCreatedDate(nowDate);// 创建时间record.setCreatedBy(Long.valueOf(subPublishing.getCreatorId()));// 创建人record.setSource(HYZR_TITLE);//消息来源 会员值日record.setMessage(subPublishing.getPublishTitle()); //记录实际发送消息record.setReplaceMessage(subPublishing.getPublishTitle()); //记录替换的消息recordList.add(record);//更新} else if (ObjectUtil.isNotNull(dbTitle)) {dbTitle.setWord(StrUtil.join(",", titleList)); //敏感词dbTitle.setLastModifiedDate(nowDate);// 修改时间dbTitle.setLastModifiedBy(Long.valueOf(subPublishing.getCreatorId()));// 修改人dbTitle.setMessage(subPublishing.getPublishTitle()); //记录实际发送消息dbTitle.setReplaceMessage(subPublishing.getPublishTitle()); //记录替换的消息recordList.add( dbTitle);}TzLySensitiveWordRecord dbContent = sensitiveWordRecordService.selectTzLySensitiveWordRecordByMessageIdAndSource(subPublishing.getId(), HYZR_CONTENT);if (CollectionUtils.isNotEmpty(recordList)) {sensitiveWordRecordService.saveOrUpdateBatch(recordList);}}

回显敏感词记录

        SubPublishing subPublishing = this.getById(id);//查询是否触发敏感词Map<String, TzLySensitiveWordRecord> sensitiveWordRecordMap = sensitiveWordRecordService.selectListByMessageId(id).stream().collect(Collectors.toMap(TzLySensitiveWordRecord::getSource, o -> o));if (!sensitiveWordRecordMap.isEmpty()) {TzLySensitiveWordRecord title = sensitiveWordRecordMap.get(HYZR_TITLE);if (ObjectUtil.isNotNull(title)) {subPublishing.setTitleSensitiveWord(StrUtil.split(title.getWord(), ","));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变阻器的分类

变阻器作为用于调节电路中电阻值的电子元件&#xff0c;在电子电路中具有广泛的应用。根据不同的工作原理和结构形式&#xff0c;变阻器可以分为多种类型。以下是对变阻器分类的详细阐述&#xff1a; 一、按工作原理分类 电位器是一种通过滑动端位置调节电阻值的变阻器&#x…

C++中 Debug和Release的区别

在C/C编程领域&#xff0c;Debug和Release是两种截然不同的编译模式&#xff0c;它们分别服务于不同的开发阶段和目标。理解这两种模式的区别不仅对于提高开发效率至关重要&#xff0c;还直接影响到最终产品的性能和质量。本文将深入探讨C/C中Debug和Release模式的区别&#xf…

Noah-MP陆面生态水文模拟与多源遥感数据同化

陆面模型在生态水文研究中的地位和作用&#xff1b;熟悉模型的发展历程&#xff0c;常见模型及各自特点&#xff1b;理解Noah-MP模型的原理&#xff0c;掌握Noah-MP模型在单站和区域的模拟、模拟结果的输出和后续分析及可视化等方法&#xff1b;课程还将深入讲解数据同化的原理…

6-添加自定义命令和生成的文件

本文使用的示例代码见1-简单开始cmake实践-CSDN博客。 假设&#xff0c;出于本教程的目的&#xff0c;我们决定不使用平台log和exp函数&#xff0c;而是希望生成一个预先计算值的表&#xff0c;以便在mysqrt函数中使用。在本节中&#xff0c;我们将创建表作为构建过程的一部分&…

1区老牌神刊,仅37天录用!网友:“这审稿速度救了我一条命”!

关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 期刊信息概况 【期刊类型】计算机科学类SCIE&EI 【出版社】ELSEVIER出版社 【期刊概况】IF&#xff1a;4.0-5.0&#xff0c;JCR1区&#xff0c;中科院3区…

用 Dockerfile 创建镜像的基本步骤有哪些?

使用 Dockerfile 创建镜像的基本步骤如下&#xff1a; 定义基础镜像 在 Dockerfile 的开头&#xff0c;使用 FROM 指令指定一个基础镜像。例如&#xff1a; FROM ubuntu:latest这表示基于最新的 Ubuntu 镜像来构建。 安装依赖和软件 使用 RUN 指令来执行命令&#xff0c;安装…

电脑文件xinput1_3.dll丢失要怎么修复win10?一键解决xinput1_3.dll丢失的方法

电脑文件xinput1_3.dll丢失要怎么修复win10&#xff1f;其实无论是哪种系统&#xff0c;是不是win10其修复方法都是大同小异&#xff0c;不过在修复xinput1_3.dll文件之前&#xff0c;首先我们要先了解这个xinput1_3.dll文件&#xff0c;只有了解了&#xff0c;那么才可以快速的…

奇瑞新能源车型EQ2在驾校领域的CAN总线数据应用

在当今这个快速发展的汽车时代&#xff0c;科技的进步不仅推动了汽车性能的提升&#xff0c;也为驾驶培训领域带来了革命性的变化。其中&#xff0c;奇瑞EQ2作为一款电动汽车&#xff0c;其在驾校领域的应用尤其值得关注&#xff0c;特别是其采用的CAN总线技术。CAN总线&#x…

【productj服务导出文件503问题】

设备服务只要导出文件&#xff0c;就报503&#xff0c;查看K8S发现服务重启 1. 复现问题1.1 问题复现频繁fullGC 宿主pod服务日志监控1.2 小内存复现 接口没啥问题&#xff0c;导出就会导致服务重启 1. 复现问题 当前uat环境配置&#xff1a; pod内存&#xff1a;2G JVM参数&a…

Python 利用pandas处理CSV文件(DataFrame的基础用法)

前面介绍过通过Python标准库中的CSV模块处理CSV文件&#xff1a; Python 利用CSV模块处理数据 相比CSV模块&#xff0c;pandas的功能更加强大&#xff0c;本文将简单介绍如何通过pandas来处理CSV文件。 文章目录 一、pandas简介二、用法示例2.1 读取CSV文件2.1.1 read_csv参数…

设计模式使用场景实现示例及优缺点(创建型模式——单例模式、建造者模式、原型模式)

创建型模式 单例模式&#xff08;Singleton Pattern&#xff09; 单例模式&#xff08;Singleton Pattern&#xff09;在Java中的使用场景与在其他编程语言中类似&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局的访问点。以下是单例模式的一些常…

现代化3D Web轻量引擎HOOPS Communicator:基于ESM的代码库转型!

HOOPS Communicator自2024.2.0版本起&#xff0c;向基于ECMAScript Modules (ESM)的系统迁移的决策和技术细节。文章分析了这一转型对代码组织、封装、依赖管理、性能以及与现代JavaScript开发实践兼容性的积极影响&#xff0c;并讨论了IIFE和UMD的兼容性支持。 引言 随着Jav…

聊聊springboot项目如何利用jmh来进行基准测试

前言 1、什么是JMH JMH&#xff08;Java Microbenchmark Harness&#xff09;是由OpenJDK团队开发的一个用于Java微基准测试工具套件&#xff0c;主要是基于方法层面的基准测试&#xff0c;精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能&…

[kuangbin]基础dp

Max Sum Plus Plus 题目大意&#xff1a;从一串数组中挑选连续m段子数组&#xff0c;使得最后的sum最大。 思路&#xff1a;首先考虑开二维数组&#xff0c;那么动态转移方程为&#xff1a; dp[i][j]max(dp[i-1][k]a[j],dp[i][j-1]a[j]) 其中dp表示枚举到第 j 个数的时候&#…

【深度学习(42)】通过vscode使用anaconda的python环境

按ctrlshiftp&#xff0c;选择Python:Select Interpreter 选择anaconda下的python虚拟环境

Elasticsearch 高亮搜索结果:提升用户体验的关键技术

在构建搜索引擎或任何需要快速、准确信息检索的应用时&#xff0c;搜索结果的高亮显示是一项至关重要的功能。它不仅能够显著提升用户的搜索体验&#xff0c;还能帮助用户更快地定位到他们感兴趣的内容。Elasticsearch&#xff0c;作为当今最流行的开源搜索和分析引擎之一&…

【k8s安装redis】k8s环境无pvc的情况下安装redis哨兵集群

文章目录 简介一.条件及环境说明&#xff1a;二.需求说明&#xff1a;三.实现原理及说明四.详细步骤4.1.规划节点标签4.2.创建configmap配置4.3.创建三个statefulset和service headless配置4.4.创建哨兵deployment配置和service配置 五.安装说明 简介 k8s集群中搭建有状态的服务…

大模型备案全网最详细流程说明【附附件】

下图为最新的直至第五批深度合成服务算法备案信息的公告 根据目前公开的国内大模型算法备案统计来看&#xff0c;首批境内深度合成服务算法备案清单&#xff0c;总共通过了五批。 以第二批举例&#xff0c;境内深度合成服务算法备案清单&#xff0c;总共通过110家&…

秒与时间转换器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好&#xff0c;我叫这是我58。在这里&#xff0c;我要给大家介绍一下我用C语言编译的秒与时间转换器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #in…

基于FaceX-Zoo里的faceSDK实现人脸识别(与人脸库结合比对人脸)

目录 一、简介 二、face SDK 1、环境需要 2、功能实现 2.1人脸库搭建 2.2人脸识别 3、测试结果 4、总结 本文根据京东开源的人脸识别工具包FaceX-Zoo,实现了人脸识别功能。对代码中的faceSDK部分做了修改,并搭建了自己的人脸库,识别结果准确度较高,后期可以打包SDK…