CardPreview.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div :class="classes">
  3. <div v-if="IS_COMMON_CARD" class="preview-frame" id="preview-frame"></div>
  4. <card-view
  5. v-if="!IS_COMMON_CARD && pages.length"
  6. ref="CardView"
  7. class="preview-body"
  8. :pages="pages"
  9. :card-config="cardConfig"
  10. ></card-view>
  11. </div>
  12. </template>
  13. <script>
  14. import CardView from "../components/CardView";
  15. import { cardDetail } from "../api";
  16. import { deepCopy } from "../plugins/utils";
  17. const JsBarcode = require("jsbarcode");
  18. export default {
  19. name: "card-preview",
  20. components: { CardView },
  21. data() {
  22. return {
  23. isPrint: this.$route.params.viewType !== "view",
  24. isFrame: this.$route.params.viewType === "frame",
  25. cardId: this.$route.params.cardId,
  26. cardConfig: {},
  27. pages: [],
  28. IS_COMMON_CARD: false
  29. };
  30. },
  31. computed: {
  32. classes() {
  33. return [
  34. "card-preview",
  35. {
  36. "card-print": this.isPrint
  37. }
  38. ];
  39. }
  40. },
  41. mounted() {
  42. if (this.isFrame) {
  43. this.initFrame();
  44. } else {
  45. this.init();
  46. }
  47. },
  48. methods: {
  49. initFrame() {
  50. const cardData = window.parent.cardData;
  51. if (!cardData) return;
  52. const { cardConfig, pages } = deepCopy(cardData);
  53. let fieldInfos = {};
  54. [...cardConfig.requiredFields, ...cardConfig.extendFields]
  55. .filter(item => item.enable)
  56. .map(item => {
  57. fieldInfos[item.code] = "${" + item.code + "}";
  58. });
  59. if (cardConfig.examNumberStyle === "PRINT") {
  60. fieldInfos.examNumber = "data:image/png;base64,${examNumber}";
  61. fieldInfos.examNumberStr = "${examNumberStr}";
  62. }
  63. if (cardConfig.aOrB && cardConfig.paperType === "PRINT") {
  64. fieldInfos.paperType = "data:image/png;base64,${paperType}";
  65. fieldInfos.paperTypeName = "${paperTypeName}";
  66. }
  67. this.cardConfig = cardConfig;
  68. this.pages = this.appendFieldInfo(pages, fieldInfos);
  69. this.$nextTick(() => {
  70. const cardContentTemp = this.$refs.CardView.getPreviewTemp(
  71. this.$el.outerHTML
  72. );
  73. const model = this.$refs.CardView.getPageModel(cardData);
  74. window.parent &&
  75. window.parent.submitCardTemp &&
  76. window.parent.submitCardTemp(cardContentTemp, model);
  77. });
  78. },
  79. async init() {
  80. const detData = await cardDetail(this.cardId);
  81. this.IS_COMMON_CARD = detData.type === "GENERIC";
  82. // 通卡展示
  83. if (this.IS_COMMON_CARD) {
  84. // TODO:通卡展示逻辑要调整
  85. this.$nextTick(() => {
  86. this.initHtmlTemp(detData.htmlContent);
  87. });
  88. return;
  89. }
  90. // 常规卡展示
  91. if (!detData.content) {
  92. this.$message.error("很抱歉,当前题卡还没开始制作!");
  93. return;
  94. }
  95. const { cardConfig, pages } = JSON.parse(detData.content);
  96. const fieldInfos = this.fetchFieldInfos(cardConfig, {});
  97. this.cardConfig = cardConfig;
  98. this.pages = this.appendFieldInfo(pages, fieldInfos);
  99. },
  100. initHtmlTemp(htmlTemp) {
  101. const iframeDom = document.createElement("iframe");
  102. document.getElementById("preview-frame").appendChild(iframeDom);
  103. const wwidth = window.innerWidth - 10;
  104. const wheight = window.innerHeight - 10;
  105. iframeDom.style.cssText = `width: ${wwidth}px;height: ${wheight}px;border:none;outline:none;`;
  106. const iframeDoc = iframeDom.contentDocument;
  107. iframeDoc.open();
  108. iframeDoc.write(htmlTemp);
  109. iframeDoc.close();
  110. },
  111. fetchFieldInfos(cardConfig, stdInfo) {
  112. let fieldInfos = {};
  113. const defContent = "相关信息";
  114. const defNumber = "123456789";
  115. [...cardConfig.requiredFields, ...cardConfig.extendFields]
  116. .filter(item => item.enable)
  117. .map(item => {
  118. fieldInfos[item.code] = stdInfo[item.code] || defContent;
  119. });
  120. if (cardConfig.examNumberStyle === "PRINT") {
  121. fieldInfos.examNumber = this.getBase64Barcode(
  122. stdInfo["examNumber"] || defNumber
  123. );
  124. fieldInfos.examNumberStr = stdInfo["examNumber"] || defNumber;
  125. }
  126. if (cardConfig.aOrB && cardConfig.paperType === "PRINT") {
  127. fieldInfos.paperType = this.getBase64Barcode(
  128. stdInfo["paperType"] || defNumber
  129. );
  130. fieldInfos.paperTypeName = stdInfo["paperTypeName"] || "A";
  131. }
  132. return fieldInfos;
  133. },
  134. getBase64Barcode(str) {
  135. const canvas = document.createElement("CANVAS");
  136. JsBarcode(canvas, str, {
  137. width: 2,
  138. height: 30,
  139. displayValue: false,
  140. marginLeft: 20,
  141. marginRight: 20,
  142. marginTop: 0,
  143. marginBottom: 0
  144. });
  145. return canvas.toDataURL();
  146. },
  147. appendFieldInfo(pages, fieldInfos) {
  148. pages.forEach((page, pageNo) => {
  149. if (pageNo % 2) return;
  150. const cardHeadElement = page.columns[0].elements[0];
  151. if (cardHeadElement.type === "CARD_HEAD") {
  152. cardHeadElement.fieldInfos = fieldInfos;
  153. }
  154. });
  155. return pages;
  156. }
  157. }
  158. };
  159. </script>