onlineText.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722
  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="float: right; margin-top: 0.3em; margin-right: 0.5em;padding: 0 1.8em;"
  15. @click="getServer"
  16. :loading="loading"
  17. >
  18. 校验
  19. </el-button>
  20. <el-button
  21. class="clearError"
  22. type="primary"
  23. style="float: right; margin-top: 0.3em; margin-right: 0.5em"
  24. @click="clearError"
  25. :icon="Delete"
  26. >
  27. 清空
  28. </el-button>
  29. </div>
  30. <div class="Fle">
  31. <Editor v-model:rawText="rawText" />
  32. </div>
  33. </div>
  34. <div class="flex2">
  35. <div class="btn-grounp">检索结果</div>
  36. <div style="padding: 1em 1em 0 1em">
  37. <div class="tabs">
  38. <div
  39. class="tab"
  40. @click="() => changeTabAll()"
  41. style="background-color: #2974ff; color: #fff"
  42. >
  43. <p>全部错误</p>
  44. {{ search.tabs[0] ? search.tabs[0].num : 0 }}
  45. </div>
  46. <div
  47. class="tab"
  48. @click="() => changeTab(1)"
  49. v-if="tabSelect[1]"
  50. :style="{
  51. backgroundColor: getTypeError(1, 'rgba'),
  52. color: getTypeError(1, 'rgb'),
  53. }"
  54. >
  55. <p>严重错误</p>
  56. {{ search.tabs[1] ? search.tabs[1].num : 0 }}
  57. </div>
  58. <div class="tab" @click="() => changeTab(1)" v-else>
  59. <p>严重错误</p>
  60. {{ search.tabs[1] ? search.tabs[1].num : 0 }}
  61. </div>
  62. <div
  63. class="tab"
  64. @click="() => changeTab(3)"
  65. v-if="tabSelect[3]"
  66. :style="{
  67. backgroundColor: getTypeError(3, 'rgba'),
  68. color: getTypeError(3, 'rgb'),
  69. }"
  70. >
  71. <p>一般错误</p>
  72. {{ search.tabs[3] ? search.tabs[3].num : 0 }}
  73. </div>
  74. <div class="tab" @click="() => changeTab(3)" v-else>
  75. <p>一般错误</p>
  76. {{ search.tabs[3] ? search.tabs[3].num : 0 }}
  77. </div>
  78. <div
  79. class="tab"
  80. @click="() => changeTab(2)"
  81. v-if="tabSelect[2]"
  82. :style="{
  83. backgroundColor: getTypeError(2, 'rgba'),
  84. color: 'rgba(73, 92, 202, 1)',
  85. }"
  86. >
  87. <p>疑错</p>
  88. {{ search.tabs[2] ? search.tabs[2].num : 0 }}
  89. </div>
  90. <div class="tab" @click="() => changeTab(2)" v-else>
  91. <p>疑错</p>
  92. {{ search.tabs[2] ? search.tabs[2].num : 0 }}
  93. </div>
  94. <div
  95. class="tab"
  96. v-if="tabSelect[4]"
  97. @click="() => changeTab(4)"
  98. :style="{
  99. backgroundColor: getTypeError(4, 'rgba'),
  100. color: 'rgba(156, 133, 255, 1)',
  101. }"
  102. >
  103. <p>
  104. 自定义错误
  105. <el-popover
  106. placement="top-start"
  107. :width="200"
  108. trigger="hover"
  109. content="若自定义的词语(除正词外)与系统通用逻辑检测出的错误重叠,则该词语会展示两条错误。例:“尊守”为系统检出的错误,若同时设置“尊守”为禁用词,则当文章中出现“尊守”时,会展示两条错误,一条为系统检出,一条为自定义禁用词错误。"
  110. >
  111. <template #reference>
  112. <div
  113. style="
  114. display: inline-block;
  115. border: 1px solid rgb(156, 133, 255);
  116. vertical-align: middle;
  117. border-radius: 50%;
  118. width: 1.2em;
  119. height: 1.2em;
  120. line-height: 1.2em;
  121. text-align: center;
  122. color: #5e5e5e;
  123. "
  124. >
  125. ?
  126. </div>
  127. </template>
  128. </el-popover>
  129. </p>
  130. {{ search.tabs[4] ? search.tabs[4].num : 0 }}
  131. </div>
  132. <div class="tab" v-else @click="() => changeTab(4)">
  133. <p>
  134. 自定义错误
  135. <el-popover
  136. placement="top-start"
  137. :width="200"
  138. trigger="hover"
  139. content="若自定义的词语(除正词外)与系统通用逻辑检测出的错误重叠,则该词语会展示两条错误。例:“尊守”为系统检出的错误,若同时设置“尊守”为禁用词,则当文章中出现“尊守”时,会展示两条错误,一条为系统检出,一条为自定义禁用词错误。"
  140. >
  141. <template #reference>
  142. <div
  143. style="
  144. display: inline-block;
  145. border: 1px solid rgb(156, 133, 255);
  146. vertical-align: middle;
  147. border-radius: 50%;
  148. width: 1.2em;
  149. height: 1.2em;
  150. line-height: 1.2em;
  151. text-align: center;
  152. color: #5e5e5e;
  153. "
  154. >
  155. ?
  156. </div>
  157. </template>
  158. </el-popover>
  159. </p>
  160. {{ search.tabs[4] ? search.tabs[4].num : 0 }}
  161. </div>
  162. </div>
  163. <div>
  164. <el-radio-group v-model="tabAct">
  165. <el-radio :label="0">未处理: {{ search.list.length }}</el-radio>
  166. <el-radio :label="1">已忽略: {{ search.list1.length }}</el-radio>
  167. <el-radio :label="2">已替换: {{ search.list2.length }}</el-radio>
  168. </el-radio-group>
  169. </div>
  170. </div>
  171. <div class="search">
  172. <div v-if="tabAct === 0">
  173. <div v-for="(item, index) in search.list" :key="index">
  174. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  175. <div
  176. v-if="tabSelect[item.um_error_level]"
  177. class="searchEnd"
  178. :style="{
  179. borderColor: getTypeError(item.um_error_level, 'rgb'),
  180. backgroundColor:
  181. select === index
  182. ? getTypeError(item.um_error_level, 'rgba')
  183. : '',
  184. }"
  185. @click="() => changeselect(index, item.type.belongId)"
  186. >
  187. <p style="display: flex">
  188. <span
  189. v-text="v.word"
  190. :style="{
  191. flex: 1,
  192. color: getTypeError(item.um_error_level, 'rgb'),
  193. }"
  194. ></span>
  195. <span
  196. style="flex: 1; text-align: right; color: #2dc76d"
  197. v-text="item.suggest[i]"
  198. ></span>
  199. </p>
  200. <p style="line-height: 2.5em">
  201. <span
  202. :style="{
  203. float: 'left',
  204. fontSize: '12px',
  205. }"
  206. >
  207. <span style="vertical-align: middle; margin-right: 5px">
  208. 错误原因:{{ item.youmeiWordName }}
  209. </span>
  210. <el-popover
  211. v-if="item.explanation"
  212. placement="top-start"
  213. :width="200"
  214. trigger="hover"
  215. :content="item.explanation"
  216. >
  217. <template #reference>
  218. <div
  219. style="
  220. display: inline-block;
  221. border: 1px solid #5e5e5e;
  222. vertical-align: middle;
  223. border-radius: 50%;
  224. width: 1.2em;
  225. height: 1.2em;
  226. line-height: 1.2em;
  227. text-align: center;
  228. color: #5e5e5e;
  229. "
  230. >
  231. ?
  232. </div>
  233. </template>
  234. </el-popover>
  235. </span>
  236. <span style="float: right; text-align: right">
  237. <span
  238. class="btn"
  239. v-if="item.suggest[i]"
  240. @click.stop="
  241. () =>
  242. clearEle(
  243. item.colorPosition,
  244. item.suggest[i],
  245. index,
  246. 2
  247. )
  248. "
  249. >替换</span
  250. >
  251. <span
  252. class="btn"
  253. v-if="isDel(item.type.belongId)"
  254. @click.stop="
  255. () =>
  256. removeEle(
  257. item.colorPosition,
  258. item.suggest[i],
  259. index,
  260. 2
  261. )
  262. "
  263. >删除
  264. </span>
  265. <span
  266. class="btn"
  267. @click.stop="
  268. () =>
  269. clearEle(
  270. item.colorPosition,
  271. item.wordHtml,
  272. index,
  273. 1
  274. )
  275. "
  276. >忽略</span
  277. >
  278. </span>
  279. <span style="clear: both; display: block"></span>
  280. </p>
  281. </div>
  282. </div>
  283. </div>
  284. <el-empty
  285. description="所选类型下暂无信息"
  286. v-if="!search.list || !search.list.length"
  287. />
  288. </div>
  289. <div v-if="tabAct === 1">
  290. <div v-for="(item, index) in search.list1 || []" :key="index">
  291. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  292. <div
  293. class="searchEnd"
  294. v-if="tabSelect[item.um_error_level]"
  295. :style="{
  296. borderColor: getTypeError(item.um_error_level, 'rgb'),
  297. backgroundColor:
  298. select === index
  299. ? getTypeError(item.um_error_level, 'rgba')
  300. : '',
  301. }"
  302. @click="() => changeselect(index, item.type.belongId)"
  303. >
  304. <p style="display: flex">
  305. <span
  306. v-text="v.word"
  307. :style="{
  308. flex: 1,
  309. color: getTypeError(item.um_error_level, 'rgb'),
  310. }"
  311. ></span>
  312. <span
  313. style="flex: 1; text-align: right; color: #2dc76d"
  314. v-text="item.suggest[i]"
  315. ></span>
  316. </p>
  317. <p style="line-height: 2.5em">
  318. <span
  319. :style="{
  320. float: 'left',
  321. fontSize: '12px',
  322. }"
  323. >
  324. <span style="vertical-align: middle; margin-right: 5px">
  325. 错误原因:{{ item.youmeiWordName }}
  326. </span>
  327. <el-popover
  328. v-if="item.explanation"
  329. placement="top-start"
  330. :width="200"
  331. trigger="hover"
  332. :content="item.explanation"
  333. >
  334. <template #reference>
  335. <div
  336. style="
  337. display: inline-block;
  338. border: 1px solid #5e5e5e;
  339. vertical-align: middle;
  340. border-radius: 50%;
  341. width: 1.2em;
  342. height: 1.2em;
  343. line-height: 1.2em;
  344. text-align: center;
  345. color: #5e5e5e;
  346. "
  347. >
  348. ?
  349. </div>
  350. </template>
  351. </el-popover>
  352. </span>
  353. <span style="float: right; text-align: right">
  354. <span class="btn" @click.stop="() => back(item, index, 1)"
  355. >撤销</span
  356. >
  357. </span>
  358. <span style="clear: both; display: block"></span>
  359. </p>
  360. </div>
  361. </div>
  362. </div>
  363. <el-empty
  364. description="所选类型下暂无信息"
  365. v-if="!search.list1 || !search.list1.length"
  366. />
  367. </div>
  368. <div v-if="tabAct === 2">
  369. <div v-for="(item, index) in search.list2 || []" :key="index">
  370. <div v-for="(v, i) in item.htmlWords" :key="'son' + i">
  371. <div
  372. class="searchEnd"
  373. v-if="tabSelect[item.um_error_level]"
  374. :style="{
  375. borderColor: getTypeError(item.um_error_level, 'rgb'),
  376. backgroundColor:
  377. select === index
  378. ? getTypeError(item.um_error_level, 'rgba')
  379. : '',
  380. }"
  381. @click="() => changeselect(index, item.type.belongId)"
  382. >
  383. <p style="display: flex">
  384. <span
  385. v-text="v.word"
  386. :style="{
  387. flex: 1,
  388. color: getTypeError(item.um_error_level, 'rgb'),
  389. }"
  390. ></span>
  391. <span
  392. style="flex: 1; text-align: right; color: #2dc76d"
  393. v-text="item.suggest[i]"
  394. ></span>
  395. </p>
  396. <p style="line-height: 2.5em">
  397. <span
  398. :style="{
  399. float: 'left',
  400. fontSize: '12px',
  401. }"
  402. >
  403. <span style="vertical-align: middle; margin-right: 5px">
  404. 错误原因:{{ item.youmeiWordName }}
  405. </span>
  406. <el-popover
  407. v-if="item.explanation"
  408. placement="top-start"
  409. :width="200"
  410. trigger="hover"
  411. :content="item.explanation"
  412. >
  413. <template #reference>
  414. <div
  415. style="
  416. display: inline-block;
  417. border: 1px solid #5e5e5e;
  418. vertical-align: middle;
  419. border-radius: 50%;
  420. width: 1.2em;
  421. height: 1.2em;
  422. line-height: 1.2em;
  423. text-align: center;
  424. color: #5e5e5e;
  425. "
  426. >
  427. ?
  428. </div>
  429. </template>
  430. </el-popover>
  431. </span>
  432. <span style="float: right; text-align: right">
  433. <span
  434. class="btn"
  435. @click.stop="() => back(item, index, 2)"
  436. >
  437. 撤销
  438. </span>
  439. </span>
  440. <span style="clear: both; display: block"></span>
  441. </p>
  442. </div>
  443. </div>
  444. </div>
  445. <el-empty
  446. description="所选类型下暂无信息"
  447. v-if="!search.list2 || !search.list2.length"
  448. />
  449. </div>
  450. </div>
  451. </div>
  452. </div>
  453. </div>
  454. </template>
  455. <script setup>
  456. import Head from '../components/head.vue';
  457. import Editor from '../components/editor.vue';
  458. import { ElMessage } from 'element-plus';
  459. import { Delete } from '@element-plus/icons-vue';
  460. import { reactive, ref, nextTick } from 'vue';
  461. import errType from '../../config/errtype';
  462. document.title = '文本检测';
  463. const loading = ref(false);
  464. const rawText = ref(
  465. '<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>'
  466. );
  467. const tabSelect = reactive([true, true, true, true, true]);
  468. const urlData = geturl();
  469. let search = reactive({
  470. list: [],
  471. list1: [],
  472. list2: [],
  473. tabs: [
  474. {
  475. num: 0,
  476. },
  477. ],
  478. });
  479. const tabAct = ref(0);
  480. const select = ref(0);
  481. function clearError() {
  482. rawText.value = '';
  483. search.list = [];
  484. search.list1 = [];
  485. search.list2 = [];
  486. search.tabs = [{ num: 0 }];
  487. }
  488. function getTypeError(key, type) {
  489. if (type == 'rgb') return type + '(' + errType[key] + ')';
  490. if (type == 'rgba') return type + '(' + errType[key] + ', 0.1)';
  491. return '';
  492. }
  493. function changeselect(index) {
  494. const oldEle = document.querySelector(
  495. "[data-umpos='" + search.list[select.value].colorPosition + "']"
  496. );
  497. const newEle = document.querySelector(
  498. "[data-umpos='" + search.list[index].colorPosition + "']"
  499. );
  500. oldEle.style.backgroundColor = '';
  501. newEle.style.backgroundColor =
  502. 'rgba(' + errType[search.list[index].um_error_level] + ', 0.5)';
  503. select.value = index;
  504. }
  505. function clearEle(colorPosition, text, i, type) {
  506. const newEle = document.querySelector("[data-umpos='" + colorPosition + "']");
  507. newEle.setAttribute('style', '');
  508. newEle.innerText = text;
  509. const item = JSON.parse(JSON.stringify(search.list[i]));
  510. search['list' + type].push(item);
  511. search.list.splice(i, 1);
  512. rawText.value = document.querySelector('.Fle .text').innerHTML;
  513. }
  514. function isDel(id) {
  515. const Del = {
  516. 105: true,
  517. 108: true,
  518. 112: true,
  519. 111: true,
  520. 201: true,
  521. };
  522. return Del[id];
  523. }
  524. function removeEle(colorPosition, text, i) {
  525. const newEle = document.querySelector("[data-umpos='" + colorPosition + "']");
  526. newEle.remove();
  527. rawText.value = document.querySelector('.text').innerHTML;
  528. search.list.splice(i, 1);
  529. }
  530. function back(v, i, type) {
  531. const newEle = document.querySelector(
  532. "[data-umpos='" + v.colorPosition + "']"
  533. );
  534. newEle.style.borderColor = 'rgb(' + errType[v.um_error_level] + ')';
  535. const item = JSON.parse(JSON.stringify(search['list' + type][i]));
  536. search.list.push(item);
  537. search['list' + type].splice(i, 1);
  538. }
  539. function getServer() {
  540. if (!window.fetch || !rawText.value) return;
  541. loading.value = true;
  542. const ele = document.createElement("div");
  543. ele.innerHTML = rawText.value;
  544. window
  545. .fetch('https://topic.smcic.net/youmei/check', {
  546. method: 'POST',
  547. body: JSON.stringify({
  548. raw: ele.innerText,
  549. text: rawText.value
  550. }),
  551. headers: {
  552. 'Content-Type': 'application/json',
  553. "spm": urlData.spm || ""
  554. },
  555. })
  556. .then(json => json.json())
  557. .then(res => {
  558. loading.value = false;
  559. if (!res || res.code !== 0) return ElMessage.error('请稍后再试!');
  560. search.list = res.data.checklist || [];
  561. search.list1 = [];
  562. search.list2 = [];
  563. rawText.value = res.data.rawText || '';
  564. nextTick(() => {
  565. const tabs = [
  566. {
  567. num: 0,
  568. },
  569. ];
  570. for (let i = 0; i < search.list.length; i++) {
  571. const item = search.list[i];
  572. const ele = document.querySelector(
  573. "[data-umpos='" + item.colorPosition + "']"
  574. );
  575. ele.style.borderColor = 'rgb(' + errType[item.um_error_level] + ')';
  576. if (!tabs[item.um_error_level])
  577. tabs[item.um_error_level] = {
  578. num: 0,
  579. };
  580. tabs[0].num += 1;
  581. tabs[item.um_error_level].num += 1;
  582. if (i !== 0) continue;
  583. ele.style.backgroundColor =
  584. 'rgba(' + errType[item.um_error_level] + ',0.5)';
  585. }
  586. search.tabs = tabs;
  587. });
  588. });
  589. }
  590. function geturl() {
  591. let search = (location.search || "").replace("?", "").split("&");
  592. let obj = {};
  593. for (let i = 0; i < search.length; i++) {
  594. const v = search[i].split("=");
  595. obj[v[0]] = v[1] || "";
  596. }
  597. return obj
  598. }
  599. function changeTab(i) {
  600. tabSelect[i] = !tabSelect[i];
  601. }
  602. function changeTabAll() {
  603. let t = tabSelect.filter(v => !v).length ? true : false;
  604. for (let i = 0; i < tabSelect.length; i++) {
  605. tabSelect[i] = t;
  606. }
  607. }
  608. </script>
  609. <style scoped>
  610. .onlineTextMain {
  611. padding: 1em;
  612. display: flex;
  613. }
  614. .onlineTextMain > div {
  615. flex: 3;
  616. margin-right: 0.5em;
  617. border: 1px solid #eee;
  618. height: calc(100vh - 106px);
  619. }
  620. .onlineTextMain .flex2 {
  621. flex: 2;
  622. }
  623. .onlineTextMain > div:last-child {
  624. margin-right: 0;
  625. }
  626. .btn-grounp {
  627. color: #666;
  628. background-color: #f9fafc;
  629. line-height: 2.52em;
  630. padding-left: 0.5em;
  631. border-bottom: 1px solid #eee;
  632. }
  633. .search {
  634. padding: 1em;
  635. font-size: 12px;
  636. height: calc(100% - 172px);
  637. overflow: auto;
  638. }
  639. .searchEnd {
  640. border: 1px solid;
  641. border-top: 4px solid;
  642. margin-bottom: 1em;
  643. padding: 5px 35px;
  644. font-size: 14px;
  645. line-height: 1.5em;
  646. }
  647. .btn {
  648. display: inline-block;
  649. background: rgba(41, 116, 255, 0.1);
  650. color: #2974ff;
  651. padding: 3px 15px;
  652. height: 1.5em;
  653. line-height: 1.5em;
  654. margin-left: 0.3em;
  655. cursor: pointer;
  656. }
  657. .flex1 {
  658. line-height: 1.5em;
  659. min-height: 1.5em;
  660. }
  661. .flex1 span {
  662. display: inline-block;
  663. }
  664. .tabs {
  665. display: flex;
  666. margin: 0.5em 0;
  667. }
  668. .tab {
  669. flex: 1;
  670. margin-left: 0.3em;
  671. border-radius: 2px;
  672. background-color: rgba(144, 144, 144, 0.1);
  673. color: #909090;
  674. line-height: 1.6em;
  675. padding: 3px 15px;
  676. text-align: center;
  677. font-size: 12px;
  678. cursor: pointer;
  679. }
  680. .Fle {
  681. height: calc(100vh-226px);
  682. }
  683. .tab p {
  684. white-space: nowrap;
  685. }
  686. .clearError {
  687. float: right;
  688. }
  689. </style>
  690. <style>
  691. .el-popper.is-light,
  692. .el-popper .el-popper__arrow::before {
  693. background-color: #2974ff !important;
  694. color: #fff;
  695. border-color: #2974ff !important;
  696. }
  697. .edito {
  698. min-width: 1280px;
  699. margin: 0 auto;
  700. }
  701. .example-showcase .el-loading-mask {
  702. z-index: 9;
  703. }
  704. </style>