需求

用户上传execl,前端解析excel ,解析之后,将excel的json数据,传给后端,后端通过关键字检测算法,返回你之前传的数据,并且附件敏感字。然后前端渲染数据只table。并且用户以到excel形式下载table表格数据。没看错,全程后端就是对敏感词检测,excel 解析 ,下载,都是前端来做。我们一步一步来分析

步骤一 界面编写

界面编写 就是element一梭子

   <!-- 上传文件按钮界面 --><div class="buttonBox"><el-upload:show-file-list="false"class="upload-demo"action="":on-change="handleChange":auto-upload="false"><el-button size="small" type="primary">点击上传</el-button></el-upload> <el-button size="small" type="primary" @click="downloadTemplate">下载检查模板</el-button><el-button size="small" type="primary" @click="downloadResult">下载检查结果</el-button></div><!-- table界面 --><el-table  v-loading = "isLoading" element-loading-background = "rgba(255, 255, 255, .5)" element-loading-text = "加载中,请稍后..." element-loading-spinner = "el-icon-loading" :data="listData" stripe width=100%><el-table-column prop="goods_id" label="商品ID" width="180"></el-table-column><el-table-column label="商品图" width="180"><template slot-scope="scope"><img :src="scope.row.goods_img" class="shop_pic"/></template></el-table-column><el-table-column prop="goods_name" label="商品名称" width="180"></el-table-column><el-table-column prop="contents" label="视频文案内容" width="500"><template slot-scope="scope"><div class="overflow-style"><span v-html="sensitiveWords(scope.row.contents, scope.row.ad_values)"></span></div></template></el-table-column><el-table-column label="违禁词"><template slot-scope="scope"><div class="overflow-style"><span class="key-words" v-for="item in scope.row.ad_arr">{{item[0]}}&nbsp;({{item[1]}})&nbsp;&nbsp;&nbsp;<span></div></template></el-table-column></el-table>

步骤二: 使用XLSX进行execl解析,接续成json格式

    // 把文件按照二进制进行读取async handleChange(file) {this.FileName = file.namelet dataBinary = await this.readFile(file.raw)let workBook = XLSX.read(dataBinary, {type: 'binary', cellDates: true})let workSheet = workBook.Sheets[workBook.SheetNames[0]] // 获取Sheets中第一个Sheet的名字const upLoadData = XLSX.utils.sheet_to_json(workSheet) //  生成 JSON 格式的数组对象console.log('data', upLoadData)const interfaceData = this.dataFormat(upLoadData) // 这里的代码快在下面this.adWordsCheck(interfaceData) // 传给后端,后端接收数组对象,经过敏感词算法,返回需要的数组对象},readFile(file) {return new Promise(resolve => {let reader = new FileReader()reader.readAsBinaryString(file) // 将文件读取为二进制字符串reader.onload = ev => {resolve(ev.target.result)}})},

这里有必要解释一下

  1. xlsx 实现基本功能没问题(解析excel数据,根据json数据下载成excel ),但是样式什么的,比较费劲,所以下载我选择了excelJS
  2. xlsx
    地址 xlsx地址 https://github.com/SheetJS/sheetjs
    安装依赖 npm install xlsx
    使用cdn <script src="https://cdn.jsdelivr.net/npm/xlsx@0.14.3/dist/xlsx.core.min.js"></script>
    excelJS
    地址 exceljs地址 https://github.com/exceljs/exceljs
    安装依赖 npm install exceljs
    使用cdn <script src="https://cdn.jsdelivr.net/npm/exceljs@4.3.0/dist/exceljs.min.js"></script>
  3. 代码解释
    3.1 readFile
    使用浏览器的FileReader接口,把文件内容读出来交给js-xlsx解析,最终生成关键的workbook实例。
    3.2 workBook 是什么: workbook是一个工作簿对象
    3.3 workBook.Sheets[workBook.SheetNames[0]] // 获取Sheets中第一个Sheet的名字
    3.4 XLSX.utils.sheet_to_json(workSheet) // 将excel里的数据生成 JSON 格式的数组对象
    3.5 至此XLSX解析就完成了,但是excel是给用户看的,解析出来的数据是要给后端的,所以解析出来的数据,得有一个映射
    3.6 比如 excel里的 商品ID, 文案内容,对应的字段可能是goods_id, contents. 要做一个映射

映射代码

let character = {goods_id: {text: "商品ID",},contents: {text: "视频文案内容",}
};dataFormat(upLoadData) {let arr = [];upLoadData.forEach(item => {let obj = {};for (let key in character) {if (!character.hasOwnProperty(key)) break;let v = character[key],text = v.text,type = v.type;v = item[text] || "";type === "string" ? (v = String(v)) : null;type === "number" ? (v = Number(v)) : null;obj[key] = v;}arr.push(obj);});return arr}

现在数据准备完毕,然后传给后端

this.adWordsCheck(interfaceData) // 传给后端,后端接收数组对象,经过敏感词算法,返回需要的数组对象// 导入检查文案接口adWordsCheck(interfaceData){this.isLoading = truelet parent = JSON.stringify(interfaceData)$.post('/Tools/ajaxAdWordsCheck', {data: parent}).then(res=>{if (res.errno == 0) {this.adWordList = res.datathis.isLoading = false;} else {this.isLoading = false;}})},

接收后端返回的数据,并且进行数据处理

这里需要对数据进行处理
后端返回的关键字是

{obj: {"最" : 2,"最好的":3,"最棒的": 4}
}

这个需要转化成数组。并且需要一个变量专门用来存放key,为后面敏感词标红做准备

 computed: {listData: function ({adWordList}) {adWordList.forEach(item=>{item.ad_arr = Object.entries(item.ad_words) // 将对象转为数据item.ad_values = Object.keys(item.ad_words) // 对关键字进行抽取}) return adWordList}},

现在数据准备完毕,然后渲染

关键点1
将之前的adWordList 转为计算属性listData
关键点2
将敏感词单独渲染
<el-table-column label="违禁词"><template slot-scope="scope"><div class="overflow-style"><span class="key-words" v-for="item in scope.row.ad_arr">{{item[0]}}&nbsp;({{item[1]}})&nbsp;&nbsp;&nbsp;<span></div></template></el-table-column>

至此el-table渲染完毕。开始进行敏感词标红

敏感词标红

匹配敏感词,如果内容中有敏感词,将content中的敏感词标红,核心就是正则,

 <el-table-column prop="contents" label="视频文案内容" width="500"><template slot-scope="scope"><div class="overflow-style"><span v-html="sensitiveWords(scope.row.contents, scope.row.ad_values)"></span></div></template></el-table-column>// 敏感词高亮sensitiveWords(content, keyWords){let keyWordsSort = keyWordskeyWordsSort.sort(function (a, b) {return b.length - a.length;}); // 这里为什么要排序?keyWordsSort.map(item=>{let reg = new RegExp(item, 'g')content = content.replaceAll(reg, `<font color="red">${item}</font>`)})return content},

为什么要对关键词排序,比如

{obj: {"最" : 2,"最好的":3,"最棒的": 4}
}

全局匹配“最” ,如果是以下内容,
最,最棒,最好的。并且都是关键字

就会出现一次匹配 最

<font color="red">最</font>
<font color="red">最</font> 棒
<font color="red">最</font>好的

第二次匹配 最棒
但是目前最棒是 <font color="red">最</font> 棒 无法匹配到 “最棒”
所以排序,是为了将字数长的,放在前面,大集合包括小集合

至此 excel 解析,敏感字标红,已经处理完,看效果

下面看下载功能

下载模板

就是一个链接,直接用window.location.href

// 下载检查模板downloadTemplate(){window.location.href = `oss地址`},

根据table ,下载成excel

// 下载检查结果async downloadResult(){console.log('this.listData111', this.listData) //  var worksheet = workbook.addWorksheet();worksheet.columns = [{ header: '商品id', key: 'goods_id', width: 20 },{ header: '商品图', key: 'goods_img', width: 50 },{ header: '商品名称', key: 'goods_name', width: 50 },{ header: '视频文案内容', key: 'contents', width: 50 },{ header: '违禁词', key: 'ad_words', width: 50, style: { font: { color: { argb: 'ff0000' } } } },];worksheet.addRows(this.listData);// 通过键,字母和基于1的列号访问单个列const dobCol = worksheet.getColumn('contents');// 遍历此列中的所有当前单元格dobCol.eachCell({ includeEmpty: true }, (cell, rowNumber)=> {let ad_address = worksheet.getCell(`${cell._address}`).value// 这里应该放关键字});// 下载excellet file = './file/' + Date.now()+ '.xlsx';workbook.xlsx.writeBuffer(file).then( value => {const blob = new Blob([value], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.style.display = 'none';link.href = url;link.setAttribute('download', `${this.FileName}`);document.body.appendChild(link);link.click();//释放URL对象所占资源window.URL.revokeObjectURL(url);//用完即删document.body.removeChild(link);});},
  1. 新建一个工作簿
    var worksheet = workbook.addWorksheet();
  2. 将需要转化的列标出来,并且,可以设置宽度和颜色
    worksheet.columns = [
    { header: ‘商品id’, key: ‘goods_id’, width: 20 },
    { header: ‘商品图’, key: ‘goods_img’, width: 50 },
    { header: ‘商品名称’, key: ‘goods_name’, width: 50 },
    { header: ‘视频文案内容’, key: ‘contents’, width: 50 },
    { header: ‘违禁词’, key: ‘ad_words’, width: 50, style: { font: { color: { argb: ‘ff0000’ } } } },
    ];
    3. 将数据塞到工作簿
    worksheet.addRows(this.listData);
    4. 下载excel

一次敏感词检测开发记录相关推荐

  1. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  2. 测试.net开源敏感词检测库ToolGood.Words

      微信公众号"DotNet"看到介绍.net开源敏感词检测库ToolGood.Words的文章<.NET Core一款高性能敏感词检测开源库>,根据参考文献2中的测试 ...

  3. 敏感词检测库ToolGood.Words中IllegalWordsSearch类使用简介

      C#开源敏感词检测库ToolGood.Words中的类IllegalWordsSearch为过滤非法词(敏感词)专用类,可设置跳字长度,支持全角转忽略大小.跳词.重复词.黑名单等功能,本文对照参考 ...

  4. 敏感词检测:整合阿里云与腾讯云相关API

    前言 项目地址:Text-Sensitivity 笔者在开发小程序时,由于需要对用户输入内容进行敏感词检查,故需要使用现有服务商的相关API(自行开发NLP产品,难度大). 我们技术团队初步使用的是腾 ...

  5. 关于java中敏感词检测的一些总结

    之前项目里客户提出一个需求,需要对系统中使用文本转化成语音发送的功能进行敏感词检测,禁止用户提交有敏感词的语音.通过查询各方面资料,整理了大概几种方案: 项目启动时对载入敏感词库作为缓存(一个大map ...

  6. 写一个高性能的敏感词检测组件

    最近写了一个高性能的敏感词检测组件[ToolGood.Words]. 一.高性能,它的效率到底有多快? 如果将正则表达式的算法效率设为1,高性能可达到正则表达式的1.5万倍. 二.选一个巧妙的算法: ...

  7. Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的.今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚. 敏感词匹配这种治标不治本的方法,在一 ...

  8. php访问小程序内容检测接口,关于小程序接入敏感词检测接口的坑

    接入 msgSecCheck 接口47001 错误码踩坑! 这是官方文档要求,写的有些笼统,根据开发者社区提供需要进行编码后在传参,以下为 php 代码示例/** * 敏感词检测 * @param $ ...

  9. 免费敏感词检测API

    免费敏感词检测,免费文本内容审核, 不用什么注册key,下载到本地直接运行,直接http json查询. 下载地址 ​​https://github.com/bosnzt/wordscheck​​ ​ ...

最新文章

  1. ISA Server 2006的CARP与NLB的构建
  2. 剑指Offer_17_树的子结构
  3. Just h-index(主席树+二分)
  4. python中的内置函数返回元素_Python内置函数_________用来返回数值型序列中所有元素之和。...
  5. Java函数式编程整理
  6. 25 款软件上榜,2020“最佳开源奖” 出炉!
  7. jQuery表格排序(tablesorter)
  8. 学术必备 | 论文写作中注意这些细节,能显著提升成稿质量
  9. 《计算机组成原理(微课版)》第1章课后习题答案
  10. 中兴f460光猫资料
  11. 【安信可IDE 1.5模板专题1】安信可windows一体化环境IDE V1.5 版本降临,体积更小,兼容新旧版本SDK编译
  12. 计算机查重公式编辑器,知网查重文字公式编辑器吗
  13. opencv读取颜色通道
  14. html插入背景图片如何拉伸,css怎样拉伸背景图片?
  15. 高通 Hexagon V65 HVX 编程参考手册(1)
  16. java手机刷机精灵,按钮救星(按键精灵所有者读写权限)
  17. mmo中匹配机制的思考与实现
  18. 《那年花开月正圆》热播 让人深觉安防重要性
  19. centos6 10分钟快速搭建iscsi存储服务器
  20. pycharm中的py版本与coda3自带版本不统一

热门文章

  1. 360安全卫士极速版和你一起轻松出发 为青少年开启安全护航
  2. 2月第1周安全回顾:移动设备威胁增加 常用软件补丁密集
  3. 我喜欢陈欧的这段广告 你只闻到我的香水 却没看的我的汗水 你有你的规则 我有我的选择 你否定我的现在 我决定我的未来 你嘲笑我一无所有 不配去爱 我可怜你总是等待 你可以轻视我们的年轻 我们会
  4. p2p僵尸网络工作原理
  5. 余生做一个有趣的人,修得平常心
  6. 中国十大女性网站排行榜
  7. 开源软件 字母组成的标志_看看6个标志性开源品牌
  8. JDBC使用Java反射万能查询Oracle表数据、插入数据——【JDBC编程】
  9. 上网部署(锐捷睿易篇)
  10. 了微操作而进化成章鱼的人们