liushengqiang 2 years ago
parent
commit
8460f2171c
2 changed files with 0 additions and 1077 deletions
  1. 0 335
      src/views/coursewarePlay/play.module.less
  2. 0 742
      src/views/coursewarePlay/play.tsx

+ 0 - 335
src/views/coursewarePlay/play.module.less

@@ -1,335 +0,0 @@
-.playContent {
-  width: 100vw;
-  height: 100vh;
-  background-color: #000;
-  overflow: hidden;
-  --plyr-color-main: var(--van-primary);
-  --plyr-range-track-height: 3px;
-}
-
-.coursewarePlay {
-  position: relative;
-  height: 100vh;
-  margin: 0 auto;
-  overflow: hidden;
-}
-
-.playModel {
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  box-shadow: inset 0px 0px 164px 0px rgba(0, 0, 0, 1);
-  pointer-events: none;
-}
-
-.headerContainer {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  z-index: 10;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  background: linear-gradient(180deg, rgba(0, 0, 0, 0.6), transparent);
-  transition: transform 0.5s;
-}
-
-.backBtn {
-  color: #fff;
-  height: 26px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  z-index: 10;
-  padding: 4px 10px 4px 15px;
-
-  :global {
-    .van-icon {
-      margin-right: 8px;
-    }
-  }
-}
-
-.menu {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  font-size: 12px;
-  color: #fff;
-}
-
-.tabsContent {
-  width: 100vw;
-  height: 100vh;
-
-  :global {
-    .van-tabs__wrap {
-      display: none !important;
-    }
-
-    .van-tabs__content {
-      width: 100%;
-      height: 100%;
-    }
-  }
-}
-
-.wraps {
-  width: 100%;
-  height: 100%;
-  transform-style: preserve-3d;
-  perspective: (32rem);
-  transition-timing-function: initial;
-}
-
-.itemDiv {
-  position: absolute;
-  left: 0;
-  top: 0;
-  width: 100%;
-  height: 100%;
-  background-color: #000;
-  transition-duration: .8s;
-  transform-style: preserve-3d;
-  transition-property: transform, opacity, height;
-  backface-visibility: hidden;
-  overflow: hidden;
-  z-index: 1;
-  &.itemActive{
-    z-index: 10;
-  }
-  video {
-    width: 100%;
-    height: 100%;
-  }
-
-  img {
-    display: block;
-    width: 100%;
-    height: 100%;
-    object-fit: contain;
-  }
-}
-
-.fullBtn {
-  width: 38px;
-  height: 46px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  color: #fff;
-  justify-content: space-evenly;
-  overflow: hidden;
-  white-space: nowrap;
-
-  &:active {
-    background: rgba(255, 255, 255, 0.2);
-  }
-}
-
-.rightFixedBtns {
-  position: absolute;
-  top: 50%;
-  transform: translateY(-50%);
-  right: 12px;
-  z-index: 10;
-
-  .btnsBottom {
-    margin-top: 10px;
-  }
-}
-
-.leftFixedBtns {
-  position: absolute;
-  top: 50%;
-  transform: translateY(-50%);
-  left: 12px;
-  z-index: 10;
-
-  .prePoint {
-    margin-bottom: 8px;
-  }
-}
-
-.btnsWrap {
-  background: rgba(51, 51, 51, 0.4);
-  border-radius: 6px;
-  overflow: hidden;
-}
-
-.bottomFixedContainer {
-  position: absolute;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 10;
-  background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), transparent);
-  transition: transform 0.5s;
-
-  .time {
-    display: flex;
-    justify-content: space-between;
-    color: #fff;
-    font-size: 10px;
-    padding: 4px 20px;
-  }
-
-  .slider {
-    padding: 8px 20px;
-
-    :global {
-      .van-slider__button {
-        background: var(--van-primary);
-      }
-    }
-  }
-
-  .actions {
-    display: flex;
-    justify-content: space-between;
-    color: #fff;
-    font-size: 12px;
-    padding: 0 10px 4px 20px;
-    align-items: center;
-
-    .actionBtn {
-      display: flex;
-    }
-
-    .actionBtn>img {
-      width: 30px;
-      height: 30px;
-      display: block;
-      padding: 4px 10px 4px 4px;
-    }
-  }
-}
-
-.popup {
-  background: rgba(0, 0, 0, 0.5);
-}
-
-.overlayClass {
-  --van-overlay-background: transparent;
-}
-
-:global {
-
-  .top-enter-active,
-  .top-leave-active {
-    transition: transform 0.5s;
-  }
-
-  .top-enter-from,
-  .top-leave-to {
-    transform: translateY(-100%);
-  }
-
-  .left-enter-active,
-  .left-leave-active {
-    transition: all 0.5s;
-  }
-
-  .left-enter-from,
-  .left-leave-to {
-    left: -60px;
-    opacity: 0;
-  }
-
-  .right-enter-active,
-  .right-leave-active {
-    transition: all 0.5s;
-  }
-
-  .right-enter-from,
-  .right-leave-to {
-    right: -60px;
-    opacity: 0;
-  }
-
-  .bottom-enter-active,
-  .bottom-leave-active {
-    transition: transform 0.5s;
-  }
-
-  .bottom-enter-from,
-  .bottom-leave-to {
-    transform: translateY(100%);
-  }
-}
-
-.loadWrap {
-  position: absolute;
-  left: 0;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  background: linear-gradient(45deg, #21232a, #111218);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-}
-
-.playRecordTime {
-  width: 90px;
-  margin-right: 10px;
-  background: rgba(0, 0, 0, 0.4);
-  border-radius: 20px;
-  font-size: 12px;
-  padding: 6px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  color: #fff;
-
-  .timeLoad {
-    width: 5px;
-    height: 5px;
-    background: #ff4e19;
-    border: 0.5px solid #ffffff;
-    border-radius: 50%;
-    margin-right: 3px;
-    animation: loadFade 1s ease-in-out infinite;
-  }
-}
-
-@keyframes loadFade {
-  0% {
-    opacity: 0;
-  }
-
-  50% {
-    opacity: 0.5;
-  }
-
-  100% {
-    opacity: 1;
-  }
-}
-
-.swiperContainer {
-  :global {
-    .swiper-wrapper {
-      height: 100vh;
-    }
-  }
-}
-
-// .preItem{
-//   transform: translate3d(0, 0, -800px) rotateX(180deg);
-// }
-// .nextItem {
-//   transform: translate3d(0, 0, -800px) rotateX(-180deg);
-// }
-// .preItem{
-//   transform: translate3d(-100%, 0, -800px);
-// }
-// .nextItem {
-//   transform: translate3d(100%, 0, -800px);
-// }

+ 0 - 742
src/views/coursewarePlay/play.tsx

@@ -1,742 +0,0 @@
-import {
-  closeToast,
-  Icon,
-  Loading,
-  Popup,
-  showToast,
-  Slider,
-  Swipe,
-  SwipeInstance,
-  SwipeItem
-} from 'vant'
-import {
-  defineComponent,
-  onMounted,
-  reactive,
-  nextTick,
-  onUnmounted,
-  ref,
-  watch,
-  Transition,
-  TransitionGroup
-} from 'vue'
-import iconBack from './image/back.svg'
-import styles from './play.module.less'
-import 'plyr/dist/plyr.css'
-import request from '@/helpers/request'
-import { state } from '@/state'
-import { useRoute, useRouter } from 'vue-router'
-import { listenerMessage, postMessage, promisefiyPostMessage } from '@/helpers/native-message'
-import MusicScore from './component/musicScore'
-import iconMenu from './image/icon-menu.svg'
-import iconDian from './image/icon-dian.svg'
-import iconTouping from './image/icon-touping.svg'
-import iconPoint from './image/icon-point.svg'
-import iconLoop from './image/icon-loop.svg'
-import iconLoopActive from './image/icon-loop-active.svg'
-import iconplay from './image/icon-play.svg'
-import iconpause from './image/icon-pause.svg'
-import iconUp from './image/icon-up.svg'
-import iconDown from './image/icon-down.svg'
-import Points from './component/points'
-import { browser, getSecondRPM } from '@/helpers/utils'
-import { Vue3Lottie } from 'vue3-lottie'
-import playLoadData from './datas/data.json'
-import { usePageVisibility, useRect } from '@vant/use'
-import PlayRecordTime from './playRecordTime'
-import VideoPlay from './component/video-play'
-import {
-  Pagination,
-  Navigation,
-  Virtual,
-  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'
-import { handleCheckVip } from '../hook/useFee'
-import OGuide from '@/components/o-guide'
-
-export default defineComponent({
-  name: 'CoursewarePlay',
-  setup() {
-    const pageVisibility = usePageVisibility()
-    const isPlay = ref(false)
-    /** 页面显示和隐藏 */
-    watch(pageVisibility, (value) => {
-      const activeItem = data.itemList[popupData.activeIndex]
-      if (activeItem.type != 'VIDEO') return
-      if (value == 'hidden') {
-        isPlay.value = !activeItem.videoEle.paused
-        togglePlay(activeItem, false)
-      } else {
-        // 页面显示,并且
-        if (isPlay.value) togglePlay(activeItem, true)
-      }
-    })
-    /** 设置播放容器 16:9 */
-    const parentContainer = reactive({
-      width: '100vw'
-    })
-    const setContainer = () => {
-      let min = Math.min(screen.width, screen.height)
-      let max = Math.max(screen.width, screen.height)
-      let width = min * (16 / 9)
-      if (width > max) {
-        parentContainer.width = '100vw'
-        return
-      } else {
-        parentContainer.width = width + 'px'
-      }
-    }
-    const handleInit = (type = 0) => {
-      //设置容器16:9
-      setContainer()
-      // 横屏
-      postMessage(
-        {
-          api: 'setRequestedOrientation',
-          content: {
-            orientation: type
-          }
-        },
-        () => {
-          console.log(234)
-        }
-      )
-      // 头,包括返回箭头
-      postMessage({
-        api: 'setTitleBarVisibility',
-        content: {
-          status: type
-        }
-      })
-      // 安卓的状态栏
-      postMessage({
-        api: 'setStatusBarVisibility',
-        content: {
-          isVisibility: type
-        }
-      })
-      // 进入页面设置常量
-      postMessage({
-        api: 'keepScreenLongLight',
-        content: {
-          isOpenLight: type ? true : false
-        }
-      })
-    }
-    handleInit()
-    onUnmounted(() => {
-      handleInit(1)
-      window.removeEventListener('message', iframeHandle)
-    })
-
-    const route = useRoute()
-    const router = useRouter()
-    const headeRef = ref()
-    const data = reactive({
-      detail: null,
-      knowledgePointList: [] as any,
-      itemList: [] as any,
-      showHead: true,
-      isCourse: false,
-      isRecordPlay: false,
-      videoRefs: {}
-    })
-    const activeData = reactive({
-      nowTime: 0,
-      model: true, // 遮罩
-      videoBtns: true, // 视频
-      currentTime: 0,
-      duration: 0,
-      timer: null as any,
-      item: null as any
-    })
-    // 获取缓存路径
-    const getCacheFilePath = async (material: any) => {
-      const res = await promisefiyPostMessage({
-        api: 'getCourseFilePath',
-        content: {
-          url: material.content,
-          localPath: '',
-          materialId: material.materialId,
-          updateTime: material.updateTime,
-          type: material.type // SONG VIDEO IMAGE
-        }
-      })
-      // console.log('缓存路径返回', res)
-      return res
-    }
-    // 获取当前课程是否签退
-    const getCourseSchedule = async () => {
-      if (!route.query.courseId) return
-      try {
-        const res = await request.get(
-          `${state.platformApi}/courseSchedule/detail/${route.query.courseId}`,
-          {
-            hideLoading: true
-          }
-        )
-        if (res?.data) {
-          data.isCourse =
-            res.data.status === 'ING' && state.platformType == 'TEACHER' ? true : false
-          // data.isRecordPlay = Date.now() > dayjs(res.data.startTime).valueOf()
-        }
-      } catch (e) {
-        console.log(e)
-      }
-    }
-    const getItemList = async () => {
-      const list: any = []
-      const browserInfo = browser()
-      for (let i = 0; i < data.knowledgePointList.length; i++) {
-        const item = data.knowledgePointList[i]
-        const itemLength = item.materialList.length - 1
-        for (let j = 0; j < item.materialList.length; j++) {
-          const material = item.materialList[j]
-          //请求本地缓存
-          if (browserInfo.isApp && ['VIDEO', 'IMG'].includes(material.type)) {
-            const localData = await getCacheFilePath(material)
-            if (localData?.content?.localPath) {
-              material.url = material.content
-              material.content = localData.content.localPath
-            }
-          }
-
-          list.push({
-            ...material,
-            iframeRef: null,
-            videoEle: null,
-            tabName: item.name,
-            isLast: j === itemLength, // 当前知识点
-            autoPlay: false, //加载完成是否自动播放
-            isprepare: false, // 视频是否加载完成
-            isRender: false // 是否渲染了
-          })
-        }
-      }
-
-      let _firstIndex = list.findIndex((n: any) => n.materialId == route.query.kId)
-      _firstIndex = _firstIndex > -1 ? _firstIndex : 0
-      const item = list[_firstIndex]
-      item.autoPlay = true
-      popupData.activeIndex = _firstIndex
-      popupData.tabName = item.tabName
-      popupData.tabActive = item.knowledgePointId
-      popupData.itemActive = item.id
-      popupData.itemName = item.name
-      // console.log('🚀 ~ list', list)
-      nextTick(() => {
-        data.itemList = list
-        postMessage({
-          api: 'courseLoading',
-          content: {
-            show: false,
-            type: 'fullscreen'
-          }
-        })
-      })
-    }
-    const getDetail = async () => {
-      try {
-        const res: any = await request.get(
-          state.platformApi + `/lessonCoursewareDetail/detail/${route.query.id}`,
-          {
-            hideLoading: true
-          }
-        )
-        if (Array.isArray(res?.data)) {
-          data.detail = res.data
-        }
-        if (Array.isArray(res?.data?.knowledgePointList)) {
-          let index = 0
-          data.knowledgePointList = res.data.knowledgePointList.map((n: any) => {
-            if (Array.isArray(n.materialList)) {
-              n.materialList = n.materialList.map((item: any) => {
-                index++
-                return {
-                  ...item,
-                  materialId: item.id,
-                  id: index + ''
-                }
-              })
-            }
-            return n
-          })
-          getItemList()
-        }
-      } catch (error) {}
-    }
-
-    const iframTime = ref()
-    // ifram事件处理
-    const iframeHandle = (ev: MessageEvent) => {
-      if (ev.data?.api === 'headerTogge') {
-        clearTimeout(iframTime.value)
-        iframTime.value = setTimeout(() => {
-          activeData.model = ev.data.show || (ev.data.playState == 'play' ? false : true)
-        }, 500)
-      }
-    }
-
-    onMounted(() => {
-      const hasVip = handleCheckVip()
-      if (!hasVip) {
-        nextTick(() => {
-          postMessage({
-            api: 'courseLoading',
-            content: {
-              show: false,
-              type: 'fullscreen'
-            }
-          })
-        })
-        return
-      }
-      getDetail()
-      getCourseSchedule()
-      window.addEventListener('message', iframeHandle)
-    })
-    const playRef = ref()
-    // 返回
-    const goback = () => {
-      try {
-        playRef.value?.handleOut()
-      } catch (error) {}
-      if (route.query.source == 'my-course') {
-        router.back()
-        return
-      }
-      postMessage({ api: 'goBack' })
-    }
-
-    const popupData = reactive({
-      open: false,
-      activeIndex: 0,
-      tabActive: '',
-      tabName: '',
-      itemActive: '',
-      itemName: '',
-      guideOpen: false
-    })
-
-    /**停止所有的播放 */
-    const handleStop = () => {
-      for (let i = 0; i < data.itemList.length; i++) {
-        const activeItem = data.itemList[i]
-        if (popupData.activeIndex !== i) {
-          if (activeItem.type === 'VIDEO' && activeItem.videoEle) {
-            activeItem.videoEle.stop()
-          }
-          // console.log('🚀 ~ activeItem:', activeItem)
-          // 停止曲谱的播放
-          if (activeItem.type === 'SONG') {
-            activeItem.iframeRef?.contentWindow?.postMessage({ api: 'setPlayState' }, '*')
-          }
-        }
-      }
-    }
-    // 切换素材
-    const toggleMaterial = () => {
-      const index = data.itemList.findIndex((n: any) => n.id == popupData.itemActive)
-      if (index > -1) {
-        handleSwipeChange(index)
-      }
-    }
-    /** 延迟收起模态框 */
-    const setModelOpen = () => {
-      clearTimeout(activeData.timer)
-      closeToast()
-      activeData.timer = setTimeout(() => {
-        activeData.model = false
-        Object.values(data.videoRefs).map((n: any) => n.toggleHideControl(false))
-      }, 4000)
-    }
-
-    // 去点名,签退
-    const gotoRollCall = (pageTag: string) => {
-      postMessage({
-        api: 'open_app_page',
-        content: {
-          action: 'app',
-          pageTag: pageTag,
-          url: '',
-          params: JSON.stringify({ courseId: route.query.courseId })
-        }
-      })
-    }
-
-    // 双击
-    const handleDbClick = (item: any) => {
-      if (item && item.type === 'VIDEO') {
-        const videoEle: HTMLVideoElement = item.videoEle
-        if (videoEle) {
-          if (videoEle.paused) {
-            closeToast()
-            videoEle.play()
-          } else {
-            showToast('已暂停')
-            videoEle.pause()
-          }
-        }
-      }
-    }
-
-    // 切换播放
-    const togglePlay = (m: any, isPlay: boolean) => {
-      if (isPlay) {
-        m.videoEle?.play()
-      } else {
-        m.videoEle?.pause()
-      }
-    }
-
-    const showIndex = ref(-4)
-    const effectIndex = ref(0)
-    const effects = [
-      {
-        prev: {
-          transform: 'translate3d(0, 0, -800px) rotateX(180deg)'
-        },
-        next: {
-          transform: 'translate3d(0, 0, -800px) rotateX(-180deg)'
-        }
-      },
-      {
-        prev: {
-          transform: 'translate3d(-100%, 0, -800px)'
-        },
-        next: {
-          transform: 'translate3d(100%, 0, -800px)'
-        }
-      },
-      {
-        prev: {
-          transform: 'translate3d(-50%, 0, -800px) rotateY(80deg)'
-        },
-        next: {
-          transform: 'translate3d(50%, 0, -800px) rotateY(-80deg)'
-        }
-      },
-      {
-        prev: {
-          transform: 'translate3d(-100%, 0, -800px) rotateY(-120deg)'
-        },
-        next: {
-          transform: 'translate3d(100%, 0, -800px) rotateY(120deg)'
-        }
-      },
-      //风车4
-      {
-        prev: {
-          transform: 'translate3d(-50%, 50%, -800px) rotateZ(-14deg)',
-          opacity: 0
-        },
-        next: {
-          transform: 'translate3d(50%, 50%, -800px) rotateZ(14deg)',
-          opacity: 0
-        }
-      },
-      //翻页5
-      {
-        prev: {
-          transform: 'translateZ(-800px) rotate3d(0, -1, 0, 90deg)',
-          opacity: 0
-        },
-        next: {
-          transform: 'translateZ(-800px) rotate3d(0, 1, 0, 90deg)',
-          opacity: 0
-        },
-        current: { transitionDelay: '700ms' }
-      }
-    ]
-
-    // 轮播切换
-    const handleSwipeChange = (index: number) => {
-      if (popupData.activeIndex == index) return
-      // console.log('轮播切换')
-      popupData.activeIndex = index
-      setTimeout(() => {
-        handleStop()
-        const item = data.itemList[index]
-        if (item) {
-          popupData.tabActive = item.knowledgePointId
-          popupData.itemActive = item.id
-          popupData.itemName = item.name
-          popupData.tabName = item.tabName
-          if (item.type == 'SONG') {
-            activeData.model = true
-          }
-          if (item.type === 'VIDEO') {
-            // 自动播放下一个视频
-            clearTimeout(activeData.timer)
-            closeToast()
-            item.autoPlay = true
-            nextTick(() => {
-              item.videoEle?.play()
-            })
-          }
-        }
-      }, 800)
-    }
-
-    // 上一个知识点, 下一个知识点
-    const handlePreAndNext = (type: string) => {
-      if (type === 'up') {
-        handleSwipeChange(popupData.activeIndex - 1)
-      } else {
-        handleSwipeChange(popupData.activeIndex + 1)
-      }
-    }
-
-    return () => (
-      <div class={styles.playContent}>
-        <div
-          onClick={() => {
-            clearTimeout(activeData.timer)
-            activeData.model = !activeData.model
-            Object.values(data.videoRefs).map((n: any) => n.toggleHideControl(activeData.model))
-          }}
-        >
-          <div
-            class={styles.coursewarePlay}
-            style={{ width: parentContainer.width }}
-            onClick={(e: Event) => {
-              e.stopPropagation()
-              setModelOpen()
-            }}
-          >
-            <div class={styles.wraps}>
-              {data.itemList.map((m: any, mIndex: number) => {
-                const isRender = m.isRender || Math.abs(popupData.activeIndex - mIndex) < 2
-                if (isRender) {
-                  m.isRender = true
-                }
-                return isRender ? (
-                  <div
-                    key={'index' + mIndex}
-                    class={[styles.itemDiv, popupData.activeIndex === mIndex && styles.itemActive]}
-                    style={
-                      mIndex < popupData.activeIndex
-                        ? effects[effectIndex.value].prev
-                        : mIndex > popupData.activeIndex
-                        ? effects[effectIndex.value].next
-                        : effects[effectIndex.value].current
-                    }
-                    onClick={(e: Event) => {
-                      e.stopPropagation()
-                      clearTimeout(activeData.timer)
-                      if (Date.now() - activeData.nowTime < 300) {
-                        handleDbClick(m)
-                        return
-                      }
-                      activeData.nowTime = Date.now()
-                      activeData.timer = setTimeout(() => {
-                        activeData.model = !activeData.model
-                        Object.values(data.videoRefs).map((n: any) =>
-                          n.toggleHideControl(activeData.model)
-                        )
-                        if (activeData.model) {
-                          setModelOpen()
-                        }
-                      }, 300)
-                    }}
-                  >
-                    {m.type === 'VIDEO' ? (
-                      <>
-                        <VideoPlay
-                          ref={(v: any) => (data.videoRefs[mIndex] = v)}
-                          item={m}
-                          onLoadedmetadata={(videoItem: any) => {
-                            m.videoEle = videoItem
-                          }}
-                          onTogglePlay={(paused: boolean) => {
-                            // console.log('播放切换', paused)
-                            // 首次播放完成
-                            if (!m.isprepare) {
-                              m.isprepare = true
-                            }
-                            m.autoPlay = false
-                            if (paused || popupData.open || popupData.guideOpen) {
-                              clearTimeout(activeData.timer)
-                            } else {
-                              setModelOpen()
-                            }
-                          }}
-                          onEnded={() => handleSwipeChange(popupData.activeIndex + 1)}
-                          onReset={() => {
-                            if (!m.videoEle?.paused) {
-                              setModelOpen()
-                            }
-                          }}
-                        />
-                        <Transition name="van-fade">
-                          {!m.isprepare && (
-                            <div class={styles.loadWrap}>
-                              <Vue3Lottie animationData={playLoadData}></Vue3Lottie>
-                            </div>
-                          )}
-                        </Transition>
-                      </>
-                    ) : m.type === 'IMG' ? (
-                      <img src={m.content} />
-                    ) : (
-                      <MusicScore
-                        data-vid={m.id}
-                        music={m}
-                        onSetIframe={(el: any) => {
-                          m.iframeRef = el
-                        }}
-                      />
-                    )}
-                  </div>
-                ) : null
-              })}
-            </div>
-            <Transition name="right">
-              {activeData.model && (
-                <div
-                  class={styles.rightFixedBtns}
-                  onClick={(e: Event) => {
-                    e.stopPropagation()
-                    clearTimeout(activeData.timer)
-                  }}
-                >
-                  <div class={styles.btnsWrap}>
-                    <div
-                      class={[styles.fullBtn, styles.point]}
-                      onClick={() => (popupData.open = true)}
-                    >
-                      <img src={iconMenu} />
-                      <span>知识点</span>
-                    </div>
-                  </div>
-
-                  <div class={[styles.btnsWrap, styles.btnsBottom]}>
-                    <div class={styles.fullBtn} onClick={() => (popupData.guideOpen = true)}>
-                      <img src={iconTouping} />
-                      <span>投屏</span>
-                    </div>
-                    {data.isCourse && (
-                      <>
-                        <div
-                          class={styles.fullBtn}
-                          onClick={() => gotoRollCall('student_roll_call')}
-                        >
-                          <img src={iconDian} />
-                          <span>点名</span>
-                        </div>
-                        <div class={styles.fullBtn} onClick={() => gotoRollCall('sign_out')}>
-                          <img src={iconPoint} />
-                          <span>签退</span>
-                        </div>
-                      </>
-                    )}
-                  </div>
-                </div>
-              )}
-            </Transition>
-
-            <Transition name="left">
-              {activeData.model && (
-                <div class={styles.leftFixedBtns} onClick={(e: Event) => e.stopPropagation()}>
-                  {popupData.activeIndex != 0 && (
-                    <div class={[styles.btnsWrap, styles.prePoint]}>
-                      <div class={styles.fullBtn} onClick={() => handlePreAndNext('up')}>
-                        <img src={iconUp} />
-                        <span style={{ textAlign: 'center' }}>上一个</span>
-                      </div>
-                    </div>
-                  )}
-                  {popupData.activeIndex != data.itemList.length - 1 && (
-                    <div class={styles.btnsWrap}>
-                      <div class={styles.fullBtn} onClick={() => handlePreAndNext('down')}>
-                        <span style={{ textAlign: 'center' }}>下一个</span>
-                        <img src={iconDown} />
-                      </div>
-                    </div>
-                  )}
-                </div>
-              )}
-            </Transition>
-          </div>
-        </div>
-
-        <div
-          style={{ transform: activeData.model ? '' : 'translateY(-100%)' }}
-          id="coursePlayHeader"
-          class={styles.headerContainer}
-          ref={headeRef}
-        >
-          <div class={styles.backBtn} onClick={() => goback()}>
-            <Icon name={iconBack} />
-            返回
-          </div>
-          <div
-            class={styles.menu}
-            onClick={() => {
-              showIndex.value += 1
-              if (showIndex.value > 0) {
-                effectIndex.value = effectIndex.value >= effects.length ? 0 : effectIndex.value + 1
-              }
-              setModelOpen()
-            }}
-          >
-            {popupData.tabName} {showIndex.value > 0 ? `动画${effectIndex.value}` : ''}
-          </div>
-          {data.isCourse && <PlayRecordTime ref={playRef} list={data.itemList} />}
-        </div>
-
-        <Popup
-          class={styles.popup}
-          overlayClass={styles.overlayClass}
-          position="right"
-          round
-          v-model:show={popupData.open}
-          onClose={() => {
-            const item = data.itemList[popupData.activeIndex]
-            if (item?.type == 'VIDEO' && !item.videoEle?.paused) {
-              setModelOpen()
-            }
-          }}
-        >
-          <Points
-            data={data.knowledgePointList}
-            tabActive={popupData.tabActive}
-            itemActive={popupData.itemActive}
-            onHandleSelect={(res: any) => {
-              // console.log(res)
-              popupData.tabActive = res.tabActive
-              popupData.itemActive = res.itemActive
-              popupData.tabName = res.tabName
-              popupData.open = false
-              toggleMaterial()
-            }}
-          />
-        </Popup>
-
-        <Popup
-          class={styles.popup}
-          overlayClass={styles.overlayClass}
-          position="right"
-          round
-          v-model:show={popupData.guideOpen}
-          onClose={() => {
-            const item = data.itemList[popupData.activeIndex]
-            if (item?.type == 'VIDEO' && !item.videoEle?.paused) {
-              setModelOpen()
-            }
-          }}
-        >
-          <OGuide />
-        </Popup>
-      </div>
-    )
-  }
-})