teacher-top.tsx 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. import { Button, Popup } from "vant";
  2. import { } from "vant";
  3. import { defineComponent, nextTick, onMounted, reactive, ref, watch } from "vue";
  4. import styles from "./index.module.less";
  5. import { getImage } from "./images";
  6. export default defineComponent({
  7. name: "teacherTop-guide",
  8. emits: ["close"],
  9. setup(props, { emit }) {
  10. const data = reactive({
  11. box: {},
  12. show: false,
  13. steps: [
  14. {
  15. ele: "",
  16. eleRect: {} as DOMRect,
  17. img: getImage("teacherTop1.png"),
  18. handStyle: {
  19. top: "0.91rem",
  20. },
  21. imgStyle: {
  22. top: "1.32rem",
  23. width:'3.63rem',
  24. height:'2.28rem',
  25. left:'-2rem'
  26. },
  27. btnsStyle: {
  28. top: "2.8rem",
  29. left:'-0.7rem'
  30. },
  31. },
  32. {
  33. ele: "",
  34. img: getImage("teacherTop2.png"),
  35. handStyle: {
  36. top: "-1.39rem",
  37. left:'0.15rem',
  38. transform: 'rotate(180deg)'
  39. },
  40. imgStyle: {
  41. top: "1.32rem",
  42. width:'4.20rem',
  43. height:'2.28rem',
  44. left:'-2rem'
  45. },
  46. btnsStyle: {
  47. top: "2.8rem",
  48. left:'-0.7rem'
  49. },
  50. },
  51. {
  52. ele: "",
  53. img: getImage("teacherTop3.png"),
  54. handStyle: {
  55. top: "-1.39rem",
  56. left:'0.17rem',
  57. transform: 'rotate(180deg)'
  58. },
  59. imgStyle: {
  60. top: "1.32rem",
  61. width:'5.15rem',
  62. height:'2.28rem',
  63. left:'-2rem'
  64. },
  65. btnsStyle: {
  66. top: "2.8rem",
  67. left:'-0.7rem'
  68. },
  69. },
  70. {
  71. ele: "",
  72. img: getImage("teacherTop4.png"),
  73. handStyle: {
  74. top: "-1.39rem",
  75. left:'1.4rem',
  76. transform: 'rotate(180deg)'
  77. },
  78. imgStyle: {
  79. top: "1.32rem",
  80. width:'4.39rem',
  81. height:'2.28rem',
  82. left:'-2rem'
  83. },
  84. btnsStyle: {
  85. top: "2.8rem",
  86. left:'-0.7rem'
  87. },
  88. },
  89. {
  90. ele: "",
  91. img: getImage("teacherTop5.png"),
  92. handStyle: {
  93. top: "-1.39rem",
  94. left:'1.4rem',
  95. transform: 'rotate(180deg)'
  96. },
  97. imgStyle: {
  98. top: "1.32rem",
  99. width:'4.58rem',
  100. height:'2.28rem',
  101. left:'-2rem'
  102. },
  103. btnsStyle: {
  104. top: "2.8rem",
  105. left:'-0.7rem'
  106. },
  107. },
  108. {
  109. ele: "",
  110. img: getImage("teacherTop6.png"),
  111. handStyle: {
  112. top: "-1.39rem",
  113. left:'1.4rem',
  114. transform: 'rotate(180deg)'
  115. },
  116. imgStyle: {
  117. top: "1.32rem",
  118. width:'4.01rem',
  119. height:'2.28rem',
  120. left:'-3.2rem'
  121. },
  122. btnsStyle: {
  123. top: "2.8rem",
  124. left:'-1.8rem'
  125. },
  126. },
  127. ],
  128. step: 0,
  129. });
  130. const tipShow = ref(false)
  131. const guideInfo = localStorage.getItem('guideInfo')
  132. if(guideInfo&&JSON.parse(guideInfo).teacherTop){
  133. tipShow.value =false
  134. }else {
  135. tipShow.value =true
  136. }
  137. const getStepELe = () => {
  138. console.log(`teacherTop${data.step}`)
  139. const ele: HTMLElement = document.getElementById(`teacherTop-${data.step}`)!;
  140. if (ele) {
  141. if (ele.style.display === 'none'){
  142. handleNext()
  143. return
  144. }
  145. const eleRect = ele.getBoundingClientRect();
  146. data.box = {
  147. left: eleRect.x + "px",
  148. top: eleRect.y + "px",
  149. width: eleRect.width + "px",
  150. height: eleRect.height + "px",
  151. };
  152. }
  153. };
  154. onMounted(() => {
  155. getStepELe();
  156. });
  157. const handleNext = () => {
  158. if (data.step >= 5) {
  159. endGuide();
  160. return;
  161. }
  162. data.step = data.step + 1;
  163. getStepELe();
  164. };
  165. const endGuide = ()=>{
  166. let guideInfo = JSON.parse(localStorage.getItem('guideInfo') || '{}') || null
  167. if(!guideInfo){
  168. guideInfo = {teacherTop:true}
  169. }else{
  170. guideInfo.teacherTop = true
  171. }
  172. localStorage.setItem('guideInfo',JSON.stringify(guideInfo))
  173. tipShow.value = false
  174. // localStorage.setItem('endC')
  175. }
  176. return () => (
  177. <Popup teleport="body" overlay={false} closeOnClickOverlay={false} class={["popup-custom", styles.guidePopup]} v-model:show={tipShow.value}>
  178. <div class={styles.content} onClick={() => handleNext()}>
  179. <div
  180. class={styles.backBtn}
  181. onClick={(e: Event) => {
  182. e.stopPropagation();
  183. endGuide()
  184. }}
  185. >
  186. 跳过
  187. </div>
  188. <div class={styles.box} style={data.box} id={`modeType-${data.step}`}>
  189. {data.steps.map((item: any, index) => (
  190. <div
  191. onClick={(e: Event) => e.stopPropagation()}
  192. class={styles.item}
  193. style={{
  194. display: index === data.step ? "" : "none",
  195. left: `${item.eleRect?.left}px`,
  196. top: `${item.eleRect?.top}px`,
  197. }}
  198. >
  199. <img class={styles.img} style={item.imgStyle} src={item.img} />
  200. {/* <img class={styles.iconHead} style={item.handStyle} src={getImage("indexDot.png")} /> */}
  201. <div class={styles.btns} style={item.btnsStyle}>
  202. {data.step + 1 == data.steps.length ? (
  203. <>
  204. <div class={[styles.endBtn]} onClick={() =>endGuide()}>
  205. 完成
  206. </div>
  207. <div
  208. class={[styles.nextBtn]}
  209. style={{ "border-color": "#fff" }}
  210. onClick={() => {
  211. data.step = 0;
  212. getStepELe();
  213. }}
  214. >
  215. 再看一遍
  216. </div>
  217. </>
  218. ) : (
  219. <Button class={styles.teacherBtn} round type="primary" onClick={() => handleNext()}>
  220. 下一步 ({data.step + 1}/{data.steps.length})
  221. </Button>
  222. )}
  223. </div>
  224. </div>
  225. ))}
  226. </div>
  227. </div>
  228. </Popup>
  229. );
  230. },
  231. });