video.tsx 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. import { defineComponent, onMounted, onUnmounted, reactive, ref, watch } from 'vue'
  2. import styles from './video.module.less'
  3. import { Button, Loading } from 'vant'
  4. import { browser } from '@/helpers/utils'
  5. // import Plyr from 'plyr'
  6. // import 'plyr/dist/plyr.css'
  7. import TCPlayer from 'tcplayer.js'
  8. import 'tcplayer.js/dist/tcplayer.css'
  9. import { useInterval, useIntervalFn } from '@vueuse/core'
  10. import { useRoute, useRouter } from 'vue-router'
  11. import request from '@/helpers/request'
  12. import qs from 'query-string'
  13. import { usePageVisibility } from '@vant/use'
  14. import deepClone from '@/helpers/deep-clone'
  15. export default defineComponent({
  16. name: 'pre-register',
  17. setup() {
  18. const route = useRoute()
  19. const router = useRouter()
  20. const pageVisibility = usePageVisibility()
  21. const openId = sessionStorage.getItem('active-open-id')
  22. // 页面定时
  23. const pageTimer = useInterval(1000, { controls: true })
  24. pageTimer.pause()
  25. const forms = reactive({
  26. videoID: 'video' + Date.now() + Math.floor(Math.random() * 100),
  27. coverImg: '',
  28. introductionVideo: '',
  29. introductionVideoTime: 0, // 视频总时长
  30. videoBrowsePoint: 0, // 视频最后观看点
  31. saveId: route.query.saveId,
  32. orchestraId: route.query.id,
  33. openId: route.query.openId || openId,
  34. loading: false,
  35. player: null as any,
  36. playerSpeed: 1,
  37. intervalFnRef: null as any,
  38. videoDetails: [] as any, // 节点列表
  39. pointVideo: {} as any, // 需要处理有效的时间段
  40. pointVideoTime: 0, // 有效时长
  41. videoSelectId: null, // 选中的编号
  42. isPageHide: false, // 处理页面返回没有刷新的问题
  43. parentConferencesNotes: '',
  44. orchestraRegisterType: '',
  45. status: '',
  46. registerDisplay: true
  47. })
  48. // 播放视频总时长
  49. const videoIntervalRef = useInterval(1000, { controls: true })
  50. videoIntervalRef.pause()
  51. /**
  52. * 格式化视屏播放有效时间 - 合并区间
  53. * @param intervals [[], []]
  54. * @example [[4, 8],[0, 4],[10, 30]]
  55. * @returns [[0, 8], [10, 30]]
  56. */
  57. const formatEffectiveTime = (intervals: any[]) => {
  58. const res: any = []
  59. intervals.sort((a, b) => a[0] - b[0])
  60. let prev = intervals[0]
  61. for (let i = 1; i < intervals.length; i++) {
  62. const cur = intervals[i]
  63. if (prev[1] >= cur[0]) {
  64. // 有重合
  65. prev[1] = Math.max(cur[1], prev[1])
  66. } else {
  67. // 不重合,prev推入res数组
  68. res.push(prev)
  69. prev = cur // 更新 prev
  70. }
  71. }
  72. res.push(prev)
  73. // console.log(res, 'formatEffectiveTime')
  74. return formatEffectiveTimeToAfter(res)
  75. }
  76. const formatEffectiveTimeToAfter = (res: any[]) => {
  77. // 格式化有效时间
  78. const effective: any = []
  79. const startNode = forms.pointVideo.startNode
  80. const endNode = forms.pointVideo.endNode
  81. // console.log(startNode, endNode, 'startNode')
  82. res.forEach((item: any) => {
  83. // 开始时间大于 设置时间
  84. if (item[1] >= item[0]) {
  85. /**
  86. * 1、开始时间
  87. */
  88. if (item[0] >= startNode && item[0] <= endNode && item[1] <= endNode) {
  89. // console.log(1)
  90. effective.push(item)
  91. }
  92. if (item[0] >= startNode && item[0] <= endNode && item[1] > endNode) {
  93. // console.log(3)
  94. effective.push([item[0], endNode])
  95. }
  96. if (item[0] < startNode && item[1] > startNode && item[1] <= endNode) {
  97. // console.log(4)
  98. effective.push([startNode, item[1]])
  99. }
  100. if (item[0] < startNode && item[1] > startNode && item[1] > endNode) {
  101. // console.log(4)
  102. effective.push([startNode, endNode])
  103. }
  104. }
  105. })
  106. // console.log(effective, 'effective')
  107. return effective
  108. }
  109. /**
  110. * 获取数据有效期
  111. * @param intervals [[], []]
  112. * @returns 0s
  113. */
  114. const formatTimer = (intervals: any[]) => {
  115. const afterIntervals = formatEffectiveTime(intervals)
  116. // console.log(afterIntervals, 'afterIntervals')
  117. let time = 0
  118. afterIntervals.forEach((t: any) => {
  119. time += t[1] - t[0]
  120. })
  121. return time
  122. }
  123. const checkVideoDetails = (time: number) => {
  124. let status = false
  125. forms.videoDetails.forEach((item: any) => {
  126. if (item.startNode <= time && time <= item.endNode) {
  127. forms.videoSelectId = item.id
  128. status = true
  129. }
  130. })
  131. if(!status) {
  132. forms.videoSelectId = null
  133. }
  134. }
  135. /**
  136. * 视屏累计时长
  137. * 1、视屏开始播放时-开始计时
  138. * 2、视频暂停时暂停-停止计时
  139. * 3、视频加载时-停止计时
  140. * 4、视频倍数播放时,时间正常计时
  141. * 5、点击视频进度或拖动进度时,时间暂停
  142. */
  143. const _init = () => {
  144. // const controls = [
  145. // 'play-large',
  146. // 'play',
  147. // 'progress',
  148. // 'captions',
  149. // 'current-time',
  150. // 'duration',
  151. // 'settings',
  152. // 'fullscreen'
  153. // ]
  154. // const params: any = {
  155. // controls: controls,
  156. // settings: ['speed'],
  157. // speed: { selected: 1, options: [0.5, 1, 1.5, 2] },
  158. // i18n: {
  159. // speed: '速度',
  160. // normal: '默认'
  161. // },
  162. // autoplay: false,
  163. // invertTime: false
  164. // }
  165. // if (browser().iPhone) {
  166. // params.fullscreen = {
  167. // enabled: true,
  168. // fallback: 'force',
  169. // iosNative: true
  170. // }
  171. // }
  172. // const times: any = []
  173. // forms.videoDetails.forEach((item: any) => {
  174. // times.push({
  175. // time: item.startNode,
  176. // label: item.desc
  177. // })
  178. // })
  179. // params.markers = { enabled: true, points: times }
  180. // forms.player = new Plyr('#register-video', params)
  181. // forms.player.on('ready', (item: any) => {
  182. // console.log('ready', item)
  183. // // forms.player.pause()
  184. // })
  185. // forms.player.on('loadedmetadata', () => {
  186. // console.log('loadedmetadata')
  187. // forms.loading = false
  188. // forms.player.currentTime() = forms.videoBrowsePoint
  189. // checkVideoDetails(forms.player.currentTime())
  190. // })
  191. // // 速度变化时
  192. // forms.player.on('ratechange', () => {
  193. // forms.playerSpeed =
  194. // forms.playerSpeed < forms.player.speed ? forms.player.speed : forms.playerSpeed
  195. // })
  196. // forms.player.on('seeking', () => {
  197. // console.log('seeking')
  198. // videoIntervalRef.isActive.value && videoIntervalRef.pause()
  199. // })
  200. // // // 拖动结束时
  201. // forms.player.on('seeked', () => {
  202. // console.log('seeked')
  203. // videoIntervalRef.isActive.value && videoIntervalRef.pause()
  204. // })
  205. // // 正在搜索中
  206. // forms.player.on('waiting', () => {
  207. // // console.log('waiting pause')
  208. // videoIntervalRef.isActive.value && videoIntervalRef.pause()
  209. // })
  210. // // 如何视频在缓存不会触发
  211. // forms.player.on('timeupdate', () => {
  212. // console.log('timeupdate', forms.player.currentTime())
  213. // // 时间变化时更新每一段的状态
  214. // checkVideoDetails(forms.player.currentTime())
  215. // // 判断视频计时器是否暂停,如果暂停则恢复
  216. // // 添加 「forms.player.playing」 是由会跳转到上次播放时间,会触发些方法
  217. // if (
  218. // !videoIntervalRef.isActive.value &&
  219. // forms.player.currentTime() > 0 &&
  220. // forms.player.playing
  221. // ) {
  222. // // console.log('timeupdate play')
  223. // videoIntervalRef.resume()
  224. // }
  225. // })
  226. // // 视屏播放时暂停
  227. // forms.player.on('ended', () => {
  228. // forms.player.pause()
  229. // })
  230. // // 开始播放
  231. // forms.player.on('play', () => {
  232. // console.log('play')
  233. // // 判断视频计时器是否暂停,如果暂停则恢复
  234. // videoIntervalRef.resume()
  235. // })
  236. // // 暂停播放
  237. // forms.player.on('pause', () => {
  238. // console.log('pause', videoIntervalRef.isActive.value)
  239. // videoIntervalRef.pause()
  240. // })
  241. // forms.player.on('enterfullscreen', () => {
  242. // console.log('fullscreen')
  243. // const i = document.createElement('i')
  244. // i.id = 'fullscreen-back'
  245. // i.className = 'van-icon van-icon-arrow-left video-back'
  246. // i.addEventListener('click', () => {
  247. // forms.player.fullscreen.exit()
  248. // })
  249. // console.log(document.getElementsByClassName('plyr'))
  250. // document.getElementsByClassName('plyr')[0].appendChild(i)
  251. // })
  252. // forms.player.on('exitfullscreen', () => {
  253. // console.log('exitfullscreen')
  254. // const i = document.getElementById('fullscreen-back')
  255. // i && i.remove()
  256. // })
  257. const Button = TCPlayer.getComponent('Button')
  258. const BigPlayButton = TCPlayer.getComponent('BigPlayButton')
  259. BigPlayButton.prototype.createEl = function () {
  260. const el = Button.prototype.createEl.call(this)
  261. const _html =
  262. '<button><svg width="41px"height="41px"viewBox="0 0 41 41"version="1.1"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="none"stroke-width="1"fill="none"fill-rule="evenodd"><g transform="translate(-167.000000, -155.000000)"><g transform="translate(0.000000, 85.000000)"><g transform="translate(158.000000, 70.000000)"><g transform="translate(9.000000, 0.000000)"><circle id="椭圆形"stroke="#FFFFFF"fill-opacity="0.1"fill="#D8D8D8"cx="20.5"cy="20.5"r="20"></circle><path d="M14.5483871,27.6859997 L14.5483871,13.4342349 C14.5480523,12.8729571 14.8729597,12.356555 15.3949624,12.0887034 C15.9169651,11.8208518 16.5522696,11.8445472 17.0503046,12.1504437 L28.6530473,19.2778563 C29.1119763,19.5602271 29.3887725,20.0426422 29.3887725,20.5601173 C29.3887725,21.0775924 29.1119763,21.5600075 28.6530473,21.8423783 L17.0503046,28.9697909 C16.5522696,29.2756874 15.9169651,29.2993828 15.3949624,29.0315312 C14.8729597,28.7636796 14.5480523,28.2472775 14.5483871,27.6859997 Z"id="路径"fill="#FFFFFF"fill-rule="nonzero"></path></g></g></g></g></g></svg></button>'
  263. el.appendChild(
  264. TCPlayer.dom.createEl('div', {
  265. className: 'vjs-button-icon',
  266. innerHTML: _html
  267. })
  268. )
  269. return el
  270. }
  271. forms.player = TCPlayer('register-video', {
  272. appID: '',
  273. controls: true,
  274. plugins: {
  275. // ProgressMarker: {
  276. // markers: [
  277. // {
  278. // content: '1111',
  279. // timeOffset: 1000
  280. // }
  281. // ]
  282. // }
  283. }
  284. }) // player-container-id 为播放器容器 ID,必须与 html 中一致
  285. if (forms.player) {
  286. forms.player.src(forms.introductionVideo) // url 播放地址
  287. forms.player.poster(forms.coverImg || '')
  288. // forms.player.on('loadstart', () => {})
  289. forms.player.on('ready', (item: any) => {
  290. // console.log('ready', item)
  291. // forms.player.pause()
  292. })
  293. forms.player.on('loadedmetadata', () => {
  294. // console.log('loadedmetadata')
  295. forms.loading = false
  296. forms.player.currentTime(forms.videoBrowsePoint)
  297. checkVideoDetails(forms.player.currentTime())
  298. })
  299. // 速度变化时
  300. forms.player.on('ratechange', () => {
  301. forms.playerSpeed =
  302. forms.playerSpeed < forms.player.playbackRate()
  303. ? forms.player.playbackRate()
  304. : forms.playerSpeed
  305. })
  306. forms.player.on('seeking', () => {
  307. // console.log('seeking')
  308. videoIntervalRef.isActive.value && videoIntervalRef.pause()
  309. })
  310. // // 拖动结束时
  311. forms.player.on('seeked', () => {
  312. // console.log('seeked')
  313. videoIntervalRef.isActive.value && videoIntervalRef.pause()
  314. })
  315. // 正在搜索中
  316. forms.player.on('waiting', () => {
  317. // console.log('waiting pause')
  318. videoIntervalRef.isActive.value && videoIntervalRef.pause()
  319. })
  320. // 如何视频在缓存不会触发
  321. forms.player.on('timeupdate', () => {
  322. // console.log('timeupdate', forms.player.currentTime())
  323. // 时间变化时更新每一段的状态
  324. checkVideoDetails(forms.player.currentTime())
  325. // 判断视频计时器是否暂停,如果暂停则恢复
  326. // 添加 「forms.player.playing」 是由会跳转到上次播放时间,会触发些方法
  327. if (
  328. !videoIntervalRef.isActive.value &&
  329. forms.player.currentTime() > 0 &&
  330. !forms.player.paused()
  331. ) {
  332. // console.log('timeupdate play')
  333. videoIntervalRef.resume()
  334. }
  335. })
  336. // 视屏播放时暂停
  337. forms.player.on('ended', () => {
  338. forms.player.pause()
  339. })
  340. // 开始播放
  341. forms.player.on('play', () => {
  342. console.log('play')
  343. // 判断视频计时器是否暂停,如果暂停则恢复
  344. videoIntervalRef.resume()
  345. })
  346. // 暂停播放
  347. forms.player.on('pause', () => {
  348. console.log('pause', videoIntervalRef.isActive.value)
  349. videoIntervalRef.pause()
  350. })
  351. forms.player.on('fullscreenchange', () => {
  352. if (forms.player.isFullscreen()) {
  353. console.log('fullscreen')
  354. const i = document.createElement('i')
  355. i.id = 'fullscreen-back'
  356. i.className = 'van-icon van-icon-arrow-left video-back'
  357. i.addEventListener('click', () => {
  358. forms.player.exitFullscreen()
  359. })
  360. document.getElementsByClassName('video-js')[0].appendChild(i)
  361. } else {
  362. console.log('exitfullscreen')
  363. const i = document.getElementById('fullscreen-back')
  364. i && i.remove()
  365. }
  366. })
  367. }
  368. checkVideoDetails(0)
  369. }
  370. // 保存零时时间
  371. const moreTime: any = ref([]) // 多个观看时间段
  372. let tempTime: any = [] // 临时存储时间
  373. const currentTimer = useInterval(1000, { controls: true })
  374. // 监听播放状态,
  375. watch(
  376. () => videoIntervalRef.isActive.value,
  377. (newVal: boolean) => {
  378. // console.log(videoIntervalRef.isActive.value, 'videoIntervalRef')
  379. initVideoCount(newVal)
  380. }
  381. )
  382. /**
  383. * 初始化视频时长
  384. * @param newVal 播放状态
  385. * @param repeat 是否为定时发送的
  386. */
  387. const initVideoCount = (newVal: any, repeat = false) => {
  388. // console.log('watch', forms.player.currentTime)
  389. const initTime = deepClone(tempTime)
  390. if (repeat) {
  391. if (tempTime.length > 0) {
  392. // console.log('join video', tempTime, 'initTime', initTime)
  393. tempTime[1] = Math.floor(forms.player.currentTime())
  394. }
  395. } else {
  396. if (newVal) {
  397. tempTime[0] = Math.floor(forms.player.currentTime())
  398. } else {
  399. tempTime[1] = Math.floor(forms.player.currentTime())
  400. }
  401. }
  402. // console.log(newVal, repeat, tempTime, tempTime.length, 'videoIntervalRef.isActive.value in')
  403. // console.log(forms.player.speed, 'speed')
  404. if (tempTime.length >= 2) {
  405. // console.log(tempTime, 'tempTime', moreTime.value)
  406. // 处理在短时间内的时间差 【视屏拖动,点击可能会导致时间差太大】
  407. const diffTime =
  408. tempTime[1] - tempTime[0] - currentTimer.counter.value * forms.playerSpeed > 2
  409. // console.log(diffTime, 'diffTime', currentTimer.counter.value, forms.playerSpeed, 'value')
  410. // 结束时间,如果 大于开始时间则清除
  411. if (tempTime[1] >= tempTime[0] && !diffTime) moreTime.value.push(tempTime)
  412. if (repeat) {
  413. tempTime = deepClone(initTime)
  414. } else {
  415. tempTime = []
  416. currentTimer.counter.value = 0
  417. }
  418. }
  419. // console.log('观看的时间', moreTime)
  420. }
  421. watch(pageVisibility, (value: any) => {
  422. console.log('watch', value)
  423. if (value == 'hidden') {
  424. forms.player.pause()
  425. }
  426. })
  427. // 更新时间
  428. const updateStat = async (pageBrowseTime = 10) => {
  429. try {
  430. const videoBrowseData = moreTime.value.length > 0 ? formatEffectiveTime(moreTime.value) : []
  431. // console.log(moreTime.value, videoBrowseData, 'video')
  432. const time = videoBrowseData.length > 0 ? formatTimer(videoBrowseData) : 0
  433. // const videoCountTime = videoIntervalRef?.counter.value
  434. // 判断如何视屏播放时间大于视屏播放有效时间则说明数据有问题,进行重置数据
  435. const rate = Math.floor((time / Math.floor(forms.pointVideoTime)) * 100)
  436. // console.log('videoIntervalRef?.counter.value', videoIntervalRef?.counter.value)
  437. await request.post('/api-student/open/studentBrowseRecord/updateStat', {
  438. data: {
  439. id: forms.saveId,
  440. pageBrowseTime, // 固定10秒
  441. videoBrowseData: JSON.stringify(videoBrowseData), // 视屏播放数据
  442. videoBrowseDataTime: time || 0, // 有效的视频观看时长
  443. videoBrowsePercentage: rate || 0, // 有效的视频观看时长百分比
  444. videoBrowseTime: videoIntervalRef?.counter.value, // 视频观看时长
  445. videoBrowsePoint: Math.floor(forms.player.currentTime() || 0) // 视频最后观看点 - 向下取整
  446. }
  447. })
  448. } catch {
  449. //
  450. }
  451. }
  452. // 提交
  453. const onSubmit = async () => {
  454. try {
  455. forms.player.pause() // 视屏
  456. forms.intervalFnRef?.pause() // 页面订时器
  457. currentTimer.pause()
  458. videoIntervalRef.pause()
  459. // 页面计时暂停
  460. pageTimer.pause()
  461. initVideoCount(videoIntervalRef.isActive.value)
  462. await updateStat()
  463. console.log(forms.orchestraRegisterType)
  464. if (forms.orchestraRegisterType === 'PARENT_CONFERENCES') {
  465. window.location.href =
  466. window.location.origin +
  467. window.location.pathname +
  468. `/#/preApply?id=${forms.orchestraId}`
  469. } else if (forms.orchestraRegisterType === 'GROUP_BUY') {
  470. window.location.href =
  471. window.location.origin +
  472. window.location.pathname +
  473. `/#/preGoodsApply?id=${forms.orchestraId}`
  474. } else {
  475. window.location.href =
  476. window.location.origin +
  477. window.location.pathname +
  478. '/project/preRegister.html?' +
  479. qs.stringify({
  480. orchestraId: forms.orchestraId,
  481. openId: forms.openId
  482. })
  483. }
  484. } catch (e) {
  485. console.log(e, 'e')
  486. // 还原
  487. forms.intervalFnRef?.resume()
  488. pageTimer.resume()
  489. currentTimer.resume()
  490. }
  491. }
  492. onMounted(async () => {
  493. try {
  494. const { data } = await request.get('/api-student/open/studentBrowseRecord/query', {
  495. params: {
  496. openId: forms.openId,
  497. orchestraId: forms.orchestraId
  498. }
  499. })
  500. forms.videoBrowsePoint = data.videoBrowsePoint || 0
  501. if (forms.player) {
  502. forms.player.currentTime(data.videoBrowsePoint || 0)
  503. }
  504. forms.introductionVideo = data.introductionVideo
  505. forms.introductionVideoTime = data.introductionVideoTime
  506. forms.coverImg = data.coverImg
  507. moreTime.value = data.videoBrowseData ? JSON.parse(data.videoBrowseData) : []
  508. forms.parentConferencesNotes = data.parentConferencesNotes
  509. forms.orchestraRegisterType = data.orchestraRegisterType
  510. forms.registerDisplay = data.registerDisplay
  511. const videoDetails = data.videoDetails || []
  512. videoDetails.forEach((video: any) => {
  513. forms.videoDetails.push({
  514. startNode: video.startNode,
  515. endNode: video.endNode,
  516. desc: video.desc,
  517. id: video.id
  518. })
  519. if (video.pointFlag) {
  520. forms.pointVideo = video
  521. forms.pointVideoTime = video.endNode - video.startNode
  522. }
  523. })
  524. _init()
  525. // 间隔多少时间同步数据
  526. forms.intervalFnRef = useIntervalFn(async () => {
  527. // 页面时间恢复
  528. pageTimer.counter.value = 0
  529. pageTimer.resume()
  530. // 同步数据时先进行有效时间进行保存
  531. initVideoCount(false, true)
  532. await updateStat()
  533. videoIntervalRef.counter.value = 0
  534. }, 10000)
  535. // const arr = [
  536. // [10, 10],
  537. // [53, 53],
  538. // [64, 64],
  539. // [74, 74],
  540. // [155, 155],
  541. // [173, 173],
  542. // [183, 183],
  543. // [191, 201]
  544. // ]
  545. // console.log(formatEffectiveTime(arr))
  546. } catch {
  547. //
  548. }
  549. })
  550. onUnmounted(() => {
  551. forms.player?.fullscreen?.exit()
  552. forms.intervalFnRef?.pause()
  553. currentTimer.pause()
  554. // 页面计时暂停
  555. pageTimer.pause()
  556. forms.player?.pause();
  557. forms.player?.src('');
  558. forms.player?.dispose();
  559. })
  560. // 判断是否有openId
  561. if (!forms.openId) {
  562. router.replace({
  563. path: '/pre-register-video',
  564. query: {
  565. id: forms.orchestraId
  566. }
  567. })
  568. }
  569. const onPageShow = () => {
  570. // console.log(forms.isPageHide, 'showInfo')
  571. if (forms.isPageHide) {
  572. window.location.reload()
  573. }
  574. }
  575. // 处理监听页面返回不刷新的问题
  576. window.addEventListener('pageshow', onPageShow)
  577. const onPageHide = () => {
  578. // console.log(forms.isPageHide, 'showInfo')
  579. forms.isPageHide = true
  580. }
  581. window.addEventListener('pagehide', onPageHide)
  582. onUnmounted(() => {
  583. window.removeEventListener('pageshow', onPageShow)
  584. window.removeEventListener('pagehide', onPageHide)
  585. })
  586. return () => (
  587. <div class={styles['pre-register-video']}>
  588. <div class={styles.videoContainer}>
  589. <div class={styles['video-content']}>
  590. <video
  591. id="register-video"
  592. class={styles['video']}
  593. src={forms.introductionVideo}
  594. playsinline={true}
  595. poster={forms.coverImg}
  596. preload="auto"
  597. ></video>
  598. {/* 加载视频使用 */}
  599. {forms.loading && (
  600. <div class={styles.loadingVideo}>
  601. <Loading
  602. size={36}
  603. color="#FF8057"
  604. vertical
  605. style={{ height: '100%', justifyContent: 'center' }}
  606. >
  607. 加载中...
  608. </Loading>
  609. </div>
  610. )}
  611. </div>
  612. </div>
  613. <div class={styles.videoCount}>
  614. <div class={styles.videoTitle}></div>
  615. <div class={styles.videoCountContent}>
  616. {forms.videoDetails.map((item: any) => (
  617. <span
  618. class={[item.id === forms.videoSelectId ? styles.active : '']}
  619. onClick={() => {
  620. forms.player.currentTime(item.startNode)
  621. forms.player.play()
  622. forms.videoBrowsePoint = item.startNode
  623. checkVideoDetails(forms.player.currentTime())
  624. }}
  625. >
  626. {item.desc}
  627. </span>
  628. ))}
  629. </div>
  630. </div>
  631. <div class={styles.messageContainer}>
  632. <div class={styles.messageContent}>
  633. {/* <p>家长您好!</p>
  634. <p class={styles.c1}>
  635. 请家长们合理安排时间,<span>认真观看</span>家长会内容。在<span>详细了解</span>
  636. 所有要求后,有意向让孩子加入乐团的家长,请在<span>明晚20:00前</span>,为孩子完成
  637. <span>乐团报名</span>。
  638. </p>
  639. <p class={styles.c1}>
  640. 下周,专业老师将针对意向入团学员进行身体条件确认。谢谢各位的支持!
  641. </p>
  642. <p class={styles.bottom}>
  643. 注:乐团于下学期正式开始训练,训练时间下学期开学前另行通知,训练时间会与学校其他社团错开,家长无需担心时间冲突问题。
  644. </p> */}
  645. <div v-html={forms.parentConferencesNotes}></div>
  646. {forms.registerDisplay && <Button class={styles.submitBtn} onClick={onSubmit}></Button>}
  647. </div>
  648. </div>
  649. </div>
  650. )
  651. }
  652. })