cread.vue 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618
  1. <template>
  2. <div class="cread" v-loading="loading">
  3. <Header :projectShow="true" />
  4. <div class="main" v-if="!isPreview">
  5. <div class="from">
  6. <div class="type">
  7. <div :class="[typeIndex == 0 ? 'sele' : '']" @click="cutType(0)">
  8. 字模式
  9. </div>
  10. <div :class="[typeIndex == 1 ? 'sele' : '']" @click="cutType(1)">
  11. 句模式
  12. </div>
  13. </div>
  14. <div class="from_main">
  15. <div class="left">
  16. <el-input
  17. type="textarea"
  18. :placeholder="
  19. typeIndex == 0 ? '每行输入一个字' : '每行输入一个句子/词汇'
  20. "
  21. v-model="from.content"
  22. maxlength="100"
  23. show-word-limit
  24. >
  25. </el-input>
  26. <div class="submit">
  27. <span @click="creadEvent">生成</span>
  28. </div>
  29. </div>
  30. <div class="right">
  31. <div class="title">基础配置:</div>
  32. <div class="dv">
  33. <el-radio-group v-model="from.BoxbgType">
  34. <el-radio :label="0">田字格</el-radio>
  35. <el-radio :label="1">米字格</el-radio>
  36. <el-radio :label="2">空格</el-radio>
  37. </el-radio-group>
  38. <span class="title">文字大小</span>
  39. <el-select
  40. v-model="from.fontSize"
  41. placeholder=""
  42. style="width: 60px"
  43. >
  44. <el-option label="大" value="big"> </el-option>
  45. <el-option label="中" value="center"> </el-option>
  46. <el-option label="小" value="little"> </el-option>
  47. </el-select>
  48. </div>
  49. <div class="dv">
  50. <span class="title">边框颜色</span>
  51. <el-color-picker
  52. v-model="from.borderColor"
  53. style="margin-right: 16px"
  54. ></el-color-picker>
  55. <span class="title">文字颜色</span>
  56. <el-color-picker v-model="from.fontColor"></el-color-picker>
  57. </div>
  58. <div class="title" style="margin-top: 24px">功能配置:</div>
  59. <div class="dv">
  60. <el-switch
  61. active-color="#424242"
  62. v-model="from.playStorkes"
  63. active-text="笔顺动画"
  64. style="margin-right: 40px"
  65. >
  66. </el-switch>
  67. <template v-if="typeIndex == 0">
  68. <el-switch
  69. active-color="#424242"
  70. v-model="from.StorkesUnfold"
  71. active-text="笔顺展开"
  72. >
  73. </el-switch>
  74. </template>
  75. </div>
  76. <div class="title" style="margin-top: 24px">书写配置:</div>
  77. <div class="dv">
  78. <div style="margin-right: 16px">
  79. <span class="title">书写格</span>
  80. <el-input
  81. style="width: 60px; text-align: center"
  82. v-model="from.writeBoxNumber"
  83. onkeyup="value=value.replace(/^0+(\d)|[^\d]+/g,'')"
  84. class="numbre-input"
  85. ></el-input>
  86. <span style="margin-left: 8px">{{
  87. typeIndex == 0 ? "行" : "句"
  88. }}</span>
  89. </div>
  90. <div style="margin-right: 16px">
  91. <span class="title">描红</span>
  92. <el-input
  93. style="width: 60px; text-align: center"
  94. v-model="from.miaoRedBoxNumber"
  95. class="numbre-input"
  96. onkeyup="value=value.replace(/^0+(\d)|[^\d]+/g,'')"
  97. ></el-input>
  98. <span style="margin-left: 8px">{{
  99. typeIndex == 0 ? "格" : "句"
  100. }}</span>
  101. </div>
  102. <div>
  103. <span class="title">文末空行</span>
  104. <el-input
  105. style="width: 60px; text-align: center"
  106. v-model="from.lastNullrow"
  107. onkeyup="value=value.replace(/^0+(\d)|[^\d]+/g,'')"
  108. class="numbre-input"
  109. ></el-input>
  110. <span style="margin-left: 8px">行</span>
  111. </div>
  112. </div>
  113. <div class="dv">
  114. <span class="title">描红底色</span>
  115. <el-color-picker
  116. v-model="from.miaoRedBgcolor"
  117. style="margin-right: 16px"
  118. ></el-color-picker>
  119. <span class="title">书写颜色</span>
  120. <el-color-picker v-model="from.writeColor"></el-color-picker>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. <div class="operation" v-if="isCread">
  126. <div @click="saveEvent">
  127. <img src="../../assets/teacherdev/word-save.png" alt="" /> 保存
  128. </div>
  129. <div @click="previewEvent">
  130. <img src="../../assets/teacherdev/word-eyes.png" alt="" /> 预览
  131. </div>
  132. <div @click="download2('pdfDom')">
  133. <img src="../../assets/teacherdev/word-download.png" alt="" /> 下载
  134. </div>
  135. </div>
  136. <div class="word_main" v-if="writeTableData && writeTableData.result">
  137. <div
  138. class="word_main_table"
  139. v-for="(itemT, indexT) in writeTableData.result"
  140. :key="indexT"
  141. >
  142. <writeTable
  143. :type="typeIndex"
  144. :dataConfig="writeTableData"
  145. :data="itemT"
  146. :pageNumber="indexT + 1"
  147. :totalNumber="writeTableData.result.length"
  148. />
  149. </div>
  150. </div>
  151. </div>
  152. <div class="preview_dv" v-if="isPreview">
  153. <img
  154. class="close"
  155. src="../../assets/teacherdev/creadCad-close.png"
  156. alt=""
  157. @click="closepreviewEvent"
  158. />
  159. <div class="preview_main">
  160. <img
  161. class="left"
  162. src="../../assets/teacherdev/creadCad-left.png"
  163. alt=""
  164. @click="changepreviewIndex('remove')"
  165. />
  166. <div class="word_main">
  167. <div class="word_main_table">
  168. <writeTable
  169. :type="typeIndex"
  170. :dataConfig="writeTableData"
  171. :data="writeTableData.result[previewIndex]"
  172. :pageNumber="previewIndex + 1"
  173. :totalNumber="writeTableData.result.length"
  174. />
  175. </div>
  176. </div>
  177. <img
  178. class="right"
  179. src="../../assets/teacherdev/creadCad-right.png"
  180. alt=""
  181. @click="changepreviewIndex('add')"
  182. />
  183. </div>
  184. </div>
  185. <el-dialog
  186. title="保存为"
  187. :visible.sync="saveShow"
  188. width="30%"
  189. :before-close="handleClose"
  190. :modal="false"
  191. >
  192. <el-input placeholder="请输入" v-model="saveName"> </el-input>
  193. <span slot="footer" class="dialog-footer">
  194. <el-button @click="handleClose">取 消</el-button>
  195. <el-button type="primary" @click="save">确 定</el-button>
  196. </span>
  197. </el-dialog>
  198. </div>
  199. </template>
  200. <script>
  201. //这里可以导入其它文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  202. //例如:import 《组件名称》from ‘《组件路径》';
  203. import Header from "@/components/Header";
  204. import { getLogin, LearnWebSI } from "@/api/api";
  205. import writeTable from "./writeTable.vue";
  206. import html2canvas from "html2canvas";
  207. import { jsPDF } from "jspdf";
  208. import canvg from "canvg";
  209. import FileSaver from "file-saver";
  210. import htmlDocx from "html-docx-js/dist/html-docx";
  211. export default {
  212. //import引入的组件需要注入到对象中才能使用
  213. components: {
  214. Header,
  215. writeTable,
  216. },
  217. props: {},
  218. data() {
  219. //这里存放数据
  220. return {
  221. saveName: "",
  222. typeIndex: 0,
  223. from: {
  224. content: "",
  225. BoxbgType: 0,
  226. fontSize: "center",
  227. playStorkes: true,
  228. StorkesUnfold: true,
  229. writeBoxNumber: "0", //书写行
  230. miaoRedBoxNumber: "0", //描红格
  231. lastNullrow: "0", //文本末空行数
  232. miaoRedBgcolor: "#E1E1E1", //描红底色
  233. writeColor: "#000000", //书写颜色
  234. borderColor: "#D65353", //边框颜色
  235. fontColor: "#000000", //文字颜色
  236. },
  237. loading: false,
  238. writeTableData: null,
  239. isCread: false,
  240. isPreview: false,
  241. previewIndex: 0,
  242. htmlTitle: "1",
  243. saveShow: false,
  244. writetableShow: true,
  245. };
  246. },
  247. //计算属性 类似于data概念
  248. computed: {},
  249. //监控data中数据变化
  250. watch: {},
  251. //方法集合
  252. methods: {
  253. saveEvent() {
  254. this.saveShow = true;
  255. },
  256. handleClose() {
  257. this.saveShow = false;
  258. },
  259. // 保存
  260. save() {
  261. this.loading = this.$loading({
  262. lock: true,
  263. text: "Loading",
  264. spinner: "el-icon-loading",
  265. background: "rgba(0, 0, 0, 0.7)",
  266. });
  267. if (this.$route.query.id) {
  268. // 编辑
  269. let Mname = "tr_tool-wsc_manager-UpdateMyWordSentenceCard";
  270. LearnWebSI(Mname, {
  271. id: this.$route.query.id,
  272. name: this.saveName,
  273. type: this.typeIndex == 0 ? "WORD" : "SENTENCE",
  274. text: this.from.content,
  275. content: JSON.stringify(this.writeTableData),
  276. })
  277. .then((res) => {
  278. this.loading.close();
  279. this.loading = false;
  280. this.saveShow = false;
  281. this.$message.success("保存成功");
  282. })
  283. .catch((res) => {
  284. this.loading.close();
  285. this.loading = false;
  286. });
  287. } else {
  288. // 新建
  289. let Mname = "tr_tool-wsc_manager-CreateMyWordSentenceCard";
  290. LearnWebSI(Mname, {
  291. name: this.saveName,
  292. type: this.typeIndex == 0 ? "WORD" : "SENTENCE",
  293. text: this.from.content,
  294. content: JSON.stringify(this.writeTableData),
  295. })
  296. .then((res) => {
  297. this.$router.replace({
  298. path: "/wordcard/cread",
  299. query: {
  300. id: res.id,
  301. },
  302. });
  303. this.loading.close();
  304. this.loading = false;
  305. this.saveShow = false;
  306. this.$message.success("保存成功");
  307. })
  308. .catch((res) => {
  309. this.loading.close();
  310. this.loading = false;
  311. });
  312. }
  313. },
  314. download(dom) {
  315. let content = document.getElementById(dom);
  316. content = content ? content : null;
  317. // 条件判断是否打印
  318. if (!content) {
  319. alert("打印失败,请重新操作");
  320. return false;
  321. }
  322. // 开始打印
  323. console.log(content);
  324. var contentWidth = content.width;
  325. var contentHeight = content.height;
  326. //以下是对svg的处理
  327. var nodesToRecover = [];
  328. var nodesToRemove = [];
  329. var svgElem = $("#pdfDom").find("svg-icon"); //divReport为需要截取成图片的dom的id
  330. console.log(svgElem);
  331. svgElem.each(function (index, node) {
  332. var parentNode = node.parentNode;
  333. var svg = node.outerHTML.trim();
  334. var canvas2 = document.createElement("canvas");
  335. canvg(canvas2, svg);
  336. if (node.style.position) {
  337. canvas2.style.position += node.style.position;
  338. canvas2.style.left += node.style.left;
  339. canvas2.style.top += node.style.top;
  340. }
  341. nodesToRecover.push({
  342. parent: parentNode,
  343. child: node,
  344. });
  345. parentNode.removeChild(node);
  346. nodesToRemove.push({
  347. parent: parentNode,
  348. child: canvas2,
  349. });
  350. parentNode.appendChild(canvas2);
  351. });
  352. var canvas = document.createElement("canvas");
  353. canvas.width = contentWidth;
  354. canvas.height = contentHeight;
  355. var context = canvas.getContext("2d");
  356. html2canvas(content, {
  357. allowTaint: true,
  358. scale: 2, // 提升画面质量,但是会增加文件大小
  359. }).then(function (canvas) {
  360. var pdfWidth = canvas.width;
  361. var pdfHeight = canvas.height;
  362. var pageHeight = (pdfWidth / 592.28) * 841.89;
  363. var leftHeight = pdfHeight;
  364. var position = 0;
  365. var imgWidth = 595.28;
  366. var imgHeight = (595.28 / pdfWidth) * pdfHeight;
  367. var pageData = canvas.toDataURL("img/jpeg", 1.0);
  368. var pdf = new jsPDF("", "pt", "a4");
  369. // 判断打印dom高度是否需要分页,如果需要进行分页处理
  370. if (leftHeight < pageHeight) {
  371. pdf.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
  372. } else {
  373. while (leftHeight > 0) {
  374. pdf.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
  375. leftHeight -= pageHeight;
  376. position -= 841.89;
  377. if (leftHeight > 0) {
  378. pdf.addPage();
  379. }
  380. }
  381. }
  382. pdf.save("案例.pdf");
  383. });
  384. },
  385. download2() {
  386. this.$nextTick(() => {
  387. if (this.writeTableData) {
  388. let str = JSON.stringify(this.writeTableData);
  389. localStorage.setItem("writeTableData", str);
  390. this.$router.replace("/wordcard/print");
  391. }
  392. });
  393. // var printBox = document.getElementById("pdfDom");
  394. // // var printBox = document.getElementsByClassName("pdfDom")[0];
  395. // //拿到打印的区域的html内容
  396. // var newContent = printBox.innerHTML;
  397. // //将旧的页面储存起来,当打印完成后返给给页面。
  398. // var oldContent = document.body.innerHTML;
  399. // //赋值给body
  400. // document.body.innerHTML = newContent;
  401. // //执行window.print打印功能
  402. // window.print();
  403. // // 重新加载页面,以刷新数据。以防打印完之后,页面不能操作的问题
  404. // window.location.reload();
  405. // document.body.innerHTML = oldContent;
  406. // return false;
  407. },
  408. changepreviewIndex(type) {
  409. if (type == "add") {
  410. if (this.previewIndex == this.writeTableData.result.length - 1) {
  411. this.$message.warning("当前已经是最后一页");
  412. return;
  413. }
  414. this.previewIndex++;
  415. } else {
  416. if (this.previewIndex == 0) {
  417. this.$message.warning("当前已经是第一页");
  418. return;
  419. }
  420. this.previewIndex--;
  421. }
  422. this.$forceUpdate();
  423. },
  424. // 预览
  425. previewEvent() {
  426. this.previewIndex = 0;
  427. this.isPreview = true;
  428. },
  429. // 关闭预览
  430. closepreviewEvent() {
  431. this.isPreview = false;
  432. },
  433. // 切换类型
  434. cutType(index) {
  435. this.typeIndex = index;
  436. this.writeTableData = null;
  437. },
  438. // 生成
  439. creadEvent() {
  440. this.writeTableData = null;
  441. if (this.from.content == "") {
  442. this.$message.warning("请先输入内容");
  443. return;
  444. }
  445. if (
  446. !(
  447. this.from.writeBoxNumber ||
  448. this.from.miaoRedBoxNumber ||
  449. this.from.lastNullrow
  450. )
  451. ) {
  452. this.$message.warning("请先输入配置内容");
  453. return;
  454. }
  455. // 大 一行8个 中 一行10个 小 一行12个
  456. let data = {
  457. option: [],
  458. typeIndex: this.typeIndex,
  459. playStorkes: this.from.playStorkes,
  460. StorkesUnfold: this.from.StorkesUnfold,
  461. BoxbgType: this.from.BoxbgType,
  462. miaoRedBgcolor: this.from.miaoRedBgcolor,
  463. writeColor: this.from.writeColor,
  464. borderColor: this.from.borderColor,
  465. fontColor: this.from.fontColor,
  466. writeBoxNumber: this.from.writeBoxNumber,
  467. miaoRedBoxNumber: this.from.miaoRedBoxNumber,
  468. lastNullrow: this.from.lastNullrow,
  469. };
  470. if (this.from.fontSize == "big") {
  471. data.width = "62px";
  472. data.fontSize = "48px";
  473. data.rowNumber = 8;
  474. data.pageNumber = 9;
  475. data.marginBottom = "15px";
  476. data.playWidth = "11px";
  477. } else if (this.from.fontSize == "center") {
  478. data.width = "49px";
  479. data.fontSize = "38px";
  480. data.rowNumber = 10;
  481. data.pageNumber = 12;
  482. data.marginBottom = "8px";
  483. data.playWidth = "9px";
  484. } else {
  485. data.width = "41px";
  486. data.fontSize = "31px";
  487. data.rowNumber = 12;
  488. data.pageNumber = 14;
  489. data.marginBottom = "7px";
  490. data.playWidth = "8px";
  491. }
  492. if (
  493. this.from.writeBoxNumber < this.from.miaoRedBoxNumber &&
  494. this.typeIndex == 1
  495. ) {
  496. this.$message.warning("书写格数不能小于描红数");
  497. return;
  498. } else if (
  499. this.from.writeBoxNumber <
  500. Math.ceil(this.from.miaoRedBoxNumber / data.rowNumber) &&
  501. this.typeIndex == 0
  502. ) {
  503. this.$message.warning("书写格数不能小于描红所用行数");
  504. return;
  505. }
  506. let contentArr = this.from.content.split("\n");
  507. for (let i = 0; i < contentArr.length; i++) {
  508. if (data.typeIndex == 0) {
  509. if (contentArr[i].length == 1) {
  510. if (/^[\u4e00-\u9fa5]/.test(contentArr[i])) {
  511. let obj = {
  512. con: contentArr[i],
  513. };
  514. data.option.push(obj);
  515. }
  516. } else {
  517. for (let m = 0; m < contentArr[i].length; m++) {
  518. if (/^[\u4e00-\u9fa5]/.test(contentArr[i][m])) {
  519. let obj = {
  520. con: contentArr[i][m],
  521. };
  522. data.option.push(obj);
  523. }
  524. }
  525. }
  526. } else {
  527. let contentItem = "";
  528. for (let s = 0; s < contentArr[i].length; s++) {
  529. if (/^[\u4e00-\u9fa5]/.test(contentArr[i][s])) {
  530. contentItem += contentArr[i][s];
  531. }
  532. }
  533. if (contentItem) data.option.push(contentItem);
  534. }
  535. }
  536. // 字模式 笔顺打开
  537. if (data.typeIndex == 0) {
  538. this.loading = true;
  539. let MethodName = "hz_resource_manager-GetHZStrokesContent";
  540. data.option.forEach((item, i) => {
  541. let obj = {
  542. hz: item.con,
  543. };
  544. item.hzDetail = {
  545. hz_json: null,
  546. };
  547. getLogin(MethodName, obj)
  548. .then((res) => {
  549. this.$set(data.option[i].hzDetail, "hz_json", res);
  550. this.$forceUpdate();
  551. if (i == data.option.length - 1) {
  552. this.loading = false;
  553. }
  554. })
  555. .catch(() => {
  556. this.loading = false;
  557. });
  558. });
  559. let hzTimer = setInterval(() => {
  560. if (!this.loading) {
  561. clearInterval(hzTimer);
  562. hzTimer = null;
  563. if (data.StorkesUnfold) {
  564. let allArr = [];
  565. let timer = setInterval(() => {
  566. if (!this.loading) {
  567. data.option.forEach((item) => {
  568. let arr = [];
  569. let hzLength = 1;
  570. let arrOption = [];
  571. // 拆分字和笔画为每一项
  572. arr.push({
  573. con: item.con,
  574. hzDetail: JSON.parse(
  575. JSON.stringify(item.hzDetail.hz_json)
  576. ),
  577. });
  578. if (
  579. item.hzDetail &&
  580. item.hzDetail.hz_json &&
  581. item.hzDetail.hz_json.medians
  582. ) {
  583. hzLength += item.hzDetail.hz_json.medians.length;
  584. item.hzDetail.hz_json.medians.forEach((items, indexs) => {
  585. arr.push({
  586. con: item.con,
  587. answer: indexs + 1,
  588. hzDetail: JSON.parse(
  589. JSON.stringify(item.hzDetail.hz_json)
  590. ),
  591. });
  592. });
  593. }
  594. // 如果不满一行则补满
  595. let newarr = [];
  596. if (arr.length % data.rowNumber != 0) {
  597. let num = data.rowNumber - (arr.length % data.rowNumber);
  598. for (let i = 0; i < num; i++) {
  599. arr.push({});
  600. }
  601. if (arr.length > data.rowNumber) {
  602. newarr = this.arrSplice(arr, data.rowNumber);
  603. newarr.forEach((itemss) => {
  604. allArr.push(itemss);
  605. });
  606. } else {
  607. allArr.push(arr);
  608. }
  609. } else {
  610. allArr.push(arr);
  611. }
  612. // 添加书写行
  613. if (data.writeBoxNumber) {
  614. for (let i = 0; i < data.writeBoxNumber; i++) {
  615. let numrow = [];
  616. for (let k = 0; k < data.rowNumber; k++) {
  617. numrow.push({
  618. con: item.con,
  619. write: true,
  620. });
  621. }
  622. // 描红格
  623. if (i == 0 && data.miaoRedBoxNumber) {
  624. let m =
  625. Math.ceil(data.miaoRedBoxNumber / data.rowNumber) >
  626. data.writeBoxNumber
  627. ? data.writeBoxNumber
  628. : Math.ceil(
  629. data.miaoRedBoxNumber / data.rowNumber
  630. );
  631. for (let j = 0; j < m; j++) {
  632. let miaoArr = [];
  633. for (let l = 0; l < data.rowNumber; l++) {
  634. if (
  635. j * data.rowNumber + l <
  636. data.miaoRedBoxNumber
  637. ) {
  638. miaoArr[l] = {
  639. con: item.con,
  640. miaoRed: true,
  641. write: true,
  642. };
  643. } else {
  644. miaoArr[l] = {
  645. con: item.con,
  646. write: true,
  647. };
  648. }
  649. }
  650. arrOption.push(JSON.parse(JSON.stringify(miaoArr)));
  651. }
  652. }
  653. arrOption.push(numrow);
  654. arrOption = arrOption.slice(0, data.writeBoxNumber);
  655. }
  656. arrOption.forEach((itemA) => {
  657. allArr.push(itemA);
  658. });
  659. }
  660. });
  661. if (data.lastNullrow) {
  662. for (let i = 0; i < data.lastNullrow; i++) {
  663. let numrow = [];
  664. for (let k = 0; k < data.rowNumber; k++) {
  665. numrow.push({
  666. write: true,
  667. });
  668. }
  669. allArr.push(numrow);
  670. }
  671. }
  672. data.result = this.arrSplice(allArr, data.pageNumber);
  673. this.writeTableData = data;
  674. clearInterval(timer);
  675. timer = null;
  676. }
  677. }, 100);
  678. } else {
  679. let allArr = [];
  680. data.option.forEach((item) => {
  681. let arr = [];
  682. let arrOption = [];
  683. // 拆分字和笔画为每一项
  684. arr.push({
  685. con: item.con,
  686. hzDetail: JSON.parse(JSON.stringify(item.hzDetail.hz_json)),
  687. });
  688. // 如果不满一行则补满
  689. let newarr = [];
  690. let areadyMiao = 0;
  691. if (arr.length % data.rowNumber != 0) {
  692. let num = data.rowNumber - (arr.length % data.rowNumber);
  693. for (let i = 0; i < num; i++) {
  694. if (data.miaoRedBoxNumber && i < data.miaoRedBoxNumber) {
  695. arr.push({
  696. con: item.con,
  697. miaoRed: true,
  698. write: true,
  699. });
  700. areadyMiao++;
  701. } else {
  702. arr.push({});
  703. }
  704. }
  705. if (arr.length > data.rowNumber) {
  706. newarr = this.arrSplice(arr, data.rowNumber);
  707. newarr.forEach((itemss) => {
  708. allArr.push(itemss);
  709. });
  710. } else {
  711. allArr.push(arr);
  712. }
  713. } else {
  714. allArr.push(arr);
  715. }
  716. // 添加书写行
  717. if (data.writeBoxNumber) {
  718. for (let i = 0; i < data.writeBoxNumber; i++) {
  719. let numrow = [];
  720. for (let k = 0; k < data.rowNumber; k++) {
  721. numrow.push({
  722. con: item.con,
  723. write: true,
  724. });
  725. }
  726. // 描红格
  727. if (i == 0 && data.miaoRedBoxNumber) {
  728. let m =
  729. Math.ceil(
  730. (data.miaoRedBoxNumber - areadyMiao) / data.rowNumber
  731. ) > data.writeBoxNumber
  732. ? data.writeBoxNumber
  733. : Math.ceil(
  734. (data.miaoRedBoxNumber - areadyMiao) /
  735. data.rowNumber
  736. );
  737. for (let j = 0; j < m; j++) {
  738. let miaoArr = [];
  739. for (let l = 0; l < data.rowNumber; l++) {
  740. if (
  741. j * data.rowNumber + l <
  742. data.miaoRedBoxNumber - areadyMiao
  743. ) {
  744. miaoArr[l] = {
  745. con: item.con,
  746. miaoRed: true,
  747. write: true,
  748. };
  749. } else {
  750. miaoArr[l] = {
  751. con: item.con,
  752. write: true,
  753. };
  754. }
  755. }
  756. arrOption.push(JSON.parse(JSON.stringify(miaoArr)));
  757. }
  758. }
  759. arrOption.push(numrow);
  760. arrOption = arrOption.slice(0, data.writeBoxNumber);
  761. }
  762. arrOption.forEach((itemA) => {
  763. allArr.push(itemA);
  764. });
  765. }
  766. });
  767. if (data.lastNullrow) {
  768. for (let i = 0; i < data.lastNullrow; i++) {
  769. let numrow = [];
  770. for (let k = 0; k < data.rowNumber; k++) {
  771. numrow.push({
  772. write: true,
  773. });
  774. }
  775. allArr.push(JSON.parse(JSON.stringify(numrow)));
  776. }
  777. }
  778. data.result = this.arrSplice(allArr, data.pageNumber);
  779. this.writeTableData = data;
  780. }
  781. this.$forceUpdate();
  782. this.isCread = true;
  783. }
  784. }, 100);
  785. } else {
  786. // 处理句模式数据
  787. let allArr = [];
  788. data.option.forEach((item) => {
  789. let sentenceArr = []; // 每一句的内容
  790. let sentence = Math.ceil(item.length / data.rowNumber);
  791. for (let k = 0; k < sentence; k++) {
  792. let sentenceItem = [];
  793. for (let s = 0; s < data.rowNumber; s++) {
  794. if (k * data.rowNumber + s < item.length) {
  795. sentenceItem.push({
  796. con: item[k * data.rowNumber + s],
  797. });
  798. } else {
  799. sentenceItem.push({});
  800. }
  801. }
  802. this.loading = true;
  803. let MethodName = "hz_resource_manager-GetHZStrokesContent";
  804. sentenceItem.forEach((items, index) => {
  805. let obj = {
  806. hz: items.con,
  807. };
  808. items.hzDetail = null;
  809. getLogin(MethodName, obj)
  810. .then((res) => {
  811. this.$set(sentenceItem[index], "hzDetail", res);
  812. this.$forceUpdate();
  813. if (index == sentenceItem.length - 1) {
  814. this.loading = false;
  815. allArr.push(JSON.parse(JSON.stringify(sentenceItem)));
  816. }
  817. })
  818. .catch(() => {
  819. this.loading = false;
  820. });
  821. });
  822. }
  823. let hzTimer = setInterval(() => {
  824. if (!this.loading) {
  825. clearInterval(hzTimer);
  826. hzTimer = null;
  827. if (data.miaoRedBoxNumber > 0 && data.writeBoxNumber > 0) {
  828. let sentenceMiao = [];
  829. for (let k = 0; k < sentence; k++) {
  830. let sentenceItemMiao = [];
  831. this.loading = true;
  832. for (let s = 0; s < data.rowNumber; s++) {
  833. if (k * data.rowNumber + s < item.length) {
  834. sentenceItemMiao[s] = {
  835. con: item[k * data.rowNumber + s],
  836. miaoRed: true,
  837. };
  838. let MethodName =
  839. "hz_resource_manager-GetHZStrokesContent";
  840. getLogin(MethodName, { hz: item[k * data.rowNumber + s] })
  841. .then((res) => {
  842. this.$set(sentenceItemMiao[s], "hzDetail", {
  843. hz_json: res,
  844. });
  845. })
  846. .catch(() => {
  847. this.loading = false;
  848. });
  849. } else {
  850. sentenceItemMiao[s] = {};
  851. }
  852. }
  853. sentenceMiao.push(
  854. JSON.parse(JSON.stringify(sentenceItemMiao))
  855. );
  856. }
  857. this.loading = false;
  858. // 描红内容
  859. for (let l = 0; l < data.miaoRedBoxNumber; l++) {
  860. for (let j = 0; j < sentenceMiao.length; j++) {
  861. sentenceArr.push(
  862. JSON.parse(JSON.stringify(sentenceMiao[j]))
  863. );
  864. }
  865. }
  866. }
  867. // 书写内容
  868. if (data.writeBoxNumber > 0) {
  869. for (
  870. let w = 0;
  871. w < Number(sentence) * Number(data.writeBoxNumber);
  872. w++
  873. ) {
  874. let sentenceItemWrite = [];
  875. for (let j = 0; j < data.rowNumber; j++) {
  876. sentenceItemWrite.push({});
  877. }
  878. sentenceArr.push(
  879. JSON.parse(JSON.stringify(sentenceItemWrite))
  880. );
  881. }
  882. }
  883. sentenceArr = sentenceArr.slice(
  884. 0,
  885. Number(sentence) * Number(data.writeBoxNumber)
  886. );
  887. sentenceArr.forEach((itemS, indexS) => {
  888. allArr.push(JSON.parse(JSON.stringify(itemS)));
  889. });
  890. }
  891. });
  892. });
  893. let hzTimer = setInterval(() => {
  894. if (!this.loading) {
  895. clearInterval(hzTimer);
  896. hzTimer = null;
  897. if (data.lastNullrow > 0) {
  898. for (let t = 0; t < data.lastNullrow; t++) {
  899. let sentenceItemNull = [];
  900. for (let j = 0; j < data.rowNumber; j++) {
  901. sentenceItemNull.push({});
  902. }
  903. allArr.push(JSON.parse(JSON.stringify(sentenceItemNull)));
  904. }
  905. }
  906. data.result = this.arrSplice(allArr, data.pageNumber);
  907. this.writeTableData = data;
  908. this.$forceUpdate();
  909. this.isCread = true;
  910. }
  911. });
  912. }
  913. // // 定时 接口请求结束再执行
  914. // let hzTimer = setInterval(() => {
  915. // if (!this.loading) {
  916. // clearInterval(hzTimer);
  917. // hzTimer = null;
  918. // if (data.typeIndex == 0) {
  919. // if (data.StorkesUnfold) {
  920. // let allArr = [];
  921. // let timer = setInterval(() => {
  922. // if (!this.loading) {
  923. // data.option.forEach((item) => {
  924. // let arr = [];
  925. // let hzLength = 1;
  926. // let arrOption = [];
  927. // // 拆分字和笔画为每一项
  928. // arr.push({
  929. // con: item.con,
  930. // hzDetail: JSON.parse(
  931. // JSON.stringify(item.hzDetail.hz_json)
  932. // ),
  933. // });
  934. // if (
  935. // item.hzDetail &&
  936. // item.hzDetail.hz_json &&
  937. // item.hzDetail.hz_json.medians
  938. // ) {
  939. // hzLength += item.hzDetail.hz_json.medians.length;
  940. // item.hzDetail.hz_json.medians.forEach((items, indexs) => {
  941. // arr.push({
  942. // con: item.con,
  943. // answer: indexs + 1,
  944. // hzDetail: JSON.parse(
  945. // JSON.stringify(item.hzDetail.hz_json)
  946. // ),
  947. // });
  948. // });
  949. // }
  950. // // 如果不满一行则补满
  951. // let newarr = [];
  952. // if (arr.length % data.rowNumber != 0) {
  953. // let num = data.rowNumber - (arr.length % data.rowNumber);
  954. // for (let i = 0; i < num; i++) {
  955. // arr.push({});
  956. // }
  957. // if (arr.length > data.rowNumber) {
  958. // newarr = this.arrSplice(arr, data.rowNumber);
  959. // newarr.forEach((itemss) => {
  960. // allArr.push(itemss);
  961. // });
  962. // } else {
  963. // allArr.push(arr);
  964. // }
  965. // } else {
  966. // allArr.push(arr);
  967. // }
  968. // // 添加书写行
  969. // if (data.writeBoxNumber) {
  970. // for (let i = 0; i < data.writeBoxNumber; i++) {
  971. // let numrow = [];
  972. // for (let k = 0; k < data.rowNumber; k++) {
  973. // numrow.push({
  974. // con: item.con,
  975. // write: true,
  976. // });
  977. // }
  978. // // 描红格
  979. // if (i == 0 && data.miaoRedBoxNumber) {
  980. // let m =
  981. // Math.ceil(data.miaoRedBoxNumber / data.rowNumber) >
  982. // data.writeBoxNumber
  983. // ? data.writeBoxNumber
  984. // : Math.ceil(
  985. // data.miaoRedBoxNumber / data.rowNumber
  986. // );
  987. // for (let j = 0; j < m; j++) {
  988. // let miaoArr = [];
  989. // for (let l = 0; l < data.rowNumber; l++) {
  990. // if (
  991. // j * data.rowNumber + l <
  992. // data.miaoRedBoxNumber
  993. // ) {
  994. // miaoArr[l] = {
  995. // con: item.con,
  996. // miaoRed: true,
  997. // write: true,
  998. // };
  999. // } else {
  1000. // miaoArr[l] = {
  1001. // con: item.con,
  1002. // write: true,
  1003. // };
  1004. // }
  1005. // }
  1006. // arrOption.push(JSON.parse(JSON.stringify(miaoArr)));
  1007. // }
  1008. // }
  1009. // arrOption.push(numrow);
  1010. // arrOption = arrOption.slice(0, data.writeBoxNumber);
  1011. // }
  1012. // arrOption.forEach((itemA) => {
  1013. // allArr.push(itemA);
  1014. // });
  1015. // }
  1016. // });
  1017. // if (data.lastNullrow) {
  1018. // for (let i = 0; i < data.lastNullrow; i++) {
  1019. // let numrow = [];
  1020. // for (let k = 0; k < data.rowNumber; k++) {
  1021. // numrow.push({
  1022. // write: true,
  1023. // });
  1024. // }
  1025. // allArr.push(numrow);
  1026. // }
  1027. // }
  1028. // data.result = this.arrSplice(allArr, data.pageNumber);
  1029. // this.writeTableData = data;
  1030. // clearInterval(timer);
  1031. // timer = null;
  1032. // }
  1033. // }, 100);
  1034. // } else {
  1035. // let allArr = [];
  1036. // data.option.forEach((item) => {
  1037. // let arr = [];
  1038. // let arrOption = [];
  1039. // // 拆分字和笔画为每一项
  1040. // arr.push({
  1041. // con: item.con,
  1042. // hzDetail: JSON.parse(JSON.stringify(item.hzDetail.hz_json)),
  1043. // });
  1044. // // 如果不满一行则补满
  1045. // let newarr = [];
  1046. // let areadyMiao = 0;
  1047. // if (arr.length % data.rowNumber != 0) {
  1048. // let num = data.rowNumber - (arr.length % data.rowNumber);
  1049. // for (let i = 0; i < num; i++) {
  1050. // if (data.miaoRedBoxNumber && i < data.miaoRedBoxNumber) {
  1051. // arr.push({
  1052. // con: item.con,
  1053. // miaoRed: true,
  1054. // write: true,
  1055. // });
  1056. // areadyMiao++;
  1057. // } else {
  1058. // arr.push({});
  1059. // }
  1060. // }
  1061. // if (arr.length > data.rowNumber) {
  1062. // newarr = this.arrSplice(arr, data.rowNumber);
  1063. // newarr.forEach((itemss) => {
  1064. // allArr.push(itemss);
  1065. // });
  1066. // } else {
  1067. // allArr.push(arr);
  1068. // }
  1069. // } else {
  1070. // allArr.push(arr);
  1071. // }
  1072. // // 添加书写行
  1073. // if (data.writeBoxNumber) {
  1074. // for (let i = 0; i < data.writeBoxNumber; i++) {
  1075. // let numrow = [];
  1076. // for (let k = 0; k < data.rowNumber; k++) {
  1077. // numrow.push({
  1078. // con: item.con,
  1079. // write: true,
  1080. // });
  1081. // }
  1082. // // 描红格
  1083. // if (i == 0 && data.miaoRedBoxNumber) {
  1084. // let m =
  1085. // Math.ceil(
  1086. // (data.miaoRedBoxNumber - areadyMiao) / data.rowNumber
  1087. // ) > data.writeBoxNumber
  1088. // ? data.writeBoxNumber
  1089. // : Math.ceil(
  1090. // (data.miaoRedBoxNumber - areadyMiao) /
  1091. // data.rowNumber
  1092. // );
  1093. // for (let j = 0; j < m; j++) {
  1094. // let miaoArr = [];
  1095. // for (let l = 0; l < data.rowNumber; l++) {
  1096. // if (
  1097. // j * data.rowNumber + l <
  1098. // data.miaoRedBoxNumber - areadyMiao
  1099. // ) {
  1100. // miaoArr[l] = {
  1101. // con: item.con,
  1102. // miaoRed: true,
  1103. // write: true,
  1104. // };
  1105. // } else {
  1106. // miaoArr[l] = {
  1107. // con: item.con,
  1108. // write: true,
  1109. // };
  1110. // }
  1111. // }
  1112. // arrOption.push(JSON.parse(JSON.stringify(miaoArr)));
  1113. // }
  1114. // }
  1115. // arrOption.push(numrow);
  1116. // arrOption = arrOption.slice(0, data.writeBoxNumber);
  1117. // }
  1118. // arrOption.forEach((itemA) => {
  1119. // allArr.push(itemA);
  1120. // });
  1121. // }
  1122. // });
  1123. // if (data.lastNullrow) {
  1124. // for (let i = 0; i < data.lastNullrow; i++) {
  1125. // let numrow = [];
  1126. // for (let k = 0; k < data.rowNumber; k++) {
  1127. // numrow.push({
  1128. // write: true,
  1129. // });
  1130. // }
  1131. // allArr.push(JSON.parse(JSON.stringify(numrow)));
  1132. // }
  1133. // }
  1134. // data.result = this.arrSplice(allArr, data.pageNumber);
  1135. // this.writeTableData = data;
  1136. // }
  1137. // } else {
  1138. // // 处理句模式数据
  1139. // let allArr = [];
  1140. // data.option.forEach((item) => {
  1141. // let sentenceArr = []; // 每一句的内容
  1142. // let sentence = Math.ceil(item.length / data.rowNumber);
  1143. // for (let k = 0; k < sentence; k++) {
  1144. // let sentenceItem = [];
  1145. // for (let s = 0; s < data.rowNumber; s++) {
  1146. // if (k * data.rowNumber + s < item.length) {
  1147. // sentenceItem.push({
  1148. // con: item[k * data.rowNumber + s],
  1149. // });
  1150. // } else {
  1151. // sentenceItem.push({});
  1152. // }
  1153. // }
  1154. // this.loading = true;
  1155. // let MethodName = "hz_resource_manager-GetHZStrokesContent";
  1156. // sentenceItem.forEach((items, index) => {
  1157. // let obj = {
  1158. // hz: items.con,
  1159. // };
  1160. // if (items.con) {
  1161. // items.hzDetail = {
  1162. // hz_json: null,
  1163. // };
  1164. // }
  1165. // getLogin(MethodName, obj)
  1166. // .then((res) => {
  1167. // if (items.con) {
  1168. // this.$set(sentenceItem[index].hzDetail, "hz_json", res);
  1169. // this.$forceUpdate();
  1170. // }
  1171. // if (index == sentenceItem.length - 1) {
  1172. // this.loading = false;
  1173. // allArr.push(JSON.parse(JSON.stringify(sentenceItem)));
  1174. // console.log(allArr);
  1175. // }
  1176. // })
  1177. // .catch(() => {
  1178. // this.loading = false;
  1179. // });
  1180. // });
  1181. // }
  1182. // if (data.miaoRedBoxNumber > 0 && data.writeBoxNumber > 0) {
  1183. // let sentenceMiao = [];
  1184. // for (let k = 0; k < sentence; k++) {
  1185. // let sentenceItemMiao = [];
  1186. // this.loading = true;
  1187. // for (let s = 0; s < data.rowNumber; s++) {
  1188. // if (k * data.rowNumber + s < item.length) {
  1189. // sentenceItemMiao[s] = {
  1190. // con: item[k * data.rowNumber + s],
  1191. // miaoRed: true,
  1192. // };
  1193. // let MethodName =
  1194. // "hz_resource_manager-GetHZStrokesContent";
  1195. // getLogin(MethodName, { hz: item[k * data.rowNumber + s] })
  1196. // .then((res) => {
  1197. // this.$set(sentenceItemMiao[s], "hzDetail", {
  1198. // hz_json: res,
  1199. // });
  1200. // })
  1201. // .catch(() => {
  1202. // this.loading = false;
  1203. // });
  1204. // } else {
  1205. // sentenceItemMiao[s] = {};
  1206. // }
  1207. // }
  1208. // sentenceMiao.push(
  1209. // JSON.parse(JSON.stringify(sentenceItemMiao))
  1210. // );
  1211. // }
  1212. // this.loading = false;
  1213. // // 描红内容
  1214. // for (let l = 0; l < data.miaoRedBoxNumber; l++) {
  1215. // for (let j = 0; j < sentenceMiao.length; j++) {
  1216. // sentenceArr.push(
  1217. // JSON.parse(JSON.stringify(sentenceMiao[j]))
  1218. // );
  1219. // }
  1220. // }
  1221. // }
  1222. // // 书写内容
  1223. // if (data.writeBoxNumber > 0) {
  1224. // for (
  1225. // let w = 0;
  1226. // w < Number(sentence) * Number(data.writeBoxNumber);
  1227. // w++
  1228. // ) {
  1229. // let sentenceItemWrite = [];
  1230. // for (let j = 0; j < data.rowNumber; j++) {
  1231. // sentenceItemWrite.push({});
  1232. // }
  1233. // sentenceArr.push(
  1234. // JSON.parse(JSON.stringify(sentenceItemWrite))
  1235. // );
  1236. // }
  1237. // }
  1238. // sentenceArr = sentenceArr.slice(
  1239. // 0,
  1240. // Number(sentence) * Number(data.writeBoxNumber)
  1241. // );
  1242. // sentenceArr.forEach((itemS, indexS) => {
  1243. // allArr.push(JSON.parse(JSON.stringify(itemS)));
  1244. // });
  1245. // });
  1246. // if (data.lastNullrow > 0) {
  1247. // for (let t = 0; t < data.lastNullrow; t++) {
  1248. // let sentenceItemNull = [];
  1249. // for (let j = 0; j < data.rowNumber; j++) {
  1250. // sentenceItemNull.push({});
  1251. // }
  1252. // allArr.push(JSON.parse(JSON.stringify(sentenceItemNull)));
  1253. // }
  1254. // }
  1255. // data.result = this.arrSplice(allArr, data.pageNumber);
  1256. // this.writeTableData = data;
  1257. // }
  1258. // this.$forceUpdate();
  1259. // this.isCread = true;
  1260. // }
  1261. // }, 100);
  1262. },
  1263. arrSplice(arr, chunkSize) {
  1264. //定义一个空数组来接收返回值
  1265. const resSplice = [];
  1266. while (arr.length > 0) {
  1267. //注意:splice方法的返回值为删除的值,在这边即为原数组中切割掉的index为0-chunkSize的值
  1268. const chunk = arr.splice(0, chunkSize);
  1269. //将返回值添加到resSplice数组
  1270. resSplice.push(chunk);
  1271. }
  1272. //return出去
  1273. return resSplice;
  1274. },
  1275. // 字句详情
  1276. getdetai() {
  1277. this.loading = true;
  1278. let Mname = "tr_tool-wsc_manager-GetWordSentenceCard";
  1279. LearnWebSI(Mname, {
  1280. id: this.$route.query.id,
  1281. })
  1282. .then((res) => {
  1283. this.saveName = res.name;
  1284. this.from.content = res.text;
  1285. this.writeTableData = JSON.parse(res.content);
  1286. // 初始化 from 表单
  1287. for (let key in this.from) {
  1288. if (this.writeTableData[key]) {
  1289. if (key == "fontSize") {
  1290. if (this.writeTableData[key] == "48px") {
  1291. this.from[key] = "big";
  1292. } else if (this.writeTableData[key] == "38px") {
  1293. this.from[key] = "center";
  1294. } else {
  1295. this.from[key] = "little";
  1296. }
  1297. } else {
  1298. this.from[key] = this.writeTableData[key];
  1299. }
  1300. }
  1301. }
  1302. if (res.type == "WORD") {
  1303. this.typeIndex = 0;
  1304. } else {
  1305. this.typeIndex = 1;
  1306. }
  1307. this.loading = false;
  1308. this.isCread = true;
  1309. })
  1310. .catch((res) => {
  1311. this.loading = false;
  1312. });
  1313. },
  1314. },
  1315. //生命周期 - 创建完成(可以访问当前this实例)
  1316. created() {},
  1317. //生命周期 - 挂载完成(可以访问DOM元素)
  1318. mounted() {},
  1319. //生命周期-创建之前
  1320. beforeCreated() {},
  1321. //生命周期-挂载之前
  1322. beforeMount() {},
  1323. //生命周期-更新之前
  1324. beforUpdate() {},
  1325. //生命周期-更新之后
  1326. updated() {},
  1327. //生命周期-销毁之前
  1328. beforeDestory() {},
  1329. //生命周期-销毁完成
  1330. destoryed() {},
  1331. //如果页面有keep-alive缓存功能,这个函数会触发
  1332. activated() {
  1333. if (this.$route.query.cachesType == "pop") {
  1334. this.saveName = "";
  1335. this.typeIndex = 0;
  1336. this.from = {
  1337. content: "",
  1338. BoxbgType: 0,
  1339. fontSize: "center",
  1340. playStorkes: true,
  1341. StorkesUnfold: true,
  1342. writeBoxNumber: "0", //书写行
  1343. miaoRedBoxNumber: "0", //描红格
  1344. lastNullrow: "0", //文本末空行数
  1345. miaoRedBgcolor: "#E1E1E1", //描红底色
  1346. writeColor: "#000000", //书写颜色
  1347. borderColor: "#D65353", //边框颜色
  1348. fontColor: "#000000", //文字颜色
  1349. };
  1350. this.loading = false;
  1351. this.writeTableData = null;
  1352. this.isCread = false;
  1353. this.isPreview = false;
  1354. this.previewIndex = 0;
  1355. this.htmlTitle = "1";
  1356. this.saveShow = false;
  1357. this.writetableShow = true;
  1358. if (this.$route.query.id) {
  1359. // 需要请求详情接口
  1360. this.getdetai();
  1361. }
  1362. }
  1363. },
  1364. };
  1365. </script>
  1366. <style lang="scss" scoped>
  1367. /* @import url(); 引入css类 */
  1368. .cread {
  1369. height: 100%;
  1370. position: relative;
  1371. .main {
  1372. min-height: 100%;
  1373. background: #f7f7f7;
  1374. padding: 24px 0;
  1375. .from {
  1376. width: 1200px;
  1377. margin: 0 auto;
  1378. background: #ffffff;
  1379. border-radius: 8px;
  1380. padding: 16px 24px 24px 18px;
  1381. box-sizing: border-box;
  1382. .type {
  1383. display: flex;
  1384. width: 108px;
  1385. height: 28px;
  1386. background: #eeeeee;
  1387. border-radius: 4px;
  1388. padding: 2px;
  1389. > div {
  1390. width: 52px;
  1391. font-weight: 400;
  1392. font-size: 12px;
  1393. line-height: 28px;
  1394. text-align: center;
  1395. color: #888888;
  1396. cursor: pointer;
  1397. }
  1398. .sele {
  1399. font-weight: 500;
  1400. line-height: 28px;
  1401. font-size: 12px;
  1402. text-align: center;
  1403. color: #000000;
  1404. background: #ffffff;
  1405. box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.08);
  1406. border-radius: 2px;
  1407. }
  1408. }
  1409. .from_main {
  1410. margin-top: 12px;
  1411. display: flex;
  1412. .left {
  1413. width: 668px;
  1414. .submit {
  1415. display: flex;
  1416. justify-content: flex-end;
  1417. span {
  1418. margin-top: 16px;
  1419. display: inline-block;
  1420. width: 80px;
  1421. height: 40px;
  1422. background: #669aff;
  1423. border-radius: 4px;
  1424. font-weight: 500;
  1425. font-size: 16px;
  1426. display: flex;
  1427. align-items: center;
  1428. justify-content: center;
  1429. color: #ffffff;
  1430. cursor: pointer;
  1431. }
  1432. }
  1433. }
  1434. .right {
  1435. flex: 1;
  1436. margin-left: 24px;
  1437. > .title {
  1438. font-weight: 400;
  1439. font-size: 14px;
  1440. line-height: 20px;
  1441. color: #000000;
  1442. }
  1443. .dv {
  1444. margin-top: 8px;
  1445. width: 466px;
  1446. height: 48px;
  1447. background: #f0f0f0;
  1448. border-radius: 8px;
  1449. display: flex;
  1450. align-items: center;
  1451. padding: 0 16px;
  1452. .title {
  1453. margin-right: 8px;
  1454. }
  1455. > span {
  1456. font-weight: 400;
  1457. font-size: 14px;
  1458. line-height: 20px;
  1459. }
  1460. }
  1461. }
  1462. }
  1463. }
  1464. .operation {
  1465. width: 1200px;
  1466. height: 72px;
  1467. margin: 24px auto 0 auto;
  1468. background: #ffffff;
  1469. border-radius: 8px;
  1470. display: flex;
  1471. justify-content: center;
  1472. align-items: center;
  1473. div {
  1474. width: 96px;
  1475. height: 40px;
  1476. background: #ffffff;
  1477. border: 1px solid rgba(0, 0, 0, 0.08);
  1478. border-radius: 4px;
  1479. display: flex;
  1480. justify-content: center;
  1481. align-items: center;
  1482. cursor: pointer;
  1483. margin-right: 16px;
  1484. img {
  1485. width: 24px;
  1486. height: 24px;
  1487. margin-right: 8px;
  1488. }
  1489. }
  1490. }
  1491. .word_main {
  1492. width: 1200px;
  1493. margin: 0 auto;
  1494. display: flex;
  1495. flex-flow: wrap;
  1496. justify-content: space-between;
  1497. &_table {
  1498. margin-top: 10px;
  1499. }
  1500. }
  1501. }
  1502. .preview_dv {
  1503. position: absolute;
  1504. left: 0;
  1505. top: 64px;
  1506. width: 100%;
  1507. min-height: 100%;
  1508. background: #f2f2f2;
  1509. > img {
  1510. width: 40px;
  1511. height: 40px;
  1512. cursor: pointer;
  1513. position: absolute;
  1514. top: 24px;
  1515. right: 31px;
  1516. }
  1517. .preview_main {
  1518. padding: 24px 0;
  1519. width: 740px;
  1520. margin: 0 auto;
  1521. display: flex;
  1522. align-items: center;
  1523. height: 100%;
  1524. > div {
  1525. margin: 0 24px;
  1526. }
  1527. img {
  1528. width: 48px;
  1529. height: 48px;
  1530. cursor: pointer;
  1531. }
  1532. }
  1533. }
  1534. }
  1535. </style>
  1536. <style lang="scss">
  1537. .cread {
  1538. .from_main {
  1539. // input
  1540. .el-textarea__inner {
  1541. height: 388px;
  1542. }
  1543. // 单选
  1544. .el-radio {
  1545. margin-right: 46px;
  1546. }
  1547. .el-radio__inner {
  1548. border: 1px solid #000000;
  1549. }
  1550. .el-radio__inner:hover {
  1551. border: 1px solid #000000;
  1552. }
  1553. .el-radio__input.is-checked .el-radio__inner {
  1554. background-color: #fff;
  1555. }
  1556. .el-radio__inner::after {
  1557. background-color: #000000;
  1558. width: 6px;
  1559. height: 6px;
  1560. }
  1561. .el-radio,
  1562. .el-radio__input.is-checked + .el-radio__label {
  1563. color: #000000;
  1564. }
  1565. // 选择颜色
  1566. .el-color-picker__trigger {
  1567. background: #fff;
  1568. }
  1569. .el-color-picker__trigger {
  1570. height: 32px;
  1571. width: 60px;
  1572. }
  1573. .el-color-picker__empty,
  1574. .el-color-picker__icon {
  1575. left: 134%;
  1576. }
  1577. .el-color-picker__icon {
  1578. color: gray;
  1579. left: 77%;
  1580. }
  1581. .el-color-picker__color {
  1582. border: none;
  1583. width: 28px;
  1584. }
  1585. .el-color-picker__color-inner {
  1586. border-radius: 2px;
  1587. }
  1588. // 开关
  1589. .el-switch__core {
  1590. width: 26px !important;
  1591. height: 16px;
  1592. }
  1593. .el-switch__core:after {
  1594. width: 8px;
  1595. height: 8px;
  1596. top: 2px;
  1597. }
  1598. .el-switch.is-checked .el-switch__core::after {
  1599. margin-left: -10px;
  1600. }
  1601. .el-switch__label.is-active {
  1602. color: #000000;
  1603. }
  1604. .numbre-input {
  1605. .el-input__inner {
  1606. padding: 0;
  1607. text-align: center;
  1608. }
  1609. }
  1610. }
  1611. }
  1612. </style>