index.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { defineComponent, onMounted, reactive, watch } from "vue";
  2. import styles from "./index.module.less";
  3. import state from "/src/state";
  4. import icon1 from "../icons/1.png";
  5. import { storeData } from "/src/store";
  6. import { evaluatingData } from "/src/view/evaluating";
  7. import icons from "../icons/index.json";
  8. import imgs from "./index.json";
  9. import iconBadge from "./img/icon-badge.svg";
  10. import icon_expression0 from "./img/icon_expression0.svg";
  11. import icon_expression1 from "./img/icon_expression1.svg";
  12. import icon_expression2 from "./img/icon_expression2.svg";
  13. import icon_expression3 from "./img/icon_expression3.svg";
  14. import icon_expression4 from "./img/icon_expression4.svg";
  15. import { getQuery } from "/src/utils/queryString";
  16. import { browser, getBehaviorId } from "/src/utils";
  17. import { api_musicPracticeRecordSave } from "../../api";
  18. import { getAudioDuration } from "/src/view/audio-list";
  19. export default defineComponent({
  20. name: "evaluatResult",
  21. emits: ["close"],
  22. setup(props, { emit }) {
  23. const query = getQuery();
  24. const data = reactive({
  25. saveLoading: true,
  26. });
  27. /** 添加评测记录 */
  28. const handleAddRecord = async () => {
  29. // console.log("结束", evaluatingData.resultData);
  30. const body = {
  31. deviceType: browser().android ? "ANDROID" : "IOS", // 设备类型
  32. intonation: evaluatingData.resultData.intonation, // 音准
  33. cadence: evaluatingData.resultData.cadence, // 节奏
  34. integrity: evaluatingData.resultData.integrity, // 完成度
  35. scoreData: JSON.stringify(evaluatingData.resultData.scoreData), // 评测数据
  36. behaviorId: getBehaviorId(), // 行为id
  37. sourceTime: getAudioDuration(), // 音频时长
  38. partIndex: state.partIndex, // 音轨
  39. speed: state.speed, // 速度
  40. practiceSource: query.workRecord ? "LESSON_TRAINING" : "EVALUATION", // 练习来源
  41. score: evaluatingData.resultData.score, // 分数
  42. clientType: storeData.user.clientType, // 客户端类型
  43. musicSheetId: state.examSongId, // 乐谱id
  44. feature: "EVALUATION", // 特征
  45. playTime: evaluatingData.resultData.playTime / 1000, // 播放时长
  46. heardLevel: state.setting.evaluationDifficulty, // 听力等级
  47. recordFilePath: evaluatingData.resultData.url, // 录音文件路径
  48. };
  49. data.saveLoading = true;
  50. const res = await api_musicPracticeRecordSave(body);
  51. if (res?.code === 200){
  52. evaluatingData.resultData.recordId = res.data
  53. }
  54. data.saveLoading = false;
  55. };
  56. onMounted(() => {
  57. handleAddRecord();
  58. });
  59. watch(() => evaluatingData.resulstMode, (val) => {
  60. if (val) {
  61. handleAddRecord();
  62. }
  63. })
  64. return () => (
  65. <div class={styles.evaluatResult}>
  66. <div class={styles.closeBtn} onClick={() => emit("close")}>
  67. <img src={icons["arrow-left-background"]} />
  68. </div>
  69. <div class={styles.headerButton}>
  70. <div class={[styles.headBtn, evaluatingData.resultData.recordId ? '' : styles.disabled]} onClick={() => emit("close", "update")}>
  71. 保存演奏
  72. </div>
  73. </div>
  74. <div class={styles.fraction}>
  75. <img class={styles.bg} src={imgs.bg} />
  76. <div class={styles.top}>
  77. {evaluatingData.resultData.score > 79 && (
  78. <img style={{}} class={styles.badge} src={iconBadge} />
  79. )}
  80. <div class={styles.text}>
  81. <div>
  82. <span class={styles.num}>{evaluatingData.resultData.score}</span>分
  83. </div>
  84. <div style={{ marginLeft: "6px" }}>{evaluatingData.resultData.clxmome}</div>
  85. </div>
  86. <img
  87. style={{ display: evaluatingData.resultData.leve === 0 ? "" : "none" }}
  88. class={styles.rightBadge}
  89. src={icon_expression0}
  90. />
  91. <img
  92. style={{ display: evaluatingData.resultData.leve === 1 ? "" : "none" }}
  93. class={styles.rightBadge}
  94. src={icon_expression1}
  95. />
  96. <img
  97. style={{ display: evaluatingData.resultData.leve === 2 ? "" : "none" }}
  98. class={styles.rightBadge}
  99. src={icon_expression2}
  100. />
  101. <img
  102. style={{ display: evaluatingData.resultData.leve === 3 ? "" : "none" }}
  103. class={styles.rightBadge}
  104. src={icon_expression3}
  105. />
  106. <img
  107. style={{ display: evaluatingData.resultData.leve === 4 ? "" : "none" }}
  108. class={styles.rightBadge}
  109. src={icon_expression4}
  110. />
  111. </div>
  112. {state.isPercussion ? (
  113. <div class={styles.percussion}>
  114. <img class={styles.leftIcon} src={evaluatingData.resultData.img || icon1} />
  115. <div class={styles.scoreDes}>
  116. <span class={styles.scoreNum}>{evaluatingData.resultData.score}</span>分
  117. <span style={{ marginLeft: "8px" }}>{evaluatingData.resultData.mome}</span>
  118. </div>
  119. </div>
  120. ) : (
  121. <div class={styles.detail}>
  122. <div class={styles.progressitem}>
  123. <div class={styles.intonation}>音准</div>
  124. <span>{evaluatingData.resultData.intonation}分</span>
  125. </div>
  126. <div class={styles.progressitem}>
  127. <div class={styles.cadence}>节奏</div>
  128. <span>{evaluatingData.resultData.cadence}分</span>
  129. </div>
  130. <div class={styles.progressitem}>
  131. <div class={styles.integrity}>完成度</div>
  132. <span>{evaluatingData.resultData.integrity}分</span>
  133. </div>
  134. </div>
  135. )}
  136. <div class={styles.tips}>{evaluatingData.resultData.clxtip}</div>
  137. <div class={styles.ctrls}>
  138. <img
  139. style={{ display: query.workRecord ? "none" : "" }}
  140. src={imgs.btn1}
  141. class={styles.ctrlsBtn}
  142. onClick={() => emit("close", "practise")}
  143. />
  144. <img src={imgs.btn2} class={styles.ctrlsBtn} onClick={() => emit("close", "tryagain")} />
  145. <img
  146. src={imgs.btn3}
  147. class={[styles.ctrlsBtn, data.saveLoading ? styles.disablued : ""]}
  148. onClick={() => emit("close", "look")}
  149. />
  150. </div>
  151. </div>
  152. </div>
  153. );
  154. },
  155. });