Index.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div class="card-exchange-view">
  3. <card-view
  4. ref="CardView"
  5. class="card-preview"
  6. :pages="pages"
  7. :card-config="cardConfig"
  8. ></card-view>
  9. <!-- 卡格式 -->
  10. <div class="card-spin-container card-preview">
  11. <template v-for="(page, pageNo) in pages">
  12. <div
  13. :class="['page-box', `page-box-${cardConfig.pageSize}`]"
  14. :key="pageNo"
  15. >
  16. <div
  17. v-for="(item, index) in page.spins"
  18. :key="index"
  19. class="element-spin"
  20. :style="item.style"
  21. ></div>
  22. </div>
  23. </template>
  24. </div>
  25. </div>
  26. </template>
  27. <script>
  28. import CardView from "../../card/components/CardView";
  29. import { cardDetail } from "../../src/modules/card/api";
  30. export default {
  31. name: "card-exchange-view",
  32. components: { CardView },
  33. data() {
  34. return { cardConfig: {}, pages: [] };
  35. },
  36. mounted() {
  37. this.initData();
  38. },
  39. methods: {
  40. async initData() {
  41. const cardId = this.$route.params.cardId;
  42. if (!cardId) return;
  43. const detData = await cardDetail(cardId);
  44. if (!detData.content) return;
  45. const { cardConfig, pages } = JSON.parse(detData.content);
  46. this.cardConfig = cardConfig;
  47. this.pages = pages.map((page) => {
  48. page.spins = this.parseSpins(page);
  49. return page;
  50. });
  51. },
  52. parseSpins(page) {
  53. const spins = [];
  54. const getPercentNum = (num) => {
  55. return num * 100 + "%";
  56. };
  57. const transformData = (dataList) => {
  58. dataList.forEach((item) => {
  59. spins.push({
  60. style: {
  61. left: getPercentNum(item[0]),
  62. top: getPercentNum(item[1]),
  63. width: getPercentNum(item[2]),
  64. height: getPercentNum(item[3]),
  65. },
  66. });
  67. });
  68. };
  69. const { locator, barcode, fill_area, answer_area } = page.exchange;
  70. const locators = [...locator.top, ...locator.bottom];
  71. transformData(locators);
  72. transformData(barcode.map((item) => item.area));
  73. // transformData(info_area);
  74. fill_area.forEach((farea) => {
  75. farea.items.forEach((fitem) => {
  76. transformData(fitem.options);
  77. });
  78. });
  79. transformData(answer_area.map((item) => item.area));
  80. return spins;
  81. },
  82. },
  83. };
  84. </script>
  85. <style lang="scss">
  86. .card-exchange-view {
  87. .element-spin {
  88. position: absolute;
  89. background: rgba(254, 93, 78, 0.5);
  90. z-index: auto;
  91. }
  92. .card-spin-container {
  93. position: absolute;
  94. width: 100%;
  95. top: 0;
  96. left: 0;
  97. z-index: 9;
  98. padding: 10px 0;
  99. background: transparent;
  100. .page-box {
  101. background: transparent;
  102. box-shadow: none;
  103. }
  104. }
  105. }
  106. </style>