|
@@ -2,6 +2,7 @@ import {
|
|
|
Button,
|
|
|
closeToast,
|
|
|
Icon,
|
|
|
+ Loading,
|
|
|
Popup,
|
|
|
showToast,
|
|
|
Slider,
|
|
@@ -93,16 +94,6 @@ export default defineComponent({
|
|
|
timer: null as any,
|
|
|
item: null as any
|
|
|
})
|
|
|
- watch(
|
|
|
- () => activeData.model,
|
|
|
- () => {
|
|
|
- const videoItem = data.itemList.find((n) => n.id === popupData.itemActive)
|
|
|
- // 阴影切换的时候,具体去切换某个视频的控件
|
|
|
- if (videoItem && videoItem.type === 'VIDEO') {
|
|
|
- videoItem.playModel = activeData.model
|
|
|
- }
|
|
|
- }
|
|
|
- )
|
|
|
// 获取缓存路径
|
|
|
const getCacheFilePath = async (material: any) => {
|
|
|
const res = await promisefiyPostMessage({
|
|
@@ -135,7 +126,6 @@ export default defineComponent({
|
|
|
const getItemList = async () => {
|
|
|
const list: any = []
|
|
|
const browserInfo = browser()
|
|
|
- let _item = null
|
|
|
for (let i = 0; i < data.knowledgePointList.length; i++) {
|
|
|
const item = data.knowledgePointList[i]
|
|
|
const itemLength = item.materialList.length - 1
|
|
@@ -163,7 +153,8 @@ export default defineComponent({
|
|
|
timer: null,
|
|
|
playModel: false,
|
|
|
isprepare: false,
|
|
|
- isDrage: false
|
|
|
+ isDrage: false,
|
|
|
+ muted: false // 是否静音
|
|
|
}
|
|
|
}
|
|
|
list.push({
|
|
@@ -172,25 +163,26 @@ export default defineComponent({
|
|
|
iframeRef: null,
|
|
|
tabName: item.name,
|
|
|
isLast: j === itemLength, // 当前知识点
|
|
|
- autoPlay: j === itemLength
|
|
|
+ autoPlay: false //加载完成是否自动播放
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let item: any = null
|
|
|
if (route.query.kId) {
|
|
|
- item = list.find((n: any) => n.id == route.query.kId)
|
|
|
- const _firstIndex = list.findIndex((n: any) => n.id == route.query.kId)
|
|
|
+ item = list.find((n: any) => n.materialId == route.query.kId)
|
|
|
+ const _firstIndex = list.findIndex((n: any) => n.materialId == route.query.kId)
|
|
|
popupData.firstIndex = _firstIndex > -1 ? _firstIndex : 0
|
|
|
- } else {
|
|
|
- item = list[0] || {}
|
|
|
}
|
|
|
+ item = item ? item : list[0] || {}
|
|
|
if (item) {
|
|
|
popupData.tabName = item.tabName
|
|
|
popupData.tabActive = item.knowledgePointId
|
|
|
popupData.itemActive = item.id
|
|
|
popupData.itemName = item.name
|
|
|
popupData.activeIndex = popupData.firstIndex
|
|
|
+ item.autoPlay = true
|
|
|
+ item.muted = true
|
|
|
}
|
|
|
console.log('🚀 ~ list', list)
|
|
|
data.itemList = list
|
|
@@ -204,8 +196,18 @@ export default defineComponent({
|
|
|
data.detail = res.data
|
|
|
}
|
|
|
if (Array.isArray(res?.data?.knowledgePointList)) {
|
|
|
+ let index = 0
|
|
|
data.knowledgePointList = res.data.knowledgePointList.map((n: any) => {
|
|
|
- n.index = 0
|
|
|
+ if (Array.isArray(n.materialList)) {
|
|
|
+ n.materialList = n.materialList.map((item: any) => {
|
|
|
+ index++
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ materialId: item.id,
|
|
|
+ id: index + ''
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
return n
|
|
|
})
|
|
|
getItemList()
|
|
@@ -216,7 +218,8 @@ export default defineComponent({
|
|
|
const iframeHandle = (ev: MessageEvent) => {
|
|
|
// console.log(ev.data)
|
|
|
if (ev.data?.api === 'headerTogge') {
|
|
|
- activeData.model = ev.data.show
|
|
|
+ // activeData.model = ev.data.show
|
|
|
+ activeData.model = !activeData.model
|
|
|
}
|
|
|
}
|
|
|
onMounted(() => {
|
|
@@ -249,7 +252,11 @@ export default defineComponent({
|
|
|
// 停止所有的播放
|
|
|
const handleStopVideo = () => {
|
|
|
data.itemList.forEach((m: any) => {
|
|
|
- m.videoEle?.pause()
|
|
|
+ const item = data.itemList[popupData.activeIndex]
|
|
|
+ if (item?.id != m.id) {
|
|
|
+ m.autoPlay = false
|
|
|
+ m.videoEle?.pause()
|
|
|
+ }
|
|
|
})
|
|
|
}
|
|
|
// 停止曲谱的播放
|
|
@@ -266,8 +273,17 @@ export default defineComponent({
|
|
|
swipeRef.value?.swipeTo(index)
|
|
|
}
|
|
|
}
|
|
|
+ /** 延迟收起模态框 */
|
|
|
+ const setModelOpen = () => {
|
|
|
+ clearTimeout(activeData.timer)
|
|
|
+ closeToast()
|
|
|
+ activeData.timer = setTimeout(() => {
|
|
|
+ activeData.model = false
|
|
|
+ }, 4000)
|
|
|
+ }
|
|
|
// 轮播切换
|
|
|
const handleSwipeChange = (val: any) => {
|
|
|
+ console.log('轮播切换')
|
|
|
popupData.activeIndex = val
|
|
|
const item = data.itemList[val]
|
|
|
if (item) {
|
|
@@ -275,9 +291,20 @@ export default defineComponent({
|
|
|
popupData.itemActive = item.id
|
|
|
popupData.itemName = item.name
|
|
|
popupData.tabName = item.tabName
|
|
|
- activeData.model = true
|
|
|
+ if (item.type == 'SONG') {
|
|
|
+ activeData.model = true
|
|
|
+ }
|
|
|
if (item.type === 'VIDEO') {
|
|
|
- item.playModel = true
|
|
|
+ // console.log("🚀 ~ item", item)
|
|
|
+ // 自动播放下一个视频
|
|
|
+ clearTimeout(activeData.timer)
|
|
|
+ closeToast()
|
|
|
+ item.currentTime = 0
|
|
|
+ item.videoEle && (item.videoEle.currentTime = 0)
|
|
|
+ nextTick(() => {
|
|
|
+ item.autoPlay = true
|
|
|
+ item.videoEle?.play()
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -309,7 +336,6 @@ export default defineComponent({
|
|
|
if (item && item.type === 'VIDEO') {
|
|
|
const videoEle: HTMLVideoElement = item.videoEle
|
|
|
if (videoEle) {
|
|
|
- console.log(videoEle)
|
|
|
if (videoEle.paused) {
|
|
|
closeToast()
|
|
|
videoEle.play()
|
|
@@ -318,29 +344,20 @@ export default defineComponent({
|
|
|
videoEle.pause()
|
|
|
}
|
|
|
}
|
|
|
- item.timer = setTimeout(() => {
|
|
|
- activeData.model = false
|
|
|
- }, 3000)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 暂停播放
|
|
|
const handlePaused = (e: Event, m: any) => {
|
|
|
e.stopPropagation()
|
|
|
- console.log('暂停')
|
|
|
m.videoEle?.pause()
|
|
|
m.paused = true
|
|
|
}
|
|
|
// 开始播放
|
|
|
const handlePlay = (e: Event, m: any) => {
|
|
|
e.stopPropagation()
|
|
|
- clearTimeout(m.timer)
|
|
|
closeToast()
|
|
|
m.videoEle?.play()
|
|
|
- m.paused = false
|
|
|
- m.timer = setTimeout(() => {
|
|
|
- activeData.model = false
|
|
|
- }, 3000)
|
|
|
}
|
|
|
|
|
|
// 调整播放进度
|
|
@@ -356,38 +373,8 @@ export default defineComponent({
|
|
|
const handleEnded = (m: any) => {
|
|
|
// console.log(m)
|
|
|
if (popupData.activeIndex != data.itemList.length - 1) {
|
|
|
- popupData.activeIndex++
|
|
|
swipeRef.value?.next()
|
|
|
- const nextItem = data.itemList[popupData.activeIndex]
|
|
|
- if (nextItem.type === 'VIDEO'){
|
|
|
- nextTick(() => {
|
|
|
- // 自动播放下一个知识点
|
|
|
- // if (m.autoPlay) {
|
|
|
- // }
|
|
|
- nextItem.videoEle?.play()
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- console.log('🚀 ~ nextItem', nextItem)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //加载第一帧
|
|
|
- const handleFirstFrame = (video: HTMLVideoElement) => {
|
|
|
- // console.log("🚀 ~ 加载第一帧", video.videoWidth, video.videoHeight)
|
|
|
- const captureImage = function () {
|
|
|
- var canvas = document.createElement('canvas')
|
|
|
- canvas.width = video.videoWidth
|
|
|
- canvas.height = video.videoHeight
|
|
|
- canvas?.getContext('2d')?.drawImage(video, 0, 0, canvas.width, canvas.height)
|
|
|
- canvas.toBlob((blob) => {
|
|
|
- // console.log("🚀 ~ blob", blob)
|
|
|
- const imgUrl = URL.createObjectURL(blob as any)
|
|
|
- // console.log("🚀 ~ imgUrl", imgUrl)
|
|
|
- video.setAttribute('poster', imgUrl)
|
|
|
- })
|
|
|
}
|
|
|
- captureImage()
|
|
|
}
|
|
|
|
|
|
return () => (
|
|
@@ -399,6 +386,7 @@ export default defineComponent({
|
|
|
loop={false}
|
|
|
vertical
|
|
|
lazyRender={true}
|
|
|
+ touchable={false}
|
|
|
initialSwipe={popupData.firstIndex}
|
|
|
onChange={handleSwipeChange}
|
|
|
>
|
|
@@ -410,7 +398,6 @@ export default defineComponent({
|
|
|
class={styles.itemDiv}
|
|
|
onClick={() => {
|
|
|
clearTimeout(activeData.timer)
|
|
|
- clearTimeout(m.timer)
|
|
|
if (Date.now() - activeData.nowTime < 300) {
|
|
|
handleDbClick(m)
|
|
|
return
|
|
@@ -418,6 +405,7 @@ export default defineComponent({
|
|
|
activeData.nowTime = Date.now()
|
|
|
activeData.timer = setTimeout(() => {
|
|
|
activeData.model = !activeData.model
|
|
|
+ setModelOpen()
|
|
|
}, 300)
|
|
|
}}
|
|
|
>
|
|
@@ -425,23 +413,20 @@ export default defineComponent({
|
|
|
<>
|
|
|
<video
|
|
|
playsinline="false"
|
|
|
+ muted={m.muted}
|
|
|
preload="auto"
|
|
|
class="player"
|
|
|
poster={iconVideobg}
|
|
|
data-vid={m.id}
|
|
|
src={m.content}
|
|
|
loop={m.loop}
|
|
|
- // onLoadeddata={(e: Event) =>
|
|
|
- // handleFirstFrame(e.target as unknown as HTMLVideoElement)
|
|
|
- // }
|
|
|
+ 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
|
|
|
- m.playModel = true
|
|
|
- console.log('视频准备完成')
|
|
|
}}
|
|
|
onTimeupdate={(e: Event) => {
|
|
|
if (!m.isprepare) return
|
|
@@ -450,15 +435,17 @@ export default defineComponent({
|
|
|
m.progress = Number(
|
|
|
((videoEle.currentTime / m.duration) * 100).toFixed(1)
|
|
|
)
|
|
|
- // console.log('播放',videoEle.currentTime, m.progress)
|
|
|
}}
|
|
|
onPlay={() => {
|
|
|
// 播放
|
|
|
m.paused = false
|
|
|
+ console.log('播放')
|
|
|
+ setModelOpen()
|
|
|
+ m.muted = false
|
|
|
}}
|
|
|
onPause={() => {
|
|
|
//暂停
|
|
|
- clearTimeout(m.timer)
|
|
|
+ clearTimeout(activeData.timer)
|
|
|
m.paused = true
|
|
|
}}
|
|
|
onEnded={() => handleEnded(m)}
|
|
@@ -466,7 +453,7 @@ export default defineComponent({
|
|
|
<source src={m.content} type="video/mp4" />
|
|
|
</video>
|
|
|
<Transition name="bottom">
|
|
|
- {m.playModel && (
|
|
|
+ {activeData.model && (
|
|
|
<div class={[styles.bottomFixedContainer]}>
|
|
|
<div class={styles.time}>
|
|
|
<span>{getSecondRPM(m.currentTime)}</span>
|
|
@@ -474,6 +461,9 @@ export default defineComponent({
|
|
|
</div>
|
|
|
<div class={styles.slider}>
|
|
|
<Slider
|
|
|
+ onClick={() => {
|
|
|
+ setModelOpen()
|
|
|
+ }}
|
|
|
style={{ display: m.isprepare ? 'block' : 'none' }}
|
|
|
buttonSize={16}
|
|
|
step={0.1}
|
|
@@ -504,29 +494,36 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.actions}>
|
|
|
- <div>
|
|
|
- {m.paused ? (
|
|
|
- <Icon
|
|
|
- name={iconplay}
|
|
|
- onClick={(e: Event) => handlePlay(e, m)}
|
|
|
- />
|
|
|
+ <div class={styles.actionBtn}>
|
|
|
+ {m.isprepare ? (
|
|
|
+ <>
|
|
|
+ {m.paused ? (
|
|
|
+ <img
|
|
|
+ src={iconplay}
|
|
|
+ onClick={(e: Event) => handlePlay(e, m)}
|
|
|
+ />
|
|
|
+ ) : (
|
|
|
+ <img
|
|
|
+ src={iconpause}
|
|
|
+ onClick={(e: Event) => handlePaused(e, m)}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </>
|
|
|
) : (
|
|
|
- <Icon
|
|
|
- name={iconpause}
|
|
|
- onClick={(e: Event) => handlePaused(e, m)}
|
|
|
- />
|
|
|
+ <Loading color="#fff" />
|
|
|
)}
|
|
|
+
|
|
|
{m.loop ? (
|
|
|
- <Icon
|
|
|
- name={iconLoopActive}
|
|
|
+ <img
|
|
|
+ src={iconLoopActive}
|
|
|
onClick={(e: Event) => {
|
|
|
e.stopPropagation()
|
|
|
m.loop = false
|
|
|
}}
|
|
|
/>
|
|
|
) : (
|
|
|
- <Icon
|
|
|
- name={iconLoop}
|
|
|
+ <img
|
|
|
+ src={iconLoop}
|
|
|
onClick={(e: Event) => {
|
|
|
e.stopPropagation()
|
|
|
m.loop = true
|
|
@@ -551,9 +548,6 @@ export default defineComponent({
|
|
|
}}
|
|
|
/>
|
|
|
)}
|
|
|
- {/* <Transition name="van-fade">
|
|
|
- {activeData.model && <div class={styles.playModel}></div>}
|
|
|
- </Transition> */}
|
|
|
</div>
|
|
|
</>
|
|
|
</SwipeItem>
|
|
@@ -576,7 +570,13 @@ export default defineComponent({
|
|
|
<Transition name="right">
|
|
|
{activeData.model && (
|
|
|
<div class={styles.rightFixedBtns}>
|
|
|
- <div class={styles.fullBtn} onClick={() => (popupData.open = true)}>
|
|
|
+ <div
|
|
|
+ class={styles.fullBtn}
|
|
|
+ onClick={() => {
|
|
|
+ clearTimeout(activeData.timer)
|
|
|
+ popupData.open = true
|
|
|
+ }}
|
|
|
+ >
|
|
|
<img src={iconMenu} />
|
|
|
<span>知识点</span>
|
|
|
</div>
|
|
@@ -627,6 +627,12 @@ export default defineComponent({
|
|
|
position="right"
|
|
|
round
|
|
|
v-model:show={popupData.open}
|
|
|
+ onClose={() => {
|
|
|
+ const item = data.itemList[popupData.activeIndex]
|
|
|
+ if (item?.type == 'VIDEO') {
|
|
|
+ setModelOpen()
|
|
|
+ }
|
|
|
+ }}
|
|
|
>
|
|
|
<Points
|
|
|
data={data.knowledgePointList}
|