import { NButton } from 'naive-ui'; import { defineComponent, nextTick, onMounted, onUnmounted, reactive, ref, watch } from 'vue'; import styles from './index.module.less'; import { getImage } from './images'; import {px2vw,px2vwH} from '@/utils/index' import {getGuidance,setGuidance} from './api' export default defineComponent({ name: 'music-guide', emits: ['close'], setup(props, { emit }) { const data = reactive({ box: { height:'0px', } as any, show: false, /** * width: px2vw(840), height: px2vw(295) */ steps: [ { ele: '', eleRect: {} as DOMRect, img: getImage('music1.png'), handStyle: { top: '0.91rem' }, imgStyle: { top:px2vw(-4), left: px2vw(0), width: px2vw(534), height: px2vw(228) }, btnsStyle: { bottom:px2vw(40), left: px2vw(159), }, eleRectPadding:{ left:7, top:7, width:14, height:14 } }, { ele: '', img: getImage('music2.png'), imgStyle: { top:px2vw(-4), left: px2vw(-205), width:px2vw(420), height:px2vw(228) }, btnsStyle: { bottom: px2vw(35), left: px2vw(-48), }, boxStyle:{ borderRadius: '25px' }, eleRectPadding:{ left:7, top:7, width:14, height:14 } }, { ele: '', img: getImage('music3.png'), imgStyle: { top: '100%', left: '-130px', width: px2vw(401), height: px2vw(304) }, btnsStyle: { bottom: px2vw(100), left:px2vw(30), }, boxStyle:{ borderRadius: '40px' }, eleRectPadding:{ left:7, top:7, width:14, height:14 }, type:'bottom' }, ], step: 0 }); const tipShow = ref(false); const guideInfo = ref({} as any) const getAllGuidance = async()=>{ try{ const res = await getGuidance({guideTag:'teacher-guideInfo'}) guideInfo.value = JSON.parse(res.data?.guideValue) if (guideInfo.value && guideInfo.value.musicGuide) { tipShow.value = false; } else { tipShow.value = true; } }catch(e){ console.log(e) } // const guideInfo = localStorage.getItem('teacher-guideInfo'); } getAllGuidance() // const guideInfo = localStorage.getItem('teacher-guideInfo'); // if (guideInfo && JSON.parse(guideInfo).musicGuide) { // tipShow.value = false; // } else { // tipShow.value = true; // } const getStepELe = () => { const ele: HTMLElement = document.getElementById(`music-${data.step}`)!; if (ele ) { const eleRect = ele.getBoundingClientRect(); console.log(ele.style.display,'ele') if(ele.style.display == 'none'){ handleNext() return } const left = data.steps[data.step].eleRectPadding?.left || 0; const top = data.steps[data.step].eleRectPadding?.top || 0; const width = data.steps[data.step].eleRectPadding?.width || 0; const height = data.steps[data.step].eleRectPadding?.height || 0 data.box = { left: eleRect.x - left+ 'px', top: eleRect.y - top +'px', width: eleRect.width + width+'px', height: eleRect.height +height+ 'px' }; console.log(`coai-${data.step}`,data.box); }else{ handleNext() } }; onMounted(() => { getStepELe(); window.addEventListener("resize", resetSize); }); const resetSize = ()=>{ getStepELe(); } onUnmounted(()=>{ window.removeEventListener("resize", resetSize); }) const handleNext = () => { if (data.step >= 3) { endGuide(); return; } data.step = data.step + 1; getStepELe(); }; const endGuide = async() => { // let guideInfo = // JSON.parse(localStorage.getItem('teacher-guideInfo')|| '{}') || null; if (!guideInfo.value) { guideInfo.value = { musicGuide: true }; } else { guideInfo.value.musicGuide = true; } // localStorage.setItem('teacher-guideInfo', JSON.stringify(guideInfo)); try{ const res = await setGuidance({guideTag:'teacher-guideInfo',guideValue:JSON.stringify(guideInfo.value)}) }catch(e){ console.log(e) } tipShow.value = false; // localStorage.setItem('endC') }; return () => ( <> {tipShow.value ? (
handleNext()}>
{ e.stopPropagation(); endGuide(); }}> 跳过
{data.steps.map((item: any, index) => (
e.stopPropagation()} class={styles.item} style={ item.type=='bottom'? { display: index === data.step ? '' : 'none', left: `${item.eleRect?.left}px`, top:`-${item.imgStyle?.height}` }:{ display: index === data.step ? '' : 'none', left: `${item.eleRect?.left}px`, top: `${data.box?.height}`, }}> {/* */}
{data.step + 1 == data.steps.length ? ( <>
endGuide()}> 完成
{ data.step = 0; getStepELe(); }}> 再看一遍
) : (
handleNext()}> 下一步 ({data.step + 1}/{data.steps.length})
)}
))}
) : null} ); } });