|  | @@ -17,7 +17,8 @@ import {
 | 
	
		
			
				|  |  |    onUnmounted,
 | 
	
		
			
				|  |  |    ref,
 | 
	
		
			
				|  |  |    watch,
 | 
	
		
			
				|  |  | -  Transition
 | 
	
		
			
				|  |  | +  Transition,
 | 
	
		
			
				|  |  | +  TransitionGroup
 | 
	
		
			
				|  |  |  } from 'vue'
 | 
	
		
			
				|  |  |  import iconBack from './image/back.svg'
 | 
	
		
			
				|  |  |  import styles from './index.module.less'
 | 
	
	
		
			
				|  | @@ -40,10 +41,17 @@ import Points from './component/points'
 | 
	
		
			
				|  |  |  import { browser, getSecondRPM } from '@/helpers/utils'
 | 
	
		
			
				|  |  |  import { Vue3Lottie } from 'vue3-lottie'
 | 
	
		
			
				|  |  |  import playLoadData from './datas/data.json'
 | 
	
		
			
				|  |  | -import { usePageVisibility } from '@vant/use'
 | 
	
		
			
				|  |  | +import { usePageVisibility, useRect } from '@vant/use'
 | 
	
		
			
				|  |  |  import PlayRecordTime from './playRecordTime'
 | 
	
		
			
				|  |  |  import dayjs from 'dayjs'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import { Pagination, Navigation, EffectFade, EffectFlip, EffectCreative, Lazy } from 'swiper'
 | 
	
		
			
				|  |  | +import { Swiper, SwiperSlide } from 'swiper/vue'
 | 
	
		
			
				|  |  | +import 'swiper/less'
 | 
	
		
			
				|  |  | +import 'swiper/less/effect-fade'
 | 
	
		
			
				|  |  | +import 'swiper/less/effect-flip'
 | 
	
		
			
				|  |  | +import 'swiper/less/effect-creative'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  export default defineComponent({
 | 
	
		
			
				|  |  |    name: 'CoursewarePlay',
 | 
	
		
			
				|  |  |    setup() {
 | 
	
	
		
			
				|  | @@ -290,6 +298,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    const swiperDom = ref()
 | 
	
		
			
				|  |  |      onMounted(() => {
 | 
	
		
			
				|  |  |        getDetail()
 | 
	
		
			
				|  |  |        getCourseSchedule()
 | 
	
	
		
			
				|  | @@ -347,9 +356,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      const toggleMaterial = () => {
 | 
	
		
			
				|  |  |        const index = data.itemList.findIndex((n: any) => n.id == popupData.itemActive)
 | 
	
		
			
				|  |  |        if (index > -1) {
 | 
	
		
			
				|  |  | -        swipeRef.value?.swipeTo(index, {
 | 
	
		
			
				|  |  | -          immediate: true
 | 
	
		
			
				|  |  | -        })
 | 
	
		
			
				|  |  | +        // swipeRef.value?.swipeTo(index, {
 | 
	
		
			
				|  |  | +        //   immediate: true
 | 
	
		
			
				|  |  | +        // })
 | 
	
		
			
				|  |  | +        swiperDom.value?.slideTo(index, 1000)
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      /** 延迟收起模态框 */
 | 
	
	
		
			
				|  | @@ -389,14 +399,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    // 上一个知识点, 下一个知识点
 | 
	
		
			
				|  |  | -    const handlePreAndNext = (type: string) => {
 | 
	
		
			
				|  |  | -      if (type === 'up') {
 | 
	
		
			
				|  |  | -        swipeRef.value?.prev()
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        swipeRef.value?.next()
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 去点名,签退
 | 
	
		
			
				|  |  |      const gotoRollCall = (pageTag: string) => {
 | 
	
	
		
			
				|  | @@ -452,187 +454,325 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      const handleEnded = (m: any) => {
 | 
	
		
			
				|  |  |        // console.log(m)
 | 
	
		
			
				|  |  |        if (popupData.activeIndex != data.itemList.length - 1) {
 | 
	
		
			
				|  |  | -        swipeRef.value?.next()
 | 
	
		
			
				|  |  | +        swiperDom.value.slideNext(800)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // setTimeout(() => {
 | 
	
		
			
				|  |  | +        // swipeRef.value?.next()
 | 
	
		
			
				|  |  | +        // ;(document.querySelector('.swiper-button-next') as any)?.click()
 | 
	
		
			
				|  |  | +        // swiperDom.value.navigation.nextEl.click()
 | 
	
		
			
				|  |  | +        // swiperDom.value.slideNext(800)
 | 
	
		
			
				|  |  | +        // }, 300)
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    const effects = [
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: [0, 0, -400]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          translate: ['100%', 0, 0]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: ['-120%', 0, -500]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: ['120%', 0, -500]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: ['-20%', 0, -1]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          translate: ['100%', 0, 0]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: [0, 0, -800],
 | 
	
		
			
				|  |  | +          rotate: [180, 0, 0]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: [0, 0, -800],
 | 
	
		
			
				|  |  | +          rotate: [-180, 0, 0]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: ['-125%', 0, -800],
 | 
	
		
			
				|  |  | +          rotate: [0, 0, -90]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          translate: ['125%', 0, -800],
 | 
	
		
			
				|  |  | +          rotate: [0, 0, 90]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          shadow: true,
 | 
	
		
			
				|  |  | +          origin: 'right center',
 | 
	
		
			
				|  |  | +          translate: ['5%', 0, -200],
 | 
	
		
			
				|  |  | +          rotate: [0, -100, 0]
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          origin: 'left center',
 | 
	
		
			
				|  |  | +          translate: ['-5%', 0, -200],
 | 
	
		
			
				|  |  | +          rotate: [0, 100, 0]
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      {
 | 
	
		
			
				|  |  | +        prev: {
 | 
	
		
			
				|  |  | +          scale: 0.3,
 | 
	
		
			
				|  |  | +          opacity: 0.4
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        next: {
 | 
	
		
			
				|  |  | +          opacity: 0.4,
 | 
	
		
			
				|  |  | +          scale: 0.3
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    ]
 | 
	
		
			
				|  |  | +    const swiperType = ref(effects[2])
 | 
	
		
			
				|  |  | +    // 上一个知识点, 下一个知识点
 | 
	
		
			
				|  |  | +    const handlePreAndNext = (type: string) => {
 | 
	
		
			
				|  |  | +      setTimeout(() => {
 | 
	
		
			
				|  |  | +        if (type === 'up') {
 | 
	
		
			
				|  |  | +          // swiperRef.value?.allowSlidePrev()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          // ;(document.querySelector('.swiper-button-prev') as any)?.click()
 | 
	
		
			
				|  |  | +          // swiperDom.value.navigation.prevEl.click()
 | 
	
		
			
				|  |  | +          swiperDom.value.slidePrev(800)
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          // swiperRef.value?.allowSlideNext()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          // ;(document.querySelector('.swiper-button-next') as any)?.click()
 | 
	
		
			
				|  |  | +          // swiperDom.value.navigation.nextEl.click()
 | 
	
		
			
				|  |  | +          // const nextKonwledgeId = data.itemList[popupData.activeIndex + 1].knowledgePointId
 | 
	
		
			
				|  |  | +          // console.log(nextKonwledgeId === popupData.tabActive)
 | 
	
		
			
				|  |  | +          // if (nextKonwledgeId === popupData.tabActive) {
 | 
	
		
			
				|  |  | +          //   swiperType.value = effects[2]
 | 
	
		
			
				|  |  | +          // } else {
 | 
	
		
			
				|  |  | +          //   swiperType.value = effects[3]
 | 
	
		
			
				|  |  | +          // }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          swiperDom.value.slideNext(800)
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }, 400)
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      return () => (
 | 
	
		
			
				|  |  |        <div class={styles.playContent}>
 | 
	
		
			
				|  |  |          <div class={styles.coursewarePlay} style={{ width: parentContainer.width }}>
 | 
	
		
			
				|  |  | -          <Swipe
 | 
	
		
			
				|  |  | +          {/* <swiper :modules="modules" :pagination="{ clickable: true }">
 | 
	
		
			
				|  |  | +    <swiper-slide>Slide 1</swiper-slide>
 | 
	
		
			
				|  |  | +    <swiper-slide>Slide 2</swiper-slide>
 | 
	
		
			
				|  |  | +    <swiper-slide>Slide 3</swiper-slide>
 | 
	
		
			
				|  |  | +  </swiper> */}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          {/* 
 | 
	
		
			
				|  |  | +            知识点 翻
 | 
	
		
			
				|  |  | +            素材滑
 | 
	
		
			
				|  |  | +          */}
 | 
	
		
			
				|  |  | +          <Swiper
 | 
	
		
			
				|  |  |              style={{ height: '100%' }}
 | 
	
		
			
				|  |  | -            ref={swipeRef}
 | 
	
		
			
				|  |  | -            showIndicators={false}
 | 
	
		
			
				|  |  | -            loop={false}
 | 
	
		
			
				|  |  | -            duration={0}
 | 
	
		
			
				|  |  | -            vertical
 | 
	
		
			
				|  |  | -            lazyRender={true}
 | 
	
		
			
				|  |  | -            touchable={false}
 | 
	
		
			
				|  |  | -            initialSwipe={popupData.firstIndex}
 | 
	
		
			
				|  |  | -            onChange={handleSwipeChange}
 | 
	
		
			
				|  |  | +            effect="creative"
 | 
	
		
			
				|  |  | +            modules={[Pagination, Navigation, EffectFade, EffectFlip, EffectCreative]}
 | 
	
		
			
				|  |  | +            creativeEffect={swiperType.value}
 | 
	
		
			
				|  |  | +            direction="vertical"
 | 
	
		
			
				|  |  | +            navigation
 | 
	
		
			
				|  |  | +            allowTouchMove={false}
 | 
	
		
			
				|  |  | +            onSwiper={(swiper: any) => {
 | 
	
		
			
				|  |  | +              // console.log(swiper, 'index')
 | 
	
		
			
				|  |  | +              swiperDom.value = swiper
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +            onSlideChange={(swiper: any) => {
 | 
	
		
			
				|  |  | +              // console.log(swiper, 'index')
 | 
	
		
			
				|  |  | +              handleSwipeChange(swiper.activeIndex)
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  |            >
 | 
	
		
			
				|  |  |              {data.itemList.map((m: any, mIndex: number) => {
 | 
	
		
			
				|  |  |                return (
 | 
	
		
			
				|  |  | -                <SwipeItem class={styles.swipeItem}>
 | 
	
		
			
				|  |  | -                  <>
 | 
	
		
			
				|  |  | -                    <div
 | 
	
		
			
				|  |  | -                      class={styles.itemDiv}
 | 
	
		
			
				|  |  | -                      onClick={() => {
 | 
	
		
			
				|  |  | -                        clearTimeout(activeData.timer)
 | 
	
		
			
				|  |  | -                        if (Date.now() - activeData.nowTime < 300) {
 | 
	
		
			
				|  |  | -                          handleDbClick(m)
 | 
	
		
			
				|  |  | -                          return
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                        activeData.nowTime = Date.now()
 | 
	
		
			
				|  |  | -                        activeData.timer = setTimeout(() => {
 | 
	
		
			
				|  |  | -                          activeData.model = !activeData.model
 | 
	
		
			
				|  |  | -                          setModelOpen()
 | 
	
		
			
				|  |  | -                        }, 300)
 | 
	
		
			
				|  |  | -                      }}
 | 
	
		
			
				|  |  | -                    >
 | 
	
		
			
				|  |  | -                      {m.type === 'VIDEO' ? (
 | 
	
		
			
				|  |  | -                        <>
 | 
	
		
			
				|  |  | -                          <video
 | 
	
		
			
				|  |  | -                            playsinline="false"
 | 
	
		
			
				|  |  | -                            muted={m.muted}
 | 
	
		
			
				|  |  | -                            preload="auto"
 | 
	
		
			
				|  |  | -                            class="player"
 | 
	
		
			
				|  |  | -                            data-vid={m.id}
 | 
	
		
			
				|  |  | -                            src={m.content}
 | 
	
		
			
				|  |  | -                            loop={m.loop}
 | 
	
		
			
				|  |  | -                            autoplay={m.autoPlay}
 | 
	
		
			
				|  |  | -                            onLoadedmetadata={(e: Event) => {
 | 
	
		
			
				|  |  | -                              const videoEle = e.target as unknown as HTMLVideoElement
 | 
	
		
			
				|  |  | -                              m.currentTime = videoEle.currentTime
 | 
	
		
			
				|  |  | -                              m.duration = videoEle.duration
 | 
	
		
			
				|  |  | -                              m.videoEle = videoEle
 | 
	
		
			
				|  |  | -                              m.isprepare = true
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                            onTimeupdate={(e: Event) => {
 | 
	
		
			
				|  |  | -                              if (!m.isprepare) return
 | 
	
		
			
				|  |  | -                              const videoEle = e.target as unknown as HTMLVideoElement
 | 
	
		
			
				|  |  | -                              m.currentTime = videoEle.currentTime
 | 
	
		
			
				|  |  | -                              m.progress = Number((videoEle.currentTime / m.duration) * 100)
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                            onPlay={() => {
 | 
	
		
			
				|  |  | -                              // 播放
 | 
	
		
			
				|  |  | -                              m.paused = false
 | 
	
		
			
				|  |  | -                              console.log('播放')
 | 
	
		
			
				|  |  | -                              setModelOpen()
 | 
	
		
			
				|  |  | -                              // 第一次播放
 | 
	
		
			
				|  |  | -                              if (m.muted) {
 | 
	
		
			
				|  |  | -                                m.muted = false
 | 
	
		
			
				|  |  | -                                m.autoPlay = false
 | 
	
		
			
				|  |  | -                              }
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                            onPause={() => {
 | 
	
		
			
				|  |  | -                              //暂停
 | 
	
		
			
				|  |  | -                              clearTimeout(activeData.timer)
 | 
	
		
			
				|  |  | -                              m.paused = true
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                            onEnded={() => handleEnded(m)}
 | 
	
		
			
				|  |  | -                          >
 | 
	
		
			
				|  |  | -                            <source src={m.content} type="video/mp4" />
 | 
	
		
			
				|  |  | -                          </video>
 | 
	
		
			
				|  |  | -                          {m.muted && (
 | 
	
		
			
				|  |  | -                            <div class={styles.loadWrap}>
 | 
	
		
			
				|  |  | -                              <Vue3Lottie animationData={playLoadData}></Vue3Lottie>
 | 
	
		
			
				|  |  | +                <SwiperSlide class={styles.swipeItem}>
 | 
	
		
			
				|  |  | +                  <div
 | 
	
		
			
				|  |  | +                    // class={[styles.itemDiv]}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    class={[styles.itemDiv]}
 | 
	
		
			
				|  |  | +                    onClick={() => {
 | 
	
		
			
				|  |  | +                      clearTimeout(activeData.timer)
 | 
	
		
			
				|  |  | +                      if (Date.now() - activeData.nowTime < 300) {
 | 
	
		
			
				|  |  | +                        handleDbClick(m)
 | 
	
		
			
				|  |  | +                        return
 | 
	
		
			
				|  |  | +                      }
 | 
	
		
			
				|  |  | +                      activeData.nowTime = Date.now()
 | 
	
		
			
				|  |  | +                      activeData.timer = setTimeout(() => {
 | 
	
		
			
				|  |  | +                        activeData.model = !activeData.model
 | 
	
		
			
				|  |  | +                        setModelOpen()
 | 
	
		
			
				|  |  | +                      }, 300)
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                  >
 | 
	
		
			
				|  |  | +                    {m.type === 'VIDEO' ? (
 | 
	
		
			
				|  |  | +                      <>
 | 
	
		
			
				|  |  | +                        <video
 | 
	
		
			
				|  |  | +                          class={['player']}
 | 
	
		
			
				|  |  | +                          playsinline="false"
 | 
	
		
			
				|  |  | +                          muted={m.muted}
 | 
	
		
			
				|  |  | +                          preload="auto"
 | 
	
		
			
				|  |  | +                          // class="player"
 | 
	
		
			
				|  |  | +                          data-vid={m.id}
 | 
	
		
			
				|  |  | +                          src={m.content}
 | 
	
		
			
				|  |  | +                          loop={m.loop}
 | 
	
		
			
				|  |  | +                          autoplay={m.autoPlay}
 | 
	
		
			
				|  |  | +                          onLoadedmetadata={(e: Event) => {
 | 
	
		
			
				|  |  | +                            const videoEle = e.target as unknown as HTMLVideoElement
 | 
	
		
			
				|  |  | +                            m.currentTime = videoEle.currentTime
 | 
	
		
			
				|  |  | +                            m.duration = videoEle.duration
 | 
	
		
			
				|  |  | +                            m.videoEle = videoEle
 | 
	
		
			
				|  |  | +                            m.isprepare = true
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  | +                          onTimeupdate={(e: Event) => {
 | 
	
		
			
				|  |  | +                            if (!m.isprepare) return
 | 
	
		
			
				|  |  | +                            const videoEle = e.target as unknown as HTMLVideoElement
 | 
	
		
			
				|  |  | +                            m.currentTime = videoEle.currentTime
 | 
	
		
			
				|  |  | +                            m.progress = Number((videoEle.currentTime / m.duration) * 100)
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  | +                          onPlay={() => {
 | 
	
		
			
				|  |  | +                            // 播放
 | 
	
		
			
				|  |  | +                            m.paused = false
 | 
	
		
			
				|  |  | +                            console.log('播放')
 | 
	
		
			
				|  |  | +                            setModelOpen()
 | 
	
		
			
				|  |  | +                            // 第一次播放
 | 
	
		
			
				|  |  | +                            if (m.muted) {
 | 
	
		
			
				|  |  | +                              m.muted = false
 | 
	
		
			
				|  |  | +                              m.autoPlay = false
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  | +                          onPause={() => {
 | 
	
		
			
				|  |  | +                            //暂停
 | 
	
		
			
				|  |  | +                            clearTimeout(activeData.timer)
 | 
	
		
			
				|  |  | +                            m.paused = true
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  | +                          onEnded={() => handleEnded(m)}
 | 
	
		
			
				|  |  | +                        >
 | 
	
		
			
				|  |  | +                          <source src={m.content} type="video/mp4" />
 | 
	
		
			
				|  |  | +                        </video>
 | 
	
		
			
				|  |  | +                        {m.muted && (
 | 
	
		
			
				|  |  | +                          <div class={styles.loadWrap}>
 | 
	
		
			
				|  |  | +                            <Vue3Lottie animationData={playLoadData}></Vue3Lottie>
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +                        )}
 | 
	
		
			
				|  |  | +                        <div
 | 
	
		
			
				|  |  | +                          style={{ transform: activeData.model ? '' : 'translateY(100%)' }}
 | 
	
		
			
				|  |  | +                          class={styles.bottomFixedContainer}
 | 
	
		
			
				|  |  | +                          onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                            e.stopPropagation()
 | 
	
		
			
				|  |  | +                            setModelOpen()
 | 
	
		
			
				|  |  | +                          }}
 | 
	
		
			
				|  |  | +                        >
 | 
	
		
			
				|  |  | +                          <div style={{ opacity: m.isprepare ? '1' : '0' }}>
 | 
	
		
			
				|  |  | +                            <div class={styles.time}>
 | 
	
		
			
				|  |  | +                              <span>{getSecondRPM(m.currentTime)}</span>
 | 
	
		
			
				|  |  | +                              <span>{getSecondRPM(m.duration)}</span>
 | 
	
		
			
				|  |  |                              </div>
 | 
	
		
			
				|  |  | -                          )}
 | 
	
		
			
				|  |  | -                          <div
 | 
	
		
			
				|  |  | -                            style={{ transform: activeData.model ? '' : 'translateY(100%)' }}
 | 
	
		
			
				|  |  | -                            class={styles.bottomFixedContainer}
 | 
	
		
			
				|  |  | -                            onClick={(e: Event) => {
 | 
	
		
			
				|  |  | -                              e.stopPropagation()
 | 
	
		
			
				|  |  | -                              setModelOpen()
 | 
	
		
			
				|  |  | -                            }}
 | 
	
		
			
				|  |  | -                          >
 | 
	
		
			
				|  |  | -                            <div style={{ opacity: m.isprepare ? '1' : '0' }}>
 | 
	
		
			
				|  |  | -                              <div class={styles.time}>
 | 
	
		
			
				|  |  | -                                <span>{getSecondRPM(m.currentTime)}</span>
 | 
	
		
			
				|  |  | -                                <span>{getSecondRPM(m.duration)}</span>
 | 
	
		
			
				|  |  | -                              </div>
 | 
	
		
			
				|  |  | -                              <div class={styles.slider}>
 | 
	
		
			
				|  |  | -                                <Slider
 | 
	
		
			
				|  |  | -                                  onClick={() => setModelOpen()}
 | 
	
		
			
				|  |  | -                                  buttonSize={16}
 | 
	
		
			
				|  |  | -                                  step={1}
 | 
	
		
			
				|  |  | -                                  modelValue={m.progress}
 | 
	
		
			
				|  |  | -                                  onUpdate:modelValue={(val: any) => {
 | 
	
		
			
				|  |  | -                                    console.log('val', val)
 | 
	
		
			
				|  |  | -                                    m.progress = val
 | 
	
		
			
				|  |  | -                                    handleChangeSlider(m)
 | 
	
		
			
				|  |  | -                                  }}
 | 
	
		
			
				|  |  | -                                  onDragStart={(e: Event) => {
 | 
	
		
			
				|  |  | -                                    // 开始拖动,暂停播放
 | 
	
		
			
				|  |  | -                                    console.log('开始拖动')
 | 
	
		
			
				|  |  | -                                    // 如果拖动之前,视频是播放状态,拖动完毕后继续播放
 | 
	
		
			
				|  |  | -                                    if (!m.paused) {
 | 
	
		
			
				|  |  | -                                      m.isDrage = true
 | 
	
		
			
				|  |  | -                                    }
 | 
	
		
			
				|  |  | -                                    handlePaused(m)
 | 
	
		
			
				|  |  | -                                  }}
 | 
	
		
			
				|  |  | -                                  onDragEnd={(e: Event) => {
 | 
	
		
			
				|  |  | -                                    console.log('结束拖动')
 | 
	
		
			
				|  |  | -                                    if (m.isDrage) {
 | 
	
		
			
				|  |  | -                                      m.isDrage = false
 | 
	
		
			
				|  |  | -                                      handlePlay(m)
 | 
	
		
			
				|  |  | -                                    }
 | 
	
		
			
				|  |  | -                                  }}
 | 
	
		
			
				|  |  | -                                  min={0}
 | 
	
		
			
				|  |  | -                                  max={100}
 | 
	
		
			
				|  |  | -                                />
 | 
	
		
			
				|  |  | -                              </div>
 | 
	
		
			
				|  |  | +                            <div class={styles.slider}>
 | 
	
		
			
				|  |  | +                              <Slider
 | 
	
		
			
				|  |  | +                                onClick={() => setModelOpen()}
 | 
	
		
			
				|  |  | +                                buttonSize={16}
 | 
	
		
			
				|  |  | +                                step={1}
 | 
	
		
			
				|  |  | +                                modelValue={m.progress}
 | 
	
		
			
				|  |  | +                                onUpdate:modelValue={(val: any) => {
 | 
	
		
			
				|  |  | +                                  console.log('val', val)
 | 
	
		
			
				|  |  | +                                  m.progress = val
 | 
	
		
			
				|  |  | +                                  handleChangeSlider(m)
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                                onDragStart={(e: Event) => {
 | 
	
		
			
				|  |  | +                                  // 开始拖动,暂停播放
 | 
	
		
			
				|  |  | +                                  console.log('开始拖动')
 | 
	
		
			
				|  |  | +                                  // 如果拖动之前,视频是播放状态,拖动完毕后继续播放
 | 
	
		
			
				|  |  | +                                  if (!m.paused) {
 | 
	
		
			
				|  |  | +                                    m.isDrage = true
 | 
	
		
			
				|  |  | +                                  }
 | 
	
		
			
				|  |  | +                                  handlePaused(m)
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                                onDragEnd={(e: Event) => {
 | 
	
		
			
				|  |  | +                                  console.log('结束拖动')
 | 
	
		
			
				|  |  | +                                  if (m.isDrage) {
 | 
	
		
			
				|  |  | +                                    m.isDrage = false
 | 
	
		
			
				|  |  | +                                    handlePlay(m)
 | 
	
		
			
				|  |  | +                                  }
 | 
	
		
			
				|  |  | +                                }}
 | 
	
		
			
				|  |  | +                                min={0}
 | 
	
		
			
				|  |  | +                                max={100}
 | 
	
		
			
				|  |  | +                              />
 | 
	
		
			
				|  |  |                              </div>
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                            <div class={styles.actions}>
 | 
	
		
			
				|  |  | -                              <div class={styles.actionBtn}>
 | 
	
		
			
				|  |  | -                                {m.isprepare ? (
 | 
	
		
			
				|  |  | -                                  <>
 | 
	
		
			
				|  |  | -                                    {m.paused ? (
 | 
	
		
			
				|  |  | -                                      <img src={iconplay} onClick={(e: Event) => handlePlay(m)} />
 | 
	
		
			
				|  |  | -                                    ) : (
 | 
	
		
			
				|  |  | -                                      <img
 | 
	
		
			
				|  |  | -                                        src={iconpause}
 | 
	
		
			
				|  |  | -                                        onClick={(e: Event) => handlePaused(m)}
 | 
	
		
			
				|  |  | -                                      />
 | 
	
		
			
				|  |  | -                                    )}
 | 
	
		
			
				|  |  | -                                  </>
 | 
	
		
			
				|  |  | -                                ) : (
 | 
	
		
			
				|  |  | -                                  <Loading color="#fff" />
 | 
	
		
			
				|  |  | -                                )}
 | 
	
		
			
				|  |  | +                          <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                            <div class={styles.actionBtn}>
 | 
	
		
			
				|  |  | +                              {m.isprepare ? (
 | 
	
		
			
				|  |  | +                                <>
 | 
	
		
			
				|  |  | +                                  {m.paused ? (
 | 
	
		
			
				|  |  | +                                    <img src={iconplay} onClick={(e: Event) => handlePlay(m)} />
 | 
	
		
			
				|  |  | +                                  ) : (
 | 
	
		
			
				|  |  | +                                    <img src={iconpause} onClick={(e: Event) => handlePaused(m)} />
 | 
	
		
			
				|  |  | +                                  )}
 | 
	
		
			
				|  |  | +                                </>
 | 
	
		
			
				|  |  | +                              ) : (
 | 
	
		
			
				|  |  | +                                <Loading color="#fff" />
 | 
	
		
			
				|  |  | +                              )}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                {m.loop ? (
 | 
	
		
			
				|  |  | -                                  <img
 | 
	
		
			
				|  |  | -                                    src={iconLoopActive}
 | 
	
		
			
				|  |  | -                                    onClick={(e: Event) => (m.loop = false)}
 | 
	
		
			
				|  |  | -                                  />
 | 
	
		
			
				|  |  | -                                ) : (
 | 
	
		
			
				|  |  | -                                  <img src={iconLoop} onClick={(e: Event) => (m.loop = true)} />
 | 
	
		
			
				|  |  | -                                )}
 | 
	
		
			
				|  |  | -                              </div>
 | 
	
		
			
				|  |  | -                              <div>{m.name}</div>
 | 
	
		
			
				|  |  | +                              {m.loop ? (
 | 
	
		
			
				|  |  | +                                <img
 | 
	
		
			
				|  |  | +                                  src={iconLoopActive}
 | 
	
		
			
				|  |  | +                                  onClick={(e: Event) => (m.loop = false)}
 | 
	
		
			
				|  |  | +                                />
 | 
	
		
			
				|  |  | +                              ) : (
 | 
	
		
			
				|  |  | +                                <img src={iconLoop} onClick={(e: Event) => (m.loop = true)} />
 | 
	
		
			
				|  |  | +                              )}
 | 
	
		
			
				|  |  |                              </div>
 | 
	
		
			
				|  |  | +                            <div>{m.name}</div>
 | 
	
		
			
				|  |  |                            </div>
 | 
	
		
			
				|  |  | -                        </>
 | 
	
		
			
				|  |  | -                      ) : m.type === 'IMG' ? (
 | 
	
		
			
				|  |  | -                        <img src={m.content} />
 | 
	
		
			
				|  |  | -                      ) : (
 | 
	
		
			
				|  |  | -                        <MusicScore
 | 
	
		
			
				|  |  | -                          data-vid={m.id}
 | 
	
		
			
				|  |  | -                          music={m}
 | 
	
		
			
				|  |  | -                          onSetIframe={(el: any) => {
 | 
	
		
			
				|  |  | -                            m.iframeRef = el
 | 
	
		
			
				|  |  | -                          }}
 | 
	
		
			
				|  |  | -                        />
 | 
	
		
			
				|  |  | -                      )}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </>
 | 
	
		
			
				|  |  | -                </SwipeItem>
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                      </>
 | 
	
		
			
				|  |  | +                    ) : m.type === 'IMG' ? (
 | 
	
		
			
				|  |  | +                      <img src={m.content} />
 | 
	
		
			
				|  |  | +                    ) : (
 | 
	
		
			
				|  |  | +                      <MusicScore
 | 
	
		
			
				|  |  | +                        data-vid={m.id}
 | 
	
		
			
				|  |  | +                        music={m}
 | 
	
		
			
				|  |  | +                        onSetIframe={(el: any) => {
 | 
	
		
			
				|  |  | +                          m.iframeRef = el
 | 
	
		
			
				|  |  | +                        }}
 | 
	
		
			
				|  |  | +                      />
 | 
	
		
			
				|  |  | +                    )}
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </SwiperSlide>
 | 
	
		
			
				|  |  |                )
 | 
	
		
			
				|  |  |              })}
 | 
	
		
			
				|  |  | -          </Swipe>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +          </Swiper>
 | 
	
		
			
				|  |  | +          {/* <Swipe
 | 
	
		
			
				|  |  | +            style={{ height: '100%' }}
 | 
	
		
			
				|  |  | +            ref={swipeRef}
 | 
	
		
			
				|  |  | +            showIndicators={false}
 | 
	
		
			
				|  |  | +            loop={false}
 | 
	
		
			
				|  |  | +            duration={0}
 | 
	
		
			
				|  |  | +            // vertical
 | 
	
		
			
				|  |  | +            lazyRender={true}
 | 
	
		
			
				|  |  | +            touchable={false}
 | 
	
		
			
				|  |  | +            initialSwipe={popupData.firstIndex}
 | 
	
		
			
				|  |  | +            onChange={handleSwipeChange}
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            
 | 
	
		
			
				|  |  | +          </Swipe> */}
 | 
	
		
			
				|  |  |            <div
 | 
	
		
			
				|  |  |              style={{ transform: activeData.model ? '' : 'translateY(-100%)' }}
 | 
	
		
			
				|  |  |              id="coursePlayHeader"
 | 
	
	
		
			
				|  | @@ -648,7 +788,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                <PlayRecordTime ref={playRef} list={data.itemList} />
 | 
	
		
			
				|  |  |              )}
 | 
	
		
			
				|  |  |            </div>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |            <Transition name="right">
 | 
	
		
			
				|  |  |              {activeData.model && (
 | 
	
		
			
				|  |  |                <div class={styles.rightFixedBtns}>
 | 
	
	
		
			
				|  | @@ -680,7 +819,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                </div>
 | 
	
		
			
				|  |  |              )}
 | 
	
		
			
				|  |  |            </Transition>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |            <Transition name="left">
 | 
	
		
			
				|  |  |              {activeData.model && (
 | 
	
		
			
				|  |  |                <div class={styles.leftFixedBtns}>
 | 
	
	
		
			
				|  | @@ -694,7 +832,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                    </div>
 | 
	
		
			
				|  |  |                  )}
 | 
	
		
			
				|  |  |                  {popupData.activeIndex != data.itemList.length - 1 && (
 | 
	
		
			
				|  |  | -                  <div class={styles.fullBtn} onClick={() => handlePreAndNext('down')}>
 | 
	
		
			
				|  |  | +                  <div class={[styles.fullBtn]} onClick={() => handlePreAndNext('down')}>
 | 
	
		
			
				|  |  |                      <span style={{ textAlign: 'center' }}>下一个</span>
 | 
	
		
			
				|  |  |                      <img src={iconDown} />
 | 
	
		
			
				|  |  |                    </div>
 | 
	
	
		
			
				|  | @@ -702,7 +840,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                </div>
 | 
	
		
			
				|  |  |              )}
 | 
	
		
			
				|  |  |            </Transition>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |            <Popup
 | 
	
		
			
				|  |  |              class={styles.popup}
 | 
	
		
			
				|  |  |              overlayClass={styles.overlayClass}
 |