|
@@ -0,0 +1,195 @@
|
|
|
+import { Button, Popup } from "vant";
|
|
|
+import { } from "vant";
|
|
|
+import { defineComponent, nextTick, onMounted, reactive, ref, watch } from "vue";
|
|
|
+import styles from "./index.module.less";
|
|
|
+import { getImage } from "./images";
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: "courseware-list",
|
|
|
+ emits: ["close"],
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const data = reactive({
|
|
|
+ box: {},
|
|
|
+ show: false,
|
|
|
+ steps: [
|
|
|
+ {
|
|
|
+ ele: "",
|
|
|
+ eleRect: {} as DOMRect,
|
|
|
+ img: getImage("courseware-list1.png"),
|
|
|
+ handStyle: {
|
|
|
+ top: "1.5rem",
|
|
|
+ left:"3.8rem",
|
|
|
+ transform: 'rotate(-90deg)'
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: ".7rem",
|
|
|
+ left:"4.8rem",
|
|
|
+ },
|
|
|
+ btnsStyle: {
|
|
|
+ top: "3.5rem",
|
|
|
+ left:"6rem",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ele: "",
|
|
|
+ img: getImage("courseware-list2.png"),
|
|
|
+ handStyle: {
|
|
|
+ top: "-.3rem",
|
|
|
+ left:"1.3rem",
|
|
|
+ transform: 'rotate(-90deg)'
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: "-1.2rem",
|
|
|
+ left:"2.4rem",
|
|
|
+
|
|
|
+ },
|
|
|
+ btnsStyle: {
|
|
|
+ top: "1.6rem",
|
|
|
+ left:'3.6rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ele: "",
|
|
|
+ img: getImage("courseware-list3.png"),
|
|
|
+ handStyle: {
|
|
|
+ bottom: "-2rem",
|
|
|
+ left:'0.5rem',
|
|
|
+
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: "1.2rem",
|
|
|
+ left:'-2rem'
|
|
|
+ },
|
|
|
+ btnsStyle: {
|
|
|
+ top:"4.2rem",
|
|
|
+ left:'-0.5rem',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ele: "",
|
|
|
+ img: getImage("courseware-list4.png"),
|
|
|
+ handStyle: {
|
|
|
+ top: ".9rem",
|
|
|
+ left:'1rem',
|
|
|
+
|
|
|
+ },
|
|
|
+ imgStyle: {
|
|
|
+ top: "1.1rem",
|
|
|
+ left:'-4.6rem',
|
|
|
+
|
|
|
+ },
|
|
|
+ btnsStyle: {
|
|
|
+ top: "4rem",
|
|
|
+ left: "-4.5rem",
|
|
|
+ "justify-content": "center",
|
|
|
+ padding: 0,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ step: 0,
|
|
|
+ });
|
|
|
+ const tipShow = ref(false)
|
|
|
+ const guideInfo = localStorage.getItem('guideInfo')
|
|
|
+ if(guideInfo&&JSON.parse(guideInfo).courseware){
|
|
|
+ tipShow.value =false
|
|
|
+ }else {
|
|
|
+ tipShow.value =true
|
|
|
+ }
|
|
|
+ const getStepELe = () => {
|
|
|
+ console.log(`courseware-${data.step}`)
|
|
|
+ const ele: HTMLElement = document.getElementById(`courseware-${data.step}`)!;
|
|
|
+ if (ele) {
|
|
|
+ const eleRect = ele.getBoundingClientRect();
|
|
|
+ data.box = {
|
|
|
+ left: eleRect.x + "px",
|
|
|
+ top: eleRect.y + "px",
|
|
|
+ width: eleRect.width + "px",
|
|
|
+ height: eleRect.height + "px",
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ onMounted(() => {
|
|
|
+ getStepELe();
|
|
|
+ });
|
|
|
+
|
|
|
+ const handleNext = () => {
|
|
|
+ if (data.step >= 3) {
|
|
|
+ endGuide();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ data.step = data.step + 1;
|
|
|
+ getStepELe();
|
|
|
+ };
|
|
|
+
|
|
|
+ const endGuide = ()=>{
|
|
|
+ let guideInfo = JSON.parse(localStorage.getItem('guideInfo')) || null
|
|
|
+ if(!guideInfo){
|
|
|
+ guideInfo = {courseware:true}
|
|
|
+ }else{
|
|
|
+ guideInfo.courseware = true
|
|
|
+ }
|
|
|
+ localStorage.setItem('guideInfo',JSON.stringify(guideInfo))
|
|
|
+ tipShow.value = false
|
|
|
+ // localStorage.setItem('endC')
|
|
|
+ }
|
|
|
+ return () => (
|
|
|
+ <Popup teleport="body" overlay={false} closeOnClickOverlay={false} class={["popup-custom", styles.guidePopup]} v-model:show={tipShow.value}>
|
|
|
+ <div class={styles.content} onClick={() => handleNext()}>
|
|
|
+ <div
|
|
|
+ class={styles.backBtn}
|
|
|
+ onClick={(e: Event) => {
|
|
|
+ e.stopPropagation();
|
|
|
+ endGuide()
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 跳过
|
|
|
+ </div>
|
|
|
+ <div class={styles.box} style={data.box} id={`modeType-${data.step}`}>
|
|
|
+ {data.steps.map((item: any, index) => (
|
|
|
+
|
|
|
+ <div
|
|
|
+ onClick={(e: Event) => e.stopPropagation()}
|
|
|
+ class={styles.item}
|
|
|
+ style={{
|
|
|
+ display: index === data.step ? "" : "none",
|
|
|
+ left: `${item.eleRect?.left}px`,
|
|
|
+ top: `${item.eleRect?.top}px`,
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <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 ? (
|
|
|
+ <>
|
|
|
+ <Button
|
|
|
+ class={styles.btn}
|
|
|
+ round
|
|
|
+ color="transparent"
|
|
|
+ style={{ "border-color": "#fff" }}
|
|
|
+ type="primary"
|
|
|
+ onClick={() => {
|
|
|
+ data.step = 0;
|
|
|
+ getStepELe();
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 再看一遍
|
|
|
+ </Button>
|
|
|
+ <Button class={[styles.btn,styles.endBtn]} round type="primary" onClick={() =>endGuide()}>
|
|
|
+ 完成
|
|
|
+ </Button>
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <Button class={styles.btn} round type="primary" onClick={() => handleNext()}>
|
|
|
+
|
|
|
+ 下一步 ({data.step + 1}/{data.steps.length})
|
|
|
+ </Button>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Popup>
|
|
|
+ );
|
|
|
+ },
|
|
|
+});
|