courseware-list.tsx 7.0 KB

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