|  | @@ -1,301 +1,301 @@
 | 
	
		
			
				|  |  | -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 { eventGlobal, 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(533),
 | 
	
		
			
				|  |  | -            height: px2vw(271)
 | 
	
		
			
				|  |  | -          },
 | 
	
		
			
				|  |  | -          btnsStyle: {
 | 
	
		
			
				|  |  | -            bottom: px2vw(40),
 | 
	
		
			
				|  |  | -            left: px2vw(-10)
 | 
	
		
			
				|  |  | -          },
 | 
	
		
			
				|  |  | -          eleRectPadding: {
 | 
	
		
			
				|  |  | -            left: 7,
 | 
	
		
			
				|  |  | -            top: 7,
 | 
	
		
			
				|  |  | -            width: 14,
 | 
	
		
			
				|  |  | -            height: 14
 | 
	
		
			
				|  |  | -          },
 | 
	
		
			
				|  |  | -          boxStyle: {}
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          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: px2vw(-130),
 | 
	
		
			
				|  |  | -            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' });
 | 
	
		
			
				|  |  | -        if (res.data) {
 | 
	
		
			
				|  |  | -          guideInfo.value = JSON.parse(res.data?.guideValue) || null;
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          guideInfo.value = {};
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        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();
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const onResetGuide = async (name: string) => {
 | 
	
		
			
				|  |  | -      try {
 | 
	
		
			
				|  |  | -        if (name !== 'xiaoku-music') return;
 | 
	
		
			
				|  |  | -        if (!guideInfo.value) {
 | 
	
		
			
				|  |  | -          guideInfo.value = { musicGuide: false };
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -          guideInfo.value.musicGuide = false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -          await setGuidance({
 | 
	
		
			
				|  |  | -            guideTag: 'teacher-guideInfo',
 | 
	
		
			
				|  |  | -            guideValue: JSON.stringify(guideInfo.value)
 | 
	
		
			
				|  |  | -          });
 | 
	
		
			
				|  |  | -        } catch (e) {
 | 
	
		
			
				|  |  | -          console.log(e);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        data.step = 0;
 | 
	
		
			
				|  |  | -        getStepELe();
 | 
	
		
			
				|  |  | -        tipShow.value = true;
 | 
	
		
			
				|  |  | -      } catch {
 | 
	
		
			
				|  |  | -        //
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    onMounted(() => {
 | 
	
		
			
				|  |  | -      getStepELe();
 | 
	
		
			
				|  |  | -      window.addEventListener('resize', resetSize);
 | 
	
		
			
				|  |  | -      eventGlobal.on('teacher-guideInfo', onResetGuide);
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const resetSize = () => {
 | 
	
		
			
				|  |  | -      getStepELe();
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    onUnmounted(() => {
 | 
	
		
			
				|  |  | -      window.removeEventListener('resize', resetSize);
 | 
	
		
			
				|  |  | -      eventGlobal.off('teacher-guideInfo', onResetGuide);
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    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 ? (
 | 
	
		
			
				|  |  | -          <div
 | 
	
		
			
				|  |  | -            v-model:show={tipShow.value}
 | 
	
		
			
				|  |  | -            class={['n-modal-mask', 'n-modal-mask-guide']}>
 | 
	
		
			
				|  |  | -            <div class={styles.content} onClick={() => handleNext()}>
 | 
	
		
			
				|  |  | -              <div
 | 
	
		
			
				|  |  | -                class={styles.backBtn}
 | 
	
		
			
				|  |  | -                onClick={(e: Event) => {
 | 
	
		
			
				|  |  | -                  e.stopPropagation();
 | 
	
		
			
				|  |  | -                  endGuide();
 | 
	
		
			
				|  |  | -                }}>
 | 
	
		
			
				|  |  | -                跳过
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -              <div
 | 
	
		
			
				|  |  | -                class={styles.box}
 | 
	
		
			
				|  |  | -                style={{ ...data.box, ...data.steps[data.step].boxStyle }}
 | 
	
		
			
				|  |  | -                id={`modeType-${data.step}`}>
 | 
	
		
			
				|  |  | -                {data.steps.map((item: any, index) => (
 | 
	
		
			
				|  |  | -                  <div
 | 
	
		
			
				|  |  | -                    onClick={(e: Event) => 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}`
 | 
	
		
			
				|  |  | -                          }
 | 
	
		
			
				|  |  | -                    }>
 | 
	
		
			
				|  |  | -                    <img
 | 
	
		
			
				|  |  | -                      class={styles.img}
 | 
	
		
			
				|  |  | -                      style={item.imgStyle}
 | 
	
		
			
				|  |  | -                      src={item.img}
 | 
	
		
			
				|  |  | -                    />
 | 
	
		
			
				|  |  | -                    {/* <img
 | 
	
		
			
				|  |  | -                      class={styles.iconHead}
 | 
	
		
			
				|  |  | -                      style={item.handStyle}
 | 
	
		
			
				|  |  | -                      src={getImage('indexDot.png')}
 | 
	
		
			
				|  |  | -                    /> */}
 | 
	
		
			
				|  |  | -                    <div class={styles.btns} style={item.btnsStyle}>
 | 
	
		
			
				|  |  | -                      {data.step + 1 == data.steps.length ? (
 | 
	
		
			
				|  |  | -                        <>
 | 
	
		
			
				|  |  | -                          <div
 | 
	
		
			
				|  |  | -                            class={[styles.endBtn]}
 | 
	
		
			
				|  |  | -                            onClick={() => endGuide()}>
 | 
	
		
			
				|  |  | -                            完成
 | 
	
		
			
				|  |  | -                          </div>
 | 
	
		
			
				|  |  | -                          <div
 | 
	
		
			
				|  |  | -                            class={styles.nextBtn}
 | 
	
		
			
				|  |  | -                            onClick={() => {
 | 
	
		
			
				|  |  | -                              data.step = 0;
 | 
	
		
			
				|  |  | -                              getStepELe();
 | 
	
		
			
				|  |  | -                            }}>
 | 
	
		
			
				|  |  | -                            再看一遍
 | 
	
		
			
				|  |  | -                          </div>
 | 
	
		
			
				|  |  | -                        </>
 | 
	
		
			
				|  |  | -                      ) : (
 | 
	
		
			
				|  |  | -                        <div class={styles.btn} onClick={() => handleNext()}>
 | 
	
		
			
				|  |  | -                          下一步 ({data.step + 1}/{data.steps.length})
 | 
	
		
			
				|  |  | -                        </div>
 | 
	
		
			
				|  |  | -                      )}
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                ))}
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -        ) : null}
 | 
	
		
			
				|  |  | -      </>
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +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 { eventGlobal, 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(533),
 | 
	
		
			
				|  |  | +            height: px2vw(271)
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          btnsStyle: {
 | 
	
		
			
				|  |  | +            bottom: px2vw(40),
 | 
	
		
			
				|  |  | +            left: px2vw(-10)
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          eleRectPadding: {
 | 
	
		
			
				|  |  | +            left: 7,
 | 
	
		
			
				|  |  | +            top: 7,
 | 
	
		
			
				|  |  | +            width: 14,
 | 
	
		
			
				|  |  | +            height: 14
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          boxStyle: {}
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          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: px2vw(-130),
 | 
	
		
			
				|  |  | +            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' });
 | 
	
		
			
				|  |  | +        if (res.data) {
 | 
	
		
			
				|  |  | +          guideInfo.value = JSON.parse(res.data?.guideValue) || null;
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          guideInfo.value = {};
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        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();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const onResetGuide = async (name: string) => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        if (name !== 'xiaoku-music') return;
 | 
	
		
			
				|  |  | +        if (!guideInfo.value) {
 | 
	
		
			
				|  |  | +          guideInfo.value = { musicGuide: false };
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          guideInfo.value.musicGuide = false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +          await setGuidance({
 | 
	
		
			
				|  |  | +            guideTag: 'teacher-guideInfo',
 | 
	
		
			
				|  |  | +            guideValue: JSON.stringify(guideInfo.value)
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        } catch (e) {
 | 
	
		
			
				|  |  | +          console.log(e);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        data.step = 0;
 | 
	
		
			
				|  |  | +        getStepELe();
 | 
	
		
			
				|  |  | +        tipShow.value = true;
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      getStepELe();
 | 
	
		
			
				|  |  | +      window.addEventListener('resize', resetSize);
 | 
	
		
			
				|  |  | +      eventGlobal.on('teacher-guideInfo', onResetGuide);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const resetSize = () => {
 | 
	
		
			
				|  |  | +      getStepELe();
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onUnmounted(() => {
 | 
	
		
			
				|  |  | +      window.removeEventListener('resize', resetSize);
 | 
	
		
			
				|  |  | +      eventGlobal.off('teacher-guideInfo', onResetGuide);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    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 ? (
 | 
	
		
			
				|  |  | +          <div
 | 
	
		
			
				|  |  | +            v-model:show={tipShow.value}
 | 
	
		
			
				|  |  | +            class={['n-modal-mask', 'n-modal-mask-guide']}>
 | 
	
		
			
				|  |  | +            <div class={styles.content} onClick={() => handleNext()}>
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={styles.backBtn}
 | 
	
		
			
				|  |  | +                onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                  e.stopPropagation();
 | 
	
		
			
				|  |  | +                  endGuide();
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                跳过
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={styles.box}
 | 
	
		
			
				|  |  | +                style={{ ...data.box, ...data.steps[data.step].boxStyle }}
 | 
	
		
			
				|  |  | +                id={`modeType-${data.step}`}>
 | 
	
		
			
				|  |  | +                {data.steps.map((item: any, index) => (
 | 
	
		
			
				|  |  | +                  <div
 | 
	
		
			
				|  |  | +                    onClick={(e: Event) => 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}`
 | 
	
		
			
				|  |  | +                          }
 | 
	
		
			
				|  |  | +                    }>
 | 
	
		
			
				|  |  | +                    <img
 | 
	
		
			
				|  |  | +                      class={styles.img}
 | 
	
		
			
				|  |  | +                      style={item.imgStyle}
 | 
	
		
			
				|  |  | +                      src={item.img}
 | 
	
		
			
				|  |  | +                    />
 | 
	
		
			
				|  |  | +                    {/* <img
 | 
	
		
			
				|  |  | +                      class={styles.iconHead}
 | 
	
		
			
				|  |  | +                      style={item.handStyle}
 | 
	
		
			
				|  |  | +                      src={getImage('indexDot.png')}
 | 
	
		
			
				|  |  | +                    /> */}
 | 
	
		
			
				|  |  | +                    <div class={styles.btns} style={item.btnsStyle}>
 | 
	
		
			
				|  |  | +                      {data.step + 1 == data.steps.length ? (
 | 
	
		
			
				|  |  | +                        <>
 | 
	
		
			
				|  |  | +                          <div
 | 
	
		
			
				|  |  | +                            class={[styles.endBtn]}
 | 
	
		
			
				|  |  | +                            onClick={() => endGuide()}>
 | 
	
		
			
				|  |  | +                            完成
 | 
	
		
			
				|  |  | +                          </div>
 | 
	
		
			
				|  |  | +                          {/* <div
 | 
	
		
			
				|  |  | +                            class={styles.nextBtn}
 | 
	
		
			
				|  |  | +                            onClick={() => {
 | 
	
		
			
				|  |  | +                              data.step = 0;
 | 
	
		
			
				|  |  | +                              getStepELe();
 | 
	
		
			
				|  |  | +                            }}>
 | 
	
		
			
				|  |  | +                            再看一遍
 | 
	
		
			
				|  |  | +                          </div> */}
 | 
	
		
			
				|  |  | +                        </>
 | 
	
		
			
				|  |  | +                      ) : (
 | 
	
		
			
				|  |  | +                        <div class={styles.btn} onClick={() => handleNext()}>
 | 
	
		
			
				|  |  | +                          下一步 ({data.step + 1}/{data.steps.length})
 | 
	
		
			
				|  |  | +                        </div>
 | 
	
		
			
				|  |  | +                      )}
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                ))}
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        ) : null}
 | 
	
		
			
				|  |  | +      </>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |