UNIAPP-微信小程序实现文本纠错功能

一、实现思路:利用UNIAPP实现前端,利用SRPINGBOOT实现后端,利用基础JS实现纠错标记与后端返回位置定位。

二、UNIAPP实现小程序页面代码

<template>
	<view style="display: flex;justify-content: center;">
		<!-- 纠错布局 外围容器-->
		<view :style="{width:'100%',height:windowsHeight+'px'}">
			<!-- <textarea v-model="text" :style="{width:'100%',height:windowsHeight+'px',fontSize:'16px'}" :maxlength="2000"
				@input='inputText'>
			</textarea> -->
			<editor :style="{width:'100%',height:windowsHeight+'px',fontSize:'16px'}" @ready="editorReady" id="editorId"
				@input="inputText"></editor>
		</view>
		<view style="position: fixed;bottom: 0;left:0;width: 100%;">
			<uni-goods-nav :fill="true" :options="[]" :buttonGroup="buttonGroup" @buttonClick="buttonClick">
			</uni-goods-nav>
		</view>


		<span @click="openOption('错误展示')" v-if="errorInfoList.length>0" style=" position: absolute;right: 0rpx;bottom:650rpx;font-size: 16px;
		background-color: orangered;color: white;padding: 5px 5px;border-radius: 5px;">
			<span style="font-weight: bold;">点我{{errorInfoList.length}}</span>
			<uni-icons type="notification-filled" size="18" color="white" style="margin-left: 5px;"></uni-icons>
		</span>

		<!-- <span style=" position: absolute;right: 24rpx;bottom:100rpx;font-size: 12px;background-color: #F5F5F5;"
			@click="myCopy">
			<image src="@/static/copy1.png" style="width: 20px;height: 20px;padding-right: 125px;padding-top: 5px;;">
			</image>
		</span> -->
		<span
			style=" position: absolute;right: 24rpx;bottom:100rpx;font-size: 12px;background-color: red;color: white;z-index: 9999;">
			字符限制:{{number}}/{{maxNumber}}
		</span>
		<!--纠错List弹出层选择器 -->
		<gdPicker :data="errorInfoListCopy" ref="gPicker" @getVal="getVal" label="label"></gdPicker>

	</view>
</template>

<script>
	import {
		mapState,
		mapMutations
	} from 'vuex'
	export default {
		computed: {
			...mapState('m_user', ['userInfo'])
		},
		data() {
			return {
				windowsHeight: 0, // 当前设备可用高度
				text: "地面还特么的留有一丝余热,如果说正午像<span class='need_mark_0' style='background-color:#F7CD2A;'>精力允沛</span>的青年,那黄昏就像幽雅的少女,清爽的风中略<span class='need_mark_1' style='background-color:#F7CD2A;'>贷</span>一丝暖意。<span class='need_mark_2' style='background-color:#F7CD2A;'>胎</span>头望着天空,只见红彤彤的晚霞<span class='need_mark_3' style='background-color:#F7CD2A;'>己</span>经染红大半片天空了,形状更是<span class='need_mark_4' style='background-color:#F7CD2A;'>千资百态</span>:你看!一只只<span class='need_mark_5' style='background-color:#F7CD2A;'>玩</span>皮的老虎在奔跑,又<span class='need_mark_6' style='background-color:#F7CD2A;'>象</span>是正在追赶周围崩崩跳跳的小兔子。<span class='need_mark_7' style='background-color:#F7CD2A;'>忠</span>于还是不见了,然而却出现了一匹<span class='need_mark_8' style='background-color:#F7CD2A;'>峻</span>马,它在<span class='need_mark_9' style='background-color:#F7CD2A;'>遗忘</span>无际的草原上奔跑着。晚霞形态千变万化,各种<span class='need_mark_10' style='background-color:#F7CD2A;'>镜像</span>令人<span class='need_mark_11' style='background-color:#F7CD2A;'>赞不决口</span>,天空的颜色也变化着:深红粉红橘红...仿佛是魔术大师的精彩魔术,让人<span class='need_mark_12' style='background-color:#F7CD2A;'>目不假接</span>。<br><br>孔雀<span class='need_mark_13' style='background-color:#F7CD2A;'>开平</span>是由一大盆菊花<span class='need_mark_14' style='background-color:#F7CD2A;'>安</span>照要求改造而成,它<span class='need_mark_15' style='background-color:#F7CD2A;'>昂首廷胸</span>屏开富贵。它的眼晴是两朵红色的菊花,像两颗红色的玛瑙,<span class='need_mark_16' style='background-color:#F7CD2A;'>襄</span>嵌在黄色的绸缎上,明亮有神。它的尾部有许多五颜六色的菊花,像七色的彩红,绚丽夺目。蝴蝶整体是由紫红色的菊花改造而成,两只翅膀<span class='need_mark_17' style='background-color:#F7CD2A;'>篇篇</span>起舞。<br><br>你看,那一朵朵菊花像一个害羞的小姑娘,<span class='need_mark_18' style='background-color:#F7CD2A;'>漏</span>出一个泛着红晕的笑脸。", // 用户校对文本
				maxNumber: 2000, //可输入最大字数
				number: 455, //已输入字数
				buttonGroup: [{
					text: '默认文本',
					backgroundColor: 'green',
					color: '#fff'
				}, {
					text: '清空文本',
					backgroundColor: '#ff0000',
					color: '#fff'
				}, {
					text: '复制文本',
					backgroundColor: '#169AD4',
					color: '#fff'
				}, {
					text: '立即校对',
					backgroundColor: '#ffa200',
					color: '#fff'
				}],
				errorInfoList: [{
					"errorName": "成语错误",
					"errorContent": null,
					"start": 19,
					"end": 23,
					"original": " 精力允沛",
					"should": "精力充沛",
					"label": "1、成语错误: 精力允沛 --> 精力充沛"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 44,
					"end": 45,
					"original": " 贷",
					"should": "带",
					"label": "2、错别字: 贷 --> 带"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 50,
					"end": 51,
					"original": " 胎",
					"should": "抬",
					"label": "3、错别字: 胎 --> 抬"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 65,
					"end": 66,
					"original": " 己",
					"should": "已",
					"label": "4、错别字: 己 --> 已"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 80,
					"end": 84,
					"original": " 千资百态",
					"should": "千姿百态",
					"label": "5、成语错误: 千资百态 --> 千姿百态"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 91,
					"end": 92,
					"original": " 玩",
					"should": "顽",
					"label": "6、错别字: 玩 --> 顽"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 101,
					"end": 102,
					"original": " 象",
					"should": "像",
					"label": "7、错别字: 象 --> 像"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 118,
					"end": 119,
					"original": " 忠",
					"should": "终",
					"label": "8、错别字: 忠 --> 终"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 134,
					"end": 135,
					"original": " 峻",
					"should": "骏",
					"label": "9、错别字: 峻 --> 骏"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 139,
					"end": 141,
					"original": " 遗忘",
					"should": "一望",
					"label": "10、错别词语: 遗忘 --> 一望"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 162,
					"end": 164,
					"original": " 镜像",
					"should": "景象",
					"label": "11、错别词语: 镜像 --> 景象"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 166,
					"end": 170,
					"original": " 赞不决口",
					"should": "赞不绝口",
					"label": "12、成语错误: 赞不决口 --> 赞不绝口"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 203,
					"end": 207,
					"original": " 目不假接",
					"should": "目不暇接",
					"label": "13、成语错误: 目不假接 --> 目不暇接"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 212,
					"end": 214,
					"original": " 开平",
					"should": "开屏",
					"label": "14、错别词语: 开平 --> 开屏"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 221,
					"end": 222,
					"original": " 安",
					"should": "按",
					"label": "15、错别字: 安 --> 按"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 231,
					"end": 235,
					"original": " 昂首廷胸",
					"should": "昂首挺胸",
					"label": "16、成语错误: 昂首廷胸 --> 昂首挺胸"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 262,
					"end": 263,
					"original": " 襄",
					"should": "镶",
					"label": "17、错别字: 襄 --> 镶"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 325,
					"end": 327,
					"original": " 篇篇",
					"should": "翩翩",
					"label": "18、错别词语: 篇篇 --> 翩翩"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 351,
					"end": 352,
					"original": " 漏",
					"should": "露",
					"label": "19、错别字: 漏 --> 露"
				}],
				errorInfoListCopy: [{
					"errorName": "成语错误",
					"errorContent": null,
					"start": 19,
					"end": 23,
					"original": " 精力允沛",
					"should": "精力充沛",
					"label": "1、成语错误: 精力允沛 --> 精力充沛"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 44,
					"end": 45,
					"original": " 贷",
					"should": "带",
					"label": "2、错别字: 贷 --> 带"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 50,
					"end": 51,
					"original": " 胎",
					"should": "抬",
					"label": "3、错别字: 胎 --> 抬"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 65,
					"end": 66,
					"original": " 己",
					"should": "已",
					"label": "4、错别字: 己 --> 已"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 80,
					"end": 84,
					"original": " 千资百态",
					"should": "千姿百态",
					"label": "5、成语错误: 千资百态 --> 千姿百态"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 91,
					"end": 92,
					"original": " 玩",
					"should": "顽",
					"label": "6、错别字: 玩 --> 顽"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 101,
					"end": 102,
					"original": " 象",
					"should": "像",
					"label": "7、错别字: 象 --> 像"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 118,
					"end": 119,
					"original": " 忠",
					"should": "终",
					"label": "8、错别字: 忠 --> 终"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 134,
					"end": 135,
					"original": " 峻",
					"should": "骏",
					"label": "9、错别字: 峻 --> 骏"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 139,
					"end": 141,
					"original": " 遗忘",
					"should": "一望",
					"label": "10、错别词语: 遗忘 --> 一望"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 162,
					"end": 164,
					"original": " 镜像",
					"should": "景象",
					"label": "11、错别词语: 镜像 --> 景象"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 166,
					"end": 170,
					"original": " 赞不决口",
					"should": "赞不绝口",
					"label": "12、成语错误: 赞不决口 --> 赞不绝口"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 203,
					"end": 207,
					"original": " 目不假接",
					"should": "目不暇接",
					"label": "13、成语错误: 目不假接 --> 目不暇接"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 212,
					"end": 214,
					"original": " 开平",
					"should": "开屏",
					"label": "14、错别词语: 开平 --> 开屏"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 221,
					"end": 222,
					"original": " 安",
					"should": "按",
					"label": "15、错别字: 安 --> 按"
				}, {
					"errorName": "成语错误",
					"errorContent": null,
					"start": 231,
					"end": 235,
					"original": " 昂首廷胸",
					"should": "昂首挺胸",
					"label": "16、成语错误: 昂首廷胸 --> 昂首挺胸"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 262,
					"end": 263,
					"original": " 襄",
					"should": "镶",
					"label": "17、错别字: 襄 --> 镶"
				}, {
					"errorName": "错别词语",
					"errorContent": null,
					"start": 325,
					"end": 327,
					"original": " 篇篇",
					"should": "翩翩",
					"label": "18、错别词语: 篇篇 --> 翩翩"
				}, {
					"errorName": "错别字",
					"errorContent": null,
					"start": 351,
					"end": 352,
					"original": " 漏",
					"should": "露",
					"label": "19、错别字: 漏 --> 露"
				}],
				needMarkIndex: 0,
			};
		},
		onLoad() {
			const sysInfo = uni.getSystemInfoSync();
			this.windowsHeight = sysInfo.windowHeight - 50
		},
		methods: {
			myCopy() {
				this.text = this.text.replaceAll(" ", "").replaceAll("<br>", "\n")
				let text = this.filtersText(this.text); // '所要复制的内容'
				uni.setClipboardData({
					data: text, // 复制的内容 
					success: function() {
						console.log('success');
						uni.showToast({
							title: '复制成功',
							duration: 2000
						})
					}
				});
			},
			getVal(val) {
				// console.log("我打印的" + JSON.stringify(val))
				if (val.buttonInfo === "错误展示") {
					// console.log("我打印的0611" + JSON.stringify(val.label))
					let tempArray = JSON.stringify(val.label).replaceAll("\"", "").split("、")
					// console.log(parseInt(tempArray[0]) + '----------dfadsfdf')
					let bigItem = {};
					this.errorInfoListCopy.forEach(item => {
						if (parseInt(item.label.substring(0, 2)) === parseInt(tempArray[0])) {
							bigItem = item // 赋值
						}
					})
					// console.log(JSON.stringify(this.errorInfoList) + "重点观察") // 确实值变了  卧槽!!!!!!!!!!!!!
					let chinaLength = bigItem.end - bigItem.start
					// console.log(chinaLength)
					this.needMarkIndex = parseInt(tempArray[0]) - 1
					let findStr = 'need_mark_' + this.needMarkIndex
					console.log(findStr + "-----------------" + JSON.stringify(this.text))
					let start = this.text.indexOf(findStr)
					// 替换背景,不能替换 需要拼接
					if (parseInt(tempArray[0]) < 11) {
						console.log(chinaLength +
							"开始寻找位置:" + start +
							"---------------------------------------------------------------------" +
							this.text.substring(start + 37, start + 44) + "替换为" + '#B5F1B5' +
							"---------------------------------------------------------------------" +
							this.text.substring(start + 47, start + 47 + chinaLength) + "替换为" +
							bigItem.should
						)
						this.text = this.text.substring(0, start + 37) + '#B5F1B5' + this.text.substring(start + 44)
						// 替换文本
						this.text = this.text.substring(0, start + 47) + bigItem.should + this.text.substring(start + 47 +
							chinaLength)
					} else {
						console.log(chinaLength +
							"开始寻找位置:" + start +
							"---------------------------------------------------------------------" +
							this.text.substring(start + 38, start + 45) + "替换为" + '#B5F1B5' +
							"---------------------------------------------------------------------" +
							this.text.substring(start + 48, start + 48 + chinaLength) + "替换为" +
							bigItem.should
						)
						this.text = this.text.substring(0, start + 38) + '#B5F1B5' + this.text.substring(start + 45)
						// 替换文本
						this.text = this.text.substring(0, start + 48) + bigItem.should + this.text.substring(start + 48 +
							chinaLength)
					}
					// console.log("替换后文本信息" + this.text)
					// console.log("分割线-----------------------------------------------------")
					let removeFlag = 0;
					this.errorInfoListCopy.forEach(item => {
						// console.log(parseInt(item.label.substring(0, 2)))
						if (parseInt(item.label.substring(0, 2)) === parseInt(tempArray[0])) {
							this.errorInfoListCopy.splice(removeFlag, 1)
						}
						removeFlag++ // 找不到继续下一个
					})
					// this.errorInfoListCopy.splice(this.needMarkIndex, 1) // 不能这么暴力的删除,会有问题
					// console.log(JSON.stringify(this.errorInfoListCopy) + "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&")
					this.editorReady()
				}
			},
			openOption(info) {
				// console.log(this.$refs)
				this.$refs.gPicker.openPick(info, this.errorInfoListCopy);
			},
			editorReady() {
				//由于editor的v-model和:value失效,只能用dom来赋值
				this.createSelectorQuery().select('#editorId').context((res) => {
					if (!res) return
					res.context.setContents({
						html: this.text
					})
				}).exec()
			},
			...mapMutations('m_user', ['updateAddress', 'updateUserInfo', 'updateToken']),
			buttonClick(e) { // 点击校对按钮
				// console.log(e)
				if (e.content.text === "立即校对") {
					if (this.text.length === 0) {
						uni.showToast({
							title: '校对文本不能为空'
						})
						return
					}
					// console.log("我打印的原请求文本" + this.text)
					this.text = this.text.replaceAll(" ", "").replaceAll("<br>", "\n")
					this.userInfo.text = this.filtersText(this.text);
					// console.log("我打印的请求文本" + this.userInfo.text)
					uni.$http.post("/wx_check", this.userInfo).then(res => {
						// console.log(res)
						if (res.data.code === "200") {
							this.updateUserInfo(res.data.object.user) // 更新用户余额
							if (res.data.object.errorInfoList.length === 0) {
								uni.showToast({
									title: '文本非常完美'
								})
								return
							} else {
								this.errorInfoList = res.data.object.errorInfoList
								// 给它封装个额外的属性
								let flag = 0;
								this.errorInfoList.forEach(item => {
									flag++
									item.label = flag + "、" + item.errorName + ":" + item
										.original + " --> " + item.should
								})
								this.errorInfoListCopy = this.errorInfoList
								// 拷贝一份 给滚动展示用
								// console.log("0611打印" + JSON.stringify(this.errorInfoList))
								this.positioning(res.data.object.errorInfoList) // 调用标记方法标记
								uni.showToast({
									title: '完成,点我纠正'
								})
							}
						} else {
							uni.setClipboardData({
								data: '13856011943', // 复制的内容 
								success: function() {
									console.log('success');
								}
							});
							uni.showModal({
								title: '余额不足,请先登录!或请WX联系 13856011943 微信号已复制',
								success: function() { // 点击确定跳转
									uni.switchTab({
										url: '/pages/my/my'
									})
								}
							});
						}
					})
				}
				if (e.content.text === "清空文本") {
					this.text = ""
					this.errorInfoList = []
					this.errorInfoListCopy = []
					this.number = 0
					this.editorReady()
				}
				if (e.content.text === "默认文本") {
					this.text =
						"地面还特么的留有一丝余热,如果说正午像<span class='need_mark_0' style='background-color:#F7CD2A;'>精力允沛</span>的青年,那黄昏就像幽雅的少女,清爽的风中略<span class='need_mark_1' style='background-color:#F7CD2A;'>贷</span>一丝暖意。<span class='need_mark_2' style='background-color:#F7CD2A;'>胎</span>头望着天空,只见红彤彤的晚霞<span class='need_mark_3' style='background-color:#F7CD2A;'>己</span>经染红大半片天空了,形状更是<span class='need_mark_4' style='background-color:#F7CD2A;'>千资百态</span>:你看!一只只<span class='need_mark_5' style='background-color:#F7CD2A;'>玩</span>皮的老虎在奔跑,又<span class='need_mark_6' style='background-color:#F7CD2A;'>象</span>是正在追赶周围崩崩跳跳的小兔子。<span class='need_mark_7' style='background-color:#F7CD2A;'>忠</span>于还是不见了,然而却出现了一匹<span class='need_mark_8' style='background-color:#F7CD2A;'>峻</span>马,它在<span class='need_mark_9' style='background-color:#F7CD2A;'>遗忘</span>无际的草原上奔跑着。晚霞形态千变万化,各种<span class='need_mark_10' style='background-color:#F7CD2A;'>镜像</span>令人<span class='need_mark_11' style='background-color:#F7CD2A;'>赞不决口</span>,天空的颜色也变化着:深红粉红橘红...仿佛是魔术大师的精彩魔术,让人<span class='need_mark_12' style='background-color:#F7CD2A;'>目不假接</span>。<br><br>孔雀<span class='need_mark_13' style='background-color:#F7CD2A;'>开平</span>是由一大盆菊花<span class='need_mark_14' style='background-color:#F7CD2A;'>安</span>照要求改造而成,它<span class='need_mark_15' style='background-color:#F7CD2A;'>昂首廷胸</span>屏开富贵。它的眼晴是两朵红色的菊花,像两颗红色的玛瑙,<span class='need_mark_16' style='background-color:#F7CD2A;'>襄</span>嵌在黄色的绸缎上,明亮有神。它的尾部有许多五颜六色的菊花,像七色的彩红,绚丽夺目。蝴蝶整体是由紫红色的菊花改造而成,两只翅膀<span class='need_mark_17' style='background-color:#F7CD2A;'>篇篇</span>起舞。<br><br>你看,那一朵朵菊花像一个害羞的小姑娘,<span class='need_mark_18' style='background-color:#F7CD2A;'>漏</span>出一个泛着红晕的笑脸。" // 用户校对文本
					this.errorInfoList = [{
						"errorName": "成语错误",
						"errorContent": null,
						"start": 19,
						"end": 23,
						"original": " 精力允沛",
						"should": "精力充沛",
						"label": "1、成语错误: 精力允沛 --> 精力充沛"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 44,
						"end": 45,
						"original": " 贷",
						"should": "带",
						"label": "2、错别字: 贷 --> 带"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 50,
						"end": 51,
						"original": " 胎",
						"should": "抬",
						"label": "3、错别字: 胎 --> 抬"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 65,
						"end": 66,
						"original": " 己",
						"should": "已",
						"label": "4、错别字: 己 --> 已"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 80,
						"end": 84,
						"original": " 千资百态",
						"should": "千姿百态",
						"label": "5、成语错误: 千资百态 --> 千姿百态"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 91,
						"end": 92,
						"original": " 玩",
						"should": "顽",
						"label": "6、错别字: 玩 --> 顽"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 101,
						"end": 102,
						"original": " 象",
						"should": "像",
						"label": "7、错别字: 象 --> 像"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 118,
						"end": 119,
						"original": " 忠",
						"should": "终",
						"label": "8、错别字: 忠 --> 终"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 134,
						"end": 135,
						"original": " 峻",
						"should": "骏",
						"label": "9、错别字: 峻 --> 骏"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 139,
						"end": 141,
						"original": " 遗忘",
						"should": "一望",
						"label": "10、错别词语: 遗忘 --> 一望"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 162,
						"end": 164,
						"original": " 镜像",
						"should": "景象",
						"label": "11、错别词语: 镜像 --> 景象"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 166,
						"end": 170,
						"original": " 赞不决口",
						"should": "赞不绝口",
						"label": "12、成语错误: 赞不决口 --> 赞不绝口"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 203,
						"end": 207,
						"original": " 目不假接",
						"should": "目不暇接",
						"label": "13、成语错误: 目不假接 --> 目不暇接"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 212,
						"end": 214,
						"original": " 开平",
						"should": "开屏",
						"label": "14、错别词语: 开平 --> 开屏"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 221,
						"end": 222,
						"original": " 安",
						"should": "按",
						"label": "15、错别字: 安 --> 按"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 231,
						"end": 235,
						"original": " 昂首廷胸",
						"should": "昂首挺胸",
						"label": "16、成语错误: 昂首廷胸 --> 昂首挺胸"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 262,
						"end": 263,
						"original": " 襄",
						"should": "镶",
						"label": "17、错别字: 襄 --> 镶"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 325,
						"end": 327,
						"original": " 篇篇",
						"should": "翩翩",
						"label": "18、错别词语: 篇篇 --> 翩翩"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 351,
						"end": 352,
						"original": " 漏",
						"should": "露",
						"label": "19、错别字: 漏 --> 露"
					}]
					this.errorInfoListCopy = [{
						"errorName": "成语错误",
						"errorContent": null,
						"start": 19,
						"end": 23,
						"original": " 精力允沛",
						"should": "精力充沛",
						"label": "1、成语错误: 精力允沛 --> 精力充沛"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 44,
						"end": 45,
						"original": " 贷",
						"should": "带",
						"label": "2、错别字: 贷 --> 带"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 50,
						"end": 51,
						"original": " 胎",
						"should": "抬",
						"label": "3、错别字: 胎 --> 抬"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 65,
						"end": 66,
						"original": " 己",
						"should": "已",
						"label": "4、错别字: 己 --> 已"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 80,
						"end": 84,
						"original": " 千资百态",
						"should": "千姿百态",
						"label": "5、成语错误: 千资百态 --> 千姿百态"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 91,
						"end": 92,
						"original": " 玩",
						"should": "顽",
						"label": "6、错别字: 玩 --> 顽"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 101,
						"end": 102,
						"original": " 象",
						"should": "像",
						"label": "7、错别字: 象 --> 像"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 118,
						"end": 119,
						"original": " 忠",
						"should": "终",
						"label": "8、错别字: 忠 --> 终"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 134,
						"end": 135,
						"original": " 峻",
						"should": "骏",
						"label": "9、错别字: 峻 --> 骏"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 139,
						"end": 141,
						"original": " 遗忘",
						"should": "一望",
						"label": "10、错别词语: 遗忘 --> 一望"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 162,
						"end": 164,
						"original": " 镜像",
						"should": "景象",
						"label": "11、错别词语: 镜像 --> 景象"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 166,
						"end": 170,
						"original": " 赞不决口",
						"should": "赞不绝口",
						"label": "12、成语错误: 赞不决口 --> 赞不绝口"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 203,
						"end": 207,
						"original": " 目不假接",
						"should": "目不暇接",
						"label": "13、成语错误: 目不假接 --> 目不暇接"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 212,
						"end": 214,
						"original": " 开平",
						"should": "开屏",
						"label": "14、错别词语: 开平 --> 开屏"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 221,
						"end": 222,
						"original": " 安",
						"should": "按",
						"label": "15、错别字: 安 --> 按"
					}, {
						"errorName": "成语错误",
						"errorContent": null,
						"start": 231,
						"end": 235,
						"original": " 昂首廷胸",
						"should": "昂首挺胸",
						"label": "16、成语错误: 昂首廷胸 --> 昂首挺胸"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 262,
						"end": 263,
						"original": " 襄",
						"should": "镶",
						"label": "17、错别字: 襄 --> 镶"
					}, {
						"errorName": "错别词语",
						"errorContent": null,
						"start": 325,
						"end": 327,
						"original": " 篇篇",
						"should": "翩翩",
						"label": "18、错别词语: 篇篇 --> 翩翩"
					}, {
						"errorName": "错别字",
						"errorContent": null,
						"start": 351,
						"end": 352,
						"original": " 漏",
						"should": "露",
						"label": "19、错别字: 漏 --> 露"
					}]
					this.number = 455 // 默认字数
					this.editorReady()
				}
				if (e.content.text === "复制文本") {
					this.myCopy()
				}
			},
			filtersText(val) { // 这个方法有点牛批
				// console.log(val)
				if (val != null && val != '') {
					let reg =
						/[\u4e00-\u9fa5]|[0-9][0-9][0-9][0-9]年|[0-9]月|[0-9][0-9]月|[0-9]日|[0-9][0-9]日|[....""!,。、,!:\s&¥]/g;
					let names = val.match(reg);
					// console.log(names)
					val = names ? names.join('') : '';
					return val;
				} else return '';
			},
			inputText(e) {
				// console.log(e.detail.text)
				if (e.detail.text.length > 2000) {
					uni.showToast({
						title: '超限,仅校对2K'
					})
					e.detail.text = e.detail.text.substring(0, 2001)
					this.number = 2000
					this.text = e.detail.text // 得改变this.text的值
				} else {
					this.text = e.detail.text // 得改变this.text的值
					let temp = e.detail.text //获取textarea的内容,
					this.number = temp.length - 1
				}
			},
			positioning(finalErrorInfoList) { // 设置纠错标记效果
				let start;
				let end;
				const tempCheckText = this.filtersText(this.text); // 拿到原纯文本
				// console.log(tempCheckText)
				let finalStr = '';
				for (let i = 0; i < finalErrorInfoList.length; i++) {
					start = finalErrorInfoList[i].start;
					end = finalErrorInfoList[i].end;
					if (start === end) { //这是由于检测出, 后台程序无法展示内容导致
						end = parseInt(end) + 1;
					}
					let tempStr = tempCheckText.substring(start, end);
					tempStr = "<span class='need_mark_" + i + "' style='background-color:#F7CD2A;'>" +
						tempStr + "</span>";
					if (i == 0) {
						if (finalErrorInfoList[i + 1] === undefined) {
							// 说明是最后了
							finalStr = finalStr + tempCheckText.substring(0, start) + tempStr + tempCheckText
								.substring(
									end);
						} else {
							// 不是最后
							finalStr = finalStr + tempCheckText.substring(0, start) + tempStr + tempCheckText
								.substring(
									end,
									finalErrorInfoList[i + 1].start);
						}
					} else {
						if (finalErrorInfoList[i + 1] != undefined) {
							finalStr = finalStr + tempStr + tempCheckText.substring(end, finalErrorInfoList[i + 1]
								.start);
						} else {
							finalStr = finalStr + tempStr + tempCheckText.substring(end);
						}
					}
				}
				// $("#leftContent").html(finalStr); 
				//设置新的DIV内容
				// console.log("************** " + finalStr)
				this.text = finalStr.replaceAll("\n", "<br>")
				console.log("************** " + this.text)
				console.log(JSON.stringify(this.errorInfoList))
				this.editorReady()
			}
		}
	}
</script>

<style>
	.box {
		width: 100px;
		height: 100px;
		background-color: red;
	}
</style>

三、后端代码

package com.day.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import okhttp3.HttpUrl;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 文本纠错 WebAPI 接口调用示例
 */
public class Check {
    // 地址与鉴权信息
    public static final String hostUrl = "https://api.xf-yun.com/v1/private/s9a87e3ec";
    // 待纠错文本
    private String text = "";
    // json
    public static final Gson gson = new Gson();

    public Check(String text) {
        this.text = text;
    }

    // 主函数
    public static void main(String[] args) throws Exception {
        doCheck("画蛇天足");
    }

    public static ArrayList<ErrorInfo> doCheck(String text) throws Exception {
        String url = getAuthUrl(hostUrl, Constants.API_KEY, Constants.API_SECRET);
        Check check = new Check(text);
        String json = getRequestJson(check);
        String backResult = doPostJson(url, json);
        System.out.println("文本纠错返回结果:" + backResult);
        JsonParse jsonParse = gson.fromJson(backResult, JsonParse.class);
        String base64Decode = new String(Base64.getDecoder().decode(jsonParse.payload.result.text), StandardCharsets.UTF_8);
        // System.out.println("text字段base64解码后纠错信息:" + base64Decode);

        ArrayList<ErrorInfo> tempList = new ArrayList<ErrorInfo>();
        JSONObject jsonObject = JSON.parseObject(base64Decode);
        String tempStr = jsonObject.toString();
        System.out.println(tempStr);
        JsonParseInner jsonParseInner = gson.fromJson(tempStr, JsonParseInner.class);
        //错别字
        List charList = jsonParseInner.char1;
        if (charList.size() > 0) {
            for (int j = 0; j < charList.size(); j++) {
                //System.out.println("错别字: "+charList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("错别字");
                String tempStrInner = charList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //领导人职称
        List leaderList = jsonParseInner.leader;
        if (leaderList.size() > 0) {
            for (int j = 0; j < leaderList.size(); j++) {
                //System.out.println("领导人职称: "+leaderList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("领导人职称");
                String tempStrInner = leaderList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //错别词语
        List wordList = jsonParseInner.word;
        if (wordList.size() > 0) {
            for (int j = 0; j < wordList.size(); j++) {
                //System.out.println("错别词语: "+wordList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("错别词语");
                String tempStrInner = wordList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //成语纠错
        List idmList = jsonParseInner.idm;
        if (idmList.size() > 0) {
            for (int j = 0; j < idmList.size(); j++) {
                //System.out.println("成语错误: "+idmList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("成语错误");
                String tempStrInner = idmList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //语法纠错-冗余
        List redundList = jsonParseInner.redund;
        if (redundList.size() > 0) {
            for (int j = 0; j < redundList.size(); j++) {
                //System.out.println("冗余: "+redundList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("冗余");
                String tempStrInner = redundList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //语法纠错-缺失
        List missList = jsonParseInner.miss;
        if (missList.size() > 0) {
            for (int j = 0; j < missList.size(); j++) {
                //System.out.println("缺失: "+missList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("缺失");
                String tempStrInner = missList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //语法纠错-乱序
        List orderList = jsonParseInner.order;
        if (orderList.size() > 0) {
            for (int j = 0; j < orderList.size(); j++) {
                //System.out.println("乱序: "+orderList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("乱序");
                String tempStrInner = orderList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //搭配纠错
        List dapeiList = jsonParseInner.dapei;
        if (dapeiList.size() > 0) {
            for (int j = 0; j < dapeiList.size(); j++) {
                //System.out.println("搭配错误: "+dapeiList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("搭配错误");
                String tempStrInner = dapeiList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //标点纠错
        List puncList = jsonParseInner.punc;
        if (puncList.size() > 0) {
            for (int j = 0; j < puncList.size(); j++) {
                //System.out.println("标点错误: "+puncList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("标点错误");
                String tempStrInner = puncList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //机构名纠错
        List orgList = jsonParseInner.org;
        if (orgList.size() > 0) {
            for (int j = 0; j < orgList.size(); j++) {
                //System.out.println("机构名错误: "+orgList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("机构名错误");
                String tempStrInner = orgList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //数字纠错
        List numberList = jsonParseInner.number;
        if (numberList.size() > 0) {
            for (int j = 0; j < numberList.size(); j++) {
                //System.out.println("数字纠错: "+numberList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("数字纠错");
                String tempStrInner = numberList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //地名纠错
        List addrList = jsonParseInner.addr;
        if (addrList.size() > 0) {
            for (int j = 0; j < addrList.size(); j++) {
                //System.out.println("数字纠错: "+numberList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("地名纠错");
                String tempStrInner = addrList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }
        //全文人名纠错
        List nameList = jsonParseInner.name;
        if (nameList.size() > 0) {
            for (int j = 0; j < nameList.size(); j++) {
                //System.out.println("数字纠错: "+numberList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("全文人名纠错");
                String tempStrInner = nameList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }

        //句式杂糅&语义重复
        List grammar_pcList = jsonParseInner.grammar_pc;
        if (grammar_pcList.size() > 0) {
            for (int j = 0; j < grammar_pcList.size(); j++) {
                //System.out.println("数字纠错: "+numberList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("句式杂糅&语义重复");
                String tempStrInner = grammar_pcList.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }

        // 黑名单
        List black_list = jsonParseInner.black_list;
        if (black_list.size() > 0) {
            for (int j = 0; j < black_list.size(); j++) {
                //System.out.println("数字纠错: "+numberList.get(j));
                ErrorInfo tempErrorInfo = new ErrorInfo();
                tempErrorInfo.setErrorName("黑名单错误");
                String tempStrInner = black_list.get(j).toString().replace("[", "").replace("]", "");
                String[] tempArray = tempStrInner.split(",");
                int tempIndex = (int) Double.parseDouble(tempArray[0]);
                tempErrorInfo.setStart(tempIndex);
                tempErrorInfo.setOriginal(tempArray[1]);
                tempErrorInfo.setShould(tempArray[2]);
                tempErrorInfo.setEnd(tempErrorInfo.getStart() + tempErrorInfo.getOriginal().length() - 1);
                tempList.add(tempErrorInfo);
            }
        }

        return tempList;
    }

    // 请求参数json拼接
    public static String getRequestJson(Check check) {
        return "{\n" +
                "  \"header\": {\n" +
                "    \"app_id\": \"" + Constants.APPID + "\",\n" +
                "    \"uid\": \"wdfgdzx2023\",\n" +
                "    \"status\": 3\n" +
                "  },\n" +
                "  \"parameter\": {\n" +
                "    \"s9a87e3ec\": {\n" +
                "    \"res_id\": \"wdfgdzx2023\",\n" +
                "      \"result\": {\n" +
                "        \"encoding\": \"utf8\",\n" +
                "        \"compress\": \"raw\",\n" +
                "        \"format\": \"json\"\n" +
                "      }\n" +
                "    }\n" +
                "  },\n" +
                "  \"payload\": {\n" +
                "    \"input\": {\n" +
                "      \"encoding\": \"utf8\",\n" +
                "      \"compress\": \"raw\",\n" +
                "      \"format\": \"plain\",\n" +
                "      \"status\": 3,\n" +
                "      \"text\": \"" + getBase64TextData(check.text) + "\"\n" +
                "    }\n" +
                "  }\n" +
                "}";
    }

    // 读取文件
    public static String getBase64TextData(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }

    // 根据json和url发起post请求
    public static String doPostJson(String url, String json) {
        CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
        CloseableHttpResponse closeableHttpResponse = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            closeableHttpResponse = closeableHttpClient.execute(httpPost);
            resultString = EntityUtils.toString(closeableHttpResponse.getEntity(), StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (closeableHttpResponse != null) {
                    closeableHttpResponse.close();
                }
                if (closeableHttpClient != null) {
                    closeableHttpClient.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

    // 鉴权方法
    public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {
        URL url = new URL(hostUrl);
        // 时间
        SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = format.format(new Date());
        // 拼接
        String preStr = "host: " + url.getHost() + "\n" +
                "date: " + date + "\n" +
                "POST " + url.getPath() + " HTTP/1.1";
        //System.out.println(preStr);
        // SHA256加密
        Mac mac = Mac.getInstance("hmacsha256");
        SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");
        mac.init(spec);
        byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));
        // Base64加密
        String sha = Base64.getEncoder().encodeToString(hexDigits);
        // 拼接
        String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);
        // 拼接地址
        HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//
                addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//
                addQueryParameter("date", date).//
                addQueryParameter("host", url.getHost()).//
                build();

        return httpUrl.toString();
    }

    //Json解析
    class JsonParse {
        public Header header;
        public Payload payload;
    }

    class Header {
        public int code;
        public String message;
        public String sid;
        public int status;
    }

    class Payload {
        //根据model的取值不同,名字有所变动。
        public Result result;
    }

    class Result {
        public String compress;
        public String encoding;
        public String format;
        public String text;
    }
//内层解析

    class JsonParseInner {
        ArrayList black_list; // 自定义黑名单
        ArrayList leader;
        ArrayList number;
        ArrayList idm;
        ArrayList org;
        @SerializedName("char")
        ArrayList char1;
        ArrayList dapei;
        ArrayList redund;
        ArrayList word;
        ArrayList punc;
        ArrayList miss;
        ArrayList order;
        ArrayList addr;
        ArrayList name;
        ArrayList grammar_pc;
    }
}

package com.day.util;

import lombok.Data;

@Data
public class ErrorInfo implements Comparable<ErrorInfo> {
    private String errorName;
    private String errorContent;
    private int start;
    private int end;
    private String original;
    private String should;

    @Override
    public int compareTo(ErrorInfo errorInfo) {
        if (this.getStart() > errorInfo.getStart()) {
            return 1;
        } else {
            return -1;
        }
    }
}
相关推荐
sunly_1 小时前
uniapp:公告上下轮播
android·uni-app
cy玩具5 小时前
uniapp中vuex(全局共享)的应用
uni-app
走,带你去玩5 小时前
uniapp+uview 图片预览组件
uni-app
袭烽5 小时前
uni-app多环境配置动态修改
uni-app·uniapp多环境配置修改
玄尺_0075 小时前
bug:uniapp运行到微信开发者工具 白屏 页面空白
uni-app·bug
狂团商城小师妹11 小时前
AJAX家政系统自营+多商家家政系统服务小程序PHP+Uniapp
微信小程序·小程序·微信公众平台
zzzzzzzi11113 小时前
uniapp自定义tabbar
uni-app
V+zmm1013414 小时前
基于微信小程序的校园二手交易平台系统设计与开发ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
IT实战课堂阿瑄学长14 小时前
精品基于Python实现的微信小程序校园导航系统-微信小程序
开发语言·python·微信小程序