index.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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 shareTitle = '音乐(器乐)课堂数字化转型调查问卷'
  26. const weChatShare = useWeChatShare(
  27. shareTitle,
  28. '科学的教育改变世界,科技的力量让音乐传播更远,让孩子奏响心中的乐章',
  29. window.location.origin + '/classroom-app/shareImg/question-share.png'
  30. );
  31. const authCode = useAuthCode();
  32. // // 获取微信Code
  33. // if (!authCode.onWeChatCode('GET') || !authCode.onWeChatCatchOpenId('GET')) {
  34. // authCode.getWeChatAuthCode(
  35. // getHttpOrigin() +
  36. // window.location.pathname +
  37. // '#' +
  38. // route.path +
  39. // '?' +
  40. // qs.stringify({
  41. // ...route.query
  42. // })
  43. // );
  44. // }
  45. // 页面定时
  46. const pageTimer = useInterval(1000, { controls: true });
  47. pageTimer.pause();
  48. const router = useRouter();
  49. const forms = reactive({
  50. loading: true,
  51. code: null as any,
  52. openId: '' as any,
  53. isPageHide: false,
  54. contentA:
  55. '', // 第一段
  56. contentB:
  57. '', // 第二段
  58. contentC:
  59. '',
  60. contentD:
  61. '',
  62. contentE: null as any,
  63. introductionVideo: 'https://oss.dayaedu.com/ktyq/03/1742283035204.mp4',
  64. introductionVideoTime: 117,
  65. coverImg: 'https://oss.dayaedu.com/ktyq/02/1739362815061.png',
  66. introductionVideo2: 'https://oss.dayaedu.com/ktyq/02/1739345326291.mp4',
  67. introductionVideoTime2: 111,
  68. coverImg2: 'https://oss.dayaedu.com/ktyq/02/1739324215341.png',
  69. player1: null as any,
  70. player2: null as any,
  71. player1Speed: 1,
  72. player2Speed: 1,
  73. videoLoading1: true,
  74. videoLoading2: true,
  75. meetingType: 'primarySchoolNo' as
  76. | 'primarySchoolNo'
  77. | 'primarySchoolYes'
  78. | 'juniorSchoolNo'
  79. | 'juniorSchool'
  80. | any,
  81. intentionInfo: null as any,
  82. contentShow: false,
  83. tenantId: null as any // 机构id
  84. });
  85. // 播放视频总时长
  86. const videoIntervalRef = useInterval(1000, { controls: true });
  87. videoIntervalRef.pause();
  88. const videoIntervalRef2 = useInterval(1000, { controls: true });
  89. videoIntervalRef2.pause();
  90. onMounted(async () => {
  91. forms.meetingType = route.query.type || forms.meetingType;
  92. forms.tenantId = route.query.id || '1891864516088385538';
  93. try {
  94. // getHttpOrigin() +
  95. // window.location.pathname +
  96. // '#' +
  97. // route.path +
  98. // '?' +
  99. // qs.stringify({
  100. // ...route.query
  101. // })
  102. // const openId = await authCode.getOnlyOpenId();
  103. // forms.openId = openId;
  104. forms.openId = authCode.onWeChatCatchOpenId('GET');
  105. // console.log(forms.openId, 'openId - show');
  106. // 获取微信分享签名
  107. weChatShare.getAppSignature();
  108. // if (!browser().weixin || !openId) return;
  109. const { data } = await request.get(
  110. '/edu-app/open/meetingQuestionSetting/detail?type=' +
  111. forms.meetingType +
  112. '&tenantId=' +
  113. forms.tenantId
  114. );
  115. if (data) {
  116. forms.contentA = data.contentA || forms.contentA;
  117. forms.contentB = data.contentB || forms.contentB;
  118. forms.contentC = data.contentC || forms.contentC;
  119. forms.contentD = data.contentD || forms.contentD;
  120. forms.contentE = data.contentE || null;
  121. // 如果设置了题目名称,则存储,下一步页面需要用到
  122. if (forms.contentE) {
  123. sessionStorage.setItem('customQuestionE', forms.contentE);
  124. }
  125. }
  126. forms.contentShow = true;
  127. } catch {
  128. forms.contentShow = true;
  129. }
  130. console.log('初始化视频', 111);
  131. forms.player1 = _initVideo('one', forms, videoIntervalRef);
  132. forms.player2 = _initVideo('two', forms, videoIntervalRef2);
  133. });
  134. const nextSkip = () => {
  135. router.push({
  136. path: '/fill-questionnaire',
  137. query: {
  138. openId: forms.openId, //
  139. meetingType: forms.meetingType,
  140. tenantId: forms.tenantId
  141. }
  142. });
  143. };
  144. const onPageShow = () => {
  145. console.log(forms.isPageHide, 'showInfo');
  146. if (forms.isPageHide) {
  147. //window.location.reload();
  148. }
  149. };
  150. // 处理监听页面返回不刷新的问题
  151. window.addEventListener('pageshow', onPageShow);
  152. const onPageHide = () => {
  153. console.log(forms.isPageHide, 'showInfo');
  154. forms.isPageHide = true;
  155. };
  156. window.addEventListener('pagehide', onPageHide);
  157. onUnmounted(() => {
  158. window.removeEventListener('pageshow', onPageShow);
  159. window.removeEventListener('pagehide', onPageHide);
  160. forms.player1?.pause();
  161. forms.player1?.src('');
  162. forms.player1?.dispose();
  163. forms.player2?.pause();
  164. forms.player2?.src('');
  165. forms.player2?.dispose();
  166. });
  167. return () => (
  168. <div class={styles['intention-page']}>
  169. <div
  170. class={[
  171. styles['content-box'],
  172. !forms.contentShow && styles.hideContent
  173. ]}>
  174. {/* <div class={styles.contentBody} v-html={forms.contentA}></div>
  175. <div class={styles.contentBody}>
  176. <div class={styles.cbTitle} style="font-size:15px;">
  177. <strong>一、数字化音乐课堂介绍</strong>
  178. </div>
  179. <div class={styles.videoBoxCon}>
  180. <div class={styles.videoBox}>
  181. <div class={[styles['video-content']]}>
  182. <video
  183. id="register-video"
  184. class={styles['video']}
  185. src={forms.introductionVideo}
  186. playsinline={true}
  187. poster={forms.coverImg}
  188. preload="auto"></video>
  189. </div>
  190. </div>
  191. </div>
  192. </div>
  193. <div class={styles.contentBody} v-html={forms.contentB}></div>
  194. <div class={styles.contentBody}>
  195. <div v-html={forms.contentC}></div>
  196. <div class={styles.videoBoxCon}>
  197. <div class={styles.videoBox}>
  198. <div class={[styles['video-content']]}>
  199. <video
  200. id="register-video2"
  201. class={styles['video']}
  202. src={forms.introductionVideo2}
  203. playsinline={true}
  204. poster={forms.coverImg2}
  205. preload="auto"></video>
  206. </div>
  207. </div>
  208. </div>
  209. </div> */}
  210. {/* <div class={styles.contentBody} v-html={forms.contentD}></div> */}
  211. {/* <div class={styles.contentBody}>
  212. <div class={styles.cbTitle} style="font-size:15px;">
  213. <strong>四、什么是器乐数字 Ai</strong><span style="font-size:13px;">(详见视频介绍)</span>
  214. </div>
  215. <div class={styles.videoBoxCon}>
  216. <div class={styles.videoBox}>
  217. <div class={[styles['video-content']]}>
  218. <video
  219. id="register-video2"
  220. class={styles['video']}
  221. src={forms.introductionVideo2}
  222. playsinline={true}
  223. poster={forms.coverImg2}
  224. preload="auto"></video>
  225. </div>
  226. </div>
  227. </div>
  228. </div> */}
  229. <div class={styles.contentBody} v-html={forms.contentA}></div>
  230. <div class={styles.contentBody}>
  231. <div v-html={forms.contentB}></div>
  232. <div class={styles.videoBoxCon}>
  233. <div class={styles.videoBox}>
  234. <div class={[styles['video-content']]}>
  235. <video
  236. id="register-video"
  237. class={styles['video']}
  238. src={forms.introductionVideo}
  239. playsinline={true}
  240. poster={forms.coverImg}
  241. preload="auto"></video>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. <div class={styles.contentBody} v-html={forms.contentC}></div>
  247. <div class={styles.contentBody}>
  248. <div v-html={forms.contentD}></div>
  249. <div class={styles.videoBoxCon}>
  250. <div class={styles.videoBox}>
  251. <div class={[styles['video-content']]}>
  252. <video
  253. id="register-video2"
  254. class={styles['video']}
  255. src={forms.introductionVideo2}
  256. playsinline={true}
  257. poster={forms.coverImg2}
  258. preload="auto"></video>
  259. </div>
  260. </div>
  261. </div>
  262. </div>
  263. </div>
  264. {/* 是否在微信中打开 */}
  265. <OWxTip />
  266. {forms.openId && (
  267. <div class={styles.bottomBtn}>
  268. <p>
  269. <i>请点击下一步填写问卷</i>
  270. </p>
  271. <img class={styles.nextBtn} src={nextBtn} onClick={nextSkip} />
  272. </div>
  273. )}
  274. </div>
  275. );
  276. }
  277. });