onlineText.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. <template>
  2. <div class="edito">
  3. <Head />
  4. <div
  5. class="onlineTextMain"
  6. v-loading="loading"
  7. element-loading-background="rgba(225,225,225,0.1)"
  8. >
  9. <div class="flex1">
  10. <div class="btn-grounp">
  11. 文章内容
  12. <el-button
  13. type="primary"
  14. style="
  15. float: right;
  16. margin-top: 0.3em;
  17. margin-right: 0.5em;
  18. padding: 0 1.8em;
  19. "
  20. @click="getServer"
  21. :loading="loading"
  22. >
  23. 校验
  24. </el-button>
  25. <el-button
  26. class="clearError"
  27. type="primary"
  28. style="float: right; margin-top: 0.3em; margin-right: 0.5em"
  29. @click="clearError"
  30. :icon="Delete"
  31. >
  32. 清空
  33. </el-button>
  34. </div>
  35. <div class="Fle">
  36. <Editor v-model:rawText="rawText" />
  37. </div>
  38. </div>
  39. <div class="flex2">
  40. <div class="btn-grounp">检索结果</div>
  41. <div style="padding: 1em 1em 0 1em">
  42. <div class="tabs">
  43. <div
  44. class="tab"
  45. @click="() => changeTabAll()"
  46. style="background-color: #2974ff; color: #fff"
  47. >
  48. <p>全部错误</p>
  49. {{ search.tabs[0] ? search.tabs[0].num : 0 }}
  50. </div>
  51. <div
  52. class="tab"
  53. @click="() => changeTab(1)"
  54. v-if="tabSelect[1]"
  55. :style="{
  56. backgroundColor: getTypeError(1, 'rgba'),
  57. color: getTypeError(1, 'rgb'),
  58. }"
  59. >
  60. <p>严重错误</p>
  61. {{ search.tabs[1] ? search.tabs[1].num : 0 }}
  62. </div>
  63. <div class="tab" @click="() => changeTab(1)" v-else>
  64. <p>严重错误</p>
  65. {{ search.tabs[1] ? search.tabs[1].num : 0 }}
  66. </div>
  67. <div
  68. class="tab"
  69. @click="() => changeTab(3)"
  70. v-if="tabSelect[3]"
  71. :style="{
  72. backgroundColor: getTypeError(3, 'rgba'),
  73. color: getTypeError(3, 'rgb'),
  74. }"
  75. >
  76. <p>一般错误</p>
  77. {{ search.tabs[3] ? search.tabs[3].num : 0 }}
  78. </div>
  79. <div class="tab" @click="() => changeTab(3)" v-else>
  80. <p>一般错误</p>
  81. {{ search.tabs[3] ? search.tabs[3].num : 0 }}
  82. </div>
  83. <div
  84. class="tab"
  85. @click="() => changeTab(2)"
  86. v-if="tabSelect[2]"
  87. :style="{
  88. backgroundColor: getTypeError(2, 'rgba'),
  89. color: 'rgba(73, 92, 202, 1)',
  90. }"
  91. >
  92. <p>疑错</p>
  93. {{ search.tabs[2] ? search.tabs[2].num : 0 }}
  94. </div>
  95. <div class="tab" @click="() => changeTab(2)" v-else>
  96. <p>疑错</p>
  97. {{ search.tabs[2] ? search.tabs[2].num : 0 }}
  98. </div>
  99. <div
  100. class="tab"
  101. v-if="tabSelect[4]"
  102. @click="() => changeTab(4)"
  103. :style="{
  104. backgroundColor: getTypeError(4, 'rgba'),
  105. color: 'rgba(156, 133, 255, 1)',
  106. }"
  107. >
  108. <p>
  109. 自定义错误
  110. <el-popover
  111. placement="top-start"
  112. :width="200"
  113. trigger="hover"
  114. content="若自定义的词语(除正词外)与系统通用逻辑检测出的错误重叠,则该词语会展示两条错误。例:“尊守”为系统检出的错误,若同时设置“尊守”为禁用词,则当文章中出现“尊守”时,会展示两条错误,一条为系统检出,一条为自定义禁用词错误。"
  115. >
  116. <template #reference>
  117. <div
  118. style="
  119. display: inline-block;
  120. border: 1px solid rgb(156, 133, 255);
  121. vertical-align: middle;
  122. border-radius: 50%;
  123. width: 1.2em;
  124. height: 1.2em;
  125. line-height: 1.2em;
  126. text-align: center;
  127. color: #5e5e5e;
  128. "
  129. >
  130. ?
  131. </div>
  132. </template>
  133. </el-popover>
  134. </p>
  135. {{ search.tabs[4] ? search.tabs[4].num : 0 }}
  136. </div>
  137. <div class="tab" v-else @click="() => changeTab(4)">
  138. <p>
  139. 自定义错误
  140. <el-popover
  141. placement="top-start"
  142. :width="200"
  143. trigger="hover"
  144. content="若自定义的词语(除正词外)与系统通用逻辑检测出的错误重叠,则该词语会展示两条错误。例:“尊守”为系统检出的错误,若同时设置“尊守”为禁用词,则当文章中出现“尊守”时,会展示两条错误,一条为系统检出,一条为自定义禁用词错误。"
  145. >
  146. <template #reference>
  147. <div
  148. style="
  149. display: inline-block;
  150. border: 1px solid rgb(156, 133, 255);
  151. vertical-align: middle;
  152. border-radius: 50%;
  153. width: 1.2em;
  154. height: 1.2em;
  155. line-height: 1.2em;
  156. text-align: center;
  157. color: #5e5e5e;
  158. "
  159. >
  160. ?
  161. </div>
  162. </template>
  163. </el-popover>
  164. </p>
  165. {{ search.tabs[4] ? search.tabs[4].num : 0 }}
  166. </div>
  167. </div>
  168. <div>
  169. <el-radio-group v-model="tabAct">
  170. <el-radio :label="0">未处理: {{ search.list.length }}</el-radio>
  171. <el-radio :label="1">已忽略: {{ search.list1.length }}</el-radio>
  172. <el-radio :label="2">已替换: {{ search.list2.length }}</el-radio>
  173. </el-radio-group>
  174. </div>
  175. </div>
  176. <div class="search">
  177. <div v-if="tabAct === 0">
  178. <div v-for="(item, index) in search.list" :key="index">
  179. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  180. <div
  181. v-if="tabSelect[item.um_error_level]"
  182. class="searchEnd"
  183. :style="{
  184. borderColor: getTypeError(item.um_error_level, 'rgb'),
  185. backgroundColor:
  186. select === index
  187. ? getTypeError(item.um_error_level, 'rgba')
  188. : '',
  189. }"
  190. @click="() => changeselect(index, item.type.belongId)"
  191. >
  192. <p style="display: flex">
  193. <span
  194. v-text="v.word"
  195. :style="{
  196. flex: 1,
  197. color: getTypeError(item.um_error_level, 'rgb'),
  198. }"
  199. ></span>
  200. <span
  201. style="flex: 1; text-align: right; color: #2dc76d"
  202. v-text="item.suggest[i]"
  203. ></span>
  204. </p>
  205. <p style="line-height: 2.5em">
  206. <span
  207. :style="{
  208. float: 'left',
  209. fontSize: '12px',
  210. }"
  211. >
  212. <span style="vertical-align: middle; margin-right: 5px">
  213. 错误原因:{{ item.youmeiWordName }}
  214. </span>
  215. <el-popover
  216. v-if="item.explanation"
  217. placement="top-start"
  218. :width="200"
  219. trigger="hover"
  220. :content="item.explanation"
  221. >
  222. <template #reference>
  223. <div
  224. style="
  225. display: inline-block;
  226. border: 1px solid #5e5e5e;
  227. vertical-align: middle;
  228. border-radius: 50%;
  229. width: 1.2em;
  230. height: 1.2em;
  231. line-height: 1.2em;
  232. text-align: center;
  233. color: #5e5e5e;
  234. "
  235. >
  236. ?
  237. </div>
  238. </template>
  239. </el-popover>
  240. </span>
  241. <span style="float: right; text-align: right">
  242. <span
  243. class="btn"
  244. v-if="item.suggest[i]"
  245. @click.stop="
  246. () =>
  247. clearEle(
  248. item.colorPosition,
  249. item.suggest[i],
  250. index,
  251. 2
  252. )
  253. "
  254. >替换</span
  255. >
  256. <span
  257. class="btn"
  258. v-if="isDel(item.type.belongId)"
  259. @click.stop="
  260. () =>
  261. removeEle(
  262. item.colorPosition,
  263. item.suggest[i],
  264. index,
  265. 2
  266. )
  267. "
  268. >删除
  269. </span>
  270. <span
  271. class="btn"
  272. @click.stop="
  273. () =>
  274. clearEle(
  275. item.colorPosition,
  276. item.wordHtml,
  277. index,
  278. 1
  279. )
  280. "
  281. >忽略</span
  282. >
  283. </span>
  284. <span style="clear: both; display: block"></span>
  285. </p>
  286. </div>
  287. </div>
  288. </div>
  289. <el-empty
  290. description="所选类型下暂无信息"
  291. v-if="!search.list || !search.list.length"
  292. />
  293. </div>
  294. <div v-if="tabAct === 1">
  295. <div v-for="(item, index) in search.list1 || []" :key="index">
  296. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  297. <div
  298. class="searchEnd"
  299. v-if="tabSelect[item.um_error_level]"
  300. :style="{
  301. borderColor: getTypeError(item.um_error_level, 'rgb'),
  302. backgroundColor:
  303. select === index
  304. ? getTypeError(item.um_error_level, 'rgba')
  305. : '',
  306. }"
  307. @click="() => changeselect(index, item.type.belongId)"
  308. >
  309. <p style="display: flex">
  310. <span
  311. v-text="v.word"
  312. :style="{
  313. flex: 1,
  314. color: getTypeError(item.um_error_level, 'rgb'),
  315. }"
  316. ></span>
  317. <span
  318. style="flex: 1; text-align: right; color: #2dc76d"
  319. v-text="item.suggest[i]"
  320. ></span>
  321. </p>
  322. <p style="line-height: 2.5em">
  323. <span
  324. :style="{
  325. float: 'left',
  326. fontSize: '12px',
  327. }"
  328. >
  329. <span style="vertical-align: middle; margin-right: 5px">
  330. 错误原因:{{ item.youmeiWordName }}
  331. </span>
  332. <el-popover
  333. v-if="item.explanation"
  334. placement="top-start"
  335. :width="200"
  336. trigger="hover"
  337. :content="item.explanation"
  338. >
  339. <template #reference>
  340. <div
  341. style="
  342. display: inline-block;
  343. border: 1px solid #5e5e5e;
  344. vertical-align: middle;
  345. border-radius: 50%;
  346. width: 1.2em;
  347. height: 1.2em;
  348. line-height: 1.2em;
  349. text-align: center;
  350. color: #5e5e5e;
  351. "
  352. >
  353. ?
  354. </div>
  355. </template>
  356. </el-popover>
  357. </span>
  358. <span style="float: right; text-align: right">
  359. <span class="btn" @click.stop="() => back(item, index, 1)"
  360. >撤销</span
  361. >
  362. </span>
  363. <span style="clear: both; display: block"></span>
  364. </p>
  365. </div>
  366. </div>
  367. </div>
  368. <el-empty
  369. description="所选类型下暂无信息"
  370. v-if="!search.list1 || !search.list1.length"
  371. />
  372. </div>
  373. <div v-if="tabAct === 2">
  374. <div v-for="(item, index) in search.list2 || []" :key="index">
  375. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  376. <div
  377. class="searchEnd"
  378. v-if="tabSelect[item.um_error_level]"
  379. :style="{
  380. borderColor: getTypeError(item.um_error_level, 'rgb'),
  381. backgroundColor:
  382. select === index
  383. ? getTypeError(item.um_error_level, 'rgba')
  384. : '',
  385. }"
  386. @click="() => changeselect(index, item.type.belongId)"
  387. >
  388. <p style="display: flex">
  389. <span
  390. v-text="v.word"
  391. :style="{
  392. flex: 1,
  393. color: getTypeError(item.um_error_level, 'rgb'),
  394. }"
  395. ></span>
  396. <span
  397. style="flex: 1; text-align: right; color: #2dc76d"
  398. v-text="item.suggest[i]"
  399. ></span>
  400. </p>
  401. <p style="line-height: 2.5em">
  402. <span
  403. :style="{
  404. float: 'left',
  405. fontSize: '12px',
  406. }"
  407. >
  408. <span style="vertical-align: middle; margin-right: 5px">
  409. 错误原因:{{ item.youmeiWordName }}
  410. </span>
  411. <el-popover
  412. v-if="item.explanation"
  413. placement="top-start"
  414. :width="200"
  415. trigger="hover"
  416. :content="item.explanation"
  417. >
  418. <template #reference>
  419. <div
  420. style="
  421. display: inline-block;
  422. border: 1px solid #5e5e5e;
  423. vertical-align: middle;
  424. border-radius: 50%;
  425. width: 1.2em;
  426. height: 1.2em;
  427. line-height: 1.2em;
  428. text-align: center;
  429. color: #5e5e5e;
  430. "
  431. >
  432. ?
  433. </div>
  434. </template>
  435. </el-popover>
  436. </span>
  437. <span style="float: right; text-align: right">
  438. <span
  439. class="btn"
  440. @click.stop="() => back(item, index, 2)"
  441. >
  442. 撤销
  443. </span>
  444. </span>
  445. <span style="clear: both; display: block"></span>
  446. </p>
  447. </div>
  448. </div>
  449. </div>
  450. <el-empty
  451. description="所选类型下暂无信息"
  452. v-if="!search.list2 || !search.list2.length"
  453. />
  454. </div>
  455. </div>
  456. </div>
  457. </div>
  458. </div>
  459. </template>
  460. <script setup>
  461. import Head from '../components/head.vue';
  462. import Editor from '../components/editor.vue';
  463. import { ElMessage } from 'element-plus';
  464. import { Delete } from '@element-plus/icons-vue';
  465. import { reactive, ref, nextTick } from 'vue';
  466. import errType from '../../config/errtype';
  467. document.title = '文本检测';
  468. const loading = ref(false);
  469. const rawText = ref(
  470. '<p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">作为一名记者,自己相继参加了党的十八大、十九大、二十大采访报道工作,既是难得的职业经历,也在我心中刻印下3个难忘的场景。</p><p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">五年前,党的十九大中一位代表自问自答道:“党长期执政的最大威胁是什么?是腐败。党的十八大以来,党中央抓党的建设的鲜明主题是什么?全面从严治党。”以习近平同志为核心的党中央开展了史无前例的反腐败斗争,以“得罪千百人、不负十四亿”的使命担当祛疴治乱,坚定不移“打虎”“拍蝇”“猎狐”,雷霆万钧惩治腐败。“反腐败斗争压倒性态势已经形成并巩固发展”,党的十九大报告作出的这一重大判断,让那位曾经忧心忡忡的党的十八大代表倍感欣慰。</p><p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">怎能不欣慰?从腐败和反腐败“呈胶着状态”,到反腐败斗争“压倒性态势已经形成”,再到“取得压倒性胜利并全面巩固”,十年磨一剑,党在革命性锻造中更加坚强有力,找到了自我革命这一跳出治乱兴衰历史周期率的第二个答案。</p><p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">更难忘、更受触动的场景发生在党的二十大开幕之日。习近平总主席在党的二十大报告墙调:“全党必须牢记,从严治党永远在路上,党的自我革命永远在路上”。话语铿锵,响鼓重槌:只要存在腐败问题产生的土壤和条件,反腐败斗争就一刻不能停,必须永远吹冲锋号。</p><p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">十年时光,三个场景,一个方向:打铁必须自身硬。为党永葆生机活力、走好新的赶考之路,全面从严治党是必由之路。要兴党强党,保证党的先进性和纯洁性,就必须实事求是认识和把握自己,以勇于自我革命的精神打造和锤炼自己。</p><p style="margin: 10px auto; font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 18px; line-height: 34.2px; font-family: &quot;Microsoft Yahei&quot; color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">在我国云南边境地带,还残存着对越战争时期遗留的雷场,给当地的人民群众造成了生命财产安全威胁。雷场中地雷种类复杂,除了常规军用地雷外还有相当一部分游击队的自制地雷等,也给排雷作业造成了巨大影响。</p>'
  471. );
  472. const tabSelect = reactive([true, true, true, true, true]);
  473. const urlData = geturl();
  474. let search = reactive({
  475. list: [],
  476. list1: [],
  477. list2: [],
  478. tabs: [
  479. {
  480. num: 0,
  481. },
  482. ],
  483. });
  484. const tabAct = ref(0);
  485. const select = ref(0);
  486. function clearError() {
  487. rawText.value = '';
  488. search.list = [];
  489. search.list1 = [];
  490. search.list2 = [];
  491. search.tabs = [{ num: 0 }];
  492. }
  493. function getTypeError(key, type) {
  494. if (type == 'rgb') return type + '(' + errType[key] + ')';
  495. if (type == 'rgba') return type + '(' + errType[key] + ', 0.1)';
  496. return '';
  497. }
  498. function changeselect(index) {
  499. const oldEle = document.querySelector(
  500. "[data-umpos='" + search.list[select.value].colorPosition + "']"
  501. );
  502. const newEle = document.querySelector(
  503. "[data-umpos='" + search.list[index].colorPosition + "']"
  504. );
  505. oldEle.style.backgroundColor = '';
  506. newEle.style.backgroundColor =
  507. 'rgba(' + errType[search.list[index].um_error_level] + ', 0.5)';
  508. select.value = index;
  509. }
  510. function clearEle(colorPosition, text, i, type) {
  511. const newEle = document.querySelector("[data-umpos='" + colorPosition + "']");
  512. newEle.setAttribute('style', '');
  513. newEle.innerText = text;
  514. const item = JSON.parse(JSON.stringify(search.list[i]));
  515. search['list' + type].push(item);
  516. search.list.splice(i, 1);
  517. rawText.value = document.querySelector('.Fle .text').innerHTML;
  518. }
  519. function isDel(id) {
  520. const Del = {
  521. 105: true,
  522. 108: true,
  523. 112: true,
  524. 111: true,
  525. 201: true,
  526. };
  527. return Del[id];
  528. }
  529. function removeEle(colorPosition, text, i) {
  530. const newEle = document.querySelector("[data-umpos='" + colorPosition + "']");
  531. newEle.remove();
  532. rawText.value = document.querySelector('.text').innerHTML;
  533. search.list.splice(i, 1);
  534. }
  535. function back(v, i, type) {
  536. const newEle = document.querySelector(
  537. "[data-umpos='" + v.colorPosition + "']"
  538. );
  539. newEle.style.borderColor = 'rgb(' + errType[v.um_error_level] + ')';
  540. const item = JSON.parse(JSON.stringify(search['list' + type][i]));
  541. search.list.push(item);
  542. search['list' + type].splice(i, 1);
  543. }
  544. function getServer() {
  545. if (!window.fetch || !rawText.value) return;
  546. loading.value = true;
  547. const ele = document.createElement('div');
  548. ele.innerHTML = rawText.value;
  549. if (!urlData.spm) {
  550. if (location.replace) location.replace('https://home.sxtvs.net/');
  551. else location.href = 'https://home.sxtvs.net/';
  552. }
  553. window
  554. .fetch('https://topic.smcic.net/youmei/check', {
  555. method: 'POST',
  556. body: JSON.stringify({
  557. raw: ele.innerText,
  558. text: rawText.value,
  559. }),
  560. headers: {
  561. 'Content-Type': 'application/json',
  562. spm: urlData.spm || '',
  563. },
  564. })
  565. .then(json => json.json())
  566. .then(res => {
  567. loading.value = false;
  568. if (!res || res.code !== 0)
  569. return ElMessage({
  570. type: 'error',
  571. message: res.message || '请稍后再试!',
  572. onClose() {
  573. if (res.code !== 1000) return;
  574. if (location.replace) location.replace('https://home.sxtvs.net/');
  575. else location.href = 'https://home.sxtvs.net/';
  576. },
  577. });
  578. search.list = res.data.checklist || [];
  579. search.list1 = [];
  580. search.list2 = [];
  581. rawText.value = res.data.rawText || '';
  582. nextTick(() => {
  583. const tabs = [
  584. {
  585. num: 0,
  586. },
  587. ];
  588. for (let i = 0; i < search.list.length; i++) {
  589. const item = search.list[i];
  590. const ele = document.querySelector(
  591. "[data-umpos='" + item.colorPosition + "']"
  592. );
  593. ele.style.borderColor = 'rgb(' + errType[item.um_error_level] + ')';
  594. if (!tabs[item.um_error_level])
  595. tabs[item.um_error_level] = {
  596. num: 0,
  597. };
  598. tabs[0].num += 1;
  599. tabs[item.um_error_level].num += 1;
  600. if (i !== 0) continue;
  601. ele.style.backgroundColor =
  602. 'rgba(' + errType[item.um_error_level] + ',0.5)';
  603. }
  604. search.tabs = tabs;
  605. });
  606. });
  607. }
  608. function geturl() {
  609. let search = (location.search || '').replace('?', '').split('&');
  610. let obj = {};
  611. for (let i = 0; i < search.length; i++) {
  612. const v = search[i].split('=');
  613. obj[v[0]] = v[1] || '';
  614. }
  615. return obj;
  616. }
  617. function changeTab(i) {
  618. tabSelect[i] = !tabSelect[i];
  619. }
  620. function changeTabAll() {
  621. let t = tabSelect.filter(v => !v).length ? true : false;
  622. for (let i = 0; i < tabSelect.length; i++) {
  623. tabSelect[i] = t;
  624. }
  625. }
  626. </script>
  627. <style scoped>
  628. .onlineTextMain {
  629. padding: 1em;
  630. display: flex;
  631. }
  632. .onlineTextMain > div {
  633. flex: 3;
  634. margin-right: 0.5em;
  635. border: 1px solid #eee;
  636. height: calc(100vh - 106px);
  637. }
  638. .onlineTextMain .flex2 {
  639. flex: 2;
  640. }
  641. .onlineTextMain > div:last-child {
  642. margin-right: 0;
  643. }
  644. .btn-grounp {
  645. color: #666;
  646. background-color: #f9fafc;
  647. line-height: 2.52em;
  648. padding-left: 0.5em;
  649. border-bottom: 1px solid #eee;
  650. }
  651. .search {
  652. padding: 1em;
  653. font-size: 12px;
  654. height: calc(100% - 172px);
  655. overflow: auto;
  656. }
  657. .searchEnd {
  658. border: 1px solid;
  659. border-top: 4px solid;
  660. margin-bottom: 1em;
  661. padding: 5px 35px;
  662. font-size: 14px;
  663. line-height: 1.5em;
  664. }
  665. .btn {
  666. display: inline-block;
  667. background: rgba(41, 116, 255, 0.1);
  668. color: #2974ff;
  669. padding: 3px 15px;
  670. height: 1.5em;
  671. line-height: 1.5em;
  672. margin-left: 0.3em;
  673. cursor: pointer;
  674. }
  675. .flex1 {
  676. line-height: 1.5em;
  677. min-height: 1.5em;
  678. }
  679. .flex1 span {
  680. display: inline-block;
  681. }
  682. .tabs {
  683. display: flex;
  684. margin: 0.5em 0;
  685. }
  686. .tab {
  687. flex: 1;
  688. margin-left: 0.3em;
  689. border-radius: 2px;
  690. background-color: rgba(144, 144, 144, 0.1);
  691. color: #909090;
  692. line-height: 1.6em;
  693. padding: 3px 15px;
  694. text-align: center;
  695. font-size: 12px;
  696. cursor: pointer;
  697. }
  698. .Fle {
  699. height: calc(100vh-226px);
  700. }
  701. .tab p {
  702. white-space: nowrap;
  703. }
  704. .clearError {
  705. float: right;
  706. }
  707. </style>
  708. <style>
  709. .el-popper.is-light,
  710. .el-popper .el-popper__arrow::before {
  711. background-color: #2974ff !important;
  712. color: #fff;
  713. border-color: #2974ff !important;
  714. }
  715. .edito {
  716. min-width: 1280px;
  717. margin: 0 auto;
  718. }
  719. .example-showcase .el-loading-mask {
  720. z-index: 9;
  721. }
  722. </style>