From 0c855c402a9a0cf32d4a058a4534c62f095f200d Mon Sep 17 00:00:00 2001
From: douzhuo <17611323298@163.com>
Date: Wed, 11 Jan 2023 20:15:00 +0800
Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E7=AD=BE=E5=8C=B9=E9=85=8D=E6=A8=A1?=
=?UTF-8?q?=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/views/Template/labelModel.vue | 1139 +++++++++++++++--------------
1 file changed, 599 insertions(+), 540 deletions(-)
diff --git a/src/views/Template/labelModel.vue b/src/views/Template/labelModel.vue
index 6e3312c..b4d27ee 100644
--- a/src/views/Template/labelModel.vue
+++ b/src/views/Template/labelModel.vue
@@ -199,546 +199,605 @@
+export default {
+ data() {
+ return {
+ dynamiclist: [],
+ taglist: [
+ {
+ label: "or (或)",
+ value: "or",
+ },
+ {
+ label: "near (临近)",
+ value: "near",
+ },
+ {
+ label: "after (后面)",
+ value: "after",
+ },
+ {
+ label: "and not (非)",
+ value: "andnot",
+ },
+ // {
+ // label: 'answer (问题)',
+ // value: 'answer'
+ // },
+ ],
+ form: {
+ keywordsName: "",
+ id: "",
+ keywordsId: "",
+ distance: 10,
+ originalExpression: "",
+ },
+ innerVisible: false,
+ innerVisible1: false,
+ dialogVisible: false,
+ value: "",
+ keyType: 0,
+ loading: false,
+ currentPage: 1,
+ tableData: [],
+ type: "0",
+ pageNum: 1,
+ pageSize: 10,
+ total: 0,
+ huashu: "",
+ wajueList: [],
+ level: "",
+ houseId: "",
+ orgType: "",
+ houseList: [],
+ };
+ },
+ created() {
+ this.houseId = localStorage.getItem("houseId");
+ this.orgType = localStorage.getItem("orgType");
+ this.orgType == 0 ? this.zkhousePage() : this.getorgCode();
+ },
+ methods: {
+ // 获取项目列表
+ zkhousePage() {
+ this.$api.api
+ .findHouseByUser({
+ orgType: localStorage.getItem("orgType"),
+ })
+ .then((res) => {
+ this.houseList = res.data;
+ this.houseId = res.data[0].id;
+ this.getorgCode();
+ });
+ },
+ houseChange() {
+ this.getorgCode();
+ },
+ // 校验是否已经选择过此标签
+ checkrepeat() {
+ this.wajueList.forEach((item) => {
+ item.disabled = false;
+ });
+ this.wajueList.forEach((item) => {
+ this.dynamiclist.forEach((obj) => {
+ if (item.id == obj.markid) {
+ item.disabled = true;
+ }
+ });
+ });
+ },
+ addItemFun() {
+ this.dynamiclist.push({
+ editValue: "", //匹配模型正则表达式
+ markid: "",
+ level: "",
+ name: "",
+ });
+ },
+ delItemFun(index) {
+ this.wajueList.forEach((item) => {
+ if (item.id == this.dynamiclist[index].markid) {
+ item.disabled = false;
+ }
+ });
+ this.dynamiclist.splice(index, 1);
+ document.getElementById("huashuModel").focus(); // 防止插入到外面,造成不可删除的操作
+ },
+
+ // 基于保存的光标插入内容 --用于失去焦点后再继续插入内容
+ insertContent(str) {
+ let selection,
+ range = window._range; // 当前光标位置对象
+ if (!window.getSelection) {
+ range.pasteHTML(str);
+ range.collapse(false);
+ range.select();
+ } else {
+ selection = window.getSelection
+ ? window.getSelection()
+ : document.selection;
+ range.collapse(false);
+ let hasR = range.createContextualFragment(str);
+ let hasR_lastChild = hasR.lastChild;
+ while (
+ hasR_lastChild &&
+ hasR_lastChild.nodeName.toLowerCase() == "br" &&
+ hasR_lastChild.previousSibling &&
+ hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br"
+ ) {
+ let e = hasR_lastChild;
+ hasR_lastChild = hasR_lastChild.previousSibling;
+ hasR.removeChild(e);
+ }
+ range.insertNode(hasR);
+ if (hasR_lastChild) {
+ range.setEndAfter(hasR_lastChild);
+ range.setStartAfter(hasR_lastChild);
+ }
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ },
+ // 失去焦点时保存光标位置,记录光标位置
+ saveRange: () => {
+ let selection = window.getSelection
+ ? window.getSelection()
+ : document.selection;
+ if (!selection.rangeCount) return;
+ let range = selection.createRange
+ ? selection.createRange()
+ : selection.getRangeAt(0);
+ window._range = range;
+ },
+ // 回显模型数据,Dialog 的内容是懒渲染的,即在第一次被打开之前,传入的默认 slot 不会被渲染到 DOM 上,so在 open 事件回调中进行
+ openModel() {
+ this.$nextTick(() => {
+ let huashuModel = document.getElementById("huashuModel");
+ huashuModel.innerHTML = this.form.originalExpression;
+ });
+ },
+ //格式化粘贴文本方法
+ onPaste(event) {
+ // var e = event || window.event
+ // // 阻止默认粘贴
+ // e.preventDefault();
+ // // 粘贴事件有一个clipboardData的属性,提供了对剪贴板的访问
+ // // clipboardData的getData(fomat) 从剪贴板获取指定格式的数据
+ // var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在这里输入文本');
+ // //清除回车
+ // text = text.replace(/\[\d+\]|\n|\r/ig,"")
+ // // 插入
+ // document.execCommand("insertText", false, text);
+ let e = event || window.event;
+ let types = event.clipboardData.types;
+ // 粘贴事件有一个clipboardData的属性,提供了对剪贴板的访问
+ let flag = false;
+ if (types && types.length > 0) {
+ types.forEach((ele) => {
+ if (ele == "Files") {
+ flag = true;
+ }
+ });
+ }
+ if (flag) {
+ event.preventDefault();
+ }
+ },
+ myeditorenter(e) {
+ e.preventDefault();
+ },
+ // 插入节点
+ insertHtmlAtCaret(html) {
+ document.getElementById("huashuModel").focus();
+ var sel, range;
+ if (window.getSelection) {
+ // IE9 and non-IE
+ sel = window.getSelection();
+ if (sel.getRangeAt && sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ range.deleteContents();
+ // Range.createContextualFragment() would be useful here but is
+ // non-standard and not supported in all browsers (IE9, for one)
+ var el = document.createElement("div");
+ el.innerHTML = html;
+ var frag = document.createDocumentFragment(),
+ node,
+ lastNode;
+ while ((node = el.firstChild)) {
+ lastNode = frag.appendChild(node);
+ }
+ range.insertNode(frag);
+ // Preserve the selection
+ if (lastNode) {
+ range = range.cloneRange();
+ range.setStartAfter(lastNode);
+ range.collapse(true);
+ sel.removeAllRanges();
+ sel.addRange(range);
+ }
+ }
+ } else if (document.selection && document.selection.type != "Control") {
+ // IE < 9
+ document.selection.createRange().pasteHTML(html);
+ }
+ },
+ // 拿问题获取所在的标签数据
+ findKeywordsById(keywordsId) {
+ axios({
+ url: `/autoSR/zk/keywords/findKeywordsById`,
+ method: "get",
+ params: {
+ houseId: this.houseId,
+ keywordsId: keywordsId,
+ level: 1,
+ },
+ }).then((res) => {
+ if (res.code == 0) {
+ // console.log(res.data)
+ this.wajueList = res.data;
+ if (this.wajueList && this.wajueList.length) {
+ this.wajueList.forEach((item) => {
+ item.disabled = false;
+ });
+ this.wajueList.forEach((item) => {
+ this.dynamiclist.forEach((obj) => {
+ if (item.id == obj.markid) {
+ item.disabled = true;
+ }
+ });
+ });
+ }
+ }
+ });
+ },
+ // 插入节点
+ insertTag(item, index) {
+ if (index == 4) {
+ // answer
+ this.huashu = "";
+ this.innerVisible1 = true;
+ } else {
+ if (window._range) {
+ this.insertContent(
+ "" +
+ item.value +
+ " "
+ );
+ } else {
+ this.insertHtmlAtCaret(
+ "" +
+ item.value +
+ " "
+ );
+ }
+ }
+ },
+ // 处理标签,删除不需要的标签格式
+ delMark(str) {
+ const hasStr = (str) => {
+ let index = str.indexOf("<");
+ let index1 = str.indexOf(">");
+ if (index > 0 && index1 > 0) {
+ let replaceStr = str.substring(index, index1 + 1);
+ str = str.replace(replaceStr, "");
+ hasStr(str);
+ }
+ };
+ hasStr(str);
+ },
+ // 确认插入选择的话术
+ clickOK() {
+ this.innerVisible1 = false;
+ if (!this.huashu) {
+ this.$message.error("请选择话术");
+ return;
+ }
+ this.insertContent(
+ "" +
+ this.huashu +
+ "answer "
+ );
+ },
+ search() {
+ this.pageNum = 1;
+ this.getorgCode();
+ },
+ //点击编辑按钮
+ editFun(item) {
+ this.dialogVisible = true;
+ this.form.id = item.id;
+ if (this.keyType == 0) {
+ // 挖掘话术类型
+ // 回显标签模型数据
+ if (item.answerList && item.answerList.length) {
+ this.dynamiclist = item.answerList.map((obj) => {
+ return {
+ id: obj.id,
+ mark: obj.level3Name ? obj.level3Name : obj.level2Name,
+ level: obj.level3Id ? 3 : 2,
+ editValue: obj.originalExpression,
+ markid: obj.level3Id ? obj.level3Id : obj.level2Id,
+ };
+ });
+ // console.log(this.dynamiclist)
+ } else {
+ this.dynamiclist = [];
+ }
+ this.form.keywordsName = item.level3Name;
+ this.form.distance = item.distance || 10;
+ this.form.originalExpression =
+ item.originalExpression || item.level3Name;
+ this.level = item.level2Id ? 2 : 1;
+ this.questionId = item.questionId;
+ this.form.keywordsId = item.level2Id ? item.level2Id : item.level1Id;
+ this.findKeywordsById(item.level1Id); // 获取标签下拉数据
+ } else if (this.keyType == 3) {
+ // 违禁词
+ this.form.keywordsName = item.level1Name;
+ this.level = 1;
+ this.form.distance = item.distance || 10;
+ this.form.originalExpression =
+ item.originalExpression || item.level1Name;
+ this.dynamiclist = [];
+ } else {
+ this.form.keywordsId = item.level3Id ? item.level3Id : item.level2Id;
+ this.level = item.level3Id ? 3 : 2;
+ this.form.keywordsName = item.level3Name || item.level2Name;
+ this.form.distance = item.distance || 10;
+ this.form.originalExpression =
+ item.originalExpression || item.level3Name || item.level2Name;
+ if (item.answerList && item.answerList.length) {
+ this.dynamiclist = item.answerList.map((obj) => {
+ return {
+ question: obj.question,
+ editValue: obj.originalExpression,
+ };
+ });
+ } else {
+ this.dynamiclist = [];
+ }
+ }
+ },
+ // 删除列表
+ deleteFun(item) {
+ this.$alert(item.keywordsName, "确定删除该条数据吗", {
+ confirmButtonText: "确定",
+ callback: (action) => {
+ axios({
+ url: `/autoSR/zk/keymodel/delKeywordsModel`,
+ method: "get",
+ params: {
+ id: item.id,
+ houseId: this.houseId,
+ },
+ })
+ .then((data) => {
+ if (data.code == 0) {
+ this.getorgCode();
+ }
+ })
+ .catch((e) => {});
+ },
+ });
+ },
+ // 处理模型 关键词加#号
+ replaceFun(str) {
+ let temp = str;
+ temp = temp.replace(/\ \;<\/text>/g, "");
+ temp = temp.replace(/\ \;/g, "");
+ temp = temp.replace(//g, "");
+ temp = temp.replace(/<\/text>/g, "");
+ temp = temp.replace(
+ //g,
+ " #"
+ ); // 后台返回是这样的,变了,需要也处理一下
+ temp = temp.replace(
+ //g,
+ " #"
+ );
+ temp = temp.replace(/<\/br>/g, "");
+ temp = temp.replace(/
/g, "");
+ temp = temp.replace(/<\/span>/g, "#");
+ // console.log('处理前temp',temp);
+ this.delMark(temp);
+ // console.log(temp);
+ return temp;
+ },
+ //修改保存标签模型
+ saveFun() {
+ if (this.cansave) return; // 防止多次点击
+ this.cansave = true;
+ let text = document.getElementById("huashuModel");
+ let answerList = [];
+ // console.log(text.innerHTML);
+ // console.log(text.innerText);
+ let temp = text.innerHTML;
+ if (this.form.distance == "") {
+ this.$message.error("请输入距离");
+ return;
+ }
+ if (text.innerText == "") {
+ this.$message.error("请输入标签模型");
+ return;
+ }
+ if (this.keyType == 0) {
+ for (var i = 0; i < this.dynamiclist.length; i++) {
+ // 使用for循环判断可以跳出循环
+ if (!this.dynamiclist[i].markid) {
+ this.$message.error("请完善要选择的标签");
+ return;
+ }
+ this.wajueList.map((item1) => {
+ if (item1.id == this.dynamiclist[i].markid) {
+ this.dynamiclist[i].level = item1.level;
+ this.dynamiclist[i].name = item1.name;
+ }
+ });
+ let huashuModel = document.getElementById("huashuModel" + i);
+ if (huashuModel.innerText == "") {
+ this.$message.error("请完善选择的标签模型");
+ return;
+ }
+ this.dynamiclist[i].editValue = huashuModel.innerHTML;
+ this.dynamiclist[i].editText = huashuModel.innerText;
+ }
+
+ answerList = this.dynamiclist.map((item) => {
+ return {
+ keyType: 2,
+ id: item.id || null,
+ level: item.level,
+ keywordsId: item.markid,
+ showFormatExpression: item.editText, //文本形式
+ formatExpression: this.replaceFun(item.editValue), // 问题表达式,关键词加#号
+ originalExpression: item.editValue, // html==带span标签
+ };
+ });
+ }
+ axios({
+ url: `/autoSR/zk/keymodel/updateKeywordsModel`,
+ method: "post",
+ data: {
+ id: this.form.id,
+ questionId: this.keyType == 0 ? this.questionId : "",
+ houseId: this.houseId,
+ keyType: this.keyType,
+ level: this.level,
+ keywordsId: this.form.keywordsId,
+ keywordsName: this.form.keywordsName,
+ formatExpression: this.replaceFun(temp), // 问题表达式,关键词加#号
+ original: temp, // html==带span标签
+ answerList: answerList,
+ showFormatExpression: text.innerText,
+ distance: this.form.distance, // 距离
+ },
+ })
+ .then((res) => {
+ this.cansave = false;
+ this.dialogVisible = false;
+ if (res.code == 0) {
+ this.$message.success(res.data);
+ this.getorgCode();
+ } else {
+ this.$message.error(res.msg);
+ }
+ })
+ .catch((e) => {
+ this.cansave = false;
+ this.dialogVisible = false;
+ });
+ },
+ //清空筛选条件
+ Emptycondition() {
+ this.value = "";
+ this.keyType = 0;
+ this.pageNum = 1;
+ this.getorgCode();
+ },
+ //初始化
+ getorgCode() {
+ this.loading = true;
+ this.tableData = [];
+ axios({
+ url: `/autoSR/zk/keymodel/findKeywordsModel`,
+ method: "get",
+ params: {
+ houseId: this.houseId,
+ current: this.pageNum,
+ size: this.pageSize,
+ keywordsName: this.value,
+ keyType: this.keyType,
+ },
+ })
+ .then((res) => {
+ this.loading = false;
+ if (res.code == 0) {
+ this.tableData = res.data.records || [];
+ this.total = res.data.total;
+ }
+ })
+ .catch((e) => {
+ this.loading = false;
+ });
+ },
+ handleSizeChange(val) {
+ console.log("每页条" + val);
+ this.pageSize = val;
+ this.getorgCode();
+ },
+ handleCurrentChange(val) {
+ console.log("当前页" + val);
+ this.pageNum = val;
+ this.getorgCode();
+ },
+ },
+};
+
+.box-center {
+ width: 100%;
+ padding: 5px 15px 40px;
+ min-width: 1000px;
+}
+.app-top {
+ margin-bottom: 20px;
+ width: 100%;
+ background: #ffffff;
+ box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.04);
+ border-radius: 4px;
+ padding: 15px;
+}
+.block {
+ width: 100%;
+ margin-top: 5px;
+ display: flex;
+}
+.blockbox {
+ margin-left: auto;
+}
+.editDiv {
+ width: 100%;
+ min-height: 60px;
+ max-height: 120px;
+ overflow: auto;
+ margin-bottom: 10px;
+ padding: 15px;
+ outline: none;
+ border: 1px solid #409eff;
+ border-radius: 10px;
+}
+.hidden-tooltip {
+ width: 330px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ position: relative;
+}
+.itemlist {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin: 20px 0;
+}
+.item-input {
+ width: 100%;
+ padding: 4px 10px;
+ outline: none;
+ border: 1px solid #409eff;
+ border-radius: 4px;
+ overflow: auto;
+ line-height: 24px;
+ min-height: 24px;
+ max-height: 100px;
+ margin: 0 10px;
+}
+.el-dialog {
+ width: 800px;
+}
+.el-dialog__body {
+ max-height: 400px;
+ overflow: auto;
+}
+
\ No newline at end of file