| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 | 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 } from '@/utils/index';import { getGuidance, setGuidance } from './api';export default defineComponent({  name: 'myResources-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('myResourecs1.png'),          handStyle: {            top: '0.91rem'          },          imgStyle: {            top: px2vw(-4),            left: px2vw(-240),            width: px2vw(556),            height: px2vw(257)          },          btnsStyle: {            bottom: px2vw(30),            left: px2vw(-80)          },          eleRectPadding: {            left: 14,            top: 14,            width: 28,            height: 28          },          boxStyle: {            borderRadius: '30px'          }        }      ],      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 = {};        }        console.log(guideInfo.value, 'guideInfo.value');        if (guideInfo.value && guideInfo.value.myResourcesGuide) {          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).myResourcesGuide) {    //   tipShow.value = false;    // } else {    //   tipShow.value = true;    // }    const getStepELe = () => {      const ele: HTMLElement = document.getElementById(        `myResources-${data.step}`      )!;      if (ele) {        const eleRect = ele.getBoundingClientRect();        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 !== 'myResources') return;        if (!guideInfo.value) {          guideInfo.value = { classGuide: false };        } else {          guideInfo.value.classGuide = 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('natural-resources-guide', (name: string) =>        onResetGuide(name)      );    });    const resetSize = () => {      getStepELe();    };    onUnmounted(() => {      window.removeEventListener('resize', resetSize);      eventGlobal.off('natural-resources-guide', onResetGuide);    });    const handleNext = () => {      if (data.step >= 4) {        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 = { myResourcesGuide: true };      } else {        guideInfo.value.myResourcesGuide = 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}      </>    );  }});
 |