index.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { defineComponent, nextTick, onMounted, reactive } from "vue";
  2. import state, { EnumMusicRenderType } from "/src/state";
  3. import MusicScore from "../music-score";
  4. import styles from "./index.module.less";
  5. import { getQuery } from "/src/utils/queryString";
  6. import { closeToast, showLoadingToast } from "vant";
  7. import { svg2canvas } from "/src/utils/svg2canvas";
  8. import { moveGracePosition } from "/src/helpers/customMusicScore"
  9. export default defineComponent({
  10. name: "transfer-to-img",
  11. setup() {
  12. const query: any = getQuery();
  13. const productRenderType = "productRenderType"
  14. const detailData = reactive({
  15. isLoading: true,
  16. isProductLoading: false,
  17. step: 0,
  18. product: [
  19. {
  20. state: false,
  21. name: "五线谱",
  22. type: EnumMusicRenderType.staff,
  23. base64: "" as any,
  24. },
  25. {
  26. state: false,
  27. name: "首调",
  28. type: EnumMusicRenderType.firstTone,
  29. base64: "" as any,
  30. },
  31. {
  32. state: false,
  33. name: "固定调",
  34. type: EnumMusicRenderType.fixedTone,
  35. base64: "" as any,
  36. },
  37. ],
  38. isSpecialXml: false, // TODO:是否是摇篮曲(节奏练习)的曲子
  39. });
  40. onMounted(() => {
  41. (window as any).appName = "colexiu";
  42. state.isSingleLine = false;
  43. state.isCreateImg = true;
  44. state.isEvxml = true;
  45. state.xmlUrl = decodeURIComponent(query.xmlUrl);
  46. const specialXmls = ['https://oss.dayaedu.com/MECMP/1715332965751.xml','https://oss.dayaedu.com/MECMP/1715326622946.xml'];
  47. if (specialXmls.includes(state.xmlUrl)) {
  48. detailData.isSpecialXml = true;
  49. }
  50. //课堂乐器,默认简谱
  51. sessionStorage.setItem(productRenderType, detailData.product[detailData.step].type);
  52. state.musicRenderType = detailData.product[detailData.step].type
  53. showLoadingToast({ message: "生成中", duration: 0 });
  54. setTimeout(() => {
  55. detailData.isLoading = false;
  56. }, 500);
  57. });
  58. /** 渲染完成 */
  59. const handleRendered = async () => {
  60. if (document.getElementById('scrollContainer')) {
  61. moveGracePosition(detailData.isSpecialXml);
  62. }
  63. detailData.product[detailData.step].state = true;
  64. detailData.product[detailData.step].base64 = await downPng();
  65. try {
  66. console.log(JSON.parse(JSON.stringify(detailData.product)), detailData.step);
  67. } catch (error) {}
  68. detailData.step += 1;
  69. if (detailData.step !== detailData.product.length) {
  70. //课堂乐器,默认简谱
  71. sessionStorage.setItem(productRenderType, detailData.product[detailData.step].type);
  72. state.musicRenderType = detailData.product[detailData.step].type
  73. nextTick(() => {
  74. detailData.isLoading = true;
  75. setTimeout(() => {
  76. detailData.isLoading = false;
  77. }, 500);
  78. });
  79. return;
  80. }
  81. closeToast();
  82. console.log(detailData.product,123456);
  83. window.parent?.postMessage(
  84. {
  85. api: "webApi_renderSvg",
  86. product: JSON.stringify(detailData.product),
  87. },
  88. "*"
  89. );
  90. };
  91. const downPng = () => {
  92. return new Promise((resolve) => {
  93. setTimeout(async () => {
  94. try {
  95. const svg: any = document.getElementById("osmdSvgPage1")?.cloneNode(true);
  96. if (!svg) {
  97. resolve("");
  98. return;
  99. }
  100. const cw = svg.width.animVal.value;
  101. const ch = svg.height.animVal.value;
  102. const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
  103. rect.setAttribute("x", "0");
  104. rect.setAttribute("y", "0");
  105. rect.setAttribute("width", `${cw * 2}`);
  106. rect.setAttribute("height", `${ch * 2}`);
  107. rect.setAttribute("fill", "#fff");
  108. svg.prepend(rect);
  109. const _canvas = svg2canvas(svg.outerHTML);
  110. const base64 = _canvas.toDataURL("image/png", 1);
  111. resolve(base64);
  112. } catch (error) {
  113. resolve("");
  114. }
  115. }, 500);
  116. });
  117. };
  118. return () => (
  119. <div class={styles.detail}>
  120. <div id="scrollContainer" class={[styles.container, "hideCursor"]}>
  121. {/* 曲谱渲染 */}
  122. {!detailData.isLoading && <MusicScore renderTypeKey={productRenderType} showSelection={false} onRendered={handleRendered} />}
  123. </div>
  124. </div>
  125. );
  126. },
  127. });