student-top.tsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  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. import { useRoute } from "vue-router";
  7. import { getQuery } from "/src/utils/queryString";
  8. import { getGuidance, setGuidance } from "./api";
  9. import { headTopData } from "/src/page-instrument/header-top/index";
  10. export default defineComponent({
  11. name: "studnetT-guide",
  12. emits: ["close"],
  13. setup(props, { emit }) {
  14. const data = reactive({
  15. box: {},
  16. show: false,
  17. steps: [
  18. {
  19. ele: "",
  20. eleRect: {} as DOMRect,
  21. img: getImage("studnetT1.png"),
  22. handStyle: {
  23. top: "1.3rem",
  24. left:'0.3rem'
  25. },
  26. imgStyle: {
  27. top: "1.9rem",
  28. width:'5.64rem',
  29. height:'2.77rem',
  30. left:'-2rem'
  31. },
  32. btnsStyle: {
  33. top: "5.1rem",
  34. left:'-0.7rem'
  35. },
  36. },
  37. {
  38. ele: "",
  39. img: getImage("studnetT2.png"),
  40. handStyle: {
  41. top: "1.3rem",
  42. left:'0.3rem',
  43. },
  44. imgStyle: {
  45. top: "1.9rem",
  46. width:'5.46rem',
  47. height:'2.3rem',
  48. left:'-2rem'
  49. },
  50. btnsStyle: {
  51. top: "4.6rem",
  52. left:'-0.7rem'
  53. },
  54. },
  55. {
  56. ele: "",
  57. img: getImage("studnetT3.png"),
  58. handStyle: {
  59. top: "1.3rem",
  60. left:'0.3rem',
  61. },
  62. imgStyle: {
  63. top: "1.9rem",
  64. width:'5.46rem',
  65. height:'2.30rem',
  66. left:'-2rem'
  67. },
  68. btnsStyle: {
  69. top: "4.6rem",
  70. left:'-0.7rem'
  71. },
  72. },
  73. {
  74. ele: "",
  75. img: getImage("studnetT4.png"),
  76. handStyle: {
  77. top: "1.3rem",
  78. left:'0.3rem',
  79. },
  80. imgStyle: {
  81. top: "1.8rem",
  82. width:'5.46rem',
  83. height:'2.30rem',
  84. left:'-2rem'
  85. },
  86. btnsStyle: {
  87. top: "4.6rem",
  88. left:'-0.7rem'
  89. },
  90. },
  91. {
  92. ele: "",
  93. img: getImage("studnetT5.png"),
  94. handStyle: {
  95. top: "1.3rem",
  96. left:'0.3rem',
  97. },
  98. imgStyle: {
  99. top: "1.8rem",
  100. width:'5.46rem',
  101. height:'2.6rem',
  102. left:'-3rem'
  103. },
  104. btnsStyle: {
  105. top: "4.8rem",
  106. left:'-1.3rem'
  107. },
  108. },
  109. {
  110. ele: "",
  111. img: getImage("studnetT6.png"),
  112. handStyle: {
  113. top: "1.3rem",
  114. left:'0.3rem',
  115. },
  116. imgStyle: {
  117. top: "1.62rem",
  118. width:'5.46rem',
  119. height:'2.30rem',
  120. left:'-5.5rem'
  121. },
  122. btnsStyle: {
  123. top: "4.3rem",
  124. left:'-1.8rem'
  125. },
  126. },
  127. {
  128. ele: "",
  129. eleRect: {} as DOMRect,
  130. img: getImage("studnetT7.png"),
  131. handStyle: {
  132. top: "1.3rem",
  133. left:'0.3rem',
  134. },
  135. imgStyle: {
  136. top: "1.62rem",
  137. width:'5.46rem',
  138. height:'2.3rem',
  139. left:'-5.5rem'
  140. },
  141. btnsStyle: {
  142. top: "4.3rem",
  143. left:'-3.7rem'
  144. },
  145. }, {
  146. ele: "",
  147. eleRect: {} as DOMRect,
  148. img: getImage("studnetT8.png"),
  149. handStyle: {
  150. top: "-1.38rem",
  151. left:'.45rem',
  152. transform: 'rotate(180deg)'
  153. },
  154. imgStyle: {
  155. top: "-3.8rem",
  156. width:'5.46rem',
  157. height:'2.28rem',
  158. left:'-5rem'
  159. },
  160. btnsStyle: {
  161. top: "-1.2rem",
  162. left:'-4.3rem'
  163. },
  164. },
  165. ],
  166. step: 0,
  167. });
  168. const tipShow = ref(false)
  169. const query: any = getQuery();
  170. // const guideInfo = localStorage.getItem('guideInfo')
  171. // if(guideInfo&&JSON.parse(guideInfo).studnetT || !query.showGuide){
  172. // tipShow.value =false
  173. // }else {
  174. // tipShow.value =true
  175. // }
  176. const guideInfo = ref({} as any)
  177. const getAllGuidance = async()=>{
  178. try{
  179. const res = await getGuidance({guideTag:'guideInfo'})
  180. if(res.data){
  181. guideInfo.value = JSON.parse(res.data?.guideValue) || null
  182. }else{
  183. guideInfo.value = {}
  184. }
  185. if (guideInfo.value && guideInfo.value.studnetT) {
  186. tipShow.value = false;
  187. } else {
  188. tipShow.value = headTopData.modeType !== "init" ? true : false;
  189. }
  190. }catch(e){
  191. console.log(e)
  192. }
  193. // const guideInfo = localStorage.getItem('teacher-guideInfo');
  194. }
  195. getAllGuidance()
  196. const getStepELe = () => {
  197. console.log(`studnetT${data.step}`)
  198. const ele: HTMLElement = document.getElementById(`studnetT-${data.step}`)!;
  199. if (ele) {
  200. if (ele.style.display === 'none'){
  201. handleNext()
  202. return
  203. }
  204. const eleRect = ele.getBoundingClientRect();
  205. data.box = {
  206. left: eleRect.x + "px",
  207. top: eleRect.y + "px",
  208. width: eleRect.width + "px",
  209. height: eleRect.height + "px",
  210. };
  211. }
  212. };
  213. onMounted(() => {
  214. getStepELe();
  215. });
  216. const handleNext = () => {
  217. if (data.step >= 7) {
  218. endGuide();
  219. return;
  220. }
  221. data.step = data.step + 1;
  222. getStepELe();
  223. };
  224. const endGuide = async()=>{
  225. // let guideInfo = JSON.parse(localStorage.getItem('guideInfo') || '{}') || null
  226. if(!guideInfo.value){
  227. guideInfo.value = {studnetT:true}
  228. }else{
  229. guideInfo.value.studnetT = true
  230. }
  231. // localStorage.setItem('guideInfo',JSON.stringify(guideInfo))
  232. try{
  233. const res = await setGuidance({guideTag:'guideInfo',guideValue:JSON.stringify(guideInfo.value)})
  234. }catch(e){
  235. console.log(e)
  236. }
  237. tipShow.value = false
  238. // localStorage.setItem('endC')
  239. }
  240. return () => (
  241. <Popup teleport="body" overlay={false} closeOnClickOverlay={false} class={["popup-custom", styles.guidePopup]} v-model:show={tipShow.value}>
  242. <div class={styles.content} onClick={() => handleNext()}>
  243. {data.step!=data.steps.length-1&&<div
  244. class={styles.backBtn}
  245. onClick={(e: Event) => {
  246. e.stopPropagation();
  247. endGuide()
  248. }}
  249. >
  250. 跳过
  251. </div>}
  252. <div class={styles.box} style={data.box} id={`modeType-${data.step}`}>
  253. {data.steps.map((item: any, index) => (
  254. <div
  255. onClick={(e: Event) => e.stopPropagation()}
  256. class={styles.item}
  257. style={{
  258. display: index === data.step ? "" : "none",
  259. left: `${item.eleRect?.left}px`,
  260. top: `${item.eleRect?.top}px`,
  261. }}
  262. >
  263. <img class={styles.img} style={item.imgStyle} src={item.img} />
  264. <img class={styles.iconHead} style={item.handStyle} src={getImage("indexDot.png")} />
  265. <div class={styles.btns} style={item.btnsStyle}>
  266. {data.step + 1 == data.steps.length ? (
  267. <>
  268. <div class={[styles.studentNext]} onClick={() =>endGuide()}>
  269. 完成
  270. </div>
  271. <div
  272. class={[styles.nextBtn]}
  273. style={{ "border-color": "#fff" }}
  274. onClick={() => {
  275. data.step = 0;
  276. getStepELe();
  277. }}
  278. >
  279. 再看一遍
  280. </div>
  281. </>
  282. ) : (
  283. <Button class={styles.studentNext} round type="primary" onClick={() => handleNext()}>
  284. 下一步 ({data.step + 1}/{data.steps.length})
  285. </Button>
  286. )}
  287. </div>
  288. </div>
  289. ))}
  290. </div>
  291. </div>
  292. </Popup>
  293. );
  294. },
  295. });