index.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { defineComponent, onMounted, reactive, watch } from "vue";
  2. import styles from "./index.module.less";
  3. // import { verifyMembershipServices } from "../vip-verify";
  4. import { api_lessonTrainingSubmitTraining, api_lessonTrainingTrainingStudentDetail } from "../../api";
  5. import state, { handleSetSpeed, hanldeDirectSelection, setSection, togglePlay } from "/src/state";
  6. import { getSecondRPM } from "/src/utils";
  7. import { headImg } from "/src/page-instrument/header-top/image";
  8. export default defineComponent({
  9. name: "HomeWork",
  10. props: {
  11. workeData: {
  12. type: Object,
  13. default: () => ({}),
  14. }
  15. },
  16. emits: ["change"],
  17. setup(props, {expose}) {
  18. const training = reactive({
  19. trainingTimes: "", // 已经练习的时长,单位分钟
  20. trainingSpeed: 0, // 作业规定的速度
  21. times: 0, // 作业规定的练习时长,单位分钟
  22. trainingTimeSecond: 0, // 实时更新的练习时长,单位秒
  23. workRecord: "",
  24. isAddOk: 0,
  25. starTime: 0,
  26. start: "" as any,
  27. end: "" as any,
  28. timer: null as any, // 定时器
  29. showWorkDonePop: false, // 显示需要提交作业弹窗
  30. });
  31. /** 隐藏评测功能 */
  32. const handleHide = () => {
  33. const ids = ["studnetT-0", "studnetT-2", "studnetT-4"];
  34. for (let i = 0; i < ids.length; i++) {
  35. const speedBtn = document.getElementById(ids[i]);
  36. if (speedBtn) {
  37. speedBtn.style.pointerEvents = "none";
  38. speedBtn.style.opacity = ".5";
  39. }
  40. }
  41. };
  42. /** 获取作业详情 */
  43. const getWorkData = async () => {
  44. const workeData = props.workeData;
  45. if (workeData.id) {
  46. let trainingContent: any = {};
  47. try {
  48. trainingContent = JSON.parse(workeData.trainingContent);
  49. } catch (error) {
  50. console.log("🚀 ~ error:", error);
  51. }
  52. training.times = trainingContent.trainingTimes || 0;
  53. training.trainingTimes = (workeData.trainingTimes / 60).toFixed(1) || "0";
  54. training.trainingTimeSecond = workeData.trainingTimes || 0;
  55. training.trainingSpeed = trainingContent.practiceSpeed;
  56. training.start = Number(trainingContent.practiceChapterBegin);
  57. training.end = Number(trainingContent.practiceChapterEnd);
  58. state.userChooseEndIndex = training.end
  59. state.isWorkDone = Number(training.trainingTimes) >= Number(training.times);
  60. if (training.isAddOk === 0) {
  61. // 设置小节
  62. setSection(training.start, training.end, training.trainingSpeed);
  63. }
  64. }
  65. };
  66. const getWorkDetail = async () => {
  67. const res = await api_lessonTrainingTrainingStudentDetail(props.workeData.id);
  68. if (res?.code === 200) {
  69. training.trainingTimes = (res.data.trainingTimes / 60).toFixed(1) || "0";
  70. training.trainingTimeSecond = res.data.trainingTimes || 0;
  71. state.isWorkDone = Number(training.trainingTimes) >= Number(training.times);
  72. }
  73. };
  74. /** 添加作业记录 */
  75. const addHomeworkRecored = async () => {
  76. let total = Math.ceil((Date.now() - training.starTime) / 1000);
  77. try {
  78. const res = await api_lessonTrainingSubmitTraining({
  79. id: props.workeData.id,
  80. trainingTimes: total,
  81. });
  82. if (res?.code == 200) {
  83. getWorkDetail();
  84. }
  85. } catch (error) {}
  86. };
  87. const handleStart = () => {
  88. training.timer = setInterval(() => {
  89. training.trainingTimeSecond += 1;
  90. // 如果播放中,作业从未达标到达标状态,需要暂停播放,并且弹窗提示作业已达标
  91. if (!state.isWorkDone && training.trainingTimeSecond >= training.times * 60) {
  92. togglePlay("paused")
  93. state.isWorkDone = true
  94. training.showWorkDonePop = true
  95. }
  96. // console.log('练习时长',training.trainingTimeSecond)
  97. }, 1000);
  98. };
  99. const handleStop = () => {
  100. clearInterval(training.timer)
  101. }
  102. watch(
  103. () => state.playState,
  104. () => {
  105. if (state.playState === "play") {
  106. training.starTime = Date.now();
  107. handleStart();
  108. } else {
  109. addHomeworkRecored();
  110. handleStop();
  111. }
  112. }
  113. );
  114. const handleAdd = () => {
  115. if (state.playState === "play") {
  116. console.log("退出");
  117. addHomeworkRecored();
  118. }
  119. }
  120. onMounted(() => {
  121. handleHide();
  122. getWorkData();
  123. // verifyMembershipServices();
  124. });
  125. expose({
  126. handleAdd,
  127. getWorkData
  128. })
  129. return () => (
  130. <>
  131. <div class={styles.homework}>
  132. <i class={state.playState === "play" ? styles.blinkDot : styles.grayDot}></i>
  133. <span>{getSecondRPM(training.trainingTimeSecond)} / {getSecondRPM(training.times*60)}</span>
  134. </div>
  135. {
  136. training.showWorkDonePop &&
  137. <div class={styles.workDonePop}>
  138. <img class={styles.doneBg} src={headImg("workDonePop.png")} />
  139. <img class={styles.doneBtn} src={headImg("workDoneBtn.png")} onClick={() => {
  140. training.showWorkDonePop = false
  141. addHomeworkRecored();
  142. }} />
  143. </div>
  144. }
  145. </>
  146. );
  147. },
  148. });