Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

768 linhas
24 KiB

  1. <template>
  2. <div class="box-center">
  3. <div class="app-top">
  4. <el-radio-group v-model="keyType" size="medium" @change="search">
  5. <el-radio-button :label="0">需求挖掘</el-radio-button>
  6. <el-radio-button :label="1">销讲词</el-radio-button>
  7. <el-radio-button :label="2">客户标签</el-radio-button>
  8. <el-radio-button :label="3">违禁词</el-radio-button>
  9. </el-radio-group>
  10. <el-input size="small" clearable style="margin: 0 10px;width: 220px" v-model="value" placeholder="标签名称"></el-input>
  11. <el-select
  12. v-if="orgType==0"
  13. v-model="houseId"
  14. @change="houseChange"
  15. placeholder="请选择"
  16. filterable
  17. >
  18. <el-option
  19. v-for="item in houseList"
  20. :key="item.id"
  21. :label="item.propertyName"
  22. :value="item.id"
  23. >
  24. </el-option>
  25. </el-select>
  26. <el-button size="small" type="primary" @click="search()">筛选</el-button>
  27. <el-button size="small" type="text" @click="Emptycondition()">清空筛选条件</el-button>
  28. </div>
  29. <div class="app-box">
  30. <el-table
  31. :data="tableData"
  32. stripe
  33. :load="loading"
  34. :header-cell-style="{background:'#F7F8FA',borderColor:'#E0E0E0',color:'#606775'}"
  35. style="width: 100%">
  36. <el-table-column
  37. prop="level1Name"
  38. :label="keyType==3?'违禁词':'画像一级'"
  39. align="center">
  40. </el-table-column>
  41. <el-table-column
  42. v-if="keyType!=3"
  43. prop="level2Name"
  44. label="画像二级"
  45. align="center">
  46. </el-table-column>
  47. <el-table-column
  48. v-if="keyType!=3"
  49. prop="level3Name"
  50. :label="keyType==0?'挖掘话术':'画像三级'"
  51. align="center">
  52. </el-table-column>
  53. <el-table-column
  54. prop="showFormatExpression"
  55. label="匹配模型"
  56. width="330"
  57. align="center">
  58. <template slot-scope="scope">
  59. <el-tooltip class="item" effect="dark" placement="top">
  60. <div v-html="scope.row.showFormatExpression" slot="content" style="max-width: 530px;"></div>
  61. <div class="hidden-tooltip">{{scope.row.showFormatExpression}}</div>
  62. </el-tooltip>
  63. </template>
  64. </el-table-column>
  65. <el-table-column
  66. prop="distance"
  67. label="匹配距离"
  68. align="center">
  69. </el-table-column>
  70. <el-table-column
  71. prop="updateUserName"
  72. label="最后修改人"
  73. align="center">
  74. </el-table-column>
  75. <el-table-column
  76. prop="updateTime"
  77. label="最后修改时间"
  78. width="110"
  79. align="center">
  80. </el-table-column>
  81. <el-table-column label="操作" width="140" fixed="right" align="center">
  82. <template slot-scope="scope">
  83. <el-button type="text" @click="editFun(scope.row)">编辑</el-button>
  84. <el-button type="text" @click="deleteFun(scope.row)">删除</el-button>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. <div class="block">
  89. <div class="blockbox">
  90. <el-pagination
  91. @size-change="handleSizeChange"
  92. @current-change="handleCurrentChange"
  93. :current-page="pageNum"
  94. :page-sizes="[10, 20, 30, 40,50,100]"
  95. :page-size="pageSize"
  96. layout="total, sizes, prev, pager, next, jumper"
  97. :total="total">
  98. </el-pagination>
  99. </div>
  100. </div>
  101. </div>
  102. <el-dialog
  103. title="编辑模型"
  104. @open="openModel"
  105. :close-on-click-modal="false"
  106. :visible.sync="dialogVisible"
  107. >
  108. <matching-rules :key="timer" :innerVisible="innerVisible"></matching-rules>
  109. <el-form ref="form" size="mini" :inline="true" :model="form" label-position="right">
  110. <el-form-item :label="keyType==0?'挖掘话术:':keyType==3?'违禁词:':'标签名称:'">
  111. <div style="max-width:400px;min-width: 200px;">{{form.keywordsName}}</div>
  112. </el-form-item>
  113. <el-form-item label="after,near,answer 匹配距离:">
  114. <el-input-number v-model="form.distance" controls-position="right" :min="0" :max="500"></el-input-number></el-input><span style="color:red;margin-left:10px">*请输入0~500内的整数</span> <el-button type="text" style="margin-left:30px" @click="innerVisible=true;timer=new Date().getTime()">规则说明</el-button>
  115. </el-form-item>
  116. <div contentEditable="true"
  117. @click="myeditorenter($event)"
  118. @keypress.enter="myeditorenter($event)"
  119. @blur="saveRange"
  120. @paste="onPaste"
  121. class="editDiv"
  122. id="huashuModel">
  123. </div>
  124. <div v-if="keyType==0||dynamiclist.length">{{keyType==0?'匹配标签:':'需求挖掘匹配:'}}</div>
  125. <!-- <%-- keyType=0 需求挖掘--%> -->
  126. <div class="dynamicbox" v-if="keyType==0">
  127. <div v-for="(item,index) in dynamiclist" :key="item" class="itemlist">
  128. <el-select size="small" v-model="item.markid" @change="checkrepeat" placeholder="标签" clearable>
  129. <el-option v-for="(mark,i) in wajueList" :disabled="mark.disabled" :key="i" :label="mark.name" :value="mark.id"></el-option>
  130. </el-select>
  131. <div contentEditable="true"
  132. @click="myeditorenter($event)"
  133. @keypress.enter="myeditorenter($event)"
  134. @blur="saveRange"
  135. class="item-input"
  136. v-html="item.editValue"
  137. :id="'huashuModel'+index"></div>
  138. <el-button size="small" plain type="primary" @click="delItemFun(index)">删除</el-button>
  139. </div>
  140. </div>
  141. <div class="dynamicbox" v-else>
  142. <div v-for="item in dynamiclist" :key="item" class="itemlist">
  143. <el-input size="small" disabled style="width: 220px" v-model="item.question"></el-input>
  144. <div class="item-input" style="pointer-events: none;" v-html="item.editValue"></div>
  145. </div>
  146. </div>
  147. <div>
  148. <el-button v-if="keyType==0" :disabled="dynamiclist.length==wajueList.length" @click="addItemFun" icon="el-icon-plus" type="primary" size="mini" style="width: 120px;margin:20px 0;"></el-button>
  149. </div>
  150. <el-form-item label="插入节点:">
  151. <el-button size="mini" type="primary" style="margin-left:8px;" v-for="(item,index) in taglist" :key="index" @click="insertTag(item,index)">{{item.label}}</el-button>
  152. </el-form-item>
  153. </el-form>
  154. <span slot="footer" class="dialog-footer">
  155. <el-button @click="dialogVisible = false">取 消</el-button>
  156. <el-button type="primary" @click="saveFun">保 存</el-button>
  157. </span>
  158. </el-dialog>
  159. </div>
  160. </template>
  161. <script>
  162. import matchingRules from "@/components/matchingRules/matchingRules.vue";
  163. export default {
  164. components: { matchingRules },
  165. data() {
  166. return {
  167. timer: 0,
  168. dynamiclist: [],
  169. taglist: [
  170. {
  171. label: "or (或)",
  172. value: "or",
  173. },
  174. {
  175. label: "near (临近)",
  176. value: "near",
  177. },
  178. {
  179. label: "after (后面)",
  180. value: "after",
  181. },
  182. {
  183. label: "and not (非)",
  184. value: "andnot",
  185. },
  186. // {
  187. // label: 'answer (问题)',
  188. // value: 'answer'
  189. // },
  190. ],
  191. form: {
  192. keywordsName: "",
  193. id: "",
  194. keywordsId: "",
  195. distance: 10,
  196. originalExpression: "",
  197. },
  198. innerVisible: false,
  199. innerVisible1: false,
  200. dialogVisible: false,
  201. value: "",
  202. keyType: 0,
  203. loading: false,
  204. currentPage: 1,
  205. tableData: [],
  206. type: "0",
  207. pageNum: 1,
  208. pageSize: 10,
  209. total: 0,
  210. huashu: "",
  211. wajueList: [],
  212. level: "",
  213. houseId: "",
  214. orgType: "",
  215. houseList: [],
  216. };
  217. },
  218. created() {
  219. this.houseId = localStorage.getItem("houseId");
  220. this.orgType = localStorage.getItem("orgType");
  221. this.orgType == 0 ? this.zkhousePage() : this.getorgCode();
  222. },
  223. methods: {
  224. // 获取项目列表
  225. zkhousePage() {
  226. this.$api.api
  227. .findHouseByUser({
  228. orgType: localStorage.getItem("orgType"),
  229. })
  230. .then((res) => {
  231. this.houseList = res.data;
  232. this.houseId = res.data[0].id;
  233. this.getorgCode();
  234. });
  235. },
  236. houseChange() {
  237. this.getorgCode();
  238. },
  239. // 校验是否已经选择过此标签
  240. checkrepeat() {
  241. this.wajueList.forEach((item) => {
  242. item.disabled = false;
  243. });
  244. this.wajueList.forEach((item) => {
  245. this.dynamiclist.forEach((obj) => {
  246. if (item.id == obj.markid) {
  247. item.disabled = true;
  248. }
  249. });
  250. });
  251. },
  252. addItemFun() {
  253. this.dynamiclist.push({
  254. editValue: "", //匹配模型正则表达式
  255. markid: "",
  256. level: "",
  257. name: "",
  258. });
  259. },
  260. delItemFun(index) {
  261. this.wajueList.forEach((item) => {
  262. if (item.id == this.dynamiclist[index].markid) {
  263. item.disabled = false;
  264. }
  265. });
  266. this.dynamiclist.splice(index, 1);
  267. document.getElementById("huashuModel").focus(); // 防止插入到外面,造成不可删除的操作
  268. },
  269. // 基于保存的光标插入内容 --用于失去焦点后再继续插入内容
  270. insertContent(str) {
  271. let selection,
  272. range = window._range; // 当前光标位置对象
  273. if (!window.getSelection) {
  274. range.pasteHTML(str);
  275. range.collapse(false);
  276. range.select();
  277. } else {
  278. selection = window.getSelection
  279. ? window.getSelection()
  280. : document.selection;
  281. range.collapse(false);
  282. let hasR = range.createContextualFragment(str);
  283. let hasR_lastChild = hasR.lastChild;
  284. while (
  285. hasR_lastChild &&
  286. hasR_lastChild.nodeName.toLowerCase() == "br" &&
  287. hasR_lastChild.previousSibling &&
  288. hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br"
  289. ) {
  290. let e = hasR_lastChild;
  291. hasR_lastChild = hasR_lastChild.previousSibling;
  292. hasR.removeChild(e);
  293. }
  294. range.insertNode(hasR);
  295. if (hasR_lastChild) {
  296. range.setEndAfter(hasR_lastChild);
  297. range.setStartAfter(hasR_lastChild);
  298. }
  299. selection.removeAllRanges();
  300. selection.addRange(range);
  301. }
  302. },
  303. // 失去焦点时保存光标位置,记录光标位置
  304. saveRange: () => {
  305. let selection = window.getSelection
  306. ? window.getSelection()
  307. : document.selection;
  308. if (!selection.rangeCount) return;
  309. let range = selection.createRange
  310. ? selection.createRange()
  311. : selection.getRangeAt(0);
  312. window._range = range;
  313. },
  314. // 回显模型数据,Dialog 的内容是懒渲染的,即在第一次被打开之前,传入的默认 slot 不会被渲染到 DOM 上,so在 open 事件回调中进行
  315. openModel() {
  316. this.$nextTick(() => {
  317. let huashuModel = document.getElementById("huashuModel");
  318. huashuModel.innerHTML = this.form.originalExpression;
  319. });
  320. },
  321. //格式化粘贴文本方法
  322. onPaste(event) {
  323. // var e = event || window.event
  324. // // 阻止默认粘贴
  325. // e.preventDefault();
  326. // // 粘贴事件有一个clipboardData的属性,提供了对剪贴板的访问
  327. // // clipboardData的getData(fomat) 从剪贴板获取指定格式的数据
  328. // var text = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('在这里输入文本');
  329. // //清除回车
  330. // text = text.replace(/\[\d+\]|\n|\r/ig,"")
  331. // // 插入
  332. // document.execCommand("insertText", false, text);
  333. let e = event || window.event;
  334. let types = event.clipboardData.types;
  335. // 粘贴事件有一个clipboardData的属性,提供了对剪贴板的访问
  336. let flag = false;
  337. if (types && types.length > 0) {
  338. types.forEach((ele) => {
  339. if (ele == "Files") {
  340. flag = true;
  341. }
  342. });
  343. }
  344. if (flag) {
  345. event.preventDefault();
  346. }
  347. },
  348. myeditorenter(e) {
  349. e.preventDefault();
  350. },
  351. // 插入节点
  352. insertHtmlAtCaret(html) {
  353. document.getElementById("huashuModel").focus();
  354. var sel, range;
  355. if (window.getSelection) {
  356. // IE9 and non-IE
  357. sel = window.getSelection();
  358. if (sel.getRangeAt && sel.rangeCount) {
  359. range = sel.getRangeAt(0);
  360. range.deleteContents();
  361. // Range.createContextualFragment() would be useful here but is
  362. // non-standard and not supported in all browsers (IE9, for one)
  363. var el = document.createElement("div");
  364. el.innerHTML = html;
  365. var frag = document.createDocumentFragment(),
  366. node,
  367. lastNode;
  368. while ((node = el.firstChild)) {
  369. lastNode = frag.appendChild(node);
  370. }
  371. range.insertNode(frag);
  372. // Preserve the selection
  373. if (lastNode) {
  374. range = range.cloneRange();
  375. range.setStartAfter(lastNode);
  376. range.collapse(true);
  377. sel.removeAllRanges();
  378. sel.addRange(range);
  379. }
  380. }
  381. } else if (document.selection && document.selection.type != "Control") {
  382. // IE < 9
  383. document.selection.createRange().pasteHTML(html);
  384. }
  385. },
  386. // 拿问题获取所在的标签数据
  387. findKeywordsById(keywordsId) {
  388. axios({
  389. url: `/autoSR/zk/keywords/findKeywordsById`,
  390. method: "get",
  391. params: {
  392. houseId: this.houseId,
  393. keywordsId: keywordsId,
  394. level: 1,
  395. },
  396. }).then((res) => {
  397. if (res.code == 0) {
  398. // console.log(res.data)
  399. this.wajueList = res.data;
  400. if (this.wajueList && this.wajueList.length) {
  401. this.wajueList.forEach((item) => {
  402. item.disabled = false;
  403. });
  404. this.wajueList.forEach((item) => {
  405. this.dynamiclist.forEach((obj) => {
  406. if (item.id == obj.markid) {
  407. item.disabled = true;
  408. }
  409. });
  410. });
  411. }
  412. }
  413. });
  414. },
  415. // 插入节点
  416. insertTag(item, index) {
  417. if (index == 4) {
  418. // answer
  419. this.huashu = "";
  420. this.innerVisible1 = true;
  421. } else {
  422. if (window._range) {
  423. this.insertContent(
  424. "<span contentEditable='false' style='color:red'>" +
  425. item.value +
  426. "</span><text>&nbsp;</text>"
  427. );
  428. } else {
  429. this.insertHtmlAtCaret(
  430. "<span contentEditable='false' style='color:red'>" +
  431. item.value +
  432. "</span><text>&nbsp;</text>"
  433. );
  434. }
  435. }
  436. },
  437. // 处理标签,删除不需要的标签格式
  438. delMark(str) {
  439. const hasStr = (str) => {
  440. let index = str.indexOf("<");
  441. let index1 = str.indexOf(">");
  442. if (index > 0 && index1 > 0) {
  443. let replaceStr = str.substring(index, index1 + 1);
  444. str = str.replace(replaceStr, "");
  445. hasStr(str);
  446. }
  447. };
  448. hasStr(str);
  449. },
  450. // 确认插入选择的话术
  451. clickOK() {
  452. this.innerVisible1 = false;
  453. if (!this.huashu) {
  454. this.$message.error("请选择话术");
  455. return;
  456. }
  457. this.insertContent(
  458. "<text>" +
  459. this.huashu +
  460. "</text><span contentEditable='false' style='color:red'>answer</span><text>&nbsp;</text>"
  461. );
  462. },
  463. search() {
  464. this.pageNum = 1;
  465. this.getorgCode();
  466. },
  467. //点击编辑按钮
  468. editFun(item) {
  469. this.dialogVisible = true;
  470. this.form.id = item.id;
  471. if (this.keyType == 0) {
  472. // 挖掘话术类型
  473. // 回显标签模型数据
  474. if (item.answerList && item.answerList.length) {
  475. this.dynamiclist = item.answerList.map((obj) => {
  476. return {
  477. id: obj.id,
  478. mark: obj.level3Name ? obj.level3Name : obj.level2Name,
  479. level: obj.level3Id ? 3 : 2,
  480. editValue: obj.originalExpression,
  481. markid: obj.level3Id ? obj.level3Id : obj.level2Id,
  482. };
  483. });
  484. // console.log(this.dynamiclist)
  485. } else {
  486. this.dynamiclist = [];
  487. }
  488. this.form.keywordsName = item.level3Name;
  489. this.form.distance = item.distance || 10;
  490. this.form.originalExpression =
  491. item.originalExpression || item.level3Name;
  492. this.level = item.level2Id ? 2 : 1;
  493. this.questionId = item.questionId;
  494. this.form.keywordsId = item.level2Id ? item.level2Id : item.level1Id;
  495. this.findKeywordsById(item.level1Id); // 获取标签下拉数据
  496. } else if (this.keyType == 3) {
  497. // 违禁词
  498. this.form.keywordsName = item.level1Name;
  499. this.level = 1;
  500. this.form.distance = item.distance || 10;
  501. this.form.originalExpression =
  502. item.originalExpression || item.level1Name;
  503. this.dynamiclist = [];
  504. } else {
  505. this.form.keywordsId = item.level3Id ? item.level3Id : item.level2Id;
  506. this.level = item.level3Id ? 3 : 2;
  507. this.form.keywordsName = item.level3Name || item.level2Name;
  508. this.form.distance = item.distance || 10;
  509. this.form.originalExpression =
  510. item.originalExpression || item.level3Name || item.level2Name;
  511. if (item.answerList && item.answerList.length) {
  512. this.dynamiclist = item.answerList.map((obj) => {
  513. return {
  514. question: obj.question,
  515. editValue: obj.originalExpression,
  516. };
  517. });
  518. } else {
  519. this.dynamiclist = [];
  520. }
  521. }
  522. },
  523. // 删除列表
  524. deleteFun(item) {
  525. this.$alert(item.keywordsName, "确定删除该条数据吗", {
  526. confirmButtonText: "确定",
  527. callback: (action) => {
  528. axios({
  529. url: `/autoSR/zk/keymodel/delKeywordsModel`,
  530. method: "get",
  531. params: {
  532. id: item.id,
  533. houseId: this.houseId,
  534. },
  535. })
  536. .then((data) => {
  537. if (data.code == 0) {
  538. this.getorgCode();
  539. }
  540. })
  541. .catch((e) => {});
  542. },
  543. });
  544. },
  545. // 处理模型 关键词加#号
  546. replaceFun(str) {
  547. let temp = str;
  548. temp = temp.replace(/<text>\&nbsp\;<\/text>/g, "");
  549. temp = temp.replace(/\&nbsp\;/g, "");
  550. temp = temp.replace(/<text>/g, "");
  551. temp = temp.replace(/<\/text>/g, "");
  552. temp = temp.replace(
  553. /<span contenteditable="false" style="color:red">/g,
  554. " #"
  555. ); // 后台返回是这样的,变了,需要也处理一下
  556. temp = temp.replace(
  557. /<span style="color:red" contenteditable="false">/g,
  558. " #"
  559. );
  560. temp = temp.replace(/<\/br>/g, "");
  561. temp = temp.replace(/<br>/g, "");
  562. temp = temp.replace(/<\/span>/g, "#");
  563. // console.log('处理前temp',temp);
  564. this.delMark(temp);
  565. // console.log(temp);
  566. return temp;
  567. },
  568. //修改保存标签模型
  569. saveFun() {
  570. if (this.cansave) return; // 防止多次点击
  571. this.cansave = true;
  572. let text = document.getElementById("huashuModel");
  573. let answerList = [];
  574. // console.log(text.innerHTML);
  575. // console.log(text.innerText);
  576. let temp = text.innerHTML;
  577. if (this.form.distance == "") {
  578. this.$message.error("请输入距离");
  579. return;
  580. }
  581. if (text.innerText == "") {
  582. this.$message.error("请输入标签模型");
  583. return;
  584. }
  585. if (this.keyType == 0) {
  586. for (var i = 0; i < this.dynamiclist.length; i++) {
  587. // 使用for循环判断可以跳出循环
  588. if (!this.dynamiclist[i].markid) {
  589. this.$message.error("请完善要选择的标签");
  590. return;
  591. }
  592. this.wajueList.map((item1) => {
  593. if (item1.id == this.dynamiclist[i].markid) {
  594. this.dynamiclist[i].level = item1.level;
  595. this.dynamiclist[i].name = item1.name;
  596. }
  597. });
  598. let huashuModel = document.getElementById("huashuModel" + i);
  599. if (huashuModel.innerText == "") {
  600. this.$message.error("请完善选择的标签模型");
  601. return;
  602. }
  603. this.dynamiclist[i].editValue = huashuModel.innerHTML;
  604. this.dynamiclist[i].editText = huashuModel.innerText;
  605. }
  606. answerList = this.dynamiclist.map((item) => {
  607. return {
  608. keyType: 2,
  609. id: item.id || null,
  610. level: item.level,
  611. keywordsId: item.markid,
  612. showFormatExpression: item.editText, //文本形式
  613. formatExpression: this.replaceFun(item.editValue), // 问题表达式,关键词加#号
  614. original: item.editValue, // html==带span标签
  615. };
  616. });
  617. }
  618. axios({
  619. url: `/autoSR/zk/keymodel/updateKeywordsModel`,
  620. method: "post",
  621. data: {
  622. id: this.form.id,
  623. questionId: this.keyType == 0 ? this.questionId : "",
  624. houseId: this.houseId,
  625. keyType: this.keyType,
  626. level: this.level,
  627. keywordsId: this.form.keywordsId,
  628. keywordsName: this.form.keywordsName,
  629. formatExpression: this.replaceFun(temp), // 问题表达式,关键词加#号
  630. original: temp, // html==带span标签
  631. answerList: answerList,
  632. showFormatExpression: text.innerText,
  633. distance: this.form.distance, // 距离
  634. },
  635. })
  636. .then((res) => {
  637. this.cansave = false;
  638. this.dialogVisible = false;
  639. if (res.code == 0) {
  640. this.$message.success(res.data);
  641. this.getorgCode();
  642. } else {
  643. this.$message.error(res.msg);
  644. }
  645. })
  646. .catch((e) => {
  647. this.cansave = false;
  648. this.dialogVisible = false;
  649. });
  650. },
  651. //清空筛选条件
  652. Emptycondition() {
  653. this.value = "";
  654. this.keyType = 0;
  655. this.pageNum = 1;
  656. this.getorgCode();
  657. },
  658. //初始化
  659. getorgCode() {
  660. this.loading = true;
  661. this.tableData = [];
  662. axios({
  663. url: `/autoSR/zk/keymodel/findKeywordsModel`,
  664. method: "get",
  665. params: {
  666. houseId: this.houseId,
  667. current: this.pageNum,
  668. size: this.pageSize,
  669. keywordsName: this.value,
  670. keyType: this.keyType,
  671. },
  672. })
  673. .then((res) => {
  674. this.loading = false;
  675. if (res.code == 0) {
  676. this.tableData = res.data.records || [];
  677. this.total = res.data.total;
  678. }
  679. })
  680. .catch((e) => {
  681. this.loading = false;
  682. });
  683. },
  684. handleSizeChange(val) {
  685. console.log("每页条" + val);
  686. this.pageSize = val;
  687. this.getorgCode();
  688. },
  689. handleCurrentChange(val) {
  690. console.log("当前页" + val);
  691. this.pageNum = val;
  692. this.getorgCode();
  693. },
  694. },
  695. };
  696. </script>
  697. <style lang="scss" scoped >
  698. .box-center {
  699. width: 100%;
  700. padding: 5px 15px 40px;
  701. min-width: 1000px;
  702. }
  703. .app-top {
  704. margin-bottom: 20px;
  705. width: 100%;
  706. background: #ffffff;
  707. box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.04);
  708. border-radius: 4px;
  709. padding: 15px;
  710. }
  711. .block {
  712. width: 100%;
  713. margin-top: 5px;
  714. display: flex;
  715. }
  716. .blockbox {
  717. margin-left: auto;
  718. }
  719. .editDiv {
  720. width: 100%;
  721. min-height: 60px;
  722. max-height: 120px;
  723. overflow: auto;
  724. margin-bottom: 10px;
  725. padding: 15px;
  726. outline: none;
  727. border: 1px solid #409eff;
  728. border-radius: 10px;
  729. }
  730. .hidden-tooltip {
  731. width: 330px;
  732. overflow: hidden;
  733. text-overflow: ellipsis;
  734. white-space: nowrap;
  735. position: relative;
  736. }
  737. .itemlist {
  738. display: flex;
  739. justify-content: space-between;
  740. align-items: center;
  741. margin: 20px 0;
  742. }
  743. .item-input {
  744. width: 100%;
  745. padding: 4px 10px;
  746. outline: none;
  747. border: 1px solid #409eff;
  748. border-radius: 4px;
  749. overflow: auto;
  750. line-height: 24px;
  751. min-height: 24px;
  752. max-height: 100px;
  753. margin: 0 10px;
  754. }
  755. .el-dialog {
  756. width: 800px;
  757. }
  758. .el-dialog__body {
  759. max-height: 400px;
  760. overflow: auto;
  761. }
  762. </style>