test.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. <template>
  2. <div>
  3. <div class="container" @touchmove="slideTopics" ref="container">
  4. <div class="tab">
  5. <div
  6. v-for="(item, index) in tabItemList"
  7. :key="index"
  8. class="tab-item"
  9. @click="
  10. () => {
  11. tabItemListIndex = index;
  12. listIndex = listIndexList[tabItemListIndex];
  13. getPage(index);
  14. }
  15. "
  16. :class="{
  17. 'tab-item_select': tabItemListIndex == index,
  18. }"
  19. >
  20. <img class="tab-img" v-if="tabItemListIndex !== index" :src="item.whiteImg" />
  21. <img class="tab-img" v-if="tabItemListIndex === index" :src="item.blueImg" />
  22. <span class="tabItem-title">{{ item.title }}</span>
  23. </div>
  24. </div>
  25. <div class="topics">
  26. <div class="topics-title">{{ list[listIndex].type == 1 ? '判断' : '选择' }}</div>
  27. <div class="topics-content">
  28. {{ list[listIndex].name }}
  29. </div>
  30. </div>
  31. <div class="options">
  32. <div
  33. class="options-select"
  34. @click="selectAnswer(list[listIndex], 1)"
  35. v-if="list[listIndex].an1"
  36. >
  37. <div class="options-selectText">
  38. <img
  39. src="@/assets/img/okimg.png"
  40. v-if="
  41. list[listIndex].userAnswer == 1 &&
  42. list[listIndex].isExplainJs &&
  43. list[listIndex].rightAnswer == 1
  44. "
  45. class="options-selectText-okimg"
  46. />
  47. <img
  48. src="@/assets/img/noimg.png"
  49. v-if="
  50. list[listIndex].userAnswer == 1 &&
  51. list[listIndex].isExplainJs &&
  52. list[listIndex].rightAnswer !== 1
  53. "
  54. class="options-selectText-noimg"
  55. />
  56. <div class="options-selectText-header">A</div>
  57. <div
  58. class="options-selectText-mid"
  59. :class="{
  60. 'options-selectText-mid_selectOk':
  61. list[listIndex].userAnswer == 1 &&
  62. list[listIndex].isExplainJs &&
  63. list[listIndex].rightAnswer == 1,
  64. 'options-selectText-mid_selectNo':
  65. list[listIndex].userAnswer == 1 &&
  66. list[listIndex].isExplainJs &&
  67. list[listIndex].rightAnswer !== 1,
  68. }"
  69. >
  70. {{ list[listIndex].an1 }}
  71. </div>
  72. </div>
  73. <div class="options-bg"></div>
  74. </div>
  75. <div
  76. class="options-select"
  77. @click="selectAnswer(list[listIndex], 2)"
  78. v-if="list[listIndex].an2"
  79. >
  80. <div class="options-selectText">
  81. <img
  82. src="@/assets/img/okimg.png"
  83. v-if="
  84. list[listIndex].userAnswer == 2 &&
  85. list[listIndex].isExplainJs &&
  86. list[listIndex].rightAnswer == 2
  87. "
  88. class="options-selectText-okimg"
  89. />
  90. <img
  91. src="@/assets/img/noimg.png"
  92. v-if="
  93. list[listIndex].userAnswer == 2 &&
  94. list[listIndex].isExplainJs &&
  95. list[listIndex].rightAnswer !== 2
  96. "
  97. class="options-selectText-noimg"
  98. />
  99. <div class="options-selectText-header">B</div>
  100. <div
  101. class="options-selectText-mid"
  102. :class="{
  103. 'options-selectText-mid_selectOk':
  104. list[listIndex].userAnswer == 2 &&
  105. list[listIndex].isExplainJs &&
  106. list[listIndex].rightAnswer == 2,
  107. 'options-selectText-mid_selectNo':
  108. list[listIndex].userAnswer == 2 &&
  109. list[listIndex].isExplainJs &&
  110. list[listIndex].rightAnswer !== 2,
  111. }"
  112. >
  113. {{ list[listIndex].an2 }}
  114. </div>
  115. </div>
  116. <div class="options-bg"></div>
  117. </div>
  118. <div
  119. class="options-select"
  120. @click="selectAnswer(list[listIndex], 3)"
  121. v-if="list[listIndex].an3"
  122. >
  123. <div class="options-selectText">
  124. <img
  125. src="@/assets/img/okimg.png"
  126. v-if="
  127. list[listIndex].userAnswer == 3 &&
  128. list[listIndex].isExplainJs &&
  129. list[listIndex].rightAnswer == 3
  130. "
  131. class="options-selectText-okimg"
  132. />
  133. <img
  134. src="@/assets/img/noimg.png"
  135. v-if="
  136. list[listIndex].userAnswer == 3 &&
  137. list[listIndex].isExplainJs &&
  138. list[listIndex].rightAnswer !== 3
  139. "
  140. class="options-selectText-noimg"
  141. />
  142. <div class="options-selectText-header">C</div>
  143. <div
  144. class="options-selectText-mid"
  145. :class="{
  146. 'options-selectText-mid_selectOk':
  147. list[listIndex].userAnswer == 3 &&
  148. list[listIndex].isExplainJs &&
  149. list[listIndex].rightAnswer == 3,
  150. 'options-selectText-mid_selectNo':
  151. list[listIndex].userAnswer == 3 &&
  152. list[listIndex].isExplainJs &&
  153. list[listIndex].rightAnswer !== 3,
  154. }"
  155. >
  156. {{ list[listIndex].an3 }}
  157. </div>
  158. </div>
  159. <div class="options-bg"></div>
  160. </div>
  161. <div
  162. class="options-select"
  163. @click="selectAnswer(list[listIndex], 4)"
  164. v-if="list[listIndex].an4"
  165. >
  166. <div class="options-selectText">
  167. <img
  168. src="@/assets/img/okimg.png"
  169. v-if="
  170. list[listIndex].userAnswer == 4 &&
  171. list[listIndex].isExplainJs &&
  172. list[listIndex].rightAnswer == 4
  173. "
  174. class="options-selectText-okimg"
  175. />
  176. <img
  177. src="@/assets/img/noimg.png"
  178. v-if="
  179. list[listIndex].userAnswer == 4 &&
  180. list[listIndex].isExplainJs &&
  181. list[listIndex].rightAnswer !== 4
  182. "
  183. class="options-selectText-noimg"
  184. />
  185. <div class="options-selectText-header">D</div>
  186. <div
  187. class="options-selectText-mid"
  188. :class="{
  189. 'options-selectText-mid_selectOk':
  190. list[listIndex].userAnswer == 4 &&
  191. list[listIndex].isExplainJs &&
  192. list[listIndex].rightAnswer == 4,
  193. 'options-selectText-mid_selectNo':
  194. list[listIndex].userAnswer == 4 &&
  195. list[listIndex].isExplainJs &&
  196. list[listIndex].rightAnswer !== 4,
  197. }"
  198. >
  199. {{ list[listIndex].an4 }}
  200. </div>
  201. </div>
  202. <div class="options-bg"></div>
  203. </div>
  204. <div
  205. class="options-select"
  206. @click="selectAnswer(list[listIndex], 5)"
  207. v-if="list[listIndex].an5"
  208. >
  209. <div class="options-selectText">
  210. <img
  211. src="@/assets/img/okimg.png"
  212. v-if="
  213. list[listIndex].userAnswer == 5 &&
  214. list[listIndex].isExplainJs &&
  215. list[listIndex].rightAnswer == 5
  216. "
  217. class="options-selectText-okimg"
  218. />
  219. <img
  220. src="@/assets/img/noimg.png"
  221. v-if="
  222. list[listIndex].userAnswer == 5 &&
  223. list[listIndex].isExplainJs &&
  224. list[listIndex].rightAnswer !== 5
  225. "
  226. class="options-selectText-noimg"
  227. />
  228. <div class="options-selectText-header">E</div>
  229. <div
  230. class="options-selectText-mid"
  231. :class="{
  232. 'options-selectText-mid_selectOk':
  233. list[listIndex].userAnswer == 5 &&
  234. list[listIndex].isExplainJs &&
  235. list[listIndex].rightAnswer == 5,
  236. 'options-selectText-mid_selectNo':
  237. list[listIndex].userAnswer == 5 &&
  238. list[listIndex].isExplainJs &&
  239. list[listIndex].rightAnswer !== 5,
  240. }"
  241. >
  242. {{ list[listIndex].an5 }}
  243. </div>
  244. </div>
  245. <div class="options-bg"></div>
  246. </div>
  247. <div
  248. class="options-select"
  249. @click="selectAnswer(list[listIndex], 6)"
  250. v-if="list[listIndex].an6"
  251. >
  252. <div class="options-selectText">
  253. <img
  254. src="@/assets/img/okimg.png"
  255. v-if="
  256. list[listIndex].userAnswer == 6 &&
  257. list[listIndex].isExplainJs &&
  258. list[listIndex].rightAnswer == 6
  259. "
  260. class="options-selectText-okimg"
  261. />
  262. <img
  263. src="@/assets/img/noimg.png"
  264. v-if="
  265. list[listIndex].userAnswer == 6 &&
  266. list[listIndex].isExplainJs &&
  267. list[listIndex].rightAnswer !== 6
  268. "
  269. class="options-selectText-noimg"
  270. />
  271. <div class="options-selectText-header">F</div>
  272. <div
  273. class="options-selectText-mid"
  274. :class="{
  275. 'options-selectText-mid_selectOk':
  276. list[listIndex].userAnswer == 6 &&
  277. list[listIndex].isExplainJs &&
  278. list[listIndex].rightAnswer == 6,
  279. 'options-selectText-mid_selectNo':
  280. list[listIndex].userAnswer == 6 &&
  281. list[listIndex].isExplainJs &&
  282. list[listIndex].rightAnswer !== 6,
  283. }"
  284. >
  285. {{ list[listIndex].an6 }}
  286. </div>
  287. </div>
  288. <div class="options-bg"></div>
  289. </div>
  290. </div>
  291. <div class="explain" v-opacity="list[listIndex].isExplainJs">
  292. <div class="explain-answer">
  293. <div class="explain-answerText">
  294. <span>正确答案:</span>
  295. <span style="color: #12af85">{{ answerIndexMap[list[listIndex].rightAnswer] }}</span>
  296. </div>
  297. </div>
  298. <div class="explain-header">题目解析</div>
  299. <div class="explain-content">
  300. {{ list[listIndex].explainJs }}
  301. </div>
  302. </div>
  303. <div class="bottom">
  304. <div class="bottom-container">
  305. <img @click="backTopics" src="@/assets/img/beforeTopics.png" />
  306. <span>
  307. <span style="color: #ffac4d">{{ listIndex + 1 }}</span
  308. >/{{ list.length }}
  309. </span>
  310. <img @click="nextTopics" src="@/assets/img/nextTopics.png" />
  311. </div>
  312. </div>
  313. </div>
  314. </div>
  315. </template>
  316. <script setup lang="ts">
  317. import { reactive, ref, onUnmounted } from 'vue';
  318. import { Toast } from 'vant';
  319. import api from '@/api/api';
  320. import blueTabItemImg0 from '@/assets/img/blueCar.png';
  321. import blueTabItemImg1 from '@/assets/img/blueBus.png';
  322. import blueTabItemImg2 from '@/assets/img/blueTruck.png';
  323. import blueTabItemImg3 from '@/assets/img/blueMoto.png';
  324. import whiteTabItemImg0 from '@/assets/img/whiteCar.png';
  325. import whiteTabItemImg1 from '@/assets/img/whiteBus.png';
  326. import whiteTabItemImg2 from '@/assets/img/whiteTruck.png';
  327. import whiteTabItemImg3 from '@/assets/img/whiteMoto.png';
  328. const tabItemListIndex = ref(0);
  329. const answerIndexMap = ['!', 'A', 'B', 'C', 'D', 'E', 'F', 'G'];
  330. const tabItemList = [
  331. {
  332. blueImg: blueTabItemImg0,
  333. whiteImg: whiteTabItemImg0,
  334. title: '小车',
  335. },
  336. {
  337. blueImg: blueTabItemImg1,
  338. whiteImg: whiteTabItemImg1,
  339. title: '客车',
  340. },
  341. {
  342. blueImg: blueTabItemImg2,
  343. whiteImg: whiteTabItemImg2,
  344. title: '货车',
  345. },
  346. {
  347. blueImg: blueTabItemImg3,
  348. whiteImg: whiteTabItemImg3,
  349. title: '摩托车',
  350. },
  351. ];
  352. let list = ref<questionTwoList.row[]>([
  353. {
  354. an1: '正确',
  355. an2: '错误',
  356. an3: '',
  357. an4: '',
  358. an5: '',
  359. an6: '',
  360. an7: '',
  361. cartype: '',
  362. name: '机动车驾驶人在实习期内有记满12分记录的,注销其实习的准驾车型驾驶资格。',
  363. explainJs:
  364. '《机动车驾驶证申请和使用规定》第八十条:机动车驾驶人在实习期内发生的道路交通安全违法行为被记满12分的,注销其实习的准驾车型驾驶资格',
  365. id: 0,
  366. image: '',
  367. kemu: 0,
  368. name: '',
  369. num: 0,
  370. rightAnswer: 0,
  371. type: 0,
  372. },
  373. ]);
  374. let listIndexList = [0, 0, 0, 0];
  375. let timer = window.setInterval(() => {
  376. listIndexList[tabItemListIndex.value] = listIndex.value;
  377. }, 400);
  378. onUnmounted(() => {
  379. window.clearInterval(timer);
  380. });
  381. let listIndex = ref(0);
  382. let list0 = ref<questionTwoList.row[]>([]);
  383. let list1 = ref<questionTwoList.row[]>([]);
  384. let list2 = ref<questionTwoList.row[]>([]);
  385. let list3 = ref<questionTwoList.row[]>([]);
  386. let container = ref(null);
  387. const query = {
  388. pageNum: 1,
  389. pageSize: 1000,
  390. cartype: '0' as '0' | '1' | '2' | '3',
  391. kemu: 1,
  392. };
  393. let getPage = (index: number) => {
  394. let indexStr = String(index);
  395. query.cartype = indexStr as '0' | '1' | '2' | '3';
  396. switch (index) {
  397. case 0:
  398. if (list0.value.length == 0) {
  399. api.questionTwoList(query).then((res) => {
  400. list0.value = res.data.rows;
  401. list.value = res.data.rows;
  402. });
  403. } else {
  404. list.value = list0.value;
  405. }
  406. break;
  407. case 1:
  408. if (list1.value.length == 0) {
  409. api.questionTwoList(query).then((res) => {
  410. list1.value = res.data.rows;
  411. list.value = res.data.rows;
  412. });
  413. } else {
  414. list.value = list1.value;
  415. }
  416. break;
  417. case 2:
  418. if (list2.value.length == 0) {
  419. api.questionTwoList(query).then((res) => {
  420. list2.value = res.data.rows;
  421. list.value = res.data.rows;
  422. });
  423. } else {
  424. list.value = list2.value;
  425. }
  426. break;
  427. case 3:
  428. if (list3.value.length == 0) {
  429. api.questionTwoList(query).then((res) => {
  430. list3.value = res.data.rows;
  431. list.value = res.data.rows;
  432. });
  433. } else {
  434. list.value = list3.value;
  435. }
  436. break;
  437. }
  438. };
  439. let nextTopics = () => {
  440. if (listIndex.value == list.value.length - 1) {
  441. Toast('到底了');
  442. return;
  443. } else {
  444. listIndex.value = listIndex.value + 1;
  445. }
  446. container.value.scrollTo(0, 0);
  447. // container.scrollTo(0, 0);
  448. };
  449. let backTopics = () => {
  450. if (listIndex.value == 0) {
  451. Toast('到底了');
  452. return;
  453. } else {
  454. listIndex.value = listIndex.value - 1;
  455. }
  456. container.value.scrollTo(0, 0);
  457. };
  458. let selectAnswer = (item: questionTwoList.row, index: number) => {
  459. if (!item.isExplainJs) {
  460. item.isExplainJs = true;
  461. item.userAnswer = index;
  462. if (item.userAnswer == item.rightAnswer) {
  463. window.setTimeout(() => {
  464. listIndex.value = listIndex.value + 1;
  465. }, 1200);
  466. }
  467. }
  468. };
  469. let slideTopics = (() => {
  470. let touchList0: TouchList;
  471. let beginTimeStrap: number = 0;
  472. return (e: TouchEvent) => {
  473. let currentTimeStrap: number = +new Date();
  474. let touchList1: TouchList;
  475. if (currentTimeStrap - beginTimeStrap < 1500) {
  476. touchList1 = e.changedTouches;
  477. //单点触摸的时候
  478. if (touchList0.length == 1 && touchList1.length == 1) {
  479. console.log(touchList1[0].clientX - touchList0[0].clientX);
  480. if (touchList1[0].clientX - touchList0[0].clientX > 160) {
  481. nextTopics();
  482. touchList0 = e.changedTouches;
  483. } else if (touchList1[0].clientX - touchList0[0].clientX < -160) {
  484. backTopics();
  485. touchList0 = e.changedTouches;
  486. }
  487. }
  488. } else {
  489. beginTimeStrap = currentTimeStrap;
  490. touchList0 = e.changedTouches;
  491. }
  492. };
  493. })();
  494. //初始获取题目
  495. getPage(0);
  496. //truck
  497. </script>
  498. <style lang="scss" scoped>
  499. .container {
  500. width: 100vw;
  501. height: 100vh;
  502. background-image: url('./../../assets/img/aprilExam.png');
  503. background-size: 100%;
  504. padding-bottom: 136px;
  505. overflow-y: scroll;
  506. }
  507. .tab {
  508. padding: 0px 60px;
  509. padding-top: 32px;
  510. display: flex;
  511. justify-content: space-around;
  512. .tab-item {
  513. display: flex;
  514. align-content: center;
  515. align-items: center;
  516. width: 140px;
  517. height: 60px;
  518. padding: 0px 15px;
  519. padding-left: 10px;
  520. justify-content: space-between;
  521. white-space: nowrap;
  522. color: #fff;
  523. .tabItem-title {
  524. font-size: 26px;
  525. }
  526. }
  527. .tab-item_select {
  528. background: #fff;
  529. border: 4px solid #2d2d2d;
  530. border-radius: 35px;
  531. color: #498ef5;
  532. }
  533. .tab-img {
  534. width: 40px;
  535. height: 24px;
  536. }
  537. }
  538. .topics {
  539. width: 690px;
  540. margin: 0 auto;
  541. margin-top: 154px;
  542. border: 5px solid #2d2d2d;
  543. padding: 26px 0;
  544. position: relative;
  545. background: #fff;
  546. border-radius: 8px;
  547. .topics-title::before {
  548. color: white;
  549. }
  550. .topics-title {
  551. position: absolute;
  552. top: 26px;
  553. width: 88px;
  554. height: 44px;
  555. left: -5px;
  556. background: #01c18d;
  557. border: 5px solid #333;
  558. display: flex;
  559. align-items: center;
  560. justify-content: center;
  561. color: #fff;
  562. }
  563. .topics-content {
  564. text-align: left;
  565. font-size: 30px;
  566. text-indent: 3em;
  567. font-weight: 600;
  568. }
  569. }
  570. .options {
  571. width: 100%;
  572. margin-top: 30px;
  573. padding-left: 60px;
  574. .options-select {
  575. width: 644px;
  576. height: 98px;
  577. position: relative;
  578. margin-bottom: 26px;
  579. }
  580. .options-selectText {
  581. border: 5px solid #2d2d2d;
  582. height: 84px;
  583. text-align: left;
  584. display: flex;
  585. align-content: center;
  586. align-items: center;
  587. background: #fff;
  588. border-radius: 8px;
  589. position: absolute;
  590. left: 0;
  591. top: 0;
  592. width: 630px;
  593. z-index: 10;
  594. }
  595. .options-selectText-header {
  596. background: #ffac4d;
  597. width: 56px;
  598. height: 56px;
  599. border: 3px solid #2d2d2d;
  600. position: relative;
  601. left: -3px;
  602. display: flex;
  603. justify-content: center;
  604. align-content: center;
  605. align-items: center;
  606. color: white;
  607. border-radius: 8px;
  608. flex-basis: 1;
  609. flex-shrink: 0;
  610. }
  611. .options-selectText-mid {
  612. margin-left: 20px;
  613. }
  614. .options-selectText-mid_selectOk {
  615. color: #12af85;
  616. }
  617. .options-selectText-mid_selectNo {
  618. color: #ff4d53;
  619. }
  620. .options-selectText-okimg {
  621. position: absolute;
  622. right: 28px;
  623. width: 28px;
  624. height: 28px;
  625. }
  626. .options-selectText-noimg {
  627. position: absolute;
  628. right: 28px;
  629. width: 28px;
  630. height: 28px;
  631. }
  632. .options-bg {
  633. width: 630px;
  634. height: 84px;
  635. background: #d6b352;
  636. border: 5px solid #2d2d2d;
  637. position: absolute;
  638. right: 0;
  639. bottom: 0;
  640. border-radius: 8px;
  641. overflow: hidden;
  642. }
  643. }
  644. .explain {
  645. margin-top: 60px;
  646. width: 690px;
  647. border: 4px solid #2d2d2d;
  648. margin: 0 auto;
  649. background: #fff;
  650. padding-bottom: 20px;
  651. .explain-answer {
  652. height: 86px;
  653. display: flex;
  654. align-items: flex-end;
  655. font-size: 32px;
  656. font-weight: 700;
  657. .explain-answerText {
  658. width: 630px;
  659. margin: 0 auto;
  660. text-align: left;
  661. border-bottom: 2px solid #cccccc;
  662. }
  663. }
  664. .explain-header {
  665. margin-top: 32px;
  666. text-align: left;
  667. padding-left: 30px;
  668. font-weight: 600;
  669. }
  670. .explain-content {
  671. font-size: 24px;
  672. text-align: left;
  673. padding: 8px 30px;
  674. }
  675. }
  676. .bottom {
  677. position: fixed;
  678. bottom: 0;
  679. width: 100%;
  680. height: 136px;
  681. background: #fff;
  682. display: flex;
  683. align-content: center;
  684. align-items: center;
  685. padding: 0 60px;
  686. .bottom-container {
  687. width: 100%;
  688. display: flex;
  689. justify-content: space-between;
  690. height: 60px;
  691. line-height: 60px;
  692. font-weight: 700;
  693. img {
  694. width: 60px;
  695. height: 60px;
  696. }
  697. }
  698. }
  699. </style>