index.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { defineComponent, onMounted, onUnmounted, reactive, ref } from 'vue';
  2. import styles from './index.module.less';
  3. import { closeToast } from 'vant';
  4. import { useRoute, useRouter } from 'vue-router';
  5. import OWxTip from '@/components/m-wx-tip';
  6. import { browser, getHttpOrigin } from '@/helpers/utils';
  7. import qs from 'query-string';
  8. import request from '@/helpers/request';
  9. import { useInterval } from '@vueuse/core';
  10. import 'tcplayer.js/dist/tcplayer.css';
  11. import { _initVideo } from './initVideo';
  12. import nextBtn from './images/next_btn.png';
  13. import useWeChatShare from '@/hooks/useWeChatShare';
  14. import useAuthCode from '@/hooks/useAuthCode';
  15. export default defineComponent({
  16. name: 'intention-questionnaire',
  17. setup() {
  18. const route = useRoute();
  19. const shareTitle =
  20. route.query.type === 'primarySchoolNo'
  21. ? '(小学)关于开展音乐(器乐)课堂数字化转型的调查问卷'
  22. : route.query.type === 'juniorSchoolNo'
  23. ? '(初中)关于开展音乐(器乐)课堂数字化转型的调查问卷'
  24. : '关于开展音乐(器乐)课堂数字化转型的调查问卷';
  25. const weChatShare = useWeChatShare(
  26. shareTitle,
  27. '科学的教育改变世界,科技的力量让音乐传播更远,让孩子奏响心中的乐章',
  28. window.location.origin + '/classroom-app/shareImg/question-share.png'
  29. );
  30. const authCode = useAuthCode();
  31. // 页面定时
  32. const pageTimer = useInterval(1000, { controls: true });
  33. pageTimer.pause();
  34. const router = useRouter();
  35. const forms = reactive({
  36. loading: true,
  37. code: null as any,
  38. openId: '' as any,
  39. isPageHide: false,
  40. contentA:
  41. '<p style="text-align: left; font-size:13px;"><strong style="font-size:15px;">尊敬的家长: 您好!</strong></p><p style="text-align: left;">非常感谢您一直以来对学校工作给予的大力支持与密切关注。为深入贯彻教育部《关于全面实施学校美育浸润行动的通知》(教体艺〔2023〕5 号)文件精神,积极顺应艺术素质测评结果纳入中考的教育改革趋势,致力于让学生在在校期间熟练掌握 1 - 2 项艺术专长,全面提升学生的艺术素养。</p><p style="text-align: left;">我校计划在北京知勉公益基金会的支持下,启动音乐(器乐)课堂数字化转型工作。为了确保此项工作顺利开展,现向您详细介绍相关情况,并诚恳征询您的宝贵意见,学校将根据您的意见反馈决定开展与否。</p>', // 第一段
  42. contentB:
  43. '<p style="text-align: left;"><strong style="font-size:15px; color: #0B8BFE;">二、为什么要开展数字化转型</strong></p><p style="text-align: left;">1.解决学习难题:数字化转型将为乐器学习和练习制定明确标准,学生能实时知晓练习的对错,练习结果也可量化呈现,有效解决学生不会练、家长无法辅导的困扰。</p><p style="text-align: left;">2.适应教改趋势:随着教育改革的推进,艺术素质测评结果已逐步纳入中考,数字化转型将助力学生更好地适应这一变化,提升综合素养。</p><p style="text-align: left;">3.关注身心健康:乐器学习能成为学生缓解学习压力的有效途径,有助于学生保持身心健康,实现全面发展。</p><p style="text-align: left;"><br></p>', // 第二段
  44. contentC:
  45. '<p style="text-align: left;"><strong style="font-size:15px; color: #0B8BFE;">三、开展原则</strong></p><p style="text-align: left;">本次活动面向全体学生,完全遵循学生自愿参加的原则。</p><p style="text-align: left;">1.若学生选择参加转型,家长需自行为学生准备好自用的乐器(硬件)和“器乐数字 Ai”应用(软件,用于联通学校音乐课堂)两项学习工具。</p><p style="text-align: left;">2.若学生不参加转型,可继续按原有方式进行音乐课学习。</p>',
  46. contentD:
  47. '<p style="text-align: left;"><strong style="font-size:15px; color: #0B8BFE;">五、事项说明</strong></p><p style="text-align: left;">1.学校不涉及任何费用收取。学生所需的自用工具在市面上均可购买到,家长可自行根据实际情况为学生准备。</p><p style="text-align: left;">2.如学生有参加数字化转型的意愿,但存在特殊或特困情况,可先向学校进行登记,学校将尽力寻求资源协助家长解决。</p><p style="text-align: left;">在您了解上述内容后,请点击下一步进行意见填写:</p>',
  48. contentE: null as any,
  49. introductionVideo: 'https://oss.dayaedu.com/ktyq/02/1739345029052.mp4',
  50. introductionVideoTime: 117,
  51. coverImg: 'https://oss.dayaedu.com/ktyq/02/1739362815061.png',
  52. introductionVideo2: 'https://oss.dayaedu.com/ktyq/02/1739345326291.mp4',
  53. introductionVideoTime2: 111,
  54. coverImg2: 'https://oss.dayaedu.com/ktyq/02/1739324215341.png',
  55. player1: null as any,
  56. player2: null as any,
  57. player1Speed: 1,
  58. player2Speed: 1,
  59. videoLoading1: true,
  60. videoLoading2: true,
  61. meetingType: 'primarySchoolNo' as
  62. | 'primarySchoolNo'
  63. | 'primarySchoolYes'
  64. | 'juniorSchoolNo'
  65. | 'juniorSchool'
  66. | any,
  67. intentionInfo: null as any,
  68. contentShow: false,
  69. tenantId: null as any, // 机构id
  70. });
  71. const showPopup = ref(false);
  72. const showPopupMessage = ref('');
  73. // 播放视频总时长
  74. const videoIntervalRef = useInterval(1000, { controls: true });
  75. videoIntervalRef.pause();
  76. const videoIntervalRef2 = useInterval(1000, { controls: true });
  77. videoIntervalRef2.pause();
  78. onMounted(async () => {
  79. forms.meetingType = route.query.type || forms.meetingType;
  80. forms.tenantId = route.query.id
  81. try {
  82. const openId = await authCode.getOpenId(
  83. getHttpOrigin() +
  84. window.location.pathname +
  85. '#' +
  86. route.path +
  87. '?' +
  88. qs.stringify({
  89. ...route.query
  90. })
  91. );
  92. forms.openId = openId
  93. // 获取微信分享签名
  94. weChatShare.getAppSignature();
  95. // if (!browser().weixin || !openId) return;
  96. const { data } = await request.get(
  97. '/edu-app/open/meetingQuestionSetting/detail?type=' +
  98. forms.meetingType +
  99. '&tenantId=' + forms.tenantId
  100. );
  101. if (data) {
  102. forms.contentA = data.contentA || forms.contentA;
  103. forms.contentB = data.contentB || forms.contentB;
  104. forms.contentC = data.contentC || forms.contentC;
  105. forms.contentD = data.contentD || forms.contentD;
  106. forms.contentE = data.contentE || null;
  107. // 如果设置了题目名称,则存储,下一步页面需要用到
  108. if (forms.contentE) {
  109. sessionStorage.setItem('customQuestionE', forms.contentE)
  110. }
  111. }
  112. forms.contentShow = true;
  113. } catch {
  114. forms.contentShow = true;
  115. }
  116. console.log('初始化视频', 111);
  117. forms.player1 = _initVideo('one', forms, videoIntervalRef);
  118. forms.player2 = _initVideo('two', forms, videoIntervalRef2);
  119. });
  120. const nextSkip = () => {
  121. router.push({
  122. path: '/fill-questionnaire',
  123. query: {
  124. openId: forms.openId, //
  125. meetingType: forms.meetingType,
  126. tenantId: forms.tenantId
  127. }
  128. });
  129. };
  130. const onPageShow = () => {
  131. console.log(forms.isPageHide, 'showInfo');
  132. if (forms.isPageHide) {
  133. //window.location.reload();
  134. }
  135. };
  136. // 处理监听页面返回不刷新的问题
  137. window.addEventListener('pageshow', onPageShow);
  138. const onPageHide = () => {
  139. console.log(forms.isPageHide, 'showInfo');
  140. forms.isPageHide = true;
  141. };
  142. window.addEventListener('pagehide', onPageHide);
  143. onUnmounted(() => {
  144. window.removeEventListener('pageshow', onPageShow);
  145. window.removeEventListener('pagehide', onPageHide);
  146. forms.player1?.pause();
  147. forms.player1?.src('');
  148. forms.player1?.dispose();
  149. forms.player2?.pause();
  150. forms.player2?.src('');
  151. forms.player2?.dispose();
  152. });
  153. return () => (
  154. <div class={styles['intention-page']}>
  155. <div
  156. class={[
  157. styles['content-box'],
  158. !forms.contentShow && styles.hideContent
  159. ]}>
  160. <div class={styles.contentBody} v-html={forms.contentA}></div>
  161. <div class={styles.contentBody}>
  162. <div class={styles.cbTitle}>
  163. 一、什么是音乐(器乐)课堂数字化转型<span>(详见视频介绍)</span>
  164. </div>
  165. <div class={styles.videoBoxCon}>
  166. <div class={styles.videoBox}>
  167. <div class={[styles['video-content']]}>
  168. <video
  169. id="register-video"
  170. class={styles['video']}
  171. src={forms.introductionVideo}
  172. playsinline={true}
  173. poster={forms.coverImg}
  174. preload="auto"></video>
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. <div class={styles.contentBody} v-html={forms.contentB}></div>
  180. <div class={styles.contentBody} v-html={forms.contentC}></div>
  181. <div class={styles.contentBody}>
  182. <div class={styles.cbTitle}>
  183. 四、什么是器乐数字 Ai<span>(详见视频介绍)</span>
  184. </div>
  185. <div class={styles.videoBoxCon}>
  186. <div class={styles.videoBox}>
  187. <div class={[styles['video-content']]}>
  188. <video
  189. id="register-video2"
  190. class={styles['video']}
  191. src={forms.introductionVideo2}
  192. playsinline={true}
  193. poster={forms.coverImg2}
  194. preload="auto"></video>
  195. </div>
  196. </div>
  197. </div>
  198. </div>
  199. <div class={styles.contentBody} v-html={forms.contentD}></div>
  200. </div>
  201. {/* 是否在微信中打开 */}
  202. <OWxTip />
  203. {forms.openId && (
  204. <div class={styles.bottomBtn}>
  205. <p>
  206. 在您了解上述内容后,<i>请点击下一步进行意见填写</i>
  207. </p>
  208. <img class={styles.nextBtn} src={nextBtn} onClick={nextSkip} />
  209. </div>
  210. )}
  211. </div>
  212. );
  213. }
  214. });