|
@@ -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>
|
|
|
- )
|
|
|
- }
|
|
|
-})
|